Ein modernes Formula-Student-Fahrzeug wimmelt förmlich vor Sensoren, die unzählige Daten erfassen. Als wichtigste Messwerte für die ersten Tests dienen Öldruck, Wasser- und Öltemperatur des Motors: Laufen sie aus dem Rahmen, droht ein Motorschaden. Sind diese Grundfunktionen des Fahrzeugs erfolgreich getestet, kann es an die Motor- und Fahrwerksabstimmung gehen. Hier interessieren dann Sensorwerte wie Bremsdruck, Reifentemperatur, Beschleunigung und viele andere.
Achtung!
Der in diesem Artikel beschriebene Rennwagen wurde von Fahrzeugtechnik-Studierenden selbst entwickelt – die Betreiber wissen also genauestens, welche Geräte verbaut und am CAN-Bus angeschlossen wurden.
Einen solchen Bus gibt es höchstwahrscheinlich auch in Ihrem Pkw – da liegt die Idee nahe, die hier demonstrierten Techniken auch einmal am eigenen fahrbaren Untersatz auszuprobieren. Das wäre allerdings eine extrem schlechte Idee, mit möglicherweise katastrophalen Folgen.
Der CAN-Bus bietet nämlich keinerlei Authentifizierungsmechanismen, sodass Sie mit CAN-Nachrichten problemlos beispielsweise die Kühlwasserpumpe abschalten könnten. Schon eine einzige versehentlich gesendete Nachricht könnte also zu Motorschäden führen oder im schlimmsten Fall zu einem Unfall.
Lassen Sie also besser die Finger von der Fahrzeugelektronik – auf jeden Fall bei Pkws, mit denen Sie am öffentlichen Straßenverkehr teilnehmen wollen.
CAN-Bus
Über den CAN-Bus des Rennfahrzeugs laufen alle relevanten Daten zwischen den Steuergeräten. Für die Telemetrie fängt ein CAN-Adapter der Firma Peak System alle Nachrichten ab. Listing 1 verdeutlicht, wie die entsprechenden Daten aussehen.
Der CAN-Bus kennt vier verschiedene Frame-Typen. Ein reiner Daten-Frame enthält bis zu 8 Daten-Bytes. Ein Remote-Frame übermittelt eine Datenanforderung eines anderen Bus-Teilnehmers, ein Error-Frame signalisiert Fehlerzustände. Mit einem Overload-Frame schließlich lässt sich eine Zwangspause zwischen Daten- und Remote-Frames einrichten.
Beim Formula-Student-Renner greift der CAN-Adapter lediglich passiv Datenpakete am CAN-Bus ab, es interessieren also nur Daten-Frames wie der in Listing 1 gezeigte.
Listing 1
$ ./candump can0 can0 0x713 [8] 2C EB C2 4A 65 0D EB 00 can0 0x5C4 [8] AE 65 0D 3B C2 4A 65 0D can0 0x5C2 [8] 5A EB C2 4A EB C2 4A 30
Die unterschiedlichen Sensorwerte landen in einem oder mehreren Bytes der CAN-Nachricht, je nach Auflösung und Messbereich des Sensors. Die Bedeutung der einzelnen Bytes in der Nachricht mit der ID 0x713 zeigt die Tabelle “CAN-Daten der ID 0x713”.
CAN-Daten der ID 0x713
|
Byte |
Bedeutung |
|---|---|
|
0 |
Öldruck |
|
4 |
Kraftstofftemperatur |
|
5 |
Öltemperatur |
|
7 |
Wassertemperatur |
Bei der Zuteilung der Messsignale an die Nachrichten gilt es, Signale nach Prioritäten zusammenzufassen, um nicht mehr unterschiedliche CAN-Nachrichten zu generieren, als unbedingt notwendig. Das hält die Busauslastung so gering wie möglich.
Hardware
Für so eine Aufgabe möchte man einen leistungsfähigen Server verbauen. Im Renneinsatz relevant sind aber in erster Linie die Größe, das Gewicht, der Stromverbrauch und nicht zuletzt der Preis. Da bietet sich fast zwangsläufig ein Raspberry Pi an. Auch im neuesten Rennfahrzeug von joanneum racing graz [1] sammelt ein solcher die Messdaten, wertet sie aus und stellt sie dem Boxenteam bereits während des Rennens zur Verfügung.
Daneben kommen ein aktiver USB-Hub, ein WLAN-Stick, eine WLAN-fähige Kamera, ein CAN-USB-Adapter sowie ein UMTS-Stick zur Datenübertragung an die Box zum Einsatz – und unvermeidlicherweise ein paar Kabel (Abbildung 4).
CAN unter Linux
Der Linux-Kernel bringt bereits etliche Treiber für den CAN-Bus mit, als einheitliche Abstraktionschicht lassen sich diese als Netzwerk-Devices ansprechen (Abbildung 5). Die Treiber beweisen übrigens, dass nicht nur private Kernel-Hacker und IT-Firmen am freien Betriebssystemkern mitprogrammieren – der Code wurde von Volkswagen Group Electronic Research beigetragen.
Auch der verwendete Treiber für den USB-CAN Adapter der Firma Peak ist eigentlich in dem Linux-Kernel enthalten – allerdings nicht beim Standard-Raspbian. Man muss daher das Modul selbst kompilieren, aber auch das erweist sich als nicht ganz einfach: Im Standard-Raspbian-Image [2] versieht ein von der Raspberry Pi Foundation modifizierter, speziell optimierter Kernel (3.6.11+) den Dienst, der im Repository weder die passenden Kernel-Sourcen noch die zugehörigen Header führt.







