やや多趣味の人のブログ

人生のアーカイブって言ったらカッコいいね!

XIAO ESP32 C6 でCAN通信しようとしたらできなかったお話。

追記(2026/02/19)

 成功しました!!こっちの記事を見てください!!

wells.hatenablog.jp

はじめに

 最近「XIAO ESP32 C6」(以下C6)を購入しまして、いろいろ遊んだのでブログにしてまとめようという。今回は、CAN通信に挑戦したけど、なんかうまくいかなかったというお話です。

 C6については、こちらに簡単な紹介をしていますよ!!!

wells.hatenablog.jp


CAN通信って何?

 まぁ詳細は省略するんですが、Controller Area Network通信の略でして、差動通信という方式であり、同相ノイズに強い、そういう意味で信頼性がある通信です。車とかロボコンの基板間通信などによく使われますね。


Esp32を使ったCAN通信。

 これ自体は以前ブログにて、紹介しました。こちらも参照いただければ幸いです。。。

wells.hatenablog.jp

 上の記事では、送信側をEsp32、受信をSTM社のマイコンとしています。現時点ではSTMのコード、つまりは受信側のコードを残していないのですけれども。。(これは、そもそも当時のコードがSTM社のH563を用いた内製基板であまり汎用的ではないため、書き直そうとしてさぼっているという。あと、一応ロボコンをしている弊団体の技術ではあるので、そのまま公開するのはいかがなものか、という意味もある)

 上記事でも紹介していますが、少なくともEsp32 Dev Module(以下Esp32無印)は外部のCANトランシーバや終端抵抗を使うことで、CAN通信が可能です。


さて、C6でやるCAN通信(できていません)

 そもそもC6でCANできるの?という問題があります(根本的すぎる)。一応、公式ドキュメントがあるので、機能としてはあるはずです。

docs.espressif.com

一応、CAN FDには対応していないのと、CANトランシーバは内蔵されていないので別に用意する必要はあります(これはEsp32無印も同様)。

つまりは、Esp32無印と同様にしてCAN通信を行えるはずなのですが、なぜかうまくいかないというオチ。


一応、コードは張り付けておきます。ライブラリは以下のものを使用しました。(このライブラリは上の記事にて、使用したものの一つであり、Esp32無印では正常動作しました。ちなみに、記事内ではもう一つ別のライブラリを使用しましたが、それはバージョンの都合上、C6では利用不可です。)

github.com

#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など)は正常に機能するので、本当によくわかりません。

 やったことある方いたら、ぜひ教えてくださると幸いです。。