Android, EMUS BMS und GEN4 Motorcontroller Kommunikation über CAN
Im vorigen Beitrag haben wir uns mit einem Android Autoradio mit Realdash als Tacho im Elektroauto beschäftigt. Hier soll es nun weiter gehen mit der Kommunikation mit den anderen Komponenten im Elektroauto: Dem EMUS BMS, dem GEN4 Motorcontroller und diverser Sensoren. Als Zentrale fungiert ein Arduino und die Kommunikation findet über den CAN Bus statt.
Inhalt:
CAN Bus
Einige Worte zum CAN Protokoll. Nur wenige durchschauen, was CAN eigentlich ist. Da gibt es CAN, OBD2, CANOpen und diverse ISO Normen.
Das “Standard” CAN Protokoll nach ISO 11898
CAN nach ISO 11898 beschreibt erst einmal den Hardware Layer und die Datenübertragung und ist recht simpel. Alle Teilnehmer am CAN Bus können prinzipiell Daten senden und empfangen.
Jedes Daten Frame enthält:
Eine CAN ID (Objekt-Identifier) der entweder 11 Bit lang ist oder 29 Bit. Jeder Teilnehmer kann anhand dieser ID schauen, ob die Message für ihn bestimmt ist. CAN nennt das das „Multi-Master-Prinzip“. Alle Teilnehmer sind gleichberechtigt.
Ein Daten Paket (Daten Feld), das aus 8 Byte besteht.
Das von Realdash und EMUS verwendete Protokoll ist dieses CAN Protokoll. Alle zur Verfügung stehenden CAN Werte werden ständig in einem festzulegenden Interwall gesendet. (100ms ist ein guter Wert).
CANopen
Nun ist z.B. ein Fahrzeug aber darauf angewiesen, das ein Gaspedalwert auch am entsprechendem Steuergerät ankommt und ein Fehler im System nicht das Auto mit Vollgas weiterfahren lässt. Deshalb hat sich die Industrie CANopen ausgedacht. Das ist prinzipiell eine weitere Softwareschicht auf dem Standard CAN Protokoll. CANopen ist kein Multimaster Protokoll, sondern hat einen Master und beliebige Slaves, die über das Protokoll periodisch melden müssen, das sie noch da sind. Außerdem ist eine Rückmeldung integriert, das ein Befehl auch empfangen wurde. Das sind nur einige Beispielhafte Eigenschaften, die CANopen, spezifiziert in der Norm EN 50325-4 bietet.
Der SEVCON GEN4 Motorcontroller z.B. kommuniziert mit CANopen, was ihn zu einem schwerer zu konfigurierendem Kandidaten macht.
Prinzipiell können Daten von Teilnehmern mit CAN und CANopen auf dem selben Bus kommunizieren (nicht miteinander) wenn es keinen CAN ID Adresskonflikt gibt. Die Hardwareschicht ist die selbe. Kommunikation kann aber über eigens zu konfigurierende TPDOs und RPDOs im GEN4 stattfinden.
Mehr zu CANopen in diesem Beitrag!
OBD2
OBD2 ist ein in nicht ganz alten Fahrzeugen integrierter Diagnoseport, der meistens auf das das CAN Protokoll aufsetzt, aber idr. von der internen Fahrzeugkommunikation isoliert ist. Wenn wir also über den OBD2 Diagnoseport uns mit dem Fahrzeug verbinden, haben wir idr. keinen Zugriff auf sicherheitsrelevante Funktionen wie z.B. die Motorsteuerung. Eine Ausnahme hiervon ist z.B. der Renault Twizy, der aus kostengründen den OBD2 Port nicht isoliert.
CAN Bus im Kewet
Hier eine Übersicht der Kommunikation vom EMUS GEN4 Display und Arduino über CAN
Arduino als zentrale Steuerung
Ich habe einen Arduino Sketch geschrieben, der die CAN Kommunikation sowohl für die Bluetooth als auch die USB Serial Kommunikation umsetzt. Praktischerweise kann man durch die Verwendung eines Arduino auch noch zusätzliche Sensoren einbinden, die das BMS nicht mitbringt, z.B. Temperatursensoren und 12V Überwachung, die Anzeige von Licht, Blinker, Heizung und anderen Verbrauchern. Das geht schon mit einem Arduino Uno, aber besser ist ein Mega, wegen des größeren Programmspeichers. Zusätzlich wird noch ein CAN Shield benötigt und ein Bluetooth Adapter. Alles für etwa 30 EUR zu bekommen. Für die bessere Verbindung von Sensoren, habe ich noch ein Screw Shield verwendet. Wenn die Kommunikation nur über USB stattfinden soll (was ich nach vielen Tests bevorzuge, da die Bluetooth Kommunikation hin und wieder instabil ist und unvermittelt abbricht), kann man sich das Bluetooth Modul natürlich sparen. Für die Programmierung ist es allerdings hilfreich, da man ansonsten den USB Anschluss des Arduino für Programmierung und Kommunikation mit Realdash immer umstöpseln muß. Das Tolle an Realdash ist, das man beide Kommunikationsprotokolle einspeichern kann, und es nimmt das jeweils verfügbare.
Bei der Komponentenauswahl ist darauf zu achten, keinen China Billigklon des Arduino Mega zu kaufen, die darauf verwendeten USB Seriell Chips sind nicht mit dem Bluetooth Modul kompatibel. Das hat mir einige Tage Kopfzerbrechen bereitet. Hier eine Liste der verwendeten Komponenten:
Arduino Mega
Bluetooth Modul HC-05
CAN Shield
USB Dongle für Windows 10
Temperatursensoren (Optional)
Wie im ersten Bild zu sehen ist, müssen die Pins 11, 12, 13 am Shield weggebogen oder entfernt werden. Werden sie durchverbunden, gibt es Kommunikationsprobleme.
Im zweiten Bild ist ein Screw Shield zugefügt, um Kabelverbindungen besser herstellen zu können und ein Seriell/USB Adapter für die Realdash/Android Verbindung.
Ein erster Test
Der Arduino ist für den Empfang und die Anzeige der CAN Befehle auf dem seriellen Monitor des Arduino zuständig. So kann man erst mal schauen, ob und was aus dem EMUS rauskommt.
Hier der -> Arduino Sketch.
Ein zweiter Test
Jetzt wollen wir versuchen, die CAN Daten vom EMUS an Realdash zu schicken!
Der Arduino fungiert hier prinzipiell als CAN – Serial / Bluetooth Bridge. Die CAN Befehle des BMS werden leicht modifiziert (ein Identifer für Realdash) gleichzeitig seriell über USB und Bluetooth weitergeleitet. Ganz praktisch, um beide Schnittstellen zu testen.
Die Daten können hier NICHT auf dem Seriellen Monitor der Arduino IDE angezeigt werden, da sie nicht für eine Anzeige formatiert sind sondern nur für die Ausgabe über USB/seriell.
Willst du nur CAN vom EMUS an Realdash schicken, reicht dieses kleine Programm eigentlich schon.
In Realdash kann die prinzipielle CAN Datenübertragung beobachtet werden, in dem man unter: WERKSTATT -> (auf die Tür klicken) -> (auf die blaue Anzeigetafel klicken) -> ANSCHLÜSSE -> auf CAN MONITOR geht.
Für das Realdash brauchen wir noch ein Datenübertragungsfile, damit Realdash weiß, welchen CAN Befehl es nehmen soll. Im .xml File ist ein einziger Wert eingetragen der den Wert “MIN CELL VOLTAGE” empfängt, also bei einem einzigen angeschlossenen Akku seine Spannung.
Natürlich muß in Realdash noch eine Anzeige für den entsprechenden Wert integriert werden. Die Progrmmierung von Realdash ist im vorigen Beitrag beschrieben.
Arduino -> Arduino Sketch
Realdash -> Arduino Sketch
Realdash -> Dash File
Der entgültige Arduino Sketch
Hier nun das endgültige Programm:
So richtig Sinn macht die ganze Sache mit einem Arduino natürlich erst, wenn wir auch noch andere Daten von Sensoren an Realdash übertragen können. z.B. Temperaturen, Spannungen usw.
Auf der Realsdash Seite kann man sich ein Beispiel Sketch für den Arduino herunterladen, mit dem man eine Kommunikation herstellen kann und Daten von und zum Arduino übertragen kann. (das ist aber leider fehlerhaft). Ich habe es umgeschrieben, so daß es mit USB und Bluetooth Verbindung läuft und CAN Daten vom EMUS direkt durchleiten kann.
Hier noch einmal die Funktionen im Überblick:
CAN Relais EMUS <-> Realdash, in beide Richtungen. Alle CAN Nachrichten werden mit einem Identifer versehen und über USB an Realdash gesendet.
CAN Nachrichten modifizieren, einzelne Nachrichten können verändert werden um sie für Realdash besser lesbar zu machen.
Anschlussmöglichkeit für Analoge und Digitale Sensoren. Die werte können ebenfalls per CAN Nachricht an Realdash gesendet werden. Dallas one wire DS18B20 Temperatursensoren können angeschlossen werden.
Umschaltmöglichkeit USB/Bluetooth.
Demowerte zur Funktionsüberprüfung.
Geplant:
Fahrzeuggeschwindigkeit über Motor/Getriebekontakt.
Erweiterte Servicefunktionen.
Arduino -> Arduino Sketch
Realdash -> Datenübertragungsfile
Realdash -> Dash File für den Kewet
(Achtung: Es muß das kostenpflichtige Dash “Classic S2000” gekauft werden auf dem das Demo beruht. Sonst läuft es nicht!)
USB oder Bluetooth?
Die Verbindung zum Android Autoradio (oder einem anderen Android Gerät wie Handy oder Tablet) kann wie bereits beschrieben über USB oder Bluetooth stattfinden, wobei ich USB bevorzuge. Die Verbindung ist einfach stabiler.
Leider funktioniert das nur mit einem Android Gerät, das im USB Host-Mode ist (der Arduino ist immer USB Slave!)
Bei Android Autoradios ist das idr. kein Problem, bei Tablet und Handy hingegen schon. Auch der OTG Modus schafft hier keine Abhilfe, da Realdash über OTG keine Verbindung aufbaut (warum auch immer..)
Hier ist Bluetooth also die einzige Möglichkeit, eine Verbindung zum Arduino herzustellen. In diesem Fall ist das Android Gerät der Master und der Arduino der Slave!
Ein netter Beitrag über Bluetooth HC-05 /HC-06 Module findet sich hier.
HC-05 Bluetooth Modul Konfiguration
Das Modul wird mit AT Befehlen konfiguriert. Das geschieht am einfachsten, indem man auf den Arduino Mega dieses Sketch lädt. So kann vom IDE Terminal das Modul simpel programmiert werden.
Um in den AT Modus umzuschalten, wird der kleine Taster an der Anschlussleiste des Moduls gedrückt und während dessen Strom angelegt (das Modul muss natürlich vorher aus sein). Das Modul blinkt im 2 Sekunden Takt. Um wieder in den Arbeitsmodus zurückzukehren, die Stromverbindung kurz trennen, das Modul blinkt nun im 0,5 Sekunden Takt.
Die wichtigsten Abfrage Befehle sind:
- Bluetooth Passort Abfrage: AT+PSWD? (Antwort z.B.: +PSWD:1234)
- Modul Versionsabfrage: AT+VERSION? (Antwort z.B.: +VERSION:v1.0.2)
- Modul Master oder Slave: AT+ROLE? (Antwort z.B.: +ROLE:0 // :0 = Slave, :1 = Master)
- Modul Name: AT+NAME? (Antwort z.B.: +NAME:HC-05)
- Modul Bautrate: AT+UART? (Antwort z.B.: +UART=9600,0,0)
Die wichtigsten programmier Befehle sind:
- Bluetooth Passort vergeben: AT+PSWD? (Antwort z.B.: +PSWD:1234)
- Modul Bautrate programmieren: AT+UART=38400,0,0 (Antwort +UART=38400,0,0)
- Modul Name programmieren: AT+NAME=HC-05_Boot (Antwort OK)
- Modul Master oder Slave: AT+ROLE=1 (Antwort z.B.: +ROLE:0 // :0 = Slave, :1 = Master)
Haben wir alles richtig eingestellt, sollte mit einem Terminalprogram (z.B. für das Smartphone “Bluetooth SSB Manager”) nach Kopplung eine Verbindung hergestellt werden können. Wenn ich also “test” auf dem Smartphone eingebe, sollte dies im Arduino Terminal angezeigt werden!
Fehlersuche
Nachdem der Arduino mit dem CAN Shield verbunden wurde und das Programm aufgespielt wurde, sollte man erst einmal die Funktion überprüfen!
Das CAN Shield hat 4 LEDs: PWR – Power (rot), TX – Daten senden (grün), RX – Daten empfangen (grün), INT – Daten verfügbar.
Alle LEDs (bis auf INT) sollten leuchten oder flackern! Ist das nicht so, schauen wir im seriellen Monitor der Arduino IDE nach (115200 Baud einstellen) … hier sollte die Meldung “MCP2515 Initialized Successfully!” angezeigt werden! (Ein CAN Kabel braucht für den Test nicht angeschlossen sein!)
Wird eine CAN Verbindung hergestellt (also werden Daten empfangen) sollte die INT LED flackern!
Ist das nicht so und wir erhalten die Meldung “Error Initializing MCP2515…” ist idr. etwas mit der Hardware nicht in Ordnung:
- Aufbau/Setup überprüfen.
- Arduino Mega tauschen (eventuell China Billigclon).
- CAN Shield tauschen.
Wenn wir mit einem Mutimeter die CAN-H und CAN-L Pegel gegen Masse prüfen, sollte:
- CAN-H einen Wert von etwa 2,5 – 3,5V haben.
- CAN-L einen Wert von etwa 1,5 – 2,5V haben.
Liegen die Pegel jeweils bei 2,5V, ist das CAN Shield nicht richtig initialisiert, meist liegt der Fehler hier beim Arduino!
Die fertige CAN Box
Dies ist nun die (fast) fertige CAN Box mit dem Arduino, CAN Shield, Screw Shield und einer kleinen Platine zum Anschluss der Digitaleingänge und eines Analogeinganges. Als Steckverbinder habe ich ODB2 Buchsen genommen, da diese Verkabelung günstig zu erhalten ist und vorverkabelte Stecker und Buchsen die Verkabelung einfach machen. Leider nicht gerade Wasserdicht, aber ich hoffe, das es hält.
Fazit:
Realdash ist ein gutes Werkzeug, um eine eigene Anzeige für ein Fahrzeug zu realisieren, und das zu einem sehr günstigen Preis!
Nachteil: Die Dokumentation ist schlecht und das Programm erfordert einige Einarbeitung. Zudem ist es etwas “bugy”.
Das EMUS BMS ist ein ausgereiftes Produkt mit weitreichenden Funktionen.
Nachteil: Recht teuer und in der Einrichtung, speziell der CAN Control Units, sehr hakelig.
Und macht das alles Sinn?
Meine Besucher haben immer den “bastelst du noch, oder fährst du schon” Blick in den Augen, aber man hat Lust dazu, oder eben nicht. Die Reise ist das Ziel.…. oder man kauft sich ein neues Auto. Teurer ist das nicht, so viel steht fest……. aber das ist eine ganz anderes Thema. Vielleicht bewerbe ich mich mal bei Tesla! 😉
Beitrag wird fortgesetzt….. im nächsten Beitrag: Android Tacho mit Realdash im Elektroauto
Bei Fragen bitte die Kommentarfunktion nutzen!
Dies ist ein privater Blog. Brauchst du professionelle Hilfe zum GEN4, EMUS BMS, EV Umbau oder Programmierung? Dann bitte hier klicken!
bom dia nao falo seus idioma mais traduzir o artigo de seu projeto e achei muito bom to tentando reunir vários artigos e projeto como esse e ver se consigo construir um para minha moto com o app realdash e Arduino e
Windows10 mais ta complicado porque a moto nao tem sistema can-bus ai vou ter que fazer o Arduino ler todos os sensores como sensor hall para velocidade criar algum sensor que possa ler o RPM da moto e ler a boia de
combustível GPS fazer que, faça as leituras dos indicadores como seta luz alta e indicador de marcha e enviar via Arduino para o windows10 no mini sticker-PC com tela de toque
desde de já agradeço a intenção
Echt guter Beitrag. Hat echt Spaß gemacht ihn zu lesen. Auch mein Sohn Luca findet den Artikel spannend, weil er seit kurzer Zeit Arduino Programmierung lernt. Hierzu hat er zum Geburtstag eine Programmierwerkstatt (https://kinderprogrammieren.de/spielsachen/experimentierkaesten/franzis-baubox-programmier-werkstatt-erfahrungsbericht/) erhalten, mit der Luca Schritt für Schritt seine Programmierfähigkeiten erweitern kann. Ich finde es wichtig, dass man Arduino programmieren kann, denn dann kann mal zahlreiche Lernroboter programmieren und auch für die MINT-Fächer in der Schule ist das förderlich.
Thanks you did a great work here.
Hallo
muss ich immer ein Arduino mit anschließen
geht das nicht über Realdash mit Verbindung mit einem USB CAN analyzer
in realdash gibt es ja eine verbindung direckt zu CAN. oder ist das nur mit Arduino machbar
Das kommt darau an, was du machen willst….
wenn du nur CAN Geräte anschließen willst, sollte das funktionieren.
Weitere Sensoren anzuschließen und Werte umfangreich zu berechnen, geht dann natürlich nicht.
also ich möchte sowas wie Blinker und Abblendlicht, Fernlicht tankanzeigen und der gleichen anzeigen lassen um nur ein digitales Display zu benutzen
aber ich finde nirgendwo eine vernünftige Anleitung wie ich RealDash über CAN anschließe und einstelle
das es nicht so leicht ist kann ich mir vorstellen. aber mit einer guten Anleitung ist das denke ich machbar, nur finde ich keine gute die genau genug alles beschreibt
Gefällt dir meine nicht?
Realdash ist nicht toll kommentiert und hat einige Macken, du wirst dich ein paar Tage damit auseinandersetzen müssen, sonst wird das nichts. Eine 1:1 Anleitung für alles gibt es nicht.