Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

M5stampS3 と Grove Mini CANモジュールでCAN通信 その1:M5stampからUbuntuへ送信

実際のところ

GroveからM5stampへの接続

M5stampにはGroveコネクタがないので、片側ピンになってるタイプの線を買ってG13とG15に繋ぎます。
ここで注意しないといけないのが、接続順。
どういうわけか、Groveコネクタの黄色、白とモジュール表記の黄色白色が反転しています。
私はここを見落としており、2時間無駄にしました。

スクリプト

M5stampではesp32_canライブラリがうまく動きません。
そこで、公式推奨の二線ライブラリ"TWAI"を使います。

加えて、USBシリアルに対応してないっぽいので、以前実験したLEDテープで確認する方向でデバッグします。

#include <M5Unified.h>
#include <FastLED.h>
#include "driver/twai.h" //TWAI for CAN
// Button configuration:w

// CAN Pins
#define TX_GPIO_NUM GPIO_NUM_13
#define RX_GPIO_NUM GPIO_NUM_15
#define CAN_BITRATE TWAI_TIMING_CONFIG_1MBITS()

#define BUTTON1_PIN 7

// LED Strip configuration
#define NUM_LEDS 27
#define LED_PIN 3
#define BRIGHTNESS 20

// Define the LED array
CRGB leds[NUM_LEDS];

// global variables
twai_message_t tx_msg;
twai_message_t rx_msg;


void sendCANMessage(uint32_t id, uint8_t* data, uint8_t length) {
    twai_message_t message;
    message.identifier = id;
    message.extd = 0;  // Standard frame
    message.rtr = 0;   // Data frame
    message.data_length_code = length;
    memcpy(message.data, data, length);
    leds[19] = CRGB::Blue;
    FastLED.show();

    if (twai_transmit(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
        leds[20] = CRGB::Green;
        FastLED.show();
        delay(100);
        Serial.printf("Message sent - ID: 0x%03X, Length: %d, Data: ", id, length);
        for (int i = 0; i < length; i++) {
            Serial.printf("%02X ", data[i]);
        }
        Serial.println();
    } else {
        Serial.println("Failed to send message");
        leds[20] = CRGB::Red;
        FastLED.show();
        delay(100);
    }
}


void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  Serial.begin(115200);
  while (!Serial) {
    delay(100);
  }
  Serial.println("Serial initialized");

  // TWAI CAN Setup
  twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(TX_GPIO_NUM, RX_GPIO_NUM, TWAI_MODE_NORMAL);
  twai_timing_config_t t_config = TWAI_TIMING_CONFIG_1MBITS();
  twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();

    // Initialize FastLED
  FastLED.addLeds<SK6812, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);  // Set brightness (0-255)

  
  // Install TWAI Driver
  if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
    // Success
    Serial.println("TWAI Driver installed");
    // Turn on LEDs
    leds[4] = CRGB::Green;
    FastLED.show();
  } else {
    // Failed
    Serial.println("TWAI Driver installation failed");
    return;
  }

  // Start TWAI Driver
  if (twai_start() == ESP_OK) {
    // Success
    // Turn on LEDs
    leds[8] = CRGB::Yellow;
    FastLED.show();
    Serial.println("TWAI Driver started");
  } else {
    // Failed
    Serial.println("TWAI Driver start failed");
    return;
  }


  // Initialize buttons
  pinMode(BUTTON1_PIN, INPUT_PULLUP);
  Serial.println("Buttons initialized");
}

void loop() {
  M5.update();
  
  // Check Button 1
  if (digitalRead(BUTTON1_PIN) == LOW) {
    fill_solid(leds, NUM_LEDS, CRGB::Black);
    FastLED.show();
    Serial.println("Button 1 pressed");
    // Send CAN Message
    sendCANMessage(0x123, (uint8_t*)"Hello, CAN!", 12);
    Serial.println("CAN Message sent");
    delay(200);

  }
}

受け手のUbuntu

のデバイスを使って、ボーレート1Mで設定します。

$ sudo ip link set can0 down
$ sudo ip link set can0 type can bitrate 1000000
$ sudo ip link set can0 up

試しにやってみると……きてますね

$ candump can0
  can0  123   [8]  48 65 6C 6C 6F 2C 20 43

参考もと

shuzo-kino.hateblo.jp