MCP2515 i raspberryPi
W ciągu moich projektów związanych z siecią CAN zaczynałem od arduino – jak w tym wpisie. Później pojawiły się różne moduły na USB i RS232. Jednak najbardziej przypadł mi do gusty prosty moduł z MCP2515 i TJA105. W połączeniu z raspberryPi dał mi do dyspozycji potężny komputerek z interfejsem CAN. Jest szybki, nie gubi pakietów i banalny w użyciu. W tym wpisie pokażę jak przygotować popularny moduł do użycia z RaspberryPi i jak odebrać pierwsze pakiety używając SocketCan.
Przygotowanie modułu MCP2515 i TJA105
Moduł po zakupie gotowy jest do zasilania napięciem 5V. Niestety RaspberryPi akceptuje poziom 3,3V na portach IO (input-output). Trzeba więc tak przerobić moduł, by był gotowy na niższe napięcie. Najprościej byłoby nic nie zmieniać i po prostu zasilić moduł 3,3V. O ile MCP2515 nie stwarza problemu i jest w stanie działać na niższym napięciu, tak układ TJA105 wymaga napięcia 5v.
W przyszłym kroku wykonamy poniższe czynności:
- układ MCP2515 zasilany będzie napięciem 3.3V
- układ TJA105 zasilany będzie napięciem 5V
- dzielnik napięcia umożliwi konwersję 5V na 3.3V by oba powyższe układy pracowały bez zarzutu.
W pierwszej kolejności nacinamy ścieżkę na dole płytki, odcinając układ TJA105 od gałęzi VCC:
Następnie podnosimy nóżkę numer 4 – RX pin układu TJA105:
tu w innym ujęciu TJA105i MCP2515:
na powyższym zdjęciu widać też przylutowany dzielnik napięcia. Wartości rezystorów to:
- 68kΩ(683) od strony kondensatora (masa)
- 39kΩ(393) od strony czerwonego kabla RX (sygnał, +5)
Teraz wykonujemy inne połączenia przy użyciu cienkiego przewodu:
- biały – wyjście przewodu do napięcia 5v – zasilanie TJA105
- zielony – przylutowanie przewodu z 5v do kondensatora filtrującego i gałęzi zasilania TJA105
- niebieski – przewód z podniesionego w poprzednim kroku pinu RX do dzielnika napięcia
- czerwony – dzielnik napięcia przylutowany do jednego z wyprowadzeń kondensatora
- żółty – wejście sygnału RX pochodzące od TJA105 odpowiednio dopasowane napięciowo przez dzielnik napięcia i połączone do MCP2515
Podłączenie MCP2515 do RaspberryPi
Ok, układ gotowy, teraz czas połączyć go do raspberryPi:
Moduł MCP2515 | RaspberryPi Numer w porcie GPIO |
RaspberryPi Nazwa sygnału |
INT | 32 | IO12 |
SCK | 23 | SPI0.CLK |
SI | 19 | SPI0.MOSI |
SO | 21 | SPI0.MISO |
CS | 24 | SPI0.CE0 |
GND | 6 | GND |
VCC | 1 | 3,3V |
„biały”przewód | 2 | 5,0V |
Użycie ProtoBoard
Ja dla wygody zamiast przewodów do połączenia użyłem płytki RPi ProtoBoard, wygląda to następująco:
Konfiguracja RaspberryPi
Ok, sprzęt gotowy i podłączony do Raspberry. Czas skonfigurować malinkę i odebrać pierwszy pakiet z sieci CAN.
Na wstępie aktywujemy SPI w raspberry – pokazuję jak to zrobić w tym wpisie.
Następnie modyfikujemy plik config.txt:
1 |
sudo nano /boot/config.txt |
odnajdujemy sw nim linijkę „dtparam=spi=on” – po aktywowaniu SPI powinna być odkomentowana (Nie zawierać ‚#’ na początku) i zaraz pod nią dopisujemy:
1 2 |
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=12 dtoverlay=spi-bcm2835-overlay |
następnie wciskamy Ctrl+X i Y, by zapisać plik.
Krótkie wyjaśnienie powyższego wpisu, umożliwia ewentualne dopasowanie do waszych warunków, ale jeśli od początku robicie wszystko według tego wpisu, tylko dla ciekawości:
- oscillator: prędkość kwarcu wlutowanego na płytce MCP2515 [Hz]
- interrupt: miejsce podłączenia PINu INT do RaspberryPi [numer portu IO]
Ok, restartujemy RaspberryPi – komenda reboot.
Teraz chwila prawdy, sprawdzamy czy wszystko polutowaliśmy poprawnie i czy kable zostały dobrze podłączone:
wywołujemy komendę:
1 |
ls /sys/bus/spi/devices/spi0.0 |
a następnie:
1 |
ls /sys/bus/spi/devices/spi0.0/net |
powinniśmy zobaczyć poniższą odpowiedź. Jeśli widzimy „can0” wszystko jest idealnie! Jeśli nie – sprawdzamy połączenia i płytkę. Mi udało się dopiero po drugim sprawdzeniu i poprawie połączeń 😛
SocketCan przy użyciu RaspberryPi i MCP2515
Ok, czas odebrać pakiety. Instalujemy oprogramowanie SocketCan:
1 |
sudo apt-get install can-utils |
Teraz konfigurujemy nasz interfejs podając z jaką prędkością sieci CAN będzie pracował – u mnie będzie to 95k.
1 |
sudo ip link set can0 up type can bitrate 95000 |
Jeśli dotrwaliście do tego momentu i wszystkie komendy nie zwróciły żadnych błędów poniższa komenda uruchamiająca dumper pakietów będzie tylko zwieńczeniem starań:
1 |
candump can0 |
po jej wywołaniu widzimy jak odbywa się ruch w sieci CAN!:
Gratulacje, teraz możliwości są nieograniczone!
mVn
Cześć,
pracuję nad czymś podobnym. Rozbudowuję fabryczne radio o możliwość odtwarzania z BT + możliwością kontroli odtwarzania z kierownicy ;). Wykorzystuje raspberry pi zero W + 2 x MCP2515. Mam tutaj taką zajawkę https://youtu.be/hC46aexGG74 . Jestem na etapie finalizacji.
Napisałem obsługę wyświetlacza, bo na początku miałem plan pozbycia się radia fabrycznego, jednak finalnie wyświetlacza nie będę wykorzystywał.
Na początku projektu, szukając informacji, trafiłem na twój artykuł z Arduino + Can. Artykuł był bardzo pomocny :).
Pozdrawiam.
Hahaha, ale trafiłeś – właśnie pracuję nad podobnym rozwiązaniem. Zmieniłem telefon i nowy aparat nie ma wyjścia Jack 3.5mm, więc muszę przejść na BT. Obejrzałem filmik – Świetny projekt! Podoba mi się jak płynnie wyświetlasz na BID i nie nakłada Ci się z danymi z radia!
A gdyby tak zamienić transceiver np. na sn65vhd230?
prawdopodobnie można by zasilić z raspberryPi bez kombinowania z dzielnikiem. Tylko z dostępnością ciężko. Ten moduł z poradnika jest dostępny w formie wygodnej, polutowanej płytki na pęczki, czy to na allegro czy na Aliexpressie 😉
Na zdjęciu numer 2 brak jest obok C1 rezystorów a na następnym zdjeciu już są, jakie są ich wartości?
Whooooa! dzięki za zwrócenie uwagi, kompletnie zapomniałem!
68k (683) od kondensatora i 39k(393) od strony czerwonego przewodu RX.
Hej, mam pytanko: w jaki sposób łączysz się z malinką? Chodzi mi o rodzaje połączenia i konfigurację
Hej,
VNC – bardzo wygodna opcja do graficznego dostępu:)
Jeśli chodzi o mnie polecam program VNC Viewer
Witam, czy możesz udzielić mi informacji czy jest możliwość odczytania danych z CAN poprzez gniazdo OBD i ewentualnie, do których pinów w OBD podłączyć moduł MCP. Ogólnie chodzi mi o prawidłowe podłączenie modułu MCP od strony instalacji w samochodzie. Poskładałem raspi z modułem i do momentu wpisania komendy „candump can0” jest ok. Po jej wpisaniu nie dzieje się nic, tzn. nie czyta „ruchu w sieci CAN. Próbowałem podpinać w różnych konfiguracjach do gniazda OBD i nic. W samochodzie natomiast dzieją się różne rzeczy np. włącza i wyłącza się radio lub włączają się światła. Byłbym wdzięczny z pomoc.
Pozdrawiam 🙂
Hej Marek,
jasne! dla mojego Opla (generalnie wszystkie Ople z lat ~2004-2008) wszystkie linie są w gnieździe OBD. a wyprowadzone są następująco:
// \ 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
więcej znajdziesz tu: http://www.emvn.pl/siec-can-opel-odczyt-jasnosci/
pozdrawiam,
Kamil