Bądź: Wyszukaj na stronie z użyciem Google
reklama:

niedziela, 2 stycznia 2011

Podłącz samochód pod komputer, czyli OBDII ELM327 i Linux

Autor: , 09:00, niedziela, 2 stycznia 2011


Współczesne samochody dobrze opanowały komunikację z komputerami. Fot: jiazi
Obecnie kody i złącza diagnostyczne są ustandaryzowane. Każdy w miarę współczesny samochód posiada 16-pinowe złącze OBD II znajdujące się w pobliżu miejsca kierowcy. Przekaz informacji pomiędzy samochodem a interfejsem diagnostycznym odbywa się za pomocą tzw. PID-ów, czyli krótkich kilkubajtowych kodów.

Wpis przygotował Adrian Przekwas. Korekta AN.

ELM327

ELM 327 jest mikrokontrolerem bazującym na układzie z serii PIC, którego oprogramowanie (firmware) umożliwiający konwersję sygnału ze złącza OBD II na transmisję znakową zgodną z RS232. Obecnie większość interfejsów diagnostycznych budowanych w oparciu o ELM 327 ma wbudowany układ FTDI pozwalający na podłączenie pod komputerowe złącze USB. Połączenie wygląda w następujący sposób:

Gniazdo OBD II <=> ELM327 <=> FTDI <=> USB
Notę katalogową układu można znaleźć tutaj (PDF).

ELM327 USB i Linux

Najpierw w terminalu wydajemy polecenie:

tail -f /var/log/messages
Następnie podłączamy interfejs oparty o ELM327. W terminalu powinniśmy zobaczyć coś w stylu:

Dec 29 13:35:13 vladimir kernel: [ 116.944037] usb 3-1: new full speed USB device using uhci_hcd and address 2
Dec 29 13:35:13 vladimir kernel: [ 117.146858] usb 3-1: configuration #1 chosen from 1 choice
Dec 29 13:35:13 vladimir kernel: [ 117.226822] usbcore: registered new interface driver usbserial
Dec 29 13:35:13 vladimir kernel: [ 117.227849] USB Serial support registered for generic
Dec 29 13:35:13 vladimir kernel: [ 117.229240] usbcore: registered new interface driver usbserial_generic
Dec 29 13:35:13 vladimir kernel: [ 117.229244] usbserial: USB Serial Driver core
Dec 29 13:35:13 vladimir kernel: [ 117.243233] USB Serial support registered for FTDI USB Serial Device
Dec 29 13:35:13 vladimir kernel: [ 117.244563] ftdi_sio 3-1:1.0: FTDI USB Serial Device converter detected
Dec 29 13:35:13 vladimir kernel: [ 117.244692] usb 3-1: Detected FT232RL
Dec 29 13:35:13 vladimir kernel: [ 117.244696] usb 3-1: Number of endpoints 2
Dec 29 13:35:13 vladimir kernel: [ 117.244699] usb 3-1: Endpoint 1 MaxPacketSize 64
Dec 29 13:35:13 vladimir kernel: [ 117.244702] usb 3-1: Endpoint 2 MaxPacketSize 64
Dec 29 13:35:13 vladimir kernel: [ 117.244704] usb 3-1: Setting MaxPacketSize 64
Dec 29 13:35:13 vladimir kernel: [ 117.246223] usb 3-1: FTDI USB Serial Device converter now attached to ttyUSB0
Dec 29 13:35:13 vladimir kernel: [ 117.246251] usbcore: registered new interface driver ftdi_sio
Dec 29 13:35:13 vladimir kernel: [ 117.246254] ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver

Najbardziej interesująca jest dla nas linia:

Dec 29 13:35:13 vladimir kernel: [ 117.246223] usb 3-1: FTDI USB Serial Device converter now attached to ttyUSB0
Dzięki niej wiemy, że urządzenie zostało przywiązane do /dev/ttyUSB0

ScanTool.net i Linux

Ilość oprogramowania diagnostycznego OBD II przeznaczonego dla systemów GNU/Linux jest niewielka. Na szczęście można łatwo posłużyć się którymś z przyjaznych programów napisanych dla systemów z rodziny Windows. Poniższy przykład będzie dotyczył programu ScanTool.net. Analogiczna procedura będzie obowiązywała także w przypadku innych programów.

Potrzebne jest Wine, dzięki któremu zainstalujemy ScanTool. Jeśli mamy je wgrane w systemie, w większości dystrybucji wystarczy już tylko dwukrotnie kliknąć na ikonę instalatora ScanTool.net.

Następnie tworzymy dowiązanie symboliczne „windowsowego” portu COM1 do „linuksowego” ttyUSB0 (nazwa może być inna – patrz poprzedni punkt). Dokonujemy tego wpisując w terminalu:

ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com1
Następnie podłączamy wtyczkę do złącza samochodu, włączamy zapłon i uruchamiamy ScanTool.net wpisując po tym:

cd ~/.wine/drive_c/Program\ Files/ScanTool.net_PL/
wine ScanTool.exe

Po chwili powinniśmy móc bezproblemowo użytkować urządzenie.

Informacje, które samochód przekazał programowi







Bezpośrednia komunikacja z ELM327

Ustawienie parametrów
Sporą zaletą ELM327 jest możliwość komunikacji za pomocą zwykłego terminala portu szeregowego. Takiego jak GtkTerm. Przed rozpoczęciem transmisji musimy ustawić kilka parametrów:

  • Port: /dev/ttyUSB0
  • Speed: 38400
  • Parity: none
  • Bits: 8
  • Stopbits: 1
