🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    M5Dial & CAN using PlatformIO

    Scheduled Pinned Locked Moved General
    8 Posts 3 Posters 7.5k Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      samarkh
      last edited by

      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.

      1 Reply Last reply Reply Quote 0
      • felmueF Offline
        felmue
        last edited by

        Hello @samarkh

        which examples have you tried? Maybe this example code can help?

        Thanks
        Felix

        GPIO translation table M5Stack / M5Core2
        Information about various M5Stack products.
        Code examples

        1 Reply Last reply Reply Quote 0
        • S Offline
          samarkh
          last edited by

          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 = 115200

          Start 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);
          ......
          .....
          .....
          etc

          and 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.11

          upload_speed = 1500000
          monitor_speed = 115200

          and 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();
          ....
          etc

          and 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.zip

          build_flags =
          -DESP32S3
          -DBOARD_HAS_PSRAM
          upload_speed = 1500000
          monitor_speed = 115200

          and 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.
          ...
          etc

          Yours Simon M

          1 Reply Last reply Reply Quote 0
          • S Offline
            samarkh
            last edited by

            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;
            #endif

            CAN_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?

            1 Reply Last reply Reply Quote 0
            • felmueF Offline
              felmue
              last edited by

              Hello @samarkh

              I assume you've adapted the TX and RX GPIOs for M5Core2 accordingly, yes?

              Thanks
              Felix

              GPIO translation table M5Stack / M5Core2
              Information about various M5Stack products.
              Code examples

              S 1 Reply Last reply Reply Quote 0
              • S Offline
                samarkh @felmue
                last edited by

                @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.

                1 Reply Last reply Reply Quote 0
                • felmueF Offline
                  felmue
                  last edited by

                  Hello @samarkh

                  these GPIOs look ok to me. Hmm, not sure why it doesn't work on M5Core2 though. Sorry.

                  Thanks
                  Felix

                  GPIO translation table M5Stack / M5Core2
                  Information about various M5Stack products.
                  Code examples

                  1 Reply Last reply Reply Quote 0
                  • U Offline
                    uberdweeb
                    last edited by

                    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 = arduino

                    lib_deps =
                    https://github.com/collin80/can_common
                    https://github.com/plapointe6/EspMQTTClient
                    m5stack/M5Dial
                    m5stack/M5Unified

                    upload_speed = 1500000
                    monitor_speed = 115200

                    Plug 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.

                    1 Reply Last reply Reply Quote 0

                    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
                    • First post
                      Last post