🤖 ESP32-S3 BALANCE — Waveshare Touch LCD 1.28

ESP32-S3 240 MHz | QMI8658 IMU | GC9A01 1.28″ LCD | CH343G USB-UART | SN65HVD230 CAN

GC9A01
1.28″ round
240×240
SPI
ESP32-S3
240 MHz / 8MB
USB-A CH343G (UART0 debug/flash)
GPIO6 IMU SDA (I2C-0)
GPIO7 IMU SCL (I2C-0)
GPIO3 QMI8658 INT
GPIO43 UART0 TX (CH343G)
GPIO44 UART0 RX (CH343G)
UART1 TX Inter-board → IO (TBD)
UART1 RX Inter-board ← IO (TBD)
CAN TX → SN65HVD230 D (TBD)
CAN RX ← SN65HVD230 R (TBD)
LCD SPI GC9A01 (onboard)
5V USB / ext 5V in
3.3V LDO out
GND Common ground

📌 Pin Assignments

IMU (QMI8658) — I2C-0 SDA=GPIO6, SCL=GPIO7, INT=GPIO3
CAN (SN65HVD230) — TX/RX TBD; confirm in esp32/balance/src/config.h
UART0 GPIO43/44 — CH343G USB bridge (debug + flash)
UART1 TBD — Inter-board @ 460800 baud → ESP32-S3 IO
LCD SPI — GC9A01 1.28″ round 240×240 (onboard, fixed pins)
Power — 5V USB input; 3.3V LDO for logic + sensors

🔌 CAN Bus Topology

Orin → CANable 2.0 → CANH/CANL (500 kbps)
BALANCE: SN65HVD230 on CAN bus
VESC Left: ID 0x44 (68) | VESC Right: ID 0x38 (56)
120 Ω termination at each bus end

📡 Inter-Board Protocol

UART @ 460800 baud, 8N1
Frame: [0xAA][LEN][TYPE][PAYLOAD][CRC8]
Types: see esp32/shared/protocol.h

⚡ Safety

Motors NEVER spin on power-on — ARM required
RC kill switch checked every loop
CAN watchdog: 500 ms → RC-only mode
ESTOP: CAN 0x303 + 0xE5 → all motors off

⚠️ CAN TX/RX GPIO assignments are TBD — confirm in esp32/balance/src/config.h before wiring. All inter-board UART GPIO also TBD. LCD and IMU pins are fixed by Waveshare hardware.