Nie przejmując się tym, że wciskanie klawiszy nie powoduje na razie widocznego efektu wpisujemy:

AT Z
 Program zgłasza aktualną wersję firmware
Operację zatwierdzamy wciskając Enter. Układ powinien odpowiedzieć zgłaszając wersję firmware (np. ELM327 v1.4).

Sprawdźmy czy ELM działa zadając pytanie o napięcie w instalacji elektrycznej samochodu (nie wymaga ono jeszcze poprawności komunikacji z OBD II):

AT RV
Powinniśmy otrzymać np.:

11.7V
Teraz ustawny protokół komunikacji na automatycznie wybierany:

AT SP 0
Jeśli z jakiegoś powodu automatyczny wybór by się nie powiódł to musimy dokonać go ręcznie zmieniając zero na odpowiedni znak (wg noty katalogowej ELM):

0 – Automatic
1 – SAE J1850 PWM (41.6 Kbaud)
2 – SAE J1850 VPW (10.4 Kbaud)
3 – ISO 9141-2 (5 baud init, 10.4 Kbaud)
4 – ISO 14230-4 KWP (5 baud init, 10.4 Kbaud)
5 – ISO 14230-4 KWP (fast init, 10.4 Kbaud)
6 – ISO 15765-4 CAN (11 bit ID, 500 Kbaud)
7 – ISO 15765-4 CAN (29 bit ID, 500 Kbaud)
8 – ISO 15765-4 CAN (11 bit ID, 250 Kbaud)
9 – ISO 15765-4 CAN (29 bit ID, 250 Kbaud)
A – SAE J1939 CAN (29 bit ID, 250* Kbaud)
B – USER1 CAN (11* bit ID, 125* Kbaud)
C – USER2 CAN (11* bit ID, 50* Kbaud)

Teraz wpiszmy:

0100
Zadaliśmy w ten sposób pytanie o PID o numerze 00 w pierwszym trybie (01). Tak naprawdę wpisane cztery znaki reprezentują dwa bajty w postaci szesnastkowej (dziesiętnie jeden bajt to 0-255, szesnastkowo to 0-FF). Pierwszy z nich zawsze reprezentuje tryb odczytu – 01 dotyczy odczytu aktualnych wartości. Drugi to numer PID. Według tej tabeli PID 00 informuje, które PID-y z pierwszych 20 są wspierane przez samochód. Tabela informuje nas także, że powinniśmy otrzymać odpowiedź w postaci 4 bajtów, czyli 8 znaków.

Odpowiedź wygląda w następujący sposób:

41 00 BE 3E A8 11
Pierwsze dwa bajty (41 00) informują o tym, że jest odpowiedź na 01 00 (w odpowiedzi pierwszy bajt zwiększany jest o 40). Właściwą informację niosą pozostałe cztery bajty BE 3E A8 11. PID 00 można łatwo rozkodować używając jednego z kalkulatorów zamieszczonych w Internecie np. NetGain. Wpisując ostatnie cztery bajty otrzymujemy informacje na temat obsługiwanych PID-ów:

BE 3E A8 11
01 01 4 Number of trouble codes and I/M info Bit encoded. See below.
01 03 2 Fuel system status Bit encoded. See below.
01 04 1 Calculated engine load value 0 100 % A*100/255
01 05 1 Engine coolant temperature -40 215 °C A-40
01 06 1 Short term fuel % trim—Bank 1 -100 (Rich) 99.22 (Lean) % 0.7812 * (A-128)
01 07 1 Long term fuel % trim—Bank 1 -100 (Rich) 99.22 (Lean) % 0.7812 * (A-128)
01 0B 1 Intake manifold pressure 0 255 kPa (absolute) A
01 0C 2 Engine RPM 0 16,383.75 rpm ((A*256)+B)/4
01 0D 1 Vehicle speed 0 255 km/h A
01 0E 1 Timing advance -64 63.5 ° relative to #1 cylinder A/2 – 64
01 0F 1 Intake air temperature -40 215 °C A-40
01 11 1 Throttle position 0 100 % A*100/255
01 13 1 Oxygen sensors present [A0..A3] == Bank 1, Sensors 1-4. [A4..A7] == Bank 2…
01 15 2 Bank 1, Sensor 2:Oxygen sensor voltage,Short term fuel trim 00 1.27599.2 Volts% A * 0.005(B-128) * 0.7812 (if B==0xFF, sensor is not used in trim calc)
01 1C 1 OBD standards this vehicle conforms to Bit encoded. See below.
01 20 4 PIDs supported 21-40 Bit encoded [A7..D0] == [PID 0x21..PID 0x40]

Sprawdźmy temperaturę cieczy chłodzącej. Wpisujemy w GtkTerm:

0105
i otrzymujemy na przykład:

41 05 23
Znów pierwsze dwa bajty (41 05) nas nie interesują. Ważny jest tylko ostatni (23). Zmieniamy 23 z wartości szesnastkowej na dziesiętną otrzymując 35. Można do tego użyć na przykład kalkulatora GNOME (gcalctool).

W opisie czytamy, że wartość przesunięta jest o 40 (01 05 1 Engine coolant temperature -40 215 °C A-40). Jest tak z uwagi na to, że bajt reprezentuje wartości 0-255, a potrzebne są także temperatury ujemne. Od 35 odejmujemy 40 (A-40) i otrzymujemy temperaturę cieczy chłodzącej: -5 stopni Celsjusza. Dokładnie taką samą jak wyświetlana przez ScanTool.net.
blog comments powered by Disqus

Prześlij komentarz


Popularne posty

Etykiety