Slotbaer / Carrera Digital 124/132 / CU Rundenzähler-Protokoll (Update 2019)

Die nachfolgende Anleitung wurde mit grösster Sorgfalt erstellt. Trotzdem erfolgt der Nachbau auf eigene Gefahr und wir übernehmen weder Verantwortung noch Haftung für eventuell entstehende Schäden jedweder Art. Der Umbau geht über den "normalen" Gebrauch hinaus, so dass Garantie- und Gewährleistungsansprüche erlöschen.

Update 2019: Ursprünglich wurde diese Seite für die CU mit der Versionsnummer 5321 erstellt. Inzwischen ist Carrera bei 5337 angelangt. Zeit für eine Neubetrachtung.

Hardware

Bei den Signalen an der PC-Unit Buchse handelt es sich um serielle Anschlüsse, die mit TTL bzw. CMOS kompatiblen Pegeln arbeiten.

Um mit einem Rechner kommunizieren zu können, muss man dem Rechner diese Signale zugänglich machen.

Weder PCs noch Macs haben dazu geeignete Anschlüsse. Moderne Rechner kommunizieren über die USB Schnitstelle mit externer Hardware.

Kabel Carrera's PC-Unit ist nichts anderes als genau so ein USB-TTL Seriell Converter.

Auf dem PC Zubehör Markt gibt es Tausende von billigen USB-Seriell Convertern. Diese verwenden allerdings RS232C Signal Pegel und dürfen deshalb auf keinen Fall an der CU verwendet werden.

Die Firma FTDI bietet ein Kabel, das die Verbindung zwischen einer TTL kompatiblen seriellen Schnittstelle und einer USB Schnitstelle herstellt. Das Kabel wird u.a. von der Firma Segor angeboten. Es gibt noch weitere günstigere Bezugsquellen. Google hilft da weiter.

Da das Kabel allerdings auf der seriellen Seite keinen passenden Anschluss hat, muss man das Kabel an diesem Ende mit einem passenden Mini Din 6 Stecker versehen. Mac und PC Treiber für das Kabel sind ebenfalls auf der Webseite von FTDI zu finden.

Nebenstehendes Bild zeigt die Anschlussbelegung.

Eine Alternative ist es eine PC-Unit des Carrera Race Management Systems und einen handelsüblichen USB - RS232 Konverter zu verwenden. Man macht aus dem TTL SIgnal der CU durch die alte PC-Unit ein RS232C kompatibles Signal und mit Hilfe des USB-Seriell Konverters aus dem RS232C kompatiblen Signal ein USB Signal.

Eine weitere Variante ist das Verbinden von CU und Rechner über ein Bluetooth Modul. Luftikus beschreibt ein solchen Projekt.

Update 2019: Inzwischen gibt es von Carrera App Connect eine Box, die die Bluetooth LE herstellt. Dazu mehr am Ende dieser Seite.

Die CU hat die Trafospannung an ihrem Stecker liegen und dummerweise auf dem Pin gegenüber Masse. D.h., wenn sie "Vorne" und "Hinten" beim Blick auf die Stecker oder Buchse verwechseln, wird die Masse des FTDI mit der Trafospannung verbunden und die serielle Schnittstelle des Prozessors wird mit einer Spannung von bis zu 22V verbunden. Das macht sie nicht mit und die CU ist schrottreif.
Also vor dem ersten Einschalten zweimal überprüfen.

 

Software

Die Verwendung des oben beschriebenen Konverters ist nur mit rechtmäßig erworbener Software gestattet. bei Weblegung gibt es, außer einer Testversion von iLap, noch keine zur CU kompatible Software. Aber die wird wohl nicht lange auf sich warten lassen.

Update 2019: Es gibt inzwischen reichlich Software auch von Drittherstellern, die die CU und verschiedene Anschlussarten unterstützen. Ich werde keine Empfehlung geben, bemüht bitte eine Suchmaschine.

Das Protokoll

Wie schon erwähnt handelt es sich um eine serielle Schnittstelle, eine asynchrone Datenübertragung im NRZ Verfahren. Die Übertragungsparameter sind 19200 Baud, 8 Bit, Keine Patität, 1 Stop Bit.

Die Kommunikation wird vom Rechner gesteuert, die CU sendet Daten nur als Antwort auf Anfragen.

Der Rechner muss also ständig Anfragen senden.

Es gibt Befehle zum Lesen und zum Schreiben von Daten.

Lesebefehle (Lesen von der Control Unit)

In allen nachfolgenden Beschreibungen sind Zeichen, die vom Rechner gesendet werden, rot und alle Daten, die von der CU gesendet werden, blau.

