Hallo, ich versuche, meine Modellbahn via Arduino zu steuern. Für die Medellbahnsteuerung nutze ich die Roco Lokmaus. Nach meinem Verständnis arbeitet die Lokmaus über Xpressnet, der wiederum auf RS 485 basiert. Nun dachte ich, dass die Steuerung mittels Arduino relativ einfach sein müsste. MAX 485 an Arduino und dann an den Booster der Lokmaus. Bislang laufen meine Versuche jedoch erfolglos. Ich sehe keine Kommunikation auf den seriellen RS 485 Bus. Ebenfalls bin ich mir nicht sicher, ob zunächst spezielle Initialisierungskommandos an den Bus gesendet werden müssen (außer Baud Rate, Datenbits usw.). Gibt es in dieser Richtung Tipps/Erfahrungen oder evtl. sogar einfach nachzubauende Lösungen? Es geht mir nicht um eine vollwertige Steuerung, mehr darum, via Arduino einfach Kommandos an eine Lok senden zu können. Vielen Dank und viele Grüße Jan Christian
2Die Google Suche nach "lokmaus protokoll" ergibt zufälligerweise sinnvolle Ergebnisse, z.B.: http://www.opendcc.de/info/xpressnet/multimaus.html
Danke für die Antwort... Dies ist Seite, die mich auf die Idee gebracht hat. Und diese Seite lässt mich auch vermuten, dass es eigentlich gar nicht so schwer sein dürfte. Was ist bislang jedoch nicht geschafft habe, ist die funktionieren Verbindung des Arduino mit dem Xpressbus. Da gibt es verschiedene Fehlerquellen: Verkabelung des Max 485, fehlerhafte Initialisierung der Seriellenschnittstelle, gedankliche Schwachstellen... Interessant ist auch folgender Artikel. Leider geht diese Lösung direkt an den PC und nicht an einen Arduino. Wobei die Verkabelung via Arduino eigentlich einfacher sein sollte. http://www.opendcc.de/elektronik/dcc_sniffer/xp_sniffer_sw.html
Zitat von der dcc-Sniffer Webseite: Der DCC Schnüffel ist ein Meßkopf für DCC. Er basiert auf Atmega162 und wird per USB an den Computer angeschlossen. und dein Arduino besteht im Kern aus ... ??? - Denk mal drüber nach ...
@Chris: Danke für den Hinweis... Soweit war ich auch schon... Wie beschrieben bin ich auf der Suche nach Leute, die dies bereits erfolgreich umsetzt haben, eine kleinen Schaltplan zur Kontroller meiner Schaltung, einer paar Code Zeilen oder vielleicht ein paar Tipps, warum es bei mir nicht funktoniert. (Gut gemeinte) Schlaubertipps gehören nicht zum Gesuchten ;-)
Jan Christian Haddorp schrieb: > Nun dachte ich, dass die Steuerung mittels Arduino relativ einfach sein > müsste. MAX 485 an Arduino und dann an den Booster der Lokmaus. Klingt ziemlich konfus. Sicher, dass Du das Prinzip Lokmaus/Xpressnet richtig verstanden hast? > Bislang laufen meine Versuche jedoch erfolglos. Ich sehe keine > Kommunikation auf den seriellen RS 485 Bus. Sieht man schon. Irgendwas machst Du grundlegend falsch. > Ebenfalls bin ich mir nicht sicher, ob zunächst spezielle > Initialisierungskommandos an den Bus gesendet werden > müssen (außer Baud Rate, Datenbits usw.). Nein, müssen sie nicht, gleich garnicht von einem Slave. Wie immer: Stelle hier Deinen Schaltplan und das Programm ein. Thomas
Anbei der Arduino Code und die Schaltung. Der Arduino ist als Slave mit dem Booster der Lokmaus verbunden. Inzwischen bin ich einen Tick weiter. Auf dem Display erscheinen nun zumindest wirre Zeichen... Die I2C Kommunikation zum Display ist ok. An dieser Stelle wäre ein zweiter serieller Port am Arduino sinnvoll. Aktuell überscheiden sich Programmierport und Port fürs Xpressnet. Die Einstellungen zu Baud und Datenbits entsprechen nicht dem Standard. Für die Initialisierung habe ich daher die Lib SerialExtension eingebunden. PS.: Ich bin mir nicht sicher, ob ich das Lokmaus/Xpressnet Prinzip komplett verstanden habe... Aber ich hoffe, dies gelingt mir noch ;-)
1 | #include <Wire.h> |
2 | #include <LiquidCrystal_I2C.h> |
3 | #include <SerialExtension.h> |
4 | |
5 | LiquidCrystal_I2C lcd(0x38, 16, 2); |
6 | |
7 | void setup() |
8 | {
|
9 | lcd.init(); |
10 | lcd.home(); |
11 | lcd.backlight(); |
12 | lcd.print("Hello world..."); |
13 | |
14 | SetSerial(62500, 'n', 9, 1); |
15 | }
|
16 | |
17 | int incomingByte = 0; |
18 | |
19 | void loop() |
20 | {
|
21 | lcd.setCursor(0, 1); |
22 | while (Serial.available() > 0) |
23 | {
|
24 | incomingByte = Serial.read(); |
25 | lcd.print(incomingByte, HEX); |
26 | }
|
27 | }
|
So schlecht sieht das doch nicht aus. Es gibt Folgendes zu tun: 1. Prüfen, ob mit der verwendeten Quarzfrequenz die 62500bd genau genug erreicht werden können. 2. 9. Bit berücksichtigen, das ist immer die Kennung für den Anfang einer Kommunikation. 3. "wirre Zeichen": Meinst Du, Du kannst 62,5kbd noch mitlesen? Macht das I²C auf dem Arduino diese Geschwindigkeit mit? 4. Zum späteren Senden: DE/RE schaltbar machen Thomas
Danke soweit... Was meinst du mit 9. Bit berücksichtigen? Ich habe gelesen, dass es 9 Datenbits gibt. Aber was bedeutet dies in der Praxis? 1. Wie lässt sich die prüfen? Grundsätzlich sollte der Arduino doch geeignet sein, schließlich soll die Lokmaus ähnlich aufgebaut sein. Oder meinst du, ein USB zu RS485 Adapter am PC wäre effektiver? 3. Es sieht so aus, als ob auf dem Display einfach nur Zeichen durchlaufen. Ok, mitlesen geht bei voller Geschwindigkeit sicherlich nicht ;-) Meine Annahme war, dass nur hin und wieder Daten übertragen werden. Also bspw. wenn ein Kommando gesendet wird. 4. Ja, macht Sinn. Viele Grüße, Jan Christian
Jan Christian Haddorp schrieb: > Danke soweit... Was meinst du mit 9. Bit berücksichtigen? Ich habe > gelesen, dass es 9 Datenbits gibt. Aber was bedeutet dies in der Praxis? Du initialisierst doch die serielle Schnittstelle selber mit 9 Datenbits. Und wenn man 9 Datenbits empfängt, sollte man sich auch Gedanken machen, was man damit anfängt. Wie schon geschrieben, ein gesetztes 9. Datenbit kennzeichnet den Kommunikationsbeginn durch die Zentrale (Token). > 1. Wie lässt sich die prüfen? Grundsätzlich sollte der Arduino doch > geeignet sein, schließlich soll die Lokmaus ähnlich aufgebaut sein. Oder > meinst du, ein USB zu RS485 Adapter am PC wäre effektiver? Taktfrequenz des verwendeten Controllers / 62500 sollte möglichst einen ganzzahligen Teiler ergeben, der mit den Vorteiler der verwendeten CPU auch erreicht werden kann. Funktioniert das nicht, ist zu prüfen, ob die genutzte Einstellung innerhalb der erlaubten Toleranz liegt. Das entsprechende Datenblatt des benutzten AVRs hilft da weiter. Eine Lokmaus ist kein Arduino. Wenn "ähnlich" die Verwendung eines µCs bedeutet: ja. Ein RS485-USB-Adapter wird Dir keinen cm weiter helfen. Mir ist kein Adapter bekannt, der RS485-seitig mit 9 Datenbits umgehen kann (das heißt nicht, dass es keinen geben könnte). Ich wüsste auch nicht, wie der PC dazu zu überreden wäre. > 3. Es sieht so aus, als ob auf dem Display einfach nur Zeichen > durchlaufen. Ok, mitlesen geht bei voller Geschwindigkeit sicherlich > nicht ;-) Meine Annahme war, dass nur hin und wieder Daten übertragen > werden. Also bspw. wenn ein Kommando gesendet wird. Sicher laufen nur Zeichen durch, aber zum Mitlesen eben etwas zu viele. Die Annahme ist falsch. Das ist ein Master-Slave-System mit maximal 32 Busteilnehmern und da können ja wohl nicht nur beim Senden eines Slaves Daten übertragen werden. Thomas
Hallo Jan, die erste Lokmaus ist gleichzeigt die Zentrale. Der Booster/Verstärker hat keine Intelligenz. Deshalb muss mindestens eine Lokmaus2/Multimaus eingesteckt sein. Grüße Stephan
Hallo, inzwischen funktioniert es. Der Arduino wird wie geplant an RS 485 Lokmaus bzw. Lenz Zentrale angeschlossen. Trick ist der Arduino Mega. Dieser bietet mehrere serielle Ports und kommt auch mit der 9-bit Kommunikation zurecht. Angepasster Hardware Treiber und Basis Implementierung der Schnittstelle finden sich hier... https://github.com/nzin/xpressnet_arduino Viele Grüße Jan Christian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.