【Raspberry Pi】python-canを使ってCANで遊ぶ

引き続き、CANのお話。

今回は、Pythonモジュールのpython-canを利用して
外部CANコントローラ、レシーバなしで遊んでみたメモです。
※詳細ではなく、とりあえず動かせる程度のものをメモ。


f:id:Yoshichi:20170831232852j:plain

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

※ちなみにWindowsの場合、ファイルを直接Python環境に放り込むのが吉

canserverを立ち上げる

上記、同フォルダにあるcanフォルダに移動し

$ python3 server.py -H 127.0.0.1 -p 54701 -i virtual -b 500000

を実行してサーバーを立ち上げます。

f:id:Yoshichi:20170907024251j:plain

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

を実行すると、

サーバー上の画面

f:id:Yoshichi:20170907023957j:plain

recve.py上の画面

f:id:Yoshichi:20170907024033j:plain

てな感じで、ターミナル2で送ったデータが
無事に、ターミナル1に届きました。

次やりたいこと

  • python-canを利用したMCP2515とのやりとり
  • python-canをもうちょっと詳しく