追記(2026/02/19)
成功しました!!こっちの記事を見てください!!
はじめに
最近「XIAO ESP32 C6」(以下C6)を購入しまして、いろいろ遊んだのでブログにしてまとめようという。今回は、CAN通信に挑戦したけど、なんかうまくいかなかったというお話です。
C6については、こちらに簡単な紹介をしていますよ!!!
CAN通信って何?
まぁ詳細は省略するんですが、Controller Area Network通信の略でして、差動通信という方式であり、同相ノイズに強い、そういう意味で信頼性がある通信です。車とかロボコンの基板間通信などによく使われますね。
Esp32を使ったCAN通信。
これ自体は以前ブログにて、紹介しました。こちらも参照いただければ幸いです。。。
上の記事では、送信側をEsp32、受信をSTM社のマイコンとしています。現時点ではSTMのコード、つまりは受信側のコードを残していないのですけれども。。(これは、そもそも当時のコードがSTM社のH563を用いた内製基板であまり汎用的ではないため、書き直そうとしてさぼっているという。あと、一応ロボコンをしている弊団体の技術ではあるので、そのまま公開するのはいかがなものか、という意味もある)
上記事でも紹介していますが、少なくともEsp32 Dev Module(以下Esp32無印)は外部のCANトランシーバや終端抵抗を使うことで、CAN通信が可能です。
さて、C6でやるCAN通信(できていません)
そもそもC6でCANできるの?という問題があります(根本的すぎる)。一応、公式ドキュメントがあるので、機能としてはあるはずです。
一応、CAN FDには対応していないのと、CANトランシーバは内蔵されていないので別に用意する必要はあります(これはEsp32無印も同様)。
つまりは、Esp32無印と同様にしてCAN通信を行えるはずなのですが、なぜかうまくいかないというオチ。
一応、コードは張り付けておきます。ライブラリは以下のものを使用しました。(このライブラリは上の記事にて、使用したものの一つであり、Esp32無印では正常動作しました。ちなみに、記事内ではもう一つ別のライブラリを使用しましたが、それはバージョンの都合上、C6では利用不可です。)
#include <Arduino.h>
#include <ESP32-TWAI-CAN.hpp>
// --- CAN通信のピン定義 ---
#define CAN_TX 5
#define CAN_RX 4
// 送信カウンタ
byte counter = 0;
void setup() {
Serial.begin(115200);
Serial.println("Ready.");
// --- CAN通信の初期化 (1Mbps) ---
if (ESP32Can.begin(ESP32Can.convertSpeed(1000), CAN_TX, CAN_RX)) {
Serial.println("CAN bus started at 1Mbps.");
} else {
Serial.println("Failed to start CAN bus.");
while (1);
}
}
void loop() {
CanFrame txFrame = {0};
txFrame.identifier = 0x100;
txFrame.extd = 0; // 標準ID
txFrame.data_length_code = 8;
// 送信する適当な値を設定
txFrame.data[0] = 0x10;
txFrame.data[1] = 0x20;
txFrame.data[2] = 0x30;
txFrame.data[3] = 0x40;
txFrame.data[4] = 0x50;
txFrame.data[5] = 0x60;
txFrame.data[6] = 0x70;
txFrame.data[7] = counter;
// フレームを送信
if(ESP32Can.writeFrame(txFrame)){
Serial.printf("CAN Frame Sent.");
} else {
Serial.println("CAN Frame Send Failed.");
}
counter++;
delay(1000);
}
簡単に説明~~
- ID = 0x100 として標準IDで送信
- 送信レートは1Mbps
- 0~6のデータにはそれぞれ固定値、7には1秒ごとに1大きくなる変数を送信
上記のコードは、Esp32無印では送信できて、受け取りも確認できました。xiao c6に関しては、無印の場合と全く同じ回路構成(トランシーバとかジャンパワイヤとかブレッドボードとか。無印の場合と同じものを使用しているため、中で断線してるとかはありえない)だったんですけど無理でした。
挙動としては、なんとなく送信してそうな気配はあったんですが(上のコードで説明すると、CAN Frame Sent. を確認できるんですけど、数秒して、CAN Frame Send Failed. となりました。ライブラリが対応していないのか、はたまた不良品なのか、、、、
さらに、オシロスコープでCANの波形を確認しようとしたところ、それらしい波形が見られないんですよね。。つまりは、CAN部分の回路が故障している不良品か、コード的に無印とC6では互換性が無いかだとは思うんですよね。
ほかにxiao c6 持ってる人がいたら、確認できるんですけどね。いないのでね。真相は闇の中、、、
おわりに
不良品だったら、かなり運が悪いですよね。まぁ某アリエクで購入したので、何とも言えませんが。。。ちなみに、後に記事に書くかもですが、CAN以外の機能(Lチカ、I2C、Wi-Fiなど)は正常に機能するので、本当によくわかりません。
やったことある方いたら、ぜひ教えてくださると幸いです。。