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 GREENM5.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.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login