別シリーズにてArduino用のCANバスIFと、M5Stack用のCANバスIFを手に入れ、ぞれぞれCANフレーム送信をロジアナ機能で確認いたしました。当然次のステップとしては2つをCANバスで接続して通信できることの確認です。今回はM5StackからArduinoへ一方通行にしたので簡単。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
何と言ってもCANバスは、「バス」というくらいで、一組のケーブルに複数のデバイスをぶら下げて相互に通信できるところが魅力であります。有線だけれど数十mくらいの距離は楽勝、ノイズにも強い、と。長いバスになるべく多く、いろいろなデバイスを接続してみようと野望を抱いておるのであります。千里の道も一歩から(?)まずは、1対1の通信が正しく行えることの確認からであります。
今回のシステムのブロックダイアグラムもどきをアイキャッチ画像に掲げました。通信を行うのはM5Stack GrayとArduino Unoであります。現物、通信しているところの様子がこちら。
左上が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 ”
ちゃんと受信できているようです。次は双方向で送受信の確認かな。