鳥なき里のマイコン屋(123) M5StackとArduino Uno、CANバス接続

Joseph Halfmoon

別シリーズにてArduino用のCANバスIFと、M5Stack用のCANバスIFを手に入れ、ぞれぞれCANフレーム送信をロジアナ機能で確認いたしました。当然次のステップとしては2つをCANバスで接続して通信できることの確認です。今回はM5StackからArduinoへ一方通行にしたので簡単。

何と言ってもCANバスは、「バス」というくらいで、一組のケーブルに複数のデバイスをぶら下げて相互に通信できるところが魅力であります。有線だけれど数十mくらいの距離は楽勝、ノイズにも強い、と。長いバスになるべく多く、いろいろなデバイスを接続してみようと野望を抱いておるのであります。千里の道も一歩から(?)まずは、1対1の通信が正しく行えることの確認からであります。

今回のシステムのブロックダイアグラムもどきをアイキャッチ画像に掲げました。通信を行うのはM5Stack GrayとArduino Unoであります。現物、通信しているところの様子がこちら。

M5_CAN_Arduino左上がM5Stack Grayであります。銀色の3個のボタンがあり、左のAボタンを押すと、CANバスにID=1、DLC=8のフレームに”HelloCAN”というメッセージを、中のBボタンを押すと同じID、DLCのフレームに”M5Stack “というメッセージを送り出すサンプルプログラムを書き込んであります。左側面からUARTの信号と電源を取り出してあり右上のM5Stack社製のCAN BUSユニットに接続しています。このユニットには(写真ちょっと切れていますが)1mほどの長さの「CANバスケーブル」が接続してあります。

ケーブルの他端は端子台に接続されています。ここに120Ωの「終端抵抗」を入れてみました。その先に接続しているのが、中央上で青くLEDを光らせているLongan Lab社製のCANバスインタフェースモジュールです。このモジュールのUART端子は純正Arduino Unoのデジタル端子に接続しています。

Arduino、M5Stackとも書き込んであるのは、ボード製造元から提供されているサンプルプログラムをチョイ変したものです。

Arduino Uno側のサンプルソフトとその設定変更

Arduino Uno側に書き込んだプログラムは、以下から取得できるLongan Lab社のexamples の recv というプログラムです。

Longan-Labs/Serial_CAN_Arduino

単純なプログラムで、CANインタフェースに到来したCANフレームを Arduino標準のSerialに接続した仮想端末に向かってID、DLC、ペイロードバイト列に解読してダンプします。以下の部分を変更してあります。

  • CANボーレートの変更 125kbps
  • Arduino-CANIF間のシリアル通信速度57600bps

デフォルトではCANの速度500kbpsになっています。相手のM5Stackのサンプルプログラムの設定が125kpbsです。初回なので「とりあえず遅いほうに合わせておく」ということで125kbpsといたしました。

また、Arduino-CANIF間はUART通信(ソフトウエアシリアル利用みたい)で、デフォルトが9600bpsになっています。CANのボーレート目安に速度を上げようかと思ったですが、どこまでソフトウエアシリアルが追いつくのか不明。サンプルプログラムをみると57600bpsにあげているものがあったので、とりあえずそれにあわせました。

M5Stack Gray側のサンプルソフトとその設定変更

M5Stack Grayに書き込んだプログラムは以下から得られる、IF単独テストの投稿でも使用した CAN_SEND というサンプルプログラムです。

M5-ProductExampleCodes/Unit/CAN

IFテストでは、オシロ/ロジアナ機能で送信CANフレームを観察するために同じフレームを垂れ流し続けるように改変して使いました。今回はオリジナル通り、M5Stackのキーを押したときだけCANフレームを送信するとともに、M5Stack画面と仮想シリアルポートに送信したというメッセージを示すようにしてあります。変更してあるのは端子のアサインです。

  • シリアル通信ピン TX G17端子
  • シリアル通信ピン RX G16端子

この変更により、M5Stackの右側面から信号を取り出すようになります。

送信側: M5Stack Grayのモニタ画面

CANバス送信側のM5Stack Grayを起動すると仮想シリアルポートには以下のようなメッセージが表示されます。上の方はシステムからの報告なので今回対象は CAN Unit Sendという行以下です。ボタンAを押すとA、ボタンBを押すとBと表示され、その裏でそれぞれのボタンに紐づいた8文字のメッセージがCANバスに送信されている筈。

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
M5Stack initializing...OK
CAN Unit Send
Start
A
B
受信側: Arudino Unoのモニタ画面

対する受信側のArduino Unoの仮想端末の画面はこんな感じです。実際にCANフレームの受信に対応しているのが、GET DAT FROM ID行とその次のペイロードの16進バイトダンプ行です。

Uno_can_recv begin
SERIAL BAUD RATE IS: 57600
Serial baudrate set to 57600
set baud rate ok
set can rate ok
GET DATA FROM ID: 1
0x48 0x65 0x6C 0x6C 0x6F 0x43 0x41 0x4E 
GET DATA FROM ID: 1
0x4D 0x35 0x53 0x54 0x41 0x43 0x4B 0x20 

Aキーが押されたときに到着しているフレームは以下のように解釈できます。

MsgID=1, DLC=8, “HelloCAN”

Bキーの場合は以下のように。

MsgID=1, DLC=8, “M5Stack ”

ちゃんと受信できているようです。次は双方向で送受信の確認かな。

鳥なき里のマイコン屋(122) Raspberry Pi4到着、パズパイPico の母艦化 へ戻る

鳥なき里のマイコン屋(124) M5StackとUno間, CANフレームのラウンドトリップ へ進む