Witam,
W tej części opiszę jak w prosty i szybki sposób zrobić użytek ze sprzętu który skompletowaliśmy we wcześniejszym wpisie i pokażę, jak odczytać jasność podświetlenia wyświetlacza CID ze SLOW SPEED OPEL CAN.
Podłączenie
Zaczynamy od podłączenia modułu Arduino do komputera i zaprogramowaniu go, by komunikował się z programem CAN-Sniffer by MartinViljoen. Trzeba założyć konto na forum i pobrać paczkę o nazwie „CAN-BUS-TOOL.zip – Can-Bus Super Sniffer V1.08„. Martin na swojej stronie udostępnia wsad do Arduino, mi jednak on się nie kompilował – szczerze już nie pamiętam dlaczego. Kiedy uporałem się z błędami kompilacji dodałem do kodu między innymi komentarz z rozpiską pinów w OBDII i trzy dyrektywy #define
, które usprawniają pracę z programem, gdy trzeba się szybko przełączyć na inną prędkość:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include <SPI.h> #include "mcp_can.h" // \ 1 2 3 4 5 6 7 8 / // \9 10 11 12 13 14 15 16/ #define SPEED CAN_33KBPS //Low Speed CAN 33.3kbps //LSCAN-H - 1 //LSCAN-L - GND - 5 //#define SPEED CAN_95KBPS //Medium Speed CAN 95kbps //MSCAN-H - 3 //MSCAN-L - 11 //#define SPEED CAN_500KBPS //High Speed CAN 500kbps //HSCAN-H - 6 //HSCAN-L - 14 MCP_CAN CAN(10); INT32U canId = 0x000; unsigned char len = 0; unsigned char buf[8]; char str[20]; void setup() { Serial.begin(38400); START_INIT: if(CAN_OK == CAN.begin(SPEED)) //MidSpeed BUS - 95.23kpbs PIN 6 - CAN-H, PIN 14 CAN - L { Serial.println("CAN BUS Shield init ok!>"); } else { Serial.println("CAN BUS Shield init fail>"); Serial.println("Init CAN BUS Shield again>"); delay(100); goto START_INIT; } } void loop() { if(CAN_MSGAVAIL == CAN.checkReceive()) { CAN.readMsgBuf(&len, buf); canId = CAN.getCanId(); Serial.print("<");Serial.print(canId);Serial.print(","); for(int i = 0; i<len; i++) { Serial.print(buf[i]);Serial.print(","); } Serial.print(">"); Serial.println(); } } |
Trzy prędkości szyn danych
Pełny opis pinów w złączu OBDII dla Oplów posiadających sieć OPEL CAN: GM-LAN (od około 2002 roku):
- SW-LS-CAN – 33kB / DW-FT-CAN (+) – <125kB
- n/a
- MS – CAN (+) – 95kb
- GND
- signal GND
- HS-CAN (+) – 500kb – ISO 15765
- n/a
- reserved
- DW-FT-CAN (-) – <125kB
- n/a
- MS-CAN (-) – 95kb
- K-Line (KW82)
- reserved
- HS-CAN (-) – 500kb – ISO 15765
- n/a
- BATT +
Zasadniczo w Oplu wyróżnić można 3 sieci OPEL CAN:
- SLOW(LS)
- MEDIUM(MS)
- HIGH(HS)
Różnią się nie tylko prędkością, ale i zastosowaniem – orientacyjnie:
Rodzaj Sieci CAN | Prędkość | Zastosowanie |
SLOW OPEL CAN | 33.3 kbps | Manetki, przyciski na kierownicy, szyby, czujniki drzwi, parktronic… |
MEDIUM OPEL CAN | 95 kbps | Radio, klimatyzacja, moduł BT, wyświetlacz CID/GID etc. |
HIGH OPEL CAN | 500 kbps | Moduły krytyczne dla auta: ECU, ABS, ESP, etc. |
Wiadomość niosąca informację o jasności podświetlenia przesyłana jest siecią SLOW SPEED CAN – LSCAN, więc do tej sieci trzeba się podpiąć. Szyna ta jest szczególna, bo używa tylko linii CAN-H, linią CAN-L jest pin oznaczony jako „masa sygnałów” w złączu diagnostycznym. Tak więc wpinamy się w następująca piny w złączu diagnostycznym:
- CAN_H ⇒ PIN 1
- CAN_L ⇒ PIN 5
Teraz Pozostaje tylko określić na którym porcie COM jest widoczny nasz zestaw Arduino + CAN-SEED, można to podejrzeć w Arduino IDE:
Uruchomienie i konfiguracja
Uruchamiamy CAN-Sniffer z prawami administratora i wybieramy Tools > Connect to COM:
Prawdopodobnie dostaniemy taki błąd:
więc klikamy OK i wybieramy właściwy COM:
Klikamy ponownie połącz z COM i w tym momencie powinny zacząć napływać dane:
Zaczynamy teraz kręcić pokrętłem od regulacji jasności i obserwujemy, która wiadomość się zmienia
CAN ID: 0x235 wygląda podejrzanie:
klikamy w nią 2x i powinna pojawić się następująca tabelka:
teraz kręcą gałką podświetlenia, powinniśmy obserwować zmiany w tabeli:
TA DAM! Jesteście HAKIERAMI Gratulacje! 🙂
OPEL CAN ZHACKOWANY! msg ID odpowiedzialny za jasność ekranu znaleziony.
A co by było, jak bym wysłał tą wiadomość, ale ze zmienionymi wartościami?… Teraz ogranicza was już tylko wyobraźnia 😉
Poniżej zamieszczam filmik na YT pokazujący zależność zmiany podświetlenia od wartości
msgID = 0x235:
Taka jest metodyka sniffowania sieci CAN, teraz pozostało tylko zlokalizować CAN ID interesujących nas wiadomości, np.: Światła, klakson, kierunkowskaz, wycieraczki, otwarcie zamka z pilota, etc…
Powodzenia,
themarvin
Witam, szukam adresu Id świateł. Na jakiej prędkości szukać? Znalazłem id włącznika świateł (0x23A na 33kbps) ale interesuje mnie co dokładnie włącza światła np po zapłonie .
Hej, światła są na slow Can
mógłbym podać Ci ID, ale zapasuję całą zabawę 😛
Podpowiem tylko, że informacja o tym jakie światła są właczone jest wysyłana cyklicznie 😉
Co do „interesuje mnie co dokładnie włącza światła np po zapłonie” nie mam pewności, ale z tego co wiem (sam nie sprawdzałem) przednie lampy ogarniane są przez BCM, tylne przez REC. Wnioskuję to po tym, że w tych modułach ustawia się automatyczne włączanie świateł po zapłonie.
pozdro,
mVn
Jeszcze jedno, id świateł 11 czy 29 bit? W ogóle na linii 33kbps pojawiają się 29bit informacje?
Twój Post mocno rozjaśnił mi temat jednak mam pytanie natury technicznej 🙂
Czy jest możliwość by jednocześnie czytać pakiety ze wszystkich trzech SLOW(LS), MEDIUM(MS) i HIGH(HS) bramek?
Jak możnaby to skonfigurować?
Dzięki za info
Dobre pytanie!
dwie drogi:
1) łączysz się po jednej szynie z jakimś modułem który jest połączony z szynami o pozostałych prędkościach i z niego wyciągasz interesujące dane (oczywiście, nie jest powiedziane, że się uda!) – tanie i łatwe z punktu widzenia HW, ale dużo pracy zajmie implementacja SW (jak zbudować zapytanie, żeby cel odpowiedział.
2) budujesz urządzenie, które jest w stanie pracować z trzema oddzielnymi szynami danych. Do każdej szyny potrzebny jest oddzielny transceiver no i mikrokontroler który to ogarnie – Atmega już wymięka na średniej prędkości, więc pozostaje ARM. HW ciężko, ale jak napiszesz dobre biblioteki, to SoftWare’owo bajka 😉
Dla mnie w grę wchodzi tylko opcja 2) jednak jeszcze nie szukałem optymalnego i taniego rozwiązania, chodź wiem, ze jest to nieuniknione w dalszych projektach…
pozdro,
mVn
No właśnie też myślałem nad opcją nr 2, ale zastanawiam sie też nad takim rozwiązaniem: 3x elm bluetooth – (każdy z nich czyta z oddzielnej szyny danych) + raspberry pi 3 🙂
I przy okazji pytanie nr 2 🙂
Posiadam Vectre C z 2004 i mam zamiar wymienić standardowy wyświeltacz (http://elektron.pol.lublin.pl/users/djlj24/studio24/kable/jpg/gidvec.jpg) na raspberry, który między innymi sterowałby klimatronikiem (głosowo :O ). Czy próbowałeś wysyłać jakieś paczki do sterowania temperaturą ? Czy to jest w ogóle na szynie Can czy na sławnej oplowskiej przerobionej I2C ? Chodzi mi o komunikacje panel klimy -> dmuchawa| panel klimy -> wyświetlacz
Dzięki!
Jedno pytanie: czy ELM< -BT->RBpi3 jest na tyle szybki, ze ogarnie MSCAN? a tym bardziej HSCAN? przyjrzyj się czy na MSCAN Ci pakietów nie gubi, u mnie Atmega nie wyrabiała i 5-10% gubiła 🙁
Jeśli idzie o klimatyzację, tylko delikatnie się o nią potknąłem. Wiem, że komunikuje się z radiem i wyświetlaczem po MSCAN. Wysyła informacje o swoim stanie. Ale czy uda Ci się nią sterować z zewnątrz? pewności nie mam – pozostają Ci eksperymenty 😉
Czy jesteś w stanie udostępnić program do analizy CAN?
Niestety na stronie autora nie jest już dostępny.
Masz rację, poprawny link: http://techtinker.co.za/forum/viewtopic.php?f=14&t=18
wystarczy zarejestrować się na forum i pobrać paczkę: CAN-BUS-TOOL.zip
poprawiłem link w artykule i dodałem jaśniejszy opis,
dzięki,
mVn
Czy te trzy rodzaje sieci CAN lecą po tych samych przewodach i są dostępne na złączu DIAG?
Witaj,
Nie. Każda prędkość ma oddzielne przewody (2 przewody do CANH, 2 przewody do CANM i 1 przewód do CANL)
Tak. Wszystkie szyny są dostępne w złączu diagnostycznym (OBD2)
Hej, czy mógłbyś przybliżyć jak teraz można wysłać jakąś wiadomość? Najlepiej na przykładzie rozjaśniania?
Hej Paweł,
pozwól, ze odpowiem na Twoje pytania za jednym razem.
Na etapie rozwoju i poznawania sieci lepiej, zapomniałem o arduino, a teraz używam raspberryPi. O ile arduino dawało radę dla LowSpeed, tak dla Middle i High miało problem, szczególnie dla długich ramek które są dzielone na części – arduino potrafiło je pogubić 🙁
Wysyłanie wiadomości jest dość proste, postaram się napisać o tym artykuł, niemniej jednak jasność podświetlenia nie jest dobrym przykładem. W sieci CAN już jest moduł który ciągle wysyła informację o jasności, więc ciężko będzie go „nadpisać” ponieważ moduł końcowy dostaje dwie informacje, oryginalną i nasz i koniec końców głupiej. Może lepiej otworzyć/zamknąć drzwi? 😀 one też są na LowSpeed 😉
Mógłbyś przybliżyć jak tego używasz teraz na raspberry?
Jasne!
Zapraszam: http://www.emvn.pl/can-bus-mcp2515-raspberrypi-socketcan/
Próbowałeś odczytać coś z LS i MS ? U mnie nie działa na tych prędkościach
Wie ktos może czemu po skopiowaniu kody do arduino i kompilacji wyskakuje błąd odnosnie Int32U?
Hej, jest jakakolwiek szansa na pozyskanie can-bus-toola? nigdzie juz nie ma instalki 🙁
Hej, niestety, dawno już nie mam go na dysku.
Teraz już tylko korzystam z http://www.emvn.pl/can-bus-mcp2515-raspberrypi-socketcan/
pozdrawiam,
Kamil