ELM327
Das ELM327 (Wiki-Link) ist ein sehr populäres Spezial-IC für
OBD-Interfaces der Firma ELM Electronics. Die erste Version
wurde um das Jahr 2005 vorgestellt. Es vereinfacht die Diagnose-Kommunikation erheblich indem es die komplexen
Sequenzen unabhängig vom verwendeten Protokoll in primitive Befehle abstrahiert. Es hat sich als Quasi-Standard
für praktisch alle aktuell verfügbaren Low-Cost-OBD2-Dongle etabliert.
Das ELM327 ist sehr gut geeignet die aktuellen Zustandsdaten der Motorsteuerung und eventuelle Fehlercodes
auszulesen. Das sind die Daten die gesetzlich von jedem Fahrzeug bereitgestellt werden müssen um die Funktion der
Abgasreinigung nachzuweisen. Nach meiner Einschätzung funktionieren alle "aktuellen Klone" (v2.3 oder so) für
diese simplen "Spielereien" sehr gut und die immer wieder zu lesenden "Warnungen" vor China-Klonen sind nicht
wirklich zutreffend.
Der ELM327 (bzw. seine Klone) sind aber nicht für das Modifizieren oder Beschreiben von Steuergeräten ausgelegt. Für
solche Aufgaben wäre z.B. ein SAE J2534-Adapter,
mit passender Software, die richtigere Wahl.
Die Firma
ELM Electronics
hat den Geschäftsbetrieb im Jahr 2022 eingestellt.
Den Erzählungen nach wurde bei einer frühen Versionen versäumt die Copy-Protection für die Firmware zu aktivieren.
Als Folge gab es kurz darauf jede Menge Klone die alle auf dieser Variante basierten. Etwas später wurden die Klone
gepatched um den (PC-)Programmen eine höhere Variantennummer vorzugaukeln, was häufig zu Fehlverhalten führte.
Über die Zeit gab es diverse Varianten (v1.0 .. v2.3) mit jeweils erweitertem und fehlerbereinigtem Funktionsumfang.
Auch die Klone entwickelten sich eigenständig weiter und wurden besser.
Mittlerweile gibt es auf dem Markt einen ganzen Zoo von Varianten mit unbekannter Basis. Findige Zeitgenossen
haben deshalb diverse "ELM-Identifier" Apps geschrieben. Diese Apps überprüfen welche Befehle der Chip akzeptiert und
schätzen daraus ab um welche Variante es sich handeln könnte.
ELM327 v2.3 Datasheet
Liste der AT-Kommandos
Programmierbare Parameter
Schaltplan
Unterstützte Protokolle
- SAE J1850 PWM (41.6 / 10.4 kbit/s)
- ISO 9141-2 (5 baud init, 10.4 kbit/s)
- ISO 14230-4 KWP (fast / 5 baud init, 10.4 kbit/s)
- ISO 15765-4 CAN (11/29 bit ID, 250/500 kbit/s)
- SAE J1939 (250/500kbit/s)
Hardware
Die meisten Low-Cost Adapter sind kleine Dongle zum direkten Aufstecken auf den OBD2-Port.
Die gängigste Kopplungsmethode mit einem Smartphone ist per Bluetooth (Classic) oder Bluetooth Low Energy (BLE). Ob
das funktioniert hängt vom Betriebssystem des Smartphones ab. Alte Adapter können keine Verbindung zu iOS-Geräten
aufbauen:
- iOS (iPhone) unterstützt nur Bluetooth Versionen grösser 4.0
- Android unterstützt auch Bluetooth Versionen kleiner 4.0
Eine vergleichende Kaufhilfe findet man z.B. hier, oder hier, oder hier.
Zusätzlich gibt es auch dutzendweise Videos auf Youtube.
Ein letzter Hinweis betrifft die MAC-Adresse. Die wird bei allen Geräten eines Herstellers identisch sein. Beim gleichzeitigen Betrieb mehrerer Geräte in unmittelbarer Nähe wird es zu Problemen und Kollisionen kommen.
Software
Man könnte fast sagen das für einen ELM327 garkeine spezielle Software benötigt wird. Alle Befehle werden als
ASCII über einen UART zum IC geschickt, die Daten kommen ebenso zurück. Die korrekten Reihenfolgen und Parameter
der Befehlssequenzen zu kennen ist natürlich essentiell. Es braucht sonst aber "nur" eine Shell um alles hübsch
darzustellen.
In den App-Stores gibt es jede Menge Apps für Smartphones.
PC-Software zum Experimentieren ist z.B.
hier im GitHub zu finden.
Hier eine weitere Quelle
(DDT4ALL) im GitHub.
STN1110
Ein sehr ähnlicher Chipsatz ist der STN1110 von
"OBD Solutions".
Er soll vollständig rückwärtskompatibel zum ELM327 sein, fehlerbereinigt, schneller und in allen Belangen besser.
Für neue Designs wird empfohlen seinen Nachfolger STN2100 einzusetzen.
Von
SparkFun, z.B.,
gibt es ein fertiges STN1110-Board mit allen für die OBD2-Analyse notwendigen Schnittstellen. Die zugehörige
Dokumentation ist im GitHub abgelegt.
Kontakt über die serielle Schnittstelle
Der ELM327 wird über seine serielle Schnittstelle durch
simple ASCII-Befehle
gesteuert. Diese Schnittstelle ist direkt verfügbar wenn man den OBD2-Adapter per Bluetooth mit einem PC koppelt.
Windows ordnet ihm dabei einen virtuellen COM-Port zu den man mit jedem einfachem Terminalprogramm (z.B. HTerm)
ansprechen kann.
>
Der Chip ist im Idle-Zustand und bereit Zeichen zu empfangen.
Befehle mit dem Präfix "AT" sind direkt für den Chip bestimmt. OBD-Befehle hingegen beginnen mit einem Hex-Zeichen ["0".."9", "A".."F"]. Ein simples Beispiel für einen "AT"-Befehl ist das Abfragen des "Identification String":
>AT I
ELM327 v2.1
Die Anwort ist: ELM327 v2.1.
Im folgenden Beispiel ist das verwendete Protokolle der Gegenstelle unbekannt und der ELM327 wird deshalb auf Automatik gesetzt (AT SP 0). Die Antwort "OK" signalisiert dass der Befehl korrekt erkannt wurde. Wenn notwendig probiert er ab jetzt alle (12) unterstützten Protokolle durch. Danach wird 0100 abgefragt für eine Liste der unterstützten PIDs:
>AT SP 0
OK
>0100
41 00 BF BF B9 93
Identifikation
Zur Abfrage der Identifikation werden die beiden folgenden "AT"-Befehle verwendet.
Parameter "Z" = Reset All and start up by sending Identification String
>AT Z
ELM327 v1.5
Parameter "I" = Send Identification String
>AT I
ELM327 v2.1
Dieser Beispiel-Klon meldet sich als v2.1 und auch als v1.5 (die es nie offiziell gab), er scheint sich selbst nicht ganz so sicher zu sein ..
Eine weitere Methode zur Identifikation ist die Prüfung ob der Chip auf die in jeder SW-Variante neu hinzugekommenen Funktionen korrekt antwortet. Die letzte korrekte Antwort zeigt die vorhandene Variante an:
## ELM327 Variants Check
AT AL ## v1.0
AT PPS ## v1.1
AT AR ## v1.2
AT D0 ## v1.3
AT FE ## v1.3a
AT CEA ## v1.4
AT CRA ## v1.4b
AT AMC ## v2.0
AT CTM1 ## v2.1
AT IB12 ## v2.2
AT C0 ## v2.3
ST DI ## STN1110
Wer es noch genauer wissen möchte kann auf die folgende Liste prüfen. Sie enthält alle von ELM ausgegebenen SW-Varianten und die jeweils unterstützten Befehle.
Bei einem Klon hat man damit leider immer noch keine Gewissheit ob der jeweilige Befehl auch korrekt implementiert wurde.
| Command/Version | 1.0 | 1.0a | 1.1 | 1.2 | 1.2a | 1.3 | 1.3 | 1.3a | 1.4 | 1.4b | 2.0 | 2.1 | 2.2 | 2.3 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| @2 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| @3 cccccccccccc | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| <CR> | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| AL | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| AMC | ● | ● | ● | ● | ||||||||||
| AMT hh | ● | ● | ● | ● | ||||||||||
| AR | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| AT0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| AT1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| AT2 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| BD | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| BI | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| BRD hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| BRT hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| C0 | ● | |||||||||||||
| C1 | ● | |||||||||||||
| CAF0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CAF1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CEA | ● | ● | ● | ● | ● | ● | ||||||||
| CEA hh | ● | ● | ● | ● | ● | ● | ||||||||
| CER hh | ● | ● | ||||||||||||
| CF hh hh hh hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CF hhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CFC0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CFC1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CM hh hh hh hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CM hhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CP hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CRA | ● | ● | ● | ● | ● | |||||||||
| CRA hhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| CRA hhh | ● | ● | ● | ● | ||||||||||
| CRA hhhhhhhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| CRA hhhhhhhh | ● | ● | ● | ● | ||||||||||
| CS | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| CS (with Freq) | ● | ● | ||||||||||||
| CSM0 | ● | ● | ● | ● | ● | |||||||||
| CSM1 | ● | ● | ● | ● | ● | |||||||||
| CTM1 | ● | ● | ● | |||||||||||
| CTM5 | ● | ● | ● | |||||||||||
| CV 0000 | ● | ● | ● | ● | ● | ● | ||||||||
| CV dddd | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| D | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| D0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| D1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| DM1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| DP | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| DPN | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| E0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| E1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| FC SD [1-5 bytes] | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| FC SH hh hh hh hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| FC SH hhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| FC SM 1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| FC SM 2 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| FC SM 3 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| FC SM 8 | ● | |||||||||||||
| FC SM 9 | ● | |||||||||||||
| FC SM A | ● | |||||||||||||
| FE | ● | ● | ● | ● | ● | ● | ● | |||||||
| FI | ● | ● | ● | ● | ● | ● | ||||||||
| FT | ● | |||||||||||||
| FT hh | ● | |||||||||||||
| H0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| H1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| I | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| IA | ● | |||||||||||||
| IB 10 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| IB 12 | ● | ● | ||||||||||||
| IB 15 | ● | ● | ||||||||||||
| IB 48 | ● | ● | ● | ● | ● | ● | ||||||||
| IB 96 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| IFR H | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| IFR S | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| IFR0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| IFR1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| IFR2 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| IFR4 | ● | ● | ||||||||||||
| IFR5 | ● | ● | ||||||||||||
| IFR6 | ● | ● | ||||||||||||
| IGN | ● | ● | ● | ● | ● | ● | ||||||||
| IIA hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| JE | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| JHF0 | ● | ● | ● | ● | ● | |||||||||
| JHF1 | ● | ● | ● | ● | ● | |||||||||
| JS | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| JTM1 | ● | ● | ● | ● | ● | |||||||||
| JTM5 | ● | ● | ● | ● | ● | |||||||||
| KW | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| KW0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| KW1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| L0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| L1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| LP | ● | ● | ● | ● | ● | ● | ||||||||
| M0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| M1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| MA | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| MP hhhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| MP hhhh n | ● | ● | ● | ● | ● | |||||||||
| MP hhhhhh | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| MP hhhhhh n | ● | ● | ● | ● | ● | |||||||||
| MR hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| MT hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| NL | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| PB xx yy | ● | ● | ● | ● | ● | ● | ||||||||
| PC | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| PP FF OFF | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| PP FF ON | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| PP xx OFF | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| PP xx ON | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| PP xx SV yy | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| PPS | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ||
| R0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| R1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| RA hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| RD | ● | ● | ● | ● | ● | ● | ||||||||
| RTR | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| RV | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| S0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| S1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| SD hh | ● | ● | ● | ● | ● | ● | ||||||||
| SH ww xx yy zz | ● | ● | ● | ● | ||||||||||
| SH xx yy zz | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| SH xyz | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| SI | ● | ● | ● | ● | ● | ● | ||||||||
| SP 00 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| SP Ah | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| SP h | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| SR hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| SS | ● | ● | ● | ● | ● | ● | ||||||||
| ST hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| SW 00 | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| SW hh | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| TA hh | ● | ● | ● | ● | ● | ● | ||||||||
| TP Ah | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| TP h | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| V0 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| V1 | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||||
| WM [1-6 bytes] | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | |||
| WM xxyyzzaa | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| WM xxyyzzaabb | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| WM xxyyzzaabbcc | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| WS | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
| Z | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |