可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

MCP2515を使ってRaspberryPiでCAN通信

MCP2515のモジュールを使ってRaspberryPiでCAN通信をする。



配線とか初期設定はここら辺を参考に


ざっくりやること
・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?