#pragma once /* ── ESP32-S3 BALANCE board — Waveshare ESP32-S3-Touch-LCD-1.28 pinout ───── * * Orin comms: CH343 USB-to-serial on UART0 (GPIO43/44) → /dev/ttyACM0 on Orin * VESC CAN: SN65HVD230 transceiver on GPIO15 (TX) / GPIO16 (RX) * Display: GC9A01 on SPI2 — BL=GPIO40, RST=GPIO12 * * GPIO2 is NOT used for CAN — it is free. Earlier versions had an erroneous * conflict between DISP_BL (GPIO2) and VESC_CAN_TX (GPIO2); corrected here * to match motor-test-firmware verified hardware layout (commit 8e66430). */ /* ── Orin serial (CH343 USB-to-UART, 1a86:55d3 on Orin side) ── */ #define ORIN_UART_PORT UART_NUM_0 #define ORIN_UART_BAUD 460800 #define ORIN_UART_TX_GPIO 43 /* ESP32 UART0 TX → CH343 RXD */ #define ORIN_UART_RX_GPIO 44 /* CH343 TXD → ESP32 UART0 RX */ #define ORIN_UART_RX_BUF 1024 #define ORIN_TX_QUEUE_DEPTH 16 /* ── Inter-board UART (ESP32 BALANCE ↔ ESP32 IO) ── */ #define IO_UART_TX_GPIO 17 #define IO_UART_RX_GPIO 18 /* ── VESC CAN TWAI (SN65HVD230 on Waveshare header GPIO15/16) ── */ #define VESC_CAN_TX_GPIO 15 /* ESP32 TWAI TX → SN65HVD230 TXD */ #define VESC_CAN_RX_GPIO 16 /* SN65HVD230 RXD → ESP32 TWAI RX */ #define VESC_CAN_RX_QUEUE 32 /* VESC node IDs */ #define VESC_ID_A 61u /* FRONT VESC — drive + telemetry (0x81) */ #define VESC_ID_B 79u /* REAR VESC — telemetry only (0x82) */ /* ── GC9A01 240×240 round display (Waveshare ESP32-S3-Touch-LCD-1.28, SPI2) ── */ #define DISP_DC_GPIO 8 #define DISP_CS_GPIO 9 #define DISP_SCK_GPIO 10 #define DISP_MOSI_GPIO 11 #define DISP_RST_GPIO 12 #define DISP_BL_GPIO 40 /* ── Safety / timing ── */ #define HB_TIMEOUT_MS 500u /* heartbeat watchdog: disarm if exceeded */ #define DRIVE_TIMEOUT_MS 500u /* drive command staleness timeout */ #define TELEM_STATUS_PERIOD_MS 100u /* 10 Hz status telemetry to Orin */ #define TELEM_VESC_PERIOD_MS 100u /* 10 Hz VESC telemetry to Orin */ /* ── Drive → VESC RPM scaling ── */ #define RPM_PER_SPEED_UNIT 5 /* speed_units=1000 → 5000 ERPM */