RE: DCC Optokoppler / shield für Arduino uno

#1 von Mottimuc , 29.11.2019 23:16

Hallo zusammen,

Ich komme eigentlich aus der Bidib Welt, hab aber gerade ein wenig rumgelesen und bin auf das Projekt DCC Servo Decoder auf Arduino Basis gestoßen. Dafür benötigt man ja zwischen dem DCC Signal und dem Arduino eine Optokoppler Schaltung. Soweit ich das sehe, nix gravierendes. Aber gibts das fertig auf Platine zu erwerben????

Ich möchte einfach kostengünstig die 9 Tore meines Lokschuppens öffnen und schließen... das per DCC Befehl... mehr nicht.

Ich bin auf auf die MOBALedLib Seite gestoßen, aber das scheint mir umfangreicher und komplexer zu sein, als ich derzeit benötige....

Hat jemand ne Idee?

Viele Grüße
Michael


________________________________
Bau der Anlage Michelstadt
(2L DC, OpenDCC von Fichtelbahn, Steuerung mit ITrain )
Meine Baubericht der Anlage "MichelStadt"


Mottimuc  
Mottimuc
InterRegioExpress (IRE)
Beiträge: 424
Registriert am: 08.12.2013
Ort: im Süden, bei München
Spurweite H0
Stromart DC, Digital


RE: DCC Optokoppler / shield für Arduino uno

#2 von hmarx , 01.12.2019 00:44

Hallo Michael,

hier im Forum habe ich schon Platinenentwicklungen für das DCC-Interface gesehen. Das finde ich allerdings übertrieben. Die 3 Widerstände, 1 Diode, 1 Optokoppler (kein SMD) und Anschlußklemmen auf ein Stückchen Lochrasterplatine zu löten und zu verbinden ist doch kein Kunststück. Man braucht doch auch nur ein einziges DCC-Interface für die Anlage.


hmarx  
hmarx
InterRegio (IR)
Beiträge: 248
Registriert am: 20.05.2016
Ort: Windeck
Gleise Roco Line o.B.
Spurweite H0
Steuerung Lenz LZV200, ModellStw, Arduino
Stromart DC, Digital


RE: DCC Optokoppler / shield für Arduino uno

#3 von hmarx , 01.12.2019 00:59

Hallo Michael,

als Nachtrag rate ich dir noch zu den hier im Forum vorgestellten MobaTools von Benutzer MicroBahner.
Da kannst du ohne viel Programmieraufwand mit nur einem Arduino über DCC gesteuert 16 Servos betätigen.
https://github.com/MicroBahner/MobaTools


hmarx  
hmarx
InterRegio (IR)
Beiträge: 248
Registriert am: 20.05.2016
Ort: Windeck
Gleise Roco Line o.B.
Spurweite H0
Steuerung Lenz LZV200, ModellStw, Arduino
Stromart DC, Digital


RE: DCC Optokoppler / shield für Arduino uno

#4 von oligluck ( gelöscht ) , 01.12.2019 04:23

Moin Michael,
wenn du ein Servo-Shield (adafruit oder Derivat aus Fernost) nimmst, sind dort Lötflächen wie bei einer Lochrasterplatine.
Die 6 Bauteile aufzulöten, dauert nur wenige Minuten.
Das Ganze sieht dann so aus (Sorry für den Staub, das Ding ist benutzt)





Ich habe mal ein DCC-Shield entworfen, das zwischen Arduino und Servoshield kommt, aber das ist unnötiger Aufwand und macht das Ganze noch eine Etage höher.

Viele Grüße,
Oliver


oligluck

RE: DCC Optokoppler / shield für Arduino uno

#5 von Dreispur , 01.12.2019 08:42

Hallo !

Zitat

Moin Michael,
wenn du ein Servo-Shield (adafruit oder Derivat aus Fernost) nimmst, sind dort Lötflächen wie bei einer Lochrasterplatine.
Die 6 Bauteile aufzulöten, dauert nur wenige Minuten.
Das Ganze sieht dann so aus (Sorry für den Staub, das Ding ist benutzt)





Ich habe mal ein DCC-Shield entworfen, das zwischen Arduino und Servoshield kommt, aber das ist unnötiger Aufwand und macht das Ganze noch eine Etage höher.

Viele Grüße,
Oliver



Sowas bräuchte ich auch .
Aber wie programiert man das ? Danke für Nachhilfe .


mfG ANTON

Roco DigiSet+MMaus Rocomotin, IB 650 2.0 / IB 60500 ESU+CT-Programmer, Schalt/RMGB Dec Viessman , LDT,Roco,Lenz,LISSY,Lopi:Lenz,Tran+Sound/ESU+Sound/ Orig. Lok+Sound.anal.Trafo z.Test.WDP 7.0 u.9.2 / 2012 /RM Digikeijs / IB II /


