M5Stackシリーズ(ATOM)とCAN-BUSユニットで、CAN送信ツールを作る。

CAN
YOU
YOU

車両のCANバスに、任意メッセージを送信したいのだけど。

CANツールって結構高いんだよね。

けんろう
けんろう

M5Stackシリーズなら、任意のCANメッセージを送信することができるよ。

しかも、その装置も小さくできるし、たった数千円で作れるよ。

M5Stackの拡張部品として、CAN-BUSユニットという部品が販売されています。

M5Stackシリーズと、CAN-BUSユニットを使うことで、自動車に使われるCANデータを送受信することができます。

M5Stack関連の情報収集をするなら、この記事を見てください。M5Stack関連のサイトを選りすぐって紹介しています。

スポンサーリンク

M5Stack用CAN-BUSユニットとは

CANユニットは、複雑なCAN通信ネットワークを構築するために使用できる分離コントローラーエリアネットワーク(CAN)トランシーバーユニットです。
内蔵のDC-DC絶縁型パワーチップは、ノイズと干渉を絶縁し、敏感な回路への損傷を防ぐことができます。

CAN-BUSユニットの情報は、以下が詳しいです。

公式サイト

m5-docs
The reference docs for M5Stack products. Quick start, get the detailed information or instructions such as IDE,UIFLOW,Arduino. The tutorials for M5Burner, Firmw...
即戦力のAIエンジニアになるためのE資格講座を、業界最安価格帯で

CAN-BUSユニットの使い方

CAN-BUSユニットのつなぎ方

ATOMとCAN-BUS間は、GROVEケーブルでつなぎます。

CAN-BUSと車両は、CANL,CANH、GNDを繋ぎます。

ライブラリ

CAN-BUSユニットには、M5Stackが用意しているライブラリがあります。

以下のサイトから、ダウンロードしてください。

M5-ProductExampleCodes/Unit/CAN at master · m5stack/M5-ProductExampleCodes
All example codes of products supplied by M5Stack have been collected in this reposity. - M5-ProductExampleCodes/Unit/CAN at master · m5stack/M5-ProductExampleC...

上記サイトを見ると、以下のフォルダがあります。

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メッセージ送信ツールを紹介しました。

M5Stack用CAN-BUSユニット(CA-IS3050G) - スイッチサイエンス
絶縁型のCAN(コントローラエリアネットワーク)トランシーバーユニットで、複雑なCAN通信ネットワークの構築が可能となります。内蔵のDC/DC絶縁型電源チップにより、ノイズと混信を絶縁し、敏感な回路へのダメージを防ぎます。

コメント

タイトルとURLをコピーしました