Forum: Mikrocontroller und Digitale Elektronik Arduino + Xpressnet (Lenz/Roco Lokmaus)


von Jan Christian H. (jhaddorp)


Lesenswert?

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

von Georg I. (dschi-ai)


Lesenswert?

2Die Google Suche nach "lokmaus protokoll" ergibt zufälligerweise 
sinnvolle Ergebnisse, z.B.:
http://www.opendcc.de/info/xpressnet/multimaus.html

von Jan Christian H. (jhaddorp)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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 ...

von Jan Christian H. (jhaddorp)


Lesenswert?

@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 ;-)

von Thomas P. (topla)


Lesenswert?

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

von Jan Christian H. (jhaddorp)


Angehängte Dateien:

Lesenswert?

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
}

von Thomas P. (topla)


Lesenswert?

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

von Jan Christian H. (jhaddorp)


Lesenswert?

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

von Thomas P. (topla)


Lesenswert?

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

von Stephan (Gast)


Lesenswert?

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

von Jan Christian H. (jhaddorp)


Lesenswert?

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
Noch kein Account? Hier anmelden.