Dreispur  
Dreispur
ICE-Sprinter
Beiträge: 5.057
Registriert am: 16.11.2010
Ort: Nähe Horn NÖ
Spurweite H0, H0e, H0m, TT, N, G
Stromart AC, DC, Digital, Analog


RE: DCC Optokoppler / shield für Arduino uno

#6 von oligluck ( gelöscht ) , 01.12.2019 09:35

Zitat

Sowas bräuchte ich auch .
Aber wie programiert man das ? Danke für Nachhilfe .



Hallo Anton,
der Arduino wird über USB an den PC angeschlossen, auf dem Die IDE installiert ist (Benutzeroberfläche, um den Ardu zu beschreiben). Mit diesem spielst du das Programm (nennt sich hier "sketch") auf den Arduino.

Du kannst beispielsweise die von Heinz erwähnten und verlinkten MobaTools nehmen, der Aufwand, sich einzuarbeiten hält sich in Grenzen.

Du musst dann eigentlich nur noch den Sketch minimal anpassen (DCC-Adresse jedes Servos, seine Geschwindigkeit und die Endlagen).

Sollen Weichen polarisiert werden, wird es etwas komplizierter, dann müssen noch Relais angeschlossen werden und natürlich konfiguriert werden (also den Servos zugeordnet).

Die gibt es fix und fertig, das sieht als 16-fach-Version so aus:



Viele Grüße,
Oliver


oligluck

RE: DCC Optokoppler / shield für Arduino uno

#7 von Dreispur , 01.12.2019 10:15

Hallo !

Danke für die gute INFO .


mfG ANTON

Roco DigiSet+MMaus Rocomotin, IB 650 2.0 / IB 60500 ESU+CT-Programmer, Schalt/RMGB Dec Viessman , LDT,Roco,Lenz,LISSY,Lopi:Lenz,Tran+Sound/ESU+Sound/ Orig. Lok+Sound.anal.Trafo z.Test.WDP 7.0 u.9.2 / 2012 /RM Digikeijs / IB II /


Dreispur  
Dreispur
ICE-Sprinter
Beiträge: 5.057
Registriert am: 16.11.2010
Ort: Nähe Horn NÖ
Spurweite H0, H0e, H0m, TT, N, G
Stromart AC, DC, Digital, Analog


RE: DCC Optokoppler / shield für Arduino uno

#8 von FlorianG , 23.12.2019 20:09

Hallo,
bei Arcomora www. Arcomora.com gibt es eine Platine, die den Optokoppler enthält.
Viele Grüße, Florian


Viele Grüße,
Florian


FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital


RE: DCC Optokoppler / shield für Arduino uno

#9 von Bodo , 31.01.2020 09:24

Hallo Michael,

in meiner Platinen-Dokumentation (s.Fußzeile) findest Du auf Seite 18 den "6n137-Adapter" - der ist allerdings bei Aisler noch nicht freigegeben und auch keine "fertige" Platine. Falls Du aber trotzdem Interesse daran hast, würde ich mich mit dem Thema mal wieder beschäftigen …

Viele Grüße, Bodo


Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)

Meine Anlage - Meine Dauerbaustelle
Platinen für Modellbahn- und Arduino-Anwendungen


 
Bodo
InterCityExpress (ICE)
Beiträge: 2.438
Registriert am: 28.04.2005
Homepage: Link
Gleise C-Gleis, Lenz 0
Spurweite H0, 0
Steuerung IB1 & CS2
Stromart Digital


RE: DCC Optokoppler / shield für Arduino uno

#10 von Ferenc , 01.02.2020 17:33

Hallo,
wie schon Florian geschrieben hat die von Arcomora nehmen. Oder gleich DCC Next nehmen ist alles auf einer Platine zusammen.

Ferenc


Immer eine Handbreit Schotter unter der Schwelle


Ferenc  
Ferenc
Metropolitan (MET)
Beiträge: 3.272
Registriert am: 27.09.2005
Spurweite H0
Stromart Digital


RE: DCC Optokoppler / shield für Arduino uno

#11 von stoni1980 , 08.04.2020 08:56

Zitat

Moin Michael,
wenn du ein Servo-Shield (adafruit oder Derivat aus Fernost) nimmst, sind dort Lötflächen wie bei einer Lochrasterplatine.
Die 6 Bauteile aufzulöten, dauert nur wenige Minuten.
Das Ganze sieht dann so aus (Sorry für den Staub, das Ding ist benutzt)





Ich habe mal ein DCC-Shield entworfen, das zwischen Arduino und Servoshield kommt, aber das ist unnötiger Aufwand und macht das Ganze noch eine Etage höher.

