【Raspberry Pi】python-canを使ってCANで遊ぶ
引き続き、CANのお話。
今回は、Pythonモジュールのpython-canを利用して
外部CANコントローラ、レシーバなしで遊んでみたメモです。
※詳細ではなく、とりあえず動かせる程度のものをメモ。
python-can
https://python-can.readthedocs.io/en/latest/python-can — python-can 2.0.0-alpha.2 documentation
PythonでCANを触ることができるようになる。
BusのInterfaceは色々揃ってて、企業でよく使われていそうなVector等も対応しているっぽい。
普段は、"socketcan_native"を使用すればよい思われます。
インストール
$ pip3 install python-can
Viertualを使ったテストコード
ドキュメントからprint文以外、そのまま持ってきています。
import can
bus1 = can.interface.Bus('test', bustype='virtual')
bus2 = can.interface.Bus('test', bustype='virtual')msg1 = can.Message(arbitration_id=0xabcde, data=[1,2,3])
bus1.send(msg1)
msg2 = bus2.recv()
print(msg2)
assert msg1 == msg2
bustypeをvirtualとしていますが、virtualを指定すると
仮想環境上で送受信のやり取りが可能になり
CANコントローラなしで、動かすことができます。
ただし、上記は同一のPythonプログラム上でしか
動かせないっぽいので、ファイルを分けて
送受信させたい場合、上記だけではできないっぽいです。
canserverとRemote interface
python-canにはRemote interfaceというものがあり、
これを利用すると、canserverを介して複数のプログラム上で通信が可能になるようです。
canserverのインストール
https://github.com/hardbyte/python-can
からクローンしてきます。
落としてきたフォルダに移動し下記を実行。
$ python3 setup.py develop
canserverを立ち上げる
上記、同フォルダにあるcanフォルダに移動し
$ python3 server.py -H 127.0.0.1 -p 54701 -i virtual -b 500000
を実行してサーバーを立ち上げます。
canserverを介して送受信させる
受信用のファイルを用意します。
recve.py
import can
bus = can.interface.Bus('127.0.0.1:54701', bustype='remote', biterate=500000 , canfilters=None)
msg2 = bus.recv()
print(msg2)
次に送信用のファイルを要します。
send.py
import can
bus = can.interface.Bus('127.0.0.1:54701', bustype='remote', bitrate=500000, canfilters=None)
msg1 = can.Message(arbitration_id=0xabcde, data=[1,2,3])
bus.send(msg1)
後は、別なターミナル上でそれぞれ
ターミナル1
$ python3 recve.py
ターミナル2
$ python3 send.py
を実行すると、
サーバー上の画面
recve.py上の画面
てな感じで、ターミナル2で送ったデータが
無事に、ターミナル1に届きました。