実際のところ
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); } }