Viele Grüße,
Oliver



Sehr gut gelöst. Wie hast du den optokoppler und den verbunden? Möchte das nachbauen wenn ich darf. Hast du vielleicht ein Foto von der unterseite und welchen Wiederstand hast du verwendet? LG stoni


Mfg Martin


stoni1980  
stoni1980
Regionalbahn (RB)
Beiträge: 43
Registriert am: 07.04.2020


RE: DCC Optokoppler / shield für Arduino uno

#12 von volkerS , 08.04.2020 09:29

Hallo Stonie,
https://www.google.de/imgres?imgurl=http...QMygBegUIARDUAQ
oder im Web unter Optokoppler DCC Arduino findest du die Antworten.
Volker


volkerS  
volkerS
Metropolitan (MET)
Beiträge: 4.891
Registriert am: 14.10.2014


RE: DCC Optokoppler / shield für Arduino uno

#13 von stoni1980 , 08.04.2020 10:42

Ja. Da hast du recht. Nur so gut kenn ich mich noch nicht aus. Für mich ist es leichter wenn ich ein Foto von der Rückseite hätte. Was ich mit was verbinde. Mfg stoni


Mfg Martin


stoni1980  
stoni1980
Regionalbahn (RB)
Beiträge: 43
Registriert am: 07.04.2020


RE: DCC Optokoppler / shield für Arduino uno

#14 von stoni1980 , 09.06.2020 13:48

Hi Leute. meine optokoppler schaltung ist fertig. sketch habe ich diesen genommen. Arduino pin ist 7 habe diesen pin auch vergeben. zentrale ist die dr5000 aber irgendwie funktionirt das nicht. was habe ich vergessen oder was mache ich falsch. aufjeden fall nach dem aufspielen von dem sketch ist ser servo auf 0 position gefahren

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Arduino DCC Servo and Function Decoder.
// Author: Author: Ruud Boer - January 2015
// This sketch turns an Arduino into a DCC decoder with max 12 servo motor outputs combined with function outputs.
// The DCC signal is optically separated and fed to pin 2 (=Interrupt 0). Schematics: www.mynabay.com
// Many thanks to www.mynabay.com for publishing their DCC monitor and -decoder code, which is used in this sketch.
//
// Important Change:
// This sketch from Ruud Boer was changed by lordbrummi in April 2016
// Now you can connect a PWM Arduino Servo Shield with 16 possible servos and adress them with DCC adresses
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORTANT: GOTO lines 22, 49, 72 to configure some data!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#include <DCC_Decoder.h>
#include <Servo.h>
#define kDCC_INTERRUPT 0

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fill in these 1 value ...
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const byte maxservos = 2; //The number of servos you have connected to this Arduino IMPORTANT!!!!!
const byte servotimer = 10; //Servotimer, higher value is slower
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the Servomin and the Servomax of your servo between the gear range possibility IMPORTANT!!!!!
const int SERVOMIN = 150; // this is the 'minimum' pulse length count (out of 4096)
const int SERVOMAX = 600; // this is the 'maximum' pulse length count (out of 4096)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

unsigned long timetoupdatesetpoint = millis() + servotimer;

struct DCCAccessoryAddress {
int address; // DCC address to respond to
byte output; // State of accessory: 1=on, 0=off (for internal use only)
int outputPin; // Arduino output pin
int change; // State of accessory change: 1=change, 0=no change (for internal use only)
};

DCCAccessoryAddress accessory[maxservos];
struct servoItem {
int angle;
int setpoint;
int offangle;
int onangle;
byte inverted;
int servo;
byte functionnumber;
};

servoItem servos[maxservos];

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fill in the address and pin for every accessory / function. Servos are 'coupled' to accessory[n] in line 72 and further. IMPORTANT!!!!!
// COPY - PASTE as many times as you have functions. The amount must be same as in line 22 above!
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ConfigureDecoderFunctions()
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
accessory[0].address = 1; // DCC address for this accessory IMPORTANT!!!!!
accessory[0].outputPin = 13; // Arduino pin where accessoryis connected to