Der Rechner sendet ein Anführungszeichen gefolgt vom Befehlszeichen z.B. "0.

Nun antwortet die CU mit dem Befehlszeichen gefolgt von den Antwortdaten, einer Prüfsumme und einem abschliessenden $, z.B.: 05321;$.

Der Rechner überprüft die Prüfsumme und quittiert sie mit einem $. Man kann diese Quittierung weglassen, es hat keine negative Auswirkungen.

Die übertragenen Daten sind entweder ASCII Zeichen oder sie stellen binäre Werte dar.

In unserem Besipiel ist die 5 das ASCII Zeichen 5.

Handelt es sich um einen binären Bytewert, so wird er durch zwei aufeinander folgendeZeichen dargestellt. Es werden nur jeweils die unteren 4 Bit jeden Zeichens verwendet. Innerhalb eines Bytes werden zuerst die niederwertigen 4 Bits übertragen und dann die höherwertigen Bits.

Werden längere Werte übertragen, so beginnt die Übertragung mit dem höchstwertigen Byte.

Die Prüfsumme wir ermittelt indem man die unteren 4 Bits aller Daten addiert, dabei die Überträge ignoriert und das Ergebnis mit $30 verodert.

Für unser Beispiel gilt:

  • Die Datenzeichen haben die die Werte $35, $33, $32 und $31.
  • $5 + $3 + $2 + $1 = $B.
  • Sollte die Prüfsumme mehr als eine Stelle umfassen, so wird nur die letzte Stelle verwendet und die anderen Stellen werden verworfen.
  • Die resultierende Prüfsumme $B wird mit $30 verodert und so ergibt sich $3B.
  • $3B entspricht dem ASCII Zeichen ;.

Kennt die CU einen Befehl nicht, so antwortet sie mit einem #.
Z.B.: "H#

Schreibbefehle (Schreiben zur Control Unit)

Der Rechner eröffnet wieder mit Anführungszeichen gefolgt vom Befehlszeichen.

Die CU antwortet mit der Wiederholung des Befehlszeichens.

Nun überträgt der Rechner die Daten gefolgt von Prüfsumme und $ genau wie oben beschrieben.

Die CU quittiert die Daten mit einem abschliessenden $.

Das ganze sieht dann z.B. so aus: "::??>$$

Befehlssatz

Der Befehlssatz der CU ist sehr klein. Und von den verfügbaren Befehlen verwendet man im normalen Betrieb nur 2. Der Befehlssatz der CU unterscheidet sich von dem des Rundenzählers. Dessen Befehlssatz ist hier beschrieben.

Die Minimalausstattung für einen Rundenzähler und Zeitmessprogramm auf einem Rechner

Für uns sind die Lesebefehle "0 (Null) und "? und der Schreibbefehl J iinteressant.

 

Befehl W Daten Beschreibung
"0 0 NNNNP$

Abfrage der Versionsnummer: Die 4 N sind ASCII-Zahlen, die die Versionsnummern von Hard- und Firmware angeben. P ist die Prüfsumme und die Übertragung wird mit einem $ abgeschlossen

Die Versionsnummer meiner CU ist 5321. Inzwischen 5337.

"? ? FBBBBBBBBGP$ Abfrage der letzten Zieldurchfahrt: Das F ist eine 4 Bit Binärwert zwischen 1 und 8, die der Fahrzeugnummer entspricht (7 = Ghostcar, 8 = Pacecar).
Die nachfolgenden 8 Zeichen bilden ein 32 Bit Binärwort. Dies ist der momentane Zählerstand eines Timers im Rundenzähler. Er läuft mit 1 kHz. Subtrahiert man zwei aufeinanderfolgende Werte für das selbe Fahrzeug, so erhält man die Rundenzeit in Millisekunden.
Das G gibt die Sensorgruppe an. Die Sensoren der Gruppe '1' bilden die Ziellinie. Die Gruppen '2' und '3' können z.B. für Zwischenzeiten verwendet werden..
Die Übertragung wird wie üblich mit Prüfsumme und $ abgeschlossen.
"? ? :TTTTTTVVSMBBAP$ Abfrage der letzten Zieldurchfahrt, aber es liegt keine neue Durchfahrt vor: Die Übertragung beginnt mit einem : was dem Binärwert für 10 sozusagen Fahrzeugnummer 10 entspricht. Daran kann man erkennen, dass es sich um ein Statuswort und keine Zieldurchfahrt handelt.
Die folgenden 6 Zeichen (T) sind die Tankstände für die 6 Fahrzeuge jeweils als 4 Bit Binärwert. Obwohl das Driverdisplay nur 8 Zustände kennt, werden 16 Zustände für jedes Fahrzeug unterschieden. $F bedeutet der Tang des Fahrzeuges ist voll - $0 er ist leer. Die Tankstände werden in der Reihenfolge der Fahrzeug Ids übertragen.
Die folgenden beiden Zeichen (V) sind bisher immer 0. Es kann sein, dass es sich um die Tankstände für Ghost- und Pacecar handelt, oder sie dienen einem Zweck, der sich mir noch nicht offenbart hat.
Das Startampelzeichen (S) nimmt die Werte 0 bis 9 an. 0 bedeutet, dass gerade ein Rennen läuft Eine 1, dass die Starttaste einmal gedrückt wurde und alle Leds leuchten. Wird die Starttaste ein zweites Mal gedrückt, zählt der Wert von 2 (1 Led leuchtet) bis 7 hoch, um dann auf die 0 zu wechseln. Im falle eines Frühstarts wird zuerst eine 8 und kurz danach eine 9 übertragen. Die Id des frühstartenden Fahrzeuges wird nicht übertragen.
Das nächste Zeichen (M) gibt den Tankmodus an. 0 - ausgeschaltet, 1- normaler Modus, 2 - Real Modus. Sollte in der Bahn ein Pitlane Adapter vorhanden sein, so wird 4 auf den entsprechenden Wert addiert. Ist ein Rundenzähler an die Rundenzählerbuchse angeschlossen, so wird 8 addiert.
Die zwei folgenden Zeichen (B) formen einen binären Bytewert, der eine Bitmaske bildet. Ist das der Fahrzeug Id zugehörige Bit gesetzt, so befindet sich das Fahrzeug in einer Pitlane mit Pitlane Adapter und kann tanken. D.h. nicht das es tankt, nur dass es tanken kann.
Das letzte Daten-Zeichen (A) ist entweder 6 oder 8, je nachdem ob der Position Tower 6 oder 8 Fahrzeuge anzeigen soll.
Die Übertragung wird wie üblich mit Prüfsumme und $ abgeschlossen.
"? ? :TTTTTTVVSMBBAXXP$ Update 2019 Abfrage der letzten Zieldurchfahrt, aber es liegt keine neue Durchfahrt vor: Im Prinzip Alles beim Alten; bis auf zwei Zeichen mehr. Die zwei XX sind scheinbar beide immer 0. Es ist mir noch nicht klar wozu sie dienen.

 

 

Befehl W Daten Q Beschreibung
"J J BAWNP$ $

Senden eines Programmiedatenwortes:

Hiermit ist es möglich vom Rechner aus ein Programmierdatenwort über die Schienen zu schicken. Das Datenwort wird nur über die Schienen geschickt und beeinflusst interne Zustände und Daten der CU scheinbar nicht.

B und A bileden ein Byte im üblichen Carrera Format dessen untere 5 Bit dem befehl und dessen höchsten 3 Bit der Fahrzeugadresse entsprechen.

W ist der zum Datenwort gehörende Wert.

N gibt an wie oft das Datenwort wiederholt werden soll.

Möchte man die Runden- und Positionsanzeige zurücksetzen, so ist das das Datenwort $32C1 oder anders ausgedrückt Befehl, 6 Wert 9 an Fahrzeug 0.

BA wäre also 6 und der Wert 9. Als J Befehl ergibt sich: "J60910$.

Will man die Postition der Fahrzeuges 5 (gezählt ab 0), das an vierter Position liegt, übertragen, so ist dies:

Befehl 6, Fahrzeug 5, Wert 4.

BA ist also $A6 und W ist 4:

Das ist ein J Befehl in der Form: "J6:415$

Eine Liste der möglichen Programmierdatenworte findet sich in der Protolkollbeschreibung.

 

": : MMP$ $

Ignorieren der Zieldurchfahrten: Hiermit ist es möglich vom Rechner aus die Rundenzählung und Zeitmessung für einzelne Fahrzeuge zu verhindern. MM bilden ein Byte. Ist ein Bit gesetzt, so werden Zieldurchfahrten des jeweiligen Fahrzeuges ignoriert. Die Zeit läuft allerdings weiter. Bit 0 entspricht Fahrzeug 0 usw.

Die Startampel setzt die Maske auf $00 zurück, so dass alle Fahrzeuge gezählt werden.

"= = 1$ $ Rennstart: Hiermit wird der CU der Rennstart angezeigt. Die CU setzt die interne Uhr auf 0. Seltsam ist die Syntax. Der Befehl hat scheinbar keine Prpüfsumme, denn hätte er nur eine Prüfsumme, aber keine Daten so müsste die Prüfsumme 0 sein.
"= = 101$ $ Update 2019 Rennstart: Hiermit wird der CU der Rennstart angezeigt. Die CU setzt die interne Uhr auf 0. Die Syntax wurde korrigiert.
"T T MP$ $

