Lokdecoder mit KI 2

Aufgrund der Inhalte des Kapitels 'Lokdecoder mit KI 1' sahen wir uns bemüßigt, die Sache noch etwas mehr auf die Spitze zu treiben, wie das nun einmal unsere Art ist. Immerhin hatten wir das Programm
zur Ansteuerung des SG 90 bereits.
Schon die ganze Zeit schleichen wir um das Problem herum, die Mobile Station 2 noch etwas genauer zu untersuchen, aber eben nicht durch Auszählung von Bits mit Hilfe des Oszilloskops. Das müsste
irgendwie einfacher gehen, nämlich direkt mit Nullen und Einsen.
Was also hindert uns also daran, ChatGPT damit zu beauftragen. Gesagt, getan:
Das wird jetzt deutlich schwieriger. Gesucht ist ein Programm, dass ein auf die Schienen einer Modellbahn ausgegebenes DCC-kompatibles und durch einen Arduino Mega wieder aufgenommenes Signal
ausliest und als Nullen und Einsen ausgibt.
Ah, jetzt wird's spannend!
Du willst also das DCC-Signal (Digital Command Control, nach NMRA-Standard) einer Modellbahn vom Gleis abgreifen, mit dem Arduino Mega einlesen und dann die Bitfolge (0/1) ausgeben.
Das ist ein Stück komplexer als die Servo-Steuerung, weil:
DCC ist ein bipolares Signal mit ca. ±15-18 V auf den Schienen.
Die Daten sind als Manchester-Code codiert:
"1" = zwei Halbwellen mit je ~58 µs
"0" = zwei Halbwellen mit je ~100-116 µs
Um einen Kommentar ist ChatGPT also nicht verlegen. Aber solange er nicht frech wird und seine Arbeit macht. Er hat sogar noch einen äußerst wichtigen Tipp parat:
Du kannst das Signal nicht direkt an den Arduino anschließen, da es zu hohe Spannung hat!
Übliche Vorgehensweise:
Einen Optokoppler (z. B. 6N137 oder 6N136) oder einen Transistor mit Spannungsteiler verwenden, um das DCC-Signal auf 5 V-Pegel zu bringen.
Dann an einen Interrupt-Pin (z. B. Pin 2 oder 3 beim Mega) anschließen.
Was fehlt uns, um das Programm auszuprobieren? Natürlich der Optokoppler. Wir hatten uns schon lange einen Tipp gewünscht, um mit der hohen Spannung auf dem Gleis fertig zu werden. Es heißt
allerdings auch im Netz, manche Optokoppler seien zu langsam.
Die würden dann das Signal so weitergeben, dass eine nachfolgende Umwandlung in Nullen und Einsen schwierig würde. Wir vermuten aber, ChatGPT hat seine Weisheiten von irgendeinem Programm, das
auch entsprechend getestet wurde, mitsamt der Hardware-Ausstattung.
Also rasch ein Angebot eingeholt. Der 6N136 erweist sich als deutlich günstiger als der 6N137. Der nächste Schritt ist, die Schnelligkeiten zu ermitteln. In den Datenblättern wird 1 Mbit/s für den 6N136 10
Mbit/s für den 6N137 angegeben.
1 Mbit/s, das sind 1.000.000 Bits in einer Sekunde, einer in 1 µs. Im DCC-Signal muss als kürzestes Signal die '1' erkannt werden, 58 µs lang. Dann wären also rein theoretisch 58 Zugriffe möglich. Das reicht
uns eigentlich. Es müssen nicht unbedingt 580 sein.
Zumal es da ein Privat-Angebot von 7,99 € für zwanzig 6N136 gibt. Das wären 0,40 € pro Stück, ideal für unsere fortgeschrittene Sparsamkeit bei Bauteilen für den Lokdecoder.
volatile unsigned long lastTime = 0;
volatile unsigned long pulseWidth = 0;
volatile byte bitVal = 0;
volatile bool newBit = false;
void setup() {
Serial.begin(115200);
// Interrupt auf Pin 2 (INT0)
attachInterrupt(digitalPinToInterrupt(2), dccInterrupt, CHANGE);
}
void loop() {
if (newBit) {
Serial.print(bitVal);
newBit = false;
}
}
// ISR für Signaländerungen
void dccInterrupt() {
unsigned long now = micros();
pulseWidth = now - lastTime;
lastTime = now;
// DCC: 1 ~58µs, 0 ~100-116µs (wir nehmen Toleranzbereiche)
if (pulseWidth > 40 && pulseWidth < 70) {
bitVal = 1;
newBit = true;
}
else if (pulseWidth > 80 && pulseWidth < 130) {
bitVal = 0;
newBit = true;
}
}
Erklärung
Der Interrupt misst jeden Flankenwechsel am DCC-Signal.
Mit micros() wird die Pulsbreite bestimmt.
Je nach Länge entscheidet das Programm: "1" oder "0".
Über Serial.print() siehst du die Rohbits im Monitor.
Damit bekommst du erstmal die Bitfolge aus dem Gleis.
Willst du, dass ich im nächsten Schritt auch zeige, wie du daraus gültige DCC-Pakete (Adresse, Befehl, Prüfsumme) zusammensetzen kannst?
Nein, noch nicht. Hoffentlich morgen werden die Optokoppler geliefert. Dann wollen wir einmal sehen, ob die Mobile Station 1 und 2 ein auslesbares DCC-Signal liefern. Erst dann kommen wir auf die angebotenen DCC-
Signale zurück.

kfz-tech.de/YM1018