accessory[1].address = 2; // DCC address for this accessory
accessory[1].outputPin = 13; // Arduino pin where accessory is connected to
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// Setup output pins for accessories
for(int i=0; i<maxservos; i++)
{
if( accessory[i].outputPin )
{
pinMode (accessory[i].outputPin, OUTPUT );
digitalWrite (accessory[i].outputPin, LOW);
}
}
} // END ConfigureDecoderFunctions


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fill in the attributes for every servo
// COPY - PASTE as many times as you have servo's. The amount must be same as maxservos in line 22 above!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ConfigureDecoderServos()
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
servos[0].angle=90; //initial angle of servo. Make this the same as offangle to avoid startup jitter. IMPORTANT!!!!!
servos[0].offangle=0; //minimum angle. Do not use value too close to 0, servo may stutter at the extremes.
servos[0].onangle=180; //maximum angle. Do not use value too close to 180, servo may stutter at the extremes.
servos[0].servo=0; //Arduino pin number where servo is connected to
servos[0].functionnumber=0; // CONNECTION BETWEEN FUNCTION AND SERVO ()accessory[functionnumber] - see above) !!!!!!

servos[1].angle=90;
servos[1].offangle=0;
servos[1].onangle=180;
servos[1].servo=1;
servos[1].functionnumber=1;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// A servo is coupled to an accessory[n]. It rotates based on accessory[n].output = 1 or 0
// If you have multiple servos you need to couple them to different accessories. However ...
// accessories may switch the same output pin (e.g. pin 13, which has the on board led attached)

} // END ConfigureDecoderServos



/////////////////////////////////////////////////////////////////////////////////////////
// DCC packet handler
/////////////////////////////////////////////////////////////////////////////////////////
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
{
// Convert NMRA packet address format to human address
address -= 1;
address *= 4;
address += 1;
address += (data & 0x06) >> 1;

boolean enable = (data & 0x01) ? 1 : 0;

for(int i=0; i<maxservos; i++)
{
if(address == accessory[i].address)
{
if (enable)
{
if (accessory[i].output == 0)accessory[i].change = 1;
accessory[i].output = 1;
}
else
{
if (accessory[i].output == 1)accessory[i].change = 1;
accessory[i].output = 0;
}
}
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Setup (run once)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
ConfigureDecoderFunctions();
ConfigureDecoderServos();
DCC.SetupDecoder( 0x00, 0x00, kDCC_INTERRUPT );
pinMode(2,INPUT_PULLUP); //Interrupt 0 with internal pull up resistor (can get rid of external 10k)
//pinMode(A5,INPUT_PULLUP); //If made LOW, all servos go to their min angle, to avoid jitter at starup. - Not to use with PWM Servoshield because it uses already pinMode A5
pinMode(13,OUTPUT);
digitalWrite(13,LOW); //switch off Arduino led at startup

Serial.begin(9600);

pwm.begin();

pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates

for (int n=0; n<maxservos; n++)
{
pinMode(accessory[n].outputPin,OUTPUT); //Set accessory pins to OUTPUT mode
servos[n].onangle = map(servos[n].onangle,0,180,SERVOMIN,SERVOMAX); // Adjust the angles to the range given by Servomin and Servomax
servos[n].offangle = map(servos[n].offangle,0,180,SERVOMIN,SERVOMAX);
servos[n].angle = map(servos[n].angle,0,180,SERVOMIN,SERVOMAX);
pwm.setPWM(servos[n].servo, 0, servos[n].angle); // Set Servos to angle at startup
}



yield();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Main loop (run continuous)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
static int addr = 0;

DCC.loop(); // DCC library

if( ++addr >= maxservos ) addr = 0; // Next address to test

// Set accessory output pin
if (accessory[addr].change == 1)
{
if (accessory[addr].output)
{
digitalWrite(accessory[addr].outputPin, HIGH);
}
else
{
digitalWrite(accessory[addr].outputPin, LOW);
}
}


// Every 'servotimer' ms, modify setpoints and move servos 1 step (if needed)
if (millis() > timetoupdatesetpoint)
{
timetoupdatesetpoint = millis() + servotimer;

for (int n=0; n<maxservos; n++)
{
if (accessory[servos[n].functionnumber].change == 1)
{
if (accessory[servos[n].functionnumber].output) servos[n].setpoint=servos[n].onangle;
else servos[n].setpoint=servos[n].offangle;

if (servos[n].angle < servos[n].setpoint) servos[n].angle++;
if (servos[n].angle > servos[n].setpoint) servos[n].angle--;

pwm.setPWM(servos[n].servo, 0, servos[n].angle);

if (servos[n].angle == servos[n].setpoint)
{
accessory[servos[n].functionnumber].change = 0;
Serial.println("Weiche wurde gestellt!");
}
}
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Move all servos to min position and set all function outputs to 0, to eliminate startup servo jerk current draw
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//if (digitalRead(A5)==LOW) {for (int n=0; n<maxservos; n++) accessory[n].output = 0;} - Not to use with PWM Servoshield because it uses already pinMode A5

} //END MAIN LOOP


Mfg Martin


stoni1980  
stoni1980
Regionalbahn (RB)
Beiträge: 43
Registriert am: 07.04.2020


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz