M5Dial & CAN using PlatformIO
-
Has anyone got the m5Stack dial to work with the CAN (Controller Area Network) Unit SKU: U085 using PlatformIO?
I have got all the examples to compile OK but now I want to connect to the CAN unit I get errors.
Yours Simon M.
-
-
The solutions I found worked are
For the M5Dial
Platform.ini :-; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduino
lib_deps =
m5stack/M5Dial@^1.0.2
m5stack/M5Unified@^0.1.11
m5stack/M5GFX@^0.1.11
platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32/archive/refs/tags/2.0.14.zip
upload_speed = 1500000
monitor_speed = 115200Start of code:
/**
- @file encoder.ino
- @author SeanKwok (shaoxiang@m5stack.com)
- @brief M5Dial Encoder Test
- @version 0.2
- @date 2023-10-18
- @Hardwares: M5Dial
- @Platform Version: Arduino M5Stack Board Manager v2.0.7
- @Dependent Library:
- M5GFX: https://github.com/m5stack/M5GFX
- M5Unified: https://github.com/m5stack/M5Unified
*/
#include "M5Dial.h"
void setup()
{
auto cfg = M5.config();
M5Dial.begin(cfg, true, false);
......
.....
.....
etcand for the M5 Core2
Platformio.ini =
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = arduino
platform_packages =
framework-arduinoespressif32@https://github.com/espressif/arduino-esp32/archive/refs/tags/2.0.14.zip
lib_deps =
m5stack/M5Unified@^0.1.11upload_speed = 1500000
monitor_speed = 115200and start of code:
/*
- Minimum code to get a display on the
- M5Stack Core2
- Using PlatformIO and Arduino
*/
#include <Arduino.h>
#include <M5Unified.h>
#include <M5GFX.h>void setup()
{
M5.begin();
....
etcand for the M5Stack Core3S
Platformio.ini
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html[env:m5stack-cores3]
platform = espressif32
board = m5stack-cores3
framework = arduino
lib_deps =
tinyu-zhao/BMI270_Sensor@^0.0.1
m5stack/M5CoreS3@^0.0.4
m5stack/M5Unified@^0.1.11
platform_packages =
framework-arduinoespressif32@https://github.com/espressif/arduino-esp32/archive/refs/tags/2.0.14.zipbuild_flags =
-DESP32S3
-DBOARD_HAS_PSRAM
upload_speed = 1500000
monitor_speed = 115200and code start
/*
- Copyright (c) 2023 by M5Stack
-
Equipped with M5CoreS3 sample source code
- Visit for more information:
- https://docs.m5stack.com/en/core/CoreS3 - Docs
- https://github.com/m5stack/M5CoreS3 - GitHub
- Describe: Hello World
- Date: 2023/5/3
*/
#include <Arduino.h>
#include <M5CoreS3.h>void setup()
{
M5.begin(true, true, false); // Init M5CoreS3.
...
etcYours Simon M
-
As yet I have only got the M5Stack ATOMIC CANBus Base and CANBus Unit to work with the following code using Atom Lite & Atom Matrix :-
#include "M5Atom.h"
#include <ESP32CAN.h>
#include <CAN_config.h>#define CAN_BASE // Remove to use external CAN bus via Grove cable
//#define CAN_RECIEVER // Remove to make sender#define CAN_MSG_ID 0x001
CAN_device_t CAN_cfg; // CAN Config.
unsigned long previousMillis = 0; // will store last time a CAN Message was sent // send. 将存储上次发送CAN消息的时间。
const int interval = 80; // interval at which send CAN Messages (milliseconds).const int rx_queue_size = 10; // Receive Queue size.
int LedNumberCount = 0;
int waitCANData = 0;uint8_t msgcnt = 0;
void setup()
{
M5.begin(true, true, true);
Serial.println("Atom Install OK....");
M5.dis.fillpix(CRGB(100, 0, 0)); //Fill the LED Matrix RED
delay(2000);#ifdef CAN_BASE // CAN base is used
//default
CAN_cfg.tx_pin_id = GPIO_NUM_22;
CAN_cfg.rx_pin_id = GPIO_NUM_19;#else
// Grove
CAN_cfg.tx_pin_id = GPIO_NUM_26;
CAN_cfg.rx_pin_id = GPIO_NUM_32;
#endifCAN_cfg.speed = CAN_SPEED_500KBPS; CAN_cfg.rx_queue = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t)); ESP32Can.CANInit(); Serial.println("CAN Install"); M5.dis.fillpix(CRGB(0, 100, 0)); //Fill the LED Matrix GREEN
M5.dis.fillpix(CRGB(HUE_GREEN)); //Fill the LED Matrix GREEN
#ifdef CAN_RECIEVER
Serial.println("Set as RECIEVER");
#else
Serial.println("Set as SENDER");
#endif
}void loop()
{
unsigned long currentMillis = millis();#ifdef CAN_RECIEVER
// recieve CAN Message
CAN_frame_t rx_frame;if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) == pdTRUE) { if (rx_frame.FIR.B.FF == CAN_frame_std) { Serial.printf("New standard frame"); } else { Serial.printf("New extended frame"); } if (rx_frame.FIR.B.RTR == CAN_RTR) { Serial.printf(" RTR from 0x%08X, DLC %d\r\n", rx_frame.MsgID, rx_frame.FIR.B.DLC); } else { Serial.printf(" from 0x%08X, DLC %d, Data ", rx_frame.MsgID, rx_frame.FIR.B.DLC); for (int i = 0; i < rx_frame.FIR.B.DLC; i++) { Serial.printf("0x%02X ", rx_frame.data.u8[i]); } Serial.printf("\n"); if (rx_frame.data.u8[0] == 0x01) { CAN_frame_t tx_frame; tx_frame.FIR.B.FF = CAN_frame_std; tx_frame.MsgID = CAN_MSG_ID; tx_frame.FIR.B.DLC = 8; tx_frame.data.u8[0] = 0x02; tx_frame.data.u8[1] = rx_frame.data.u8[1]; tx_frame.data.u8[2] = 0x00; tx_frame.data.u8[3] = 0x00; tx_frame.data.u8[4] = 0x00; tx_frame.data.u8[5] = 0x00; tx_frame.data.u8[6] = 0x00; tx_frame.data.u8[7] = 0x00; ESP32Can.CANWriteFrame(&tx_frame); } } }
#else
// Send CAN Message
if (currentMillis - previousMillis >= interval)
{
// ESP32Can.CANInit();
previousMillis = currentMillis;
CAN_frame_t tx_frame;
tx_frame.FIR.B.FF = CAN_frame_std;
tx_frame.MsgID = CAN_MSG_ID;
tx_frame.FIR.B.DLC = 8;
tx_frame.data.u8[0] = 0x01;
tx_frame.data.u8[1] = msgcnt;
tx_frame.data.u8[2] = 0x00;
tx_frame.data.u8[3] = 0x00;
tx_frame.data.u8[4] = 0x00;
tx_frame.data.u8[5] = 0x00;
tx_frame.data.u8[6] = 0x00;
tx_frame.data.u8[7] = 0x00;ESP32Can.CANWriteFrame(&tx_frame); // ESP32Can.CANStop(); msgcnt++; if (msgcnt > 29) { msgcnt = 0; } } CAN_frame_t rx_frame; if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) == pdTRUE) { if (rx_frame.FIR.B.FF == CAN_frame_std) { Serial.printf("New standard frame"); } else { Serial.printf("New extended frame"); } if (rx_frame.FIR.B.RTR == CAN_RTR) { Serial.printf(" RTR from 0x%08X, DLC %d\r\n", rx_frame.MsgID, rx_frame.FIR.B.DLC); } else { Serial.printf(" from 0x%08X, DLC %d, Data ", rx_frame.MsgID, rx_frame.FIR.B.DLC); for (int i = 0; i < rx_frame.FIR.B.DLC; i++) { Serial.printf("0x%02X ", rx_frame.data.u8[i]); } Serial.printf("\n"); if (rx_frame.data.u8[0] == 0x02) { if (rx_frame.data.u8[1] < 25) { M5.dis.drawpix(rx_frame.data.u8[1], CRGB(100, 0, 0)); } else if (rx_frame.data.u8[1] > 27) { M5.dis.fillpix(CRGB(0, 0, 20)); } waitCANData = 0; } } }
#endif
// waitCANData
M5.update();
if (M5.Btn.isPressed())
{
M5.dis.clear();
M5.dis.fillpix(CRGB(0, 100, 0));
esp_restart();
}
delay(10);
}when I modify it to work with the Core2, it compiles OK but no echo back. what am I missing?
-
Hello @samarkh
I assume you've adapted the TX and RX GPIOs for M5Core2 accordingly, yes?
Thanks
Felix -
@felmue
I used
/* set CAN pins */
// GROVE connector GPIO pins
CAN_cfg.tx_pin_id = GPIO_NUM_32; // Use this order only
CAN_cfg.rx_pin_id = GPIO_NUM_33;and I'm able to see activity on the CAN bus using an oscilloscope.
-
Hello @samarkh
these GPIOs look ok to me. Hmm, not sure why it doesn't work on M5Core2 though. Sorry.
Thanks
Felix -
I did get this to work. I'm using this library for the CAN part:
https://github.com/aaknitt/esp32_can/tree/master
Put this code in lib and change the pin designations in esp32_can.cpp:
ESP32CAN attribute((weak)) CAN0(GPIO_NUM_1, GPIO_NUM_2) ;platformio.ini looks like this:
[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduinolib_deps =
https://github.com/collin80/can_common
https://github.com/plapointe6/EspMQTTClient
m5stack/M5Dial
m5stack/M5Unifiedupload_speed = 1500000
monitor_speed = 115200Plug it into Port B
Setup code is like:
CAN0.setCANPins(GPIO_NUM_1, GPIO_NUM_2);
USBSerial.println("Set CAN pins...");
CAN0.begin(500000);
USBSerial.println("CAN has started...");
CAN0.watchFor();
CAN0.setCallback(0, theCanDecoder);If you want full code I can probably clean this all up and publish on Git.