Schweineschnäuzchen

Arduino, DCC++ und Rocrail

DCC und Rocrail kennt ihr … Arduino noch nicht ?
Ich möchte Euch auf dieser Seite die Verwendung von Arduinos im Zusammenhang mit DCC++ und Rocrail näher bringen. Und wenn Fragen offen bleiben, dann fragt bitte nach. Wenn die Thematik einem schon bekannt ist, dann ist vieles schon selbstverständlich und wird in so einer kleinen Doku schnell vergessen. An der Stelle also schonmal “Danke” für Eure Hilfe !

Ein kleiner Hinweis : Diese Seite ist schon freigeschaltet, obwohl sie lange nicht fertig ist, wundert Euch also nicht, dass weiter unten quasi “das Messer im Schwein stecken geblieben ist”. Eins ist sicher : Die Seite wird je nach Zeit und Lust ausgebaut !

Was ist Arduino und was kann das ?

Für ausführliche Erklärung verweise ich hier auf
Arduino bei Wikipedia
und
Arduino Homepage
Wer tiefer einsteigen will, ist dort gut aufgehoben. Ich werde hier nur das behandeln, was im Zusammenhang mit dem DCC++ Projekt steht.
Der Arduino ist für das DCC++ Projekt in zwei Ausführungen interessant :
- Arduino UNO
- Arduino MEGA 2560
Der bedeutende Unterschied in Verwendung mit DCC++ liegt in der Anzahl der I/O-Pins : 14 Pins beim UNO stehen 54 Pins beim MEGA gegenüber. Außerdem hat der MEGA mehr Speicher, die Ausführungsgeschwindigkeit ist aufgrund der identischen Taktrate von 16MHz identisch.
Mit dem UNO ist also der gut bedient, der nur die DCC-Signal-Erzeugung benötigt, und ggf. noch ein paar wenige Eingänge, zum Beispiel für einen Pendelzugbetrieb. Alle Anderen stoßen beim UNO schnell an die Grenzen und freuen sich über die 40 zusätzlichen IO's des MEGA.
Der Arduino UNO ist bei den bekannten Distributoren für ca. 20€ zu bekommen, der Arduino MEGA liegt mit 35€ zwar preislich deutlich darüber, aber letztendlich sind das dann nur ca. 0,40€ pro zusätzlichem Pin.
Dem Leser, der jetzt schon mehrfach über den Begriff I/O gestolpert ist, sei erklärt, dass es sich, wie üblich, um englische Abkürzungen handelt :
- I = Input = Eingang
- O = Output = Ausgang
Und mit dem Begriff I/O kennzeichnet man Pins, die mal sowohl als Eingang, als auch als Ausgang konfigurieren kann. Einen Eingang nimmt man zum Beispiel für den Anschluss eines Tasters, einen Ausgang nimmt man zum Beispiel für den Anschluss einer LED.
Während der Taster eine Information in Richtung ZUM Arduino-Eingang liefert (z.B. Taster ist gedrückt), bekommt die LED ihre Information VOM Arduino-Ausgang (z.B. LED soll leuchten). Wer jetzt an einen “Raspberry” denkt, der liegt garnicht so falsch. Der Raspberry ist von der Konzeption mit seinen I/O's ähnlich, allerdings höherwertiger angesetzt, und benötigt (zumindest für den Einsteiger) zudem Tastatur und Bildschirm. Die Arduinos steckt man per USB an seinen Computer, startet die Programmierumgebung und los geht's. Die Ähnlichkeiten bzw. die Unterschiede zwischen Arduino und Raspberry aufzuzeigen, würde allerdings den Rahmen hier sprengen.

Was hat nun DCC damit zu tun, und was haben die beiden Pluszeichen da zu suchen ?

Die Arduino's an sich können beide kein DCC-Signal erzeugen, sondern sie stellen quasi nur die Logik-Plattform zur Verfügung. Für die Erzeugung des DCC-Signals benötigt man zusätzlich einen sogenannten “Motor-Shield”, das ist eine Platine, die man auf beide genannten Arduinos aufstecken kann.
Dieser “Motor-Shield” ist eigentlich dafür gedacht, um zwei Gleichstrommotore laufen lassen zu können, und die Drehrichtung, wie auch die Geschwindigkeit beeinflussen zu können. Bei den üblichen Distributoren kann man das Motorshield für ca. 20€ erwerben.
Irgendwann ist jemandem dann wohl die Idee gekommen, dass man mit so einem Motorshield auch ein DCC-Signal erzeugen könnte. Diese Programmierung des Arduino hat der schlaue Mann mit der Programmiersprache C++ gemacht, und aus dem DCC-Signal und der Programmiersprache C++ war dann der Name des Projekts geboren : DCC++ (wer sich da näher einlesen möchte, und des Englischen mächtig ist : www.trainboard.com

Und wie macht man Rocrail das alles klar ?

Rocrail geht mit DCC++ und der passenden Hardware genauso um, wie mit jeder anderen Zentrale. Für jede Zentrale hat Rob sogenannte Bibliotheken erstellt, in denen definiert ist, wie das Datentelegramm zur Zentrale zu verschlüsseln ist, und natürlich auch, wie das Datentelegramm von der Zentrale zu entschlüsseln ist.
Dem Einen oder Anderen mag es widerstreben, in der Arduino-Motorshield-Kombination eine Zentrale zu sehen, aber es ist so.
Bevor ich jetzt in's “Eingemachte” gehe, sei noch aus eigener Erfahrung der Hinweis gestattet :
DCC++ ist recht neu, und deswegen bitte Rocrail auf den aktuellen Stand bringen, bevor mit DCC++ getestet wird !
In Rocrail lege ich die Zentrale für DCC++ genauso an, wie jede andere Zentrale, und anschließend kann ich bei der Definition der Rückmelder, Weichen, Signale oder was auch immer auf die Bezeichnung der Zentrale zurückgreifen, wie bei jeder anderen Zentrale auch.
Dass man einen Stromfühler-Rückmelder vom Gleis aus nicht direkt an den Arduino anschließen kann, sondern wie bei anderen Zentralen auch über eine Adapterplatine (z.B. die CGA's von Peter) gehen muss, sei nur vorsichthalber erwähnt. Das Gleiche gilt natürlich sinngemäß für die Ansteuerung von Weichen oder Signalen. Es würde ja auch keiner auf die Idee kommen, an die RocNetNode-Platinen, die man über den Raspberry betreiben kann, direkt ein Gleis oder eine Weiche anzuschließen.

Von der Theorie in die Praxis

Im folgenden werde ich Schritt für Schritt mit Bildschirm-Fotos erklären, wie man einen Arduino als Zentrale einrichtet, wie man einen Gleisrückmelder definiert und wie man eine Weiche definiert.
Den Anfang soll aber das eigentliche Einrichten der Zentrale machen. Ich zeige das hier am Beispiel eines Arduino UNO mit einem Arduino Motorshield.

Die Zentrale einrichten

Schritt 1 : Arduino-IDE von arduino.cc herunterladen und installieren
Schritt 2 : Das DCCpp-Programm herunterladen und abspeichern
Schritt 3 : Arduino-IDE starten
Die Arduino-IDE nach dem Start
Schritt 4 : Die Arduino-IDE auf den passenden Arduino einstellen
Schritt 5 : Das Script “DCCpp_UNO.ino” in die Arduino-IDE laden
Die Arduino-IDE mit geladenem DCCpp-Script
Schritt 6 : Das Script “DCCpp_UNO.ino” in den Arduino hochladen
Die Arduino-IDE nach dem Hochladen des Scripts
Schritt 7 : Kontrolle, ob das Script sich im Terminal richtig meldet
Die Arduino-IDE bei der Funktionsprüfung


Schritt 8 : In Rocrail unter “Rocrail-Eigenschaften” eine Zentrale mit der Kennung “dccpp” hinzufügen
Einrichten der DCCpp-Zentrale, Schritt 1
Schritt 9 : Die neue Zentrale in der Übersicht doppelklicken, ihr einen Namen geben und einen USB-Port zuweisen
Einrichten der DCCpp-Zentrale, Schritt 2
Schritt 10 :Nach Bestätigung mit “OK” sollte die Zentralen-Übersicht dann in etwa so aussehen
Einrichten der DCCpp-Zentrale, Schritt 3
Die ganzen Optionen in den einzelnen Fenstern lassen wir unverändert, im Moment sind die für uns in Ordnung !

Einrichten der I/O's im Arduino

Als erstes in “Rocrail Eigenschaften” die DCCpp-Zentrale doppelklicken und den Reiter “I/O” auswählen. Das folgende Fenster sollte dann so aussehen :
Einrichten von IO in der DCCpp-Zentrale
Jetzt als “Typ” den “Eingang” wählen, dann den Pin auf “2” setzen, als “Option” das “Umkehren” einstellen (zu dem Sinn der Option komme ich später noch), und dann mit “Hinzufügen” in den Arduino speichern. Hierbei sollte natürlich sinnigerweise ein Arduino angeschlossen sein, sonst gibt es Fehlermeldungen im “Server-Fenster” von Rocrail ! Dananch sollte das Fenster so aussehen :
Einrichten von IO in der DCCpp-Zentrale
Das wiederholen wir mit Pin 3 und ohne die Option “Umkehren”, am Schluss nicht das “Hinzufügen” vergessen ! Anschließend sollte das Fenster so aussehen, wie im folgenden Bild. Wenn nicht, dann die zuletzt hinzugefügte Zeile mit “Löschen” entfernen und nochmal probieren.
Einrichten von IO in der DCCpp-Zentrale
Jetzt wählen wir als “Typ” den “Ausgang”, als Pin “6” und drücken “Hinzufügen”.
Einrichten von IO in der DCCpp-Zentrale
Zum Schluss noch einen Ausgang auf Pin 7 mit der Option “Umkehren” - “Hinzufügen” nicht vergessen !
Einrichten von IO in der DCCpp-Zentrale
Wenn bisher alles gut gelaufen ist, dann machen wir jetzt die Kontrolle, und lesen das aus, was im Arduino gespeichert ist. Mit der Taste “Abfrage” wird die I/O-Konfiguration aus dem Arduino ausgelesen und angezeigt. Das ist auch die erste Kontrolle, die man bei einer Fehlfunktion machen sollte, bevor man woanders sucht ! Nach unseren Einstellungen von eben sollte das Fenster so aussehen :
Einrichten von IO in der DCCpp-Zentrale
Ja, richtig, die Tabelle sieht so aus, wie nach der Definion von Pin 7. aber beim Definieren stehen in der Tabelle nur die Änderungen, und nicht das, was vorher schon im Arduino konfiguriert war. Das kontrolliert man einzig und alleine mit “Abfrage” !
So, jetzt haben wir unsere ersten I/Os definiert, war doch garnicht schwer. Die Definition im Arduino ist nötig, weil der Arduino nahezu jeden “freien” IO als Eingang oder als Ausgang behandeln kann. Und dafür muss er ja wissen, was wir von ihm wollen - und deswegen die eben beschriebene Konfiguration.

Nein, ich habe es nicht vergessen : die Option “Umkehren” sollte noch erklärt werden, was ich jetzt tun möchte.
Dazu muss ich etwas in die Grundlagen. Digitaltechnik kennt nur zwei Zustände, die am einfachsten mit “1” und “0” beschrieben werden, andere Bezeichnungen sind “High/Low”, “True/False” oder die deutschen Entsprechungen. Ich habe mich immer an “1/0” gehalten, da damit auch die Boolsche Algebra anschaulicher ist, die beim Programmieren ab und zu vonnöten ist, hier aber kein Thema sein soll. Viele Vergleiche gibt es von Digitalsystemen mit Wassersystemen. Ein Ausgang ist wie ein Wasserkran, und ein Eingang ist wie eine Wassersenke (Abfluss). Und so wie zwei Wasserkräne zusammen eher eine Überflutung veranstalten, so ist es auch beim Digitalsystem, dass zwei Ausgänge nicht ohne Sicherungsmaßnahmen zusammengeschaltet werden sollten. Zwei Wassersenken hingegen kann man ebenso wie zwei Eingänge relativ problemlos zusammenschalten.
Ein Standard-Ausgang ist “Aktiv” spannungsführend, ein Standard-Eingang erwartet für eine “Aktiv-Rückmeldung” Spannung an seinem Eingang. So hat Digitaltechnik angefangen. In dem Moment, wo mehrere Ausgänge auf einen Eingang wirken sollen, da wird es komplizierter. Wie oben geschrieben braucht man da Sicherungsmaßnahmen. Eine Möglichkeit ist, den Eingang mit einem Widerstand fest gegen die Plus-Spannung zu legen, und mit einem Masse-Signal zu schalten. Von diesen Masse-Signalen kann man beliebig viele parallel schalten. Wenn nur eines dieser Masse-Signale am Eingang ankommt, so wird der Eingang von “Spannung” auf “Masse” gezogen, zum Beipsiel durch einen offen Kollektor, den es heutzutage an vielen IC-Ausgängen gibt. Dieser beschriebene Eingang verhält sich damit also “umgekehrt” zu dem Standard-Eingang, und das kann der Arduino intern schalten, und wir können es mit der Option “Umkehren” in der Komfiguration einschalten. Jeder Eingang, bei dem “Umkehren” aktiv ist, wird also mit einem Masse-Signal aktiviert (zu einem praktischen Beispiel kommen wir weiter unten).
Bei den Ausgängen verhält es sich entsprechend. Standard ist ein Ausgang aktiv spannungsführend, spätestens dann, wenn er einen eben beschriebenen “Offenen-Kollektor-Eingang” beschalten soll, muss auch hier das Signal umgedreht werden. Das liest sich jetzt recht komplex und kompliziert, daher noch mal kurz zusammengefasst :
Ein “normaler Eingang” braucht eine “1”, wenn er aktiviert werden soll, ein “invertierter Eingang” eine “0”.
Ein “normaler Ausgang” gibt eine “1” raus, wenn er aktiv ist, ein “invertierter Ausgang” eine “0”.

Viele Zusatzschaltungen haben an den Ausgängen ICs mit offenen Kollektoren, so dass die Eingänge “umgekehrt” werden müssen. Ein gutes Beispiel ist der Stromfühler-Sensor MGV93 von Peter, den ich mit meinem Arduino bereits auprobiert habe. Damit komme ich zur nächsten Hürde : wie schliesst man sowas an einen Arduino an ?

Einen Stromfühler-Rückmelder an den Arduino anschließen

Anschluss des Arduino an einen Stromfühler MGV93
Ich habe hier den für den Anschluss wesentlichen Teil des MGV93 kopiert und mit Text am Steckverbinder versehen. Für denjenigen, der Schaltungen lesen kann, wird schnell deutlich, dass +5V und GND (Masse) von außen (in diesem Fall vom Arduino) zugeführt werden müssen. Weder Spannungsversorgung noch Ausgänge haben eine Verbindung zum eigentlichen “Stromfühler-Teil”, denn Peter hat hier sogenannte Optokoppler eingesetzt, die die Gleisspannung sauber von der Steuerspannung trennen. Damit kann der Steuerungsseite nichts passieren, wenn auf der Gleisseite mal irgendwas schief geht. Für den Anschluss von ”+5V” und “GND” bitte nur die entsprechend beschrifteten Pins des Arduino nehmen !
Mit den Optokopplern haben wir auch ein sehr gutes Beispiel für den oben angesprochenen “umgekehrten Ausgang”, bzw. den dafür nötigen “umgekehrten Eingang”. Jeden der hier mit “I/O a” bis “I/O h” beschrifteten Ausgänge schließen wir am Arduino an einen freien Steuerpin an, der eine I/O-Nummer größer als 1 hat. In der Einstellung der I/O über die Zentrale werden diese I/O-Pins als “Eingang” mit der Option “Umkehren” eingestellt (also so, wie oben beim Pin 2 gezeigt). Anschließend müssen die Eingänge nur noch in Rocrail eingebaut werden, aber das Procedere kennt ihr ja schon von anderen Zentralen.

In Rocrail eine Weiche einrichten

Wird noch ergänzt …


Personal Tools