From 09edd8f593402feff65136ffd6753967879ccae8 Mon Sep 17 00:00:00 2001 From: jwidess Date: Sun, 16 Mar 2025 19:50:40 -0500 Subject: [PATCH 1/7] Support for nodemcu32_uart Added env for nodemcu32 UART --- platformio.ini | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/platformio.ini b/platformio.ini index d820e93..b9e50f6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -13,6 +13,7 @@ default_envs = wemos_d1_mini32 ;default_envs = esp32doit_devkit_v1 ;default_envs = esp32doit_devkit_v1_uart ;default_envs = nodemcu-32s +;default_envs = nodemcu-32s_uart ;default_envs = avaspark-rgb ;default_envs = lolin_wemos_s3_mini ;default_envs = feather_esp32 @@ -176,6 +177,19 @@ build_flags = extra_scripts = pre:change_firmware_name.py custom_firmware_name = firmware_nodemcu-32s +[env:nodemcu-32s_uart] +platform = espressif32 +board = nodemcu-32s +framework = arduino +monitor_speed = 115200 +board_build.partitions = default.csv +lib_deps = + ${common_env_data.lib_deps_external} +build_flags = + ${ESP32.build_flags} -D LED_WS28xx -D CANBUS_ENABLED +extra_scripts = pre:change_firmware_name.py +custom_firmware_name = firmware_nodemcu-32s_uart + [env:avaspark-rgb] platform = espressif32 board = nodemcu-32s From c36464e2e688df789b20b728fb3451f416e54f7f Mon Sep 17 00:00:00 2001 From: jwidess Date: Mon, 23 Mar 2026 17:04:17 -0500 Subject: [PATCH 2/7] Update .gitignore with Clangd files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 4bafaae..138b451 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ extensions.json /CMakeListsPrivate.txt rESCue.code-workspace .vscode/settings.json + +# Clangd related: +.cache +compile_commands.json From a267af5c8605a550372924ae38e5945c243a6667 Mon Sep 17 00:00:00 2001 From: jwidess Date: Mon, 23 Mar 2026 18:04:34 -0500 Subject: [PATCH 3/7] Fix CAN pin defines and GPIO mapping macros Removed leading underscores(_) from CAN_TX_PIN/CAN_RX_PIN in platformio.ini (now 26, 27) and simplified CanDevice.h GPIO macro to use these. Can't see a reason why the ESP32S3 had different `#ifndef` --- platformio.ini | 12 ++++++------ src/CanDevice.h | 17 +++++------------ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/platformio.ini b/platformio.ini index b9e50f6..2d0ce6d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -47,8 +47,8 @@ build_flags= -D LIGHT_BAR_PIN=2 ; DIN of WS28xx for battery indicator -D VESC_RX_PIN=16 ; UART RX to Cheap Focer 2, connent to TX on CF2 -D VESC_TX_PIN=17 ; UART TX to Cheap Focer 2, connent to RX on CF2 - -D CAN_TX_PIN=_26 - -D CAN_RX_PIN=_27 + -D CAN_TX_PIN=26 + -D CAN_RX_PIN=27 [FEATHER-ESP32] build_flags= @@ -64,8 +64,8 @@ build_flags= -D LIGHT_BAR_PIN=13 ; DIN of WS28xx for battery indicator -D VESC_RX_PIN=7 ; UART RX to Cheap Focer 2, connent to TX on CF2 -D VESC_TX_PIN=8 ; UART TX to Cheap Focer 2, connent to RX on CF2 - -D CAN_TX_PIN=_26 - -D CAN_RX_PIN=_27 + -D CAN_TX_PIN=26 + -D CAN_RX_PIN=27 [ESP32-S3] build_flags= @@ -100,8 +100,8 @@ build_flags= -D LIGHT_BAR_PIN=19 ; DIN of WS28xx for battery indicator ;-D VESC_RX_PIN=32 ; UART RX to Cheap Focer 2, connent to TX on CF2 ;-D VESC_TX_PIN=33 ; UART TX to Cheap Focer 2, connent to RX on CF2 - -D CAN_TX_PIN=_33 - -D CAN_RX_PIN=_32 + -D CAN_TX_PIN=33 + -D CAN_RX_PIN=32 -D PIN_BOARD_LED=16 ; Onboard LED for avaspark-rgb -D BMS_TX_PIN=23 ; Map UART RX to BMS TX Pin -D BMS_ON_PIN=25 ; Map GPIO to trigger IRF540N 100v N-channel mosfet which emulates momentary button for OWIE BMS on (battery voltage on blue wire) to ground. Connect the Source pin of the MOSFET to ground. Connect the Drain pin to the BMS's wake-up wire. Connect the Gate pin to the microcontroller's TX pin. diff --git a/src/CanDevice.h b/src/CanDevice.h index ace07e4..205f92f 100644 --- a/src/CanDevice.h +++ b/src/CanDevice.h @@ -15,18 +15,11 @@ static const char* LOG_TAG_CANDEVICE = "CanDevice"; #define CAN_RX_PIN 27 #endif //CAN_RX_PIN -//Macros to fix actually being able to map the CAN GPIO pins in platformio.ini instead of them being hard coded in init() for TWAI_GENERAL_CONFIG_DEFAULT(); -#ifndef ESP32S3 - #define GPIO_NUM_HELPER(x) GPIO_NUM##x - #define GPIO_NUM(x) GPIO_NUM_HELPER(x) - #define GPIO_CAN_TX_PIN GPIO_NUM(CAN_TX_PIN) - #define GPIO_CAN_RX_PIN GPIO_NUM(CAN_RX_PIN) -#else - #define GPIO_NUM_HELPER(x) GPIO_NUM_##x - #define GPIO_NUM_(x) GPIO_NUM_HELPER(x) - #define GPIO_CAN_TX_PIN GPIO_NUM_(CAN_TX_PIN) - #define GPIO_CAN_RX_PIN GPIO_NUM_(CAN_RX_PIN) -#endif +// Map numeric CAN pin defines (e.g. 9) to gpio_num_t enum constants (GPIO_NUM_9). +#define GPIO_NUM_HELPER(x) GPIO_NUM_##x +#define GPIO_NUM_(x) GPIO_NUM_HELPER(x) +#define GPIO_CAN_TX_PIN GPIO_NUM_(CAN_TX_PIN) +#define GPIO_CAN_RX_PIN GPIO_NUM_(CAN_RX_PIN) class CanDevice { private: From 8442f95ae95cd5fec421d83541d2c6ffc7fedb1c Mon Sep 17 00:00:00 2001 From: jwidess Date: Mon, 23 Mar 2026 18:06:46 -0500 Subject: [PATCH 4/7] Remove CANBUS from nodemcu-32s_uart Removed ` -D CANBUS_ENABLED` from UART variant. --- platformio.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 2d0ce6d..61ac885 100644 --- a/platformio.ini +++ b/platformio.ini @@ -185,8 +185,7 @@ monitor_speed = 115200 board_build.partitions = default.csv lib_deps = ${common_env_data.lib_deps_external} -build_flags = - ${ESP32.build_flags} -D LED_WS28xx -D CANBUS_ENABLED +build_flags = ${ESP32.build_flags} -D LED_WS28xx extra_scripts = pre:change_firmware_name.py custom_firmware_name = firmware_nodemcu-32s_uart From 03149587ee0a53f4ae36abef8f26dd67f11ce703 Mon Sep 17 00:00:00 2001 From: jwidess Date: Mon, 23 Mar 2026 18:12:46 -0500 Subject: [PATCH 5/7] Added VESC_UART_PORT and CANBUS checks Configurable VESC_UART_PORT macro (default 2) in config.h for the HardwareSerial in main.cpp instead of a hardcoded port. This allows for boards like the ESP32-C3. Add preprocessor checks in main.cpp to enforce that CANBUS_ENABLED and CANBUS_ONLY are either both defined (CAN mode) or both undefined (UART mode). I'd like to eventually see if we can allow for just CANBUS_ENABLED to support a dual UART and CANBUS_ENABLED setup. --- src/config.h | 4 ++++ src/main.cpp | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/config.h b/src/config.h index 19d0643..aee5d6d 100644 --- a/src/config.h +++ b/src/config.h @@ -34,6 +34,10 @@ #define VESC_BAUD_RATE 115200 // BAUD rate of the CF2 +#ifndef VESC_UART_PORT +#define VESC_UART_PORT 2 +#endif + #define VESC_CAN_ID 25 //VESC-ID as configured in VESC as decimal #endif //__CONFIG_H__ diff --git a/src/main.cpp b/src/main.cpp index 21ad171..eb358cf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,6 +15,14 @@ const int mainBufSize = 128; char mainBuf[mainBufSize]; +#if defined(CANBUS_ENABLED) && !defined(CANBUS_ONLY) + #error "CANBUS_ENABLED and CANBUS_ONLY must both be defined for CANBUS mode. For UART mode, define neither." +#endif + +#if defined(CANBUS_ONLY) && !defined(CANBUS_ENABLED) + #error "CANBUS_ENABLED and CANBUS_ONLY must both be defined for CANBUS mode. For UART mode, define neither." +#endif + #if defined(CANBUS_ENABLED) && defined(BMS_TX_PIN) && defined(BMS_ON_PIN) #include "BMSController.h" #endif @@ -35,7 +43,7 @@ BLE_OTA_DFU ota_dfu_ble; VescData vescData; #ifndef CANBUS_ENABLED - HardwareSerial vesc(2); + HardwareSerial vesc(VESC_UART_PORT); #endif ILedController *ledController; From 0b692e089352992b91c156003578a927dd24addc Mon Sep 17 00:00:00 2001 From: jwidess Date: Mon, 23 Mar 2026 18:13:58 -0500 Subject: [PATCH 6/7] Add ESP32-C3 support Added esp32c3_devkitm_1 support, both CAN and UART variants. --- platformio.ini | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 61ac885..3c648aa 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,6 +18,8 @@ default_envs = wemos_d1_mini32 ;default_envs = lolin_wemos_s3_mini ;default_envs = feather_esp32 ;default_envs = m5stack-stamps3 +;default_envs = esp32c3_devkitm_1 +;default_envs = esp32c3_devkitm_1_uart [common_env_data] lib_deps_external = @@ -85,6 +87,22 @@ build_flags= -D CAN_RX_PIN=17 -D ESP32S3 +[ESP32-C3] +build_flags= + ${common_env_data.build_flags} + -D PIN_NEOPIXEL=8 ; DIN of WS28xx stripe for front- / backlight, only needed if WS28xx is used + -D PIN_FORWARD=3 ; digital signal from Cheap Focer 2 if direction is forward + -D PIN_BACKWARD=4 ; digital signal from Cheap Focer 2 if direction is backward + -D PIN_BRAKE=5 ; digital signal from Cheap Focer 2 if electric motor brakes is on + -D BUZPIN=6 ; PIN for Piezo buzzer for acoustic signals (e.g. battery warning) + -D BATTERY_PIN=1 ; analog input for battery monitor, connected to voltage divider + -D LIGHT_BAR_PIN=7 ; DIN of WS28xx for battery indicator + -D VESC_RX_PIN=20 ; UART RX to Cheap Focer 2, connent to TX on CF2 + -D VESC_TX_PIN=21 ; UART TX to Cheap Focer 2, connent to RX on CF2 + -D CAN_TX_PIN=9 + -D CAN_RX_PIN=10 + -D VESC_UART_PORT=1 ; UART port for VESC + [AVASPARK-RGB] build_flags= ${common_env_data.build_flags} @@ -255,4 +273,20 @@ monitor_filters = esp32_exception_decoder ; build_type = debug extra_scripts = pre:change_firmware_name.py -custom_firmware_name = firmware_m5stack_stamps3 \ No newline at end of file +custom_firmware_name = firmware_m5stack_stamps3 + +[env:esp32c3_devkitm_1] +platform = espressif32 +board = esp32-c3-devkitm-1 +framework = arduino +monitor_speed = 115200 +board_build.partitions = default.csv +lib_deps = ${common_env_data.lib_deps_external} +build_flags = ${ESP32-C3.build_flags} -D LED_WS28xx -D CANBUS_ENABLED -D CANBUS_ONLY +extra_scripts = pre:change_firmware_name.py +custom_firmware_name = firmware_esp32c3_devkitm_1 + +[env:esp32c3_devkitm_1_uart] +extends = env:esp32c3_devkitm_1 +build_flags = ${ESP32-C3.build_flags} -D LED_WS28xx +custom_firmware_name = firmware_esp32c3_devkitm_1_uart \ No newline at end of file From 30692697cb4f0fc3dbdb83df52fe30ceb65bcd76 Mon Sep 17 00:00:00 2001 From: Justin Widen Date: Mon, 23 Mar 2026 21:42:15 -0500 Subject: [PATCH 7/7] Add ESP32-C3 and NodeMCU build targets to CI Updated GitHub Actions workflow to build and publish environments: esp32c3_devkitm_1, esp32c3_devkitm_1_uart, and nodemcu-32s_uart --- .github/workflows/main.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 800240e..3eec9d1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,20 +39,23 @@ jobs: python -m pip install --upgrade pip pip install --upgrade platformio - name: Run PlatformIO - run: pio run -e wemos_d1_mini32 -e wemos_d1_mini32_cob -e wemos_d1_mini32_uart -e wemos_d1_mini32_cob_uart -e lolin_wemos_s3_mini -e lolin_wemos_s3_mini_cob -e lolin_wemos_s3_mini_uart -e lolin_wemos_s3_mini_cob_uart + run: pio run -e wemos_d1_mini32 -e wemos_d1_mini32_cob -e wemos_d1_mini32_uart -e wemos_d1_mini32_cob_uart -e lolin_wemos_s3_mini -e lolin_wemos_s3_mini_cob -e lolin_wemos_s3_mini_uart -e lolin_wemos_s3_mini_cob_uart -e esp32c3_devkitm_1 -e esp32c3_devkitm_1_uart -e nodemcu-32s_uart - name: Rename firmware files run: | mv .pio/build/lolin_wemos_s3_mini/firmware_lolin_wemos_s3_mini.bin .pio/build/lolin_wemos_s3_mini/firmware_lolin_wemos_s3_mini-v${{ github.ref_name }}.bin mv .pio/build/lolin_wemos_s3_mini_cob/firmware_lolin_wemos_s3_mini_cob.bin .pio/build/lolin_wemos_s3_mini_cob/firmware_lolin_wemos_s3_mini-cob-v${{ github.ref_name }}.bin mv .pio/build/lolin_wemos_s3_mini_uart/firmware_lolin_wemos_s3_mini_uart.bin .pio/build/lolin_wemos_s3_mini_uart/firmware_lolin_wemos_s3_mini-uart-v${{ github.ref_name }}.bin mv .pio/build/lolin_wemos_s3_mini_cob_uart/firmware_lolin_wemos_s3_mini_cob_uart.bin .pio/build/lolin_wemos_s3_mini_cob_uart/firmware_lolin_wemos_s3_mini-cob_uart-v${{ github.ref_name }}.bin + mv .pio/build/esp32c3_devkitm_1/firmware_esp32c3_devkitm_1.bin .pio/build/esp32c3_devkitm_1/firmware_esp32c3_devkitm_1-v${{ github.ref_name }}.bin + mv .pio/build/esp32c3_devkitm_1_uart/firmware_esp32c3_devkitm_1_uart.bin .pio/build/esp32c3_devkitm_1_uart/firmware_esp32c3_devkitm_1_uart-v${{ github.ref_name }}.bin + mv .pio/build/nodemcu-32s_uart/firmware_nodemcu-32s_uart.bin .pio/build/nodemcu-32s_uart/firmware_nodemcu-32s_uart-v${{ github.ref_name }}.bin mv .pio/build/wemos_d1_mini32/firmware_wemos_d1_mini32.bin .pio/build/wemos_d1_mini32/firmware_wemos_d1_mini32-v${{ github.ref_name }}.bin mv .pio/build/wemos_d1_mini32_cob/firmware_wemos_d1_mini32_cob.bin .pio/build/wemos_d1_mini32_cob/firmware_wemos_d1_mini32-cob-v${{ github.ref_name }}.bin mv .pio/build/wemos_d1_mini32_uart/firmware_wemos_d1_mini32_uart.bin .pio/build/wemos_d1_mini32_uart/firmware_wemos_d1_mini32-uart-v${{ github.ref_name }}.bin mv .pio/build/wemos_d1_mini32_cob_uart/firmware_wemos_d1_mini32_cob_uart.bin .pio/build/wemos_d1_mini32_cob_uart/firmware_wemos_d1_mini32-cob_uart-v${{ github.ref_name }}.bin - name: Calculate checksums run: | - for file in $(ls .pio/build/wemos_d1_mini32*/*.bin .pio/build/lolin_wemos_s3_mini*/*.bin); do + for file in $(ls .pio/build/wemos_d1_mini32*/*.bin .pio/build/lolin_wemos_s3_mini*/*.bin .pio/build/esp32c3_devkitm_1*/*.bin .pio/build/nodemcu-32s_uart/*.bin); do sha256sum $file | cut -d " " -f 1 > $file.sha256 done - name: Release @@ -66,6 +69,9 @@ jobs: .pio/build/lolin_wemos_s3_mini_cob/firmware_lolin_wemos_s3_mini-cob-v${{ github.ref_name }}.bin .pio/build/lolin_wemos_s3_mini_uart/firmware_lolin_wemos_s3_mini-uart-v${{ github.ref_name }}.bin .pio/build/lolin_wemos_s3_mini_cob_uart/firmware_lolin_wemos_s3_mini-cob_uart-v${{ github.ref_name }}.bin + .pio/build/esp32c3_devkitm_1/firmware_esp32c3_devkitm_1-v${{ github.ref_name }}.bin + .pio/build/esp32c3_devkitm_1_uart/firmware_esp32c3_devkitm_1_uart-v${{ github.ref_name }}.bin + .pio/build/nodemcu-32s_uart/firmware_nodemcu-32s_uart-v${{ github.ref_name }}.bin .pio/build/wemos_d1_mini32/firmware_wemos_d1_mini32-v${{ github.ref_name }}.bin .pio/build/wemos_d1_mini32_cob/firmware_wemos_d1_mini32-cob-v${{ github.ref_name }}.bin .pio/build/wemos_d1_mini32_uart/firmware_wemos_d1_mini32-uart-v${{ github.ref_name }}.bin @@ -76,6 +82,9 @@ jobs: .pio/build/lolin_wemos_s3_mini_cob/firmware_lolin_wemos_s3_mini-cob-v${{ github.ref_name }}.bin.sha256 .pio/build/lolin_wemos_s3_mini_uart/firmware_lolin_wemos_s3_mini-uart-v${{ github.ref_name }}.bin.sha256 .pio/build/lolin_wemos_s3_mini_cob_uart/firmware_lolin_wemos_s3_mini-cob_uart-v${{ github.ref_name }}.bin.sha256 + .pio/build/esp32c3_devkitm_1/firmware_esp32c3_devkitm_1-v${{ github.ref_name }}.bin.sha256 + .pio/build/esp32c3_devkitm_1_uart/firmware_esp32c3_devkitm_1_uart-v${{ github.ref_name }}.bin.sha256 + .pio/build/nodemcu-32s_uart/firmware_nodemcu-32s_uart-v${{ github.ref_name }}.bin.sha256 .pio/build/wemos_d1_mini32/firmware_wemos_d1_mini32-v${{ github.ref_name }}.bin.sha256 .pio/build/wemos_d1_mini32_cob/firmware_wemos_d1_mini32-cob-v${{ github.ref_name }}.bin.sha256 .pio/build/wemos_d1_mini32_uart/firmware_wemos_d1_mini32-uart-v${{ github.ref_name }}.bin.sha256