車両のCANバスに、任意メッセージを送信したいのだけど。
CANツールって結構高いんだよね。
M5Stackシリーズなら、任意のCANメッセージを送信することができるよ。
しかも、その装置も小さくできるし、たった数千円で作れるよ。
M5Stackの拡張部品として、CAN-BUSユニットという部品が販売されています。
M5Stackシリーズと、CAN-BUSユニットを使うことで、自動車に使われるCANデータを送受信することができます。
M5Stack関連の情報収集をするなら、この記事を見てください。M5Stack関連のサイトを選りすぐって紹介しています。
M5Stack用CAN-BUSユニットとは
CANユニットは、複雑なCAN通信ネットワークを構築するために使用できる分離コントローラーエリアネットワーク(CAN)トランシーバーユニットです。
内蔵のDC-DC絶縁型パワーチップは、ノイズと干渉を絶縁し、敏感な回路への損傷を防ぐことができます。
CAN-BUSユニットの情報は、以下が詳しいです。
公式サイト
CAN-BUSユニットの使い方
CAN-BUSユニットのつなぎ方
ATOMとCAN-BUS間は、GROVEケーブルでつなぎます。
CAN-BUSと車両は、CANL,CANH、GNDを繋ぎます。
ライブラリ
CAN-BUSユニットには、M5Stackが用意しているライブラリがあります。
以下のサイトから、ダウンロードしてください。
上記サイトを見ると、以下のフォルダがあります。
CAN_RECEIVE (CAN受信サンプルコード)
CAN_SEND (CAN送信サンプルコード)
フォルダ内は、以下のソースコードが入っています。
CAN-BUSユニットのライブラリコード(CAN_RECEIVE、CAN_SENDで共通です)
CAN.c
CAN.h
CAN_config.h
ESP32CAN.cpp
ESP32CAN.h
can_regdef.h
CAN-BUSユニットのアプリ
CAN_RECEIVE.ino ・・・ CAN受信アプリ
CAN_SEND.ino ・・・ CAN送信アプリ
CAN-BUSユニットを使ったアプリを作るには、上記アプリを改造して製作するのが一番簡単です。
今回作成するアプリ
自動車のCANバスに、ATOM+CAN-BUS経由で、任意のCANメッセージを送信するアプリを作成します。
「1」を指示すれば、CANメッセージ(CAN ID:0x100、DATA:01 02 03 04 05 06 07 08)
「2」を指示すれば、CANメッセージ(CAN ID:0x200、DATA:A0 A1 A2 A3 A4 A5 A6 A7)
フォルダ構成
ライブラリとアプリを同じフォルダに入れるようにしてください。
CAN_test - CAN_TEST.ino
CAN.c
CAN.h
CAN_config.h
ESP32CAN.cpp
ESP32CAN.h
can_regdef.h
サンプルコード
#include "M5Atom.h"
#include "ESP32CAN.h"
#include "CAN_config.h"
#define TX_PORT GPIO_NUM_26
#define RX_PORT GPIO_NUM_32
CAN_device_t CAN_cfg;
// CAN初期化処理
void func_can_init(){
CAN_cfg.speed=CAN_SPEED_500KBPS;
CAN_cfg.tx_pin_id = TX_PORT;
CAN_cfg.rx_pin_id = RX_PORT;
CAN_cfg.rx_queue = xQueueCreate(10,sizeof(CAN_frame_t));
//start CAN Module
ESP32Can.CANInit();
}
// 初期化処理
void setup(){
// M5Stack初期化
M5.begin(true, false, true);
Serial.begin(115200);
// 表示
Serial.println("");
Serial.println("CAN送信アプリ");
Serial.println("「1」押下で、CANメッセージ1を送信");
Serial.println("「2」押下で、CANメッセージ2を送信");
// CANモジュール初期化
func_can_init();
// 起動時LED点灯
M5.dis.drawpix(0, 0x00f0f0); // 紫
}
// メイン処理
void loop(){
CAN_frame_t rx_frame;
// シリアル通信を受信したときの処理
if(Serial.available() > 0) {
// 受信データを取得
char ch = Serial.read();
Serial.println(ch);
if(ch == '1'){
rx_frame.FIR.B.FF = CAN_frame_std;
rx_frame.MsgID = 0x100;
rx_frame.FIR.B.DLC = 8;
rx_frame.data.u8[0] = 0x01;
rx_frame.data.u8[1] = 0x02;
rx_frame.data.u8[2] = 0x03;
rx_frame.data.u8[3] = 0x04;
rx_frame.data.u8[4] = 0x05;
rx_frame.data.u8[5] = 0x06;
rx_frame.data.u8[6] = 0x07;
rx_frame.data.u8[7] = 0x08;
ESP32Can.CANWriteFrame(&rx_frame);
Serial.println("Send Message 1 ");
delay(100);
}else if(ch == '2'){
rx_frame.FIR.B.FF = CAN_frame_std;
rx_frame.MsgID = 0x200;
rx_frame.FIR.B.DLC = 8;
rx_frame.data.u8[0] = 0xA0;
rx_frame.data.u8[1] = 0xA1;
rx_frame.data.u8[2] = 0xA2;
rx_frame.data.u8[3] = 0xA3;
rx_frame.data.u8[4] = 0xA4;
rx_frame.data.u8[5] = 0xA5;
rx_frame.data.u8[6] = 0xA6;
rx_frame.data.u8[7] = 0xA7;
ESP32Can.CANWriteFrame(&rx_frame);
Serial.println("Send Message 2 ");
delay(100);
}else if(ch == 13){
}else if(ch == 10){
}else{
Serial.println("無効な操作です");
}
}else{
}
}
注意事項です。
上記サンプルコードの「CAN_cfg.speed=CAN_SPEED_500KBPS;」という文がありますが、これはCAN速度の設定です。つなぐ先のCAN速度を設定してください。今の車なら、だいたい500kbpsで問題ないと思います。
上記サンプルコードをArduinoIDEで、ATOMに書き込んでください。
上で説明したように、各部品を繋いでください。
使い方
ArduinoIDEのシリアルモニターをつかってもらうのが簡単です。
シリアルモニターの上部に、1か2を入力すると、CANメッセージが送信されます。
まとめ
今回は、M5 ATOMとCAN-BUSユニットを使ったCANメッセージ送信ツールを紹介しました。
コメント