LoginSignup
0
0

M5Stamp C3U Mate 3.3V電源駆動とCAN通信

Posted at

概要

低消費電力でCAN通信を行う必要があり調べたところ、RISC-V MCUを用いた
M5Stamp C3U Mate(もしくはSeeedXiao ESP32C3)が良いということが分かりました。
機器の制約上供給できる電源は3.3Vのため、M5Stamp C3U Mateの入力電圧要件を
満たせていません。
しかしESP32C3の推奨電圧要件を調べると3.0V~3.6Vとなています。
image.png

M5Stamp C3U Mate内蔵のDCDCコンバーター(HM8089)の入力電圧範囲は
2.5V~5.5Vとなっており、3.3V入力でも大丈夫そうです。
image.png

以上を踏まえて5V端子に3.33Vを印加したところ、3V3端子部で3.06Vとなりました。
この端子電圧はMCUの供給電圧でもあるためMCUの電圧要件を満足しています。
手持ちのマイコンから3.3Vを供給したため正確な3.3Vではありませんが、
3.30Vでも問題は無さそうです。
image.png

image.png

実際に動作させてみたところCAN通信できることが確認できました。

環境など

 エディタ:VisualStudioCode(PlatformIO IDE)
 マイコン:M5Stamp C3U Mate
 CANライブラリ:ESP32-TWAI-CAN.hpp
 CANコンバーター:SN65HVD230搭載 CANトランシーバボード(WAVESHARE-3945)

回路図

image.png

コード 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を試してみましたが、ほぼ同等の結果でした。
image.png

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0