MCP2515を使ってRaspberryPiでCAN通信
MCP2515のモジュールを使ってRaspberryPiでCAN通信をする。
配線とか初期設定はここら辺を参考に
- python-can — python-can 2.1.0 documentation
- https://media.readthedocs.org/pdf/python-can/2.1.0/python-can.pdf
- 【Raspberry Pi】python-canを使ってCANで遊ぶ - Yoshichiの日記
- 【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた - Yoshichiの日記
- 【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた 2回目 - Yoshichiの日記
- Raspberry Pi CAN通信 (MCP2515 TJA1050 CAN Bus Module) - Qiita
- OBD2(CAN)で自動車と通信(ソフト編) | Make.
- Raspberry Pi と MCP2515 で CAN 通信 | Rabbit Note
- MCP2515 | wsnakのブログ
- Python-can(CAN over Serial)でESP32(ESP-IDF)と通信する - Qiita
ざっくりやること
・can-utilsのインストール
・python-canモジュールのインストール
・SPIの設定
・CANインタフェース設定とUP
ハマったところ⇒config.txtの編集、overlayがいらないってところ
電源電圧分離箇所
can-utilsはapt-getでインストールできる。
情報が少ないpython-canの使い方を少し説明。
簡単なCAN受信のコードを。
import can # バスの初期化 bus = can.interface.Bus(channel = 'can0', bustype='socketcan_native', bitrate=500000, canfilters=None) # すでに用意されているコールバック関数(can.Listenerクラスのon_message_received関数)をオーバーライド class CallBackFunction(can.Listener): def on_message_received(self, msg): print(msg.data) # コールバック関数のインスタンス生成 call_back_function = CallBackFunction() # コールバック関数登録 can.Notifier(bus, [call_back_function, ]) # 何もしない処理 try: while True: pass except KeyboardInterrupt: print('exit') bus.shutdown()
このコードはCAN信号を受信するまで待機し、受信したらコールバック関数を実行するコードとなっています。
普通こういう割り込みをさせる場合は、コールバック関数を自分で定義し、
何かしらの関数か何かに引数として渡して、コールバック関数を登録することが多いと思うのですが、
python-canの場合はもうすでに用意してあるcan.Listenerクラスのon_message_received()関数をオーバーライド(上書き)し、
そのインスタンスをcan.Notifier()に渡すことでコールバック関数を登録します。
この時can.Notifier()に渡すコールバック関数インスタンスはリストにしなければいけません。
一回だけ受信する場合はcan.recv()を使ったり、送信する場合はcan.send()を使ったりします。
そこらへん詳しくは、時間があれば。
おまけ
C++でCAN?
- All miscellanous tech articles: Step-by-step guide: Installing the Lawicel CANUSB adapter on Linux
- SocketCAN - Wikipedia
- http://www.can232.com/?page_id=75
- Installing SocketCAN · gribot-robotics/documentation Wiki · GitHub
- GitHub - linux-can/can-utils: Linux-CAN / SocketCAN user space applications