CAN FDをマイコンで扱った事例がネット上に少なく苦労しましたが……要約疎通したのでメモ
実際のところ
回路接続
- M5stack Basic
- Grove PortA (赤)にコネクタをつなげる
私の環境では不要でしたが、終端の120Ωが必要なときは裏面にある端子をジャンパはんださせます。
スクリプト
#include "Serial_CAN_FD.h" #include <Arduino.h> #include <M5Unified.h> #define can_tx 22 // Grove connector pin 1 (SCL) #define can_rx 21 // Grove connector pin 2 (SDA) #define uart_can Serial2 void uart_init(unsigned long baudrate) { uart_can.begin(baudrate, SERIAL_8N1, can_tx, can_rx); } void uart_write(unsigned char c) { uart_can.write(c); } unsigned char uart_read() { return uart_can.read(); } int uart_available() { return uart_can.available(); } void setup() { M5.begin(); M5.Power.begin(); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(0, 0); M5.Lcd.println("CAN FD Test"); uart_init(9600); can_speed_20(1000000); // set can bus baudrate to 1M can_speed_fd(1000000, 5000000); // set can bus baudrate to 5M. M5.Lcd.println("CAN FD Initialized"); } void loop() { M5.update(); // M5Stack のボタンの状態を更新 if (M5.BtnA.wasPressed()) { // ボタン A が押されたかチェック unsigned long __id = 0x01; // can id unsigned char __ext = 0; // 拡張フレームなし unsigned char __rtr = 0; // データフレーム’(1にするとリモートフレーム) unsigned char __fdf = 0; // CAN FDのパケットとして設定 unsigned char __len = 3; // data length // 1つ目のパケット unsigned char __dta1[3] = {0x01, 0x02, 0x03}; can_send(__id, __ext, __rtr, __fdf, __len, __dta1); M5.Lcd.setCursor(0, 60); M5.Lcd.println("Sent 2 CAN FD frames"); } delay(10); // 短い遅延を追加してCPU負荷を軽減 }