Update 2019 Tastendruck: 

Ist M gleich 1, so wird die Pacecar Taste gedrückt. D.h. in Abhängigkeit vom gegenwärtigen Status wird das Pacecar gestartet oder zurückgerufen.

Ist M gleich 2, so wird die Starttaste gedrückt. D.h. in Abhängigkeit vom gegenwärtigen Status werden alle Autos angehalten und alle Leds der Startampel leuchten oder die Startsequenz wird gestartet.

Somit kann man jetzt die Startampel und das Pacecar vom Rechner aus starten.

 

AppConnect - Bluetooth Adapter

Carrera bietet statt USB zur Verbindung von Rechner auch eine Bluetooth LE an. Bluetooth LE  - LE steht für Low Energy - ist nicht das selbe wie Bluetooth ohne LE. BLE ist eine Option von Bluetooth 4.0. D.h. nicht jedes Bluetooth Gerät bzw. Rechner oder BT-Dongle unterstützt BLE. Allerdings kann man davon ausgehen, dass heute alle aktuellen Rechner mit BT und BT Dongles BLE unterstützen. 

Die Kommunikation mit einem BLE Gerät unterscheidet sich von der mit einem USB/Seriell Wandler. Ein BLE Gerät stellt Services zur Verfügung. Ein Service hat verschiedene Characteristics, die funktional zusammen gehören. AppConnect hat nur eine Funktion, Daten von und zur seriellen Schnittstelle der CU zu übertragen.

Deshalb bietet AppConnect auch nur einen Service. Jeder Service wird über eine UUID (Universally Unique Identifier, eineindeutige Bezeichnung) identifiziert. Die UUID des Service der AppConnect ist 39DF7777-B1B4-B90B-57F1-7144AE4E4A6A. Das ist deshalb interessant, weil der Programmierer den Rechner Geräte suchen lassen kann, die einen Service mit dieser UUIDs anbieten.

Ein Service hat Characteristics (Eigenschaften) und diese können gelesen oder geschrieben werden. Characteristics klingt nach einen Wert abfragen oder setzen, aber das ist zu eng gedacht. Das Lesen oder Schreiben einer Characteristic kann auch Funktionen oder Abläufe auslösen. 

Das Schreiben einer Characteristic kann mit oder ohne Handshake erfolgen. Mit Handshake, weiß man ob und wann die Daten angekommen sind und im anderen Fall vertraut man darauf , dass die Daten schon ankommen werden. 

Will man wissen ob sich der Wert einer Characteristic geändert hat muss man sie nicht ständig abfragen, man kann ihr auch mitteilen, dass sie die Daten schicken soll, wenn sich was geändert hat. Die Characteristic unterstützt dann "Notify"..

Characteristcs werden ebenfalls über UUIDs identifiziert.

Der Service im AppConnect hat zwei Characteristics eine um Daten vom Rechner zur CU und eine um Daten von der CU zum Rechner zu schicken.

39DF9999-B1B4-B90B-57F1-7144AE4E4A6A leitet die von der CU empfangenen Daten an den Rechner weiter. Damit man nicht dauernd fragen muss ob es was neues gibt unterstützt sie Notify.

39DF8888-B1B4-B90B-57F1-7144AE4E4A6A leitet die vom Rechner empfangenen Daten an die CU weiter. Sie unterstützt keinen Handshake, so dass der Rechner nicht weiß ob das Schreiben geklappt hat.  Auf der anderen Seite, wenn keine Antwort auf die Anfrage kommt, hat es wohl nicht geklappt.

Man sollte erwarten, dass der Datenaustausch wie beim USB-Seriell Konverter erfolg, man was oben in der Protokoll-Beschreibung rot markiert ist an 39DF8888-B1B4-B90B-57F1-7144AE4E4A6A schickt und was blau markiert ist von 39DF9999-B1B4-B90B-57F1-7144AE4E4A6A empfängt.

Fast - es gibt kleine Unterschiede.

Wenn man einen Befehl schickt lässt man das Gänsefüßchen weg also statt "0 nur 0.

Schickt man einen Befehl mit Parametern so schickt man alles auf einmal und wartet nicht, dass man das Befehlszeichen zurück bekommt, bevor man die Parameter schickt. Es wird kein Quittierungs $ von AppConnect an den Rechner gesendet, Es wird nur das Befehlszeichen zurückgeschickt.

Eine Abfrage der Versionsnummer sähe wie folgt aus: 0053372$

Das Setzen von Parametern sieht dann z.B. so aus: ":??>$: