概要
低消費電力でCAN通信を行う必要があり調べたところ、RISC-V MCUを用いた
M5Stamp C3U Mate(もしくはSeeedXiao ESP32C3)が良いということが分かりました。
機器の制約上供給できる電源は3.3Vのため、M5Stamp C3U Mateの入力電圧要件を
満たせていません。
しかしESP32C3の推奨電圧要件を調べると3.0V~3.6Vとなています。
M5Stamp C3U Mate内蔵のDCDCコンバーター(HM8089)の入力電圧範囲は
2.5V~5.5Vとなっており、3.3V入力でも大丈夫そうです。
以上を踏まえて5V端子に3.33Vを印加したところ、3V3端子部で3.06Vとなりました。
この端子電圧はMCUの供給電圧でもあるためMCUの電圧要件を満足しています。
手持ちのマイコンから3.3Vを供給したため正確な3.3Vではありませんが、
3.30Vでも問題は無さそうです。
実際に動作させてみたところCAN通信できることが確認できました。
環境など
エディタ:VisualStudioCode(PlatformIO IDE)
マイコン:M5Stamp C3U Mate
CANライブラリ:ESP32-TWAI-CAN.hpp
CANコンバーター:SN65HVD230搭載 CANトランシーバボード(WAVESHARE-3945)
回路図
コード M5Stamp C3U Mate
#include <Arduino.h>
#include <M5Unified.h>
#include <ESP32-TWAI-CAN.hpp>
#define CAN_TX 3
#define CAN_RX 4
int RX_PIN = 20;
int TX_PIN = 21;
CanFrame rxFrame;
byte data[7];
uint8_t can_rev_data[9];
// CANデータ送信
void send_CAN(int ID,byte value[]){
CanFrame obdFrame = { 0 };
obdFrame.identifier = ID;//ID設定
obdFrame.extd = 0;
obdFrame.data_length_code = 8;
for (int i = 0; i < 8; i++) {
obdFrame.data[i] = value[i];
}
ESP32Can.writeFrame(obdFrame); // timeout defaults to 1 ms
}
// CAN受信データをPCへ転送
void receive_CAN(){
// IDを2byte配列へ格納
int32_t data = rxFrame.identifier;
uint8_t ID_H = (uint8_t)((data & 0x0000FF00) >> 8);
uint8_t ID_L = (uint8_t)((data & 0x000000FF) >> 0);
// データ送信
Serial1.write(ID_H);//ID_H送信
Serial1.write(ID_L);//ID_L送信
for(int i=0;i<8;i++)
{
Serial1.write(rxFrame.data[i]);//データ送信
}
}
void setup() {
// 周波数設定(WiFi利用時は80以上で設定)
setCpuFrequencyMhz(160);
Serial1.begin(62500,SERIAL_8N1,RX_PIN,TX_PIN);
// Start CAN@500kbps
if(ESP32Can.begin(ESP32Can.convertSpeed(500), CAN_TX, CAN_RX, 10, 10)) {
//Serial1.println("CAN bus started!");
} else {
//Serial1.println("CAN bus failed!");
}
}
void loop() {
// CANデータ受信 You can set custom timeout
if(ESP32Can.readFrame(rxFrame, 10)) {
receive_CAN();
}
// シリアルデータ受信
if(Serial1.available() > 0) {
byte buf[9];
Serial1.readBytes(buf, 10); //byte配列受信(10byte:ID2byte、data8byte)
int ID=buf[0]*256+buf[1]; //CAN ID
data[0]=buf[2]; //D1
data[1]=buf[3]; //D2
data[2]=buf[4]; //D3
data[3]=buf[5]; //D4
data[4]=buf[6]; //D5
data[5]=buf[7]; //D6
data[6]=buf[8]; //D7
data[7]=buf[9]; //D8
send_CAN(ID,data); //CANデータ送信(ID,Value)
}
}
plathomeio.ini設定
[env:esp32-c3-devkitm-1]
platform = espressif32
framework = arduino
board = esp32-c3-devkitm-1
build_flags =
-DARDUINO_USB_CDC_ON_BOOT
-DARDUINO_USB_MODE
lib_deps =
m5stack/M5Unified@^0.1.14
adafruit/Adafruit NeoPixel@^1.12.0
handmade0octopus/ESP32-TWAI-CAN@^1.0.1
対向機、PCソフトコード
以前の記事を参照ください。
https://qiita.com/pugzo/items/ff74eac3cdd1bdc16c05
消費電流測定
設定周波数を変更してみましたが大きく変わることはありませんでした。
また、40MHzではCAN通信が成立しませんでした。
同じ条件でSeeedXiao ESP32C3を試してみましたが、ほぼ同等の結果でした。
参考URL