- docs/: rewrite AGENTS.md, wiring-diagram.md (SAUL-TEE arch); update SALTYLAB.md, FACE_LCD_ANIMATION.md, board-viz.html, SALTYLAB-DETAILED refs - cad/: dimensions.scad FC params → ESP32-S3 BALANCE params - chassis/: ASSEMBLY.md, BOM.md, ip54_BOM.md, *.scad — FC_MOUNT_SPACING/ FC_PITCH → TBD ESP32-S3; Drone FC → MCU mount throughout - CLAUDE.md, TEAM.md: project desc → SAUL-TEE; hardware table → ESP32-S3/VESC - USB_CDC_BUG.md: marked ARCHIVED (legacy STM32 era) - AUTONOMOUS_ARMING.md: USB CDC → inter-board UART (ESP32-S3 BALANCE) - projects/saltybot/SLAM-SETUP-PLAN.md: FC/STM32F722 → BALANCE/CAN - jetson/docs/pinout.md, power-budget.md, README.md: STM32 bridge → CAN bridge - jetson/config/RECOVERY_BEHAVIORS.md: FC+Hoverboard → BALANCE+VESC - jetson/ros2_ws: stm32_protocol.py → esp32_protocol.py, stm32_cmd_node.py → esp32_cmd_node.py, mamba_protocol.py → balance_protocol.py; can_bridge_node imports updated - scripts/flash_firmware.py: DFU/STM32 → pio run -t upload - src/ include/: ARCHIVED headers added (legacy code preserved) - test/: ARCHIVED notices; STM32F722 comments marked LEGACY - ui/diagnostics_panel.html: Board/STM32 → ESP32-S3 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
230 lines
9.3 KiB
HTML
230 lines
9.3 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>ESP32-S3 BALANCE — Waveshare Touch LCD 1.28 Pinout</title>
|
||
<style>
|
||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||
body { background: #1a1a2e; color: #eee; font-family: 'Courier New', monospace; display: flex; flex-direction: column; align-items: center; padding: 20px; }
|
||
h1 { color: #e94560; margin-bottom: 5px; font-size: 1.4em; }
|
||
.subtitle { color: #888; margin-bottom: 20px; font-size: 0.85em; }
|
||
.container { display: flex; gap: 30px; align-items: flex-start; flex-wrap: wrap; justify-content: center; }
|
||
.board-wrap { position: relative; }
|
||
.board { width: 400px; height: 380px; background: #1a472a; border: 3px solid #333; border-radius: 50%; position: relative; box-shadow: 0 0 20px rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; }
|
||
.board::before { content: 'Waveshare Touch LCD 1.28'; position: absolute; top: 30px; left: 50%; transform: translateX(-50%); color: #fff3; font-size: 9px; letter-spacing: 1px; white-space: nowrap; }
|
||
|
||
/* LCD circle */
|
||
.lcd { width: 180px; height: 180px; background: #111; border: 3px solid #444; border-radius: 50%; position: absolute; display: flex; align-items: center; justify-content: center; font-size: 9px; color: #64B5F6; text-align: center; line-height: 1.6; }
|
||
.lcd-inner { text-align: center; }
|
||
|
||
/* MCU chip */
|
||
.mcu-label { position: absolute; top: 95px; left: 50%; transform: translateX(-50%); font-size: 8px; color: #aaa; text-align: center; white-space: nowrap; }
|
||
|
||
/* Component dots */
|
||
.comp { position: absolute; font-size: 9px; color: #ccc; }
|
||
|
||
/* USB */
|
||
.usb { position: absolute; width: 36px; height: 14px; background: #444; border: 2px solid #777; border-radius: 3px; bottom: 25px; left: 50%; transform: translateX(-50%); }
|
||
.usb-label { position: absolute; bottom: 44px; left: 50%; transform: translateX(-50%); font-size: 8px; color: #999; white-space: nowrap; }
|
||
|
||
/* Pin rows */
|
||
.pin-row { position: absolute; display: flex; flex-direction: column; gap: 4px; }
|
||
.pin { display: flex; align-items: center; gap: 4px; font-size: 10px; }
|
||
.pin .dot { width: 10px; height: 10px; border-radius: 50%; border: 2px solid; flex-shrink: 0; }
|
||
.pin .name { min-width: 70px; }
|
||
.pin .sublabel { font-size: 8px; color: #888; }
|
||
|
||
/* Left side pins */
|
||
.pins-left { left: 10px; top: 60px; }
|
||
.pins-left .pin { flex-direction: row; }
|
||
|
||
/* Right side pins */
|
||
.pins-right { right: 10px; top: 60px; }
|
||
.pins-right .pin { flex-direction: row-reverse; text-align: right; }
|
||
|
||
/* Colors by function */
|
||
.imu .dot { background: #e94560; border-color: #ff6b81; }
|
||
.can .dot { background: #FF9800; border-color: #FFB74D; }
|
||
.uart .dot { background: #2196F3; border-color: #64B5F6; }
|
||
.spi .dot { background: #9C27B0; border-color: #CE93D8; }
|
||
.pwr .dot { background: #4CAF50; border-color: #81C784; }
|
||
.io .dot { background: #607D8B; border-color: #90A4AE; }
|
||
|
||
/* Legend */
|
||
.legend { background: #16213e; padding: 15px 20px; border-radius: 8px; min-width: 290px; }
|
||
.legend h2 { color: #e94560; font-size: 1.1em; margin-bottom: 10px; border-bottom: 1px solid #333; padding-bottom: 5px; }
|
||
.legend-item { display: flex; align-items: center; gap: 8px; margin: 6px 0; font-size: 12px; }
|
||
.legend-item .swatch { width: 14px; height: 14px; border-radius: 50%; flex-shrink: 0; }
|
||
.legend-section { margin-top: 12px; padding-top: 8px; border-top: 1px solid #333; }
|
||
.legend-section h3 { font-size: 0.9em; color: #888; margin-bottom: 6px; }
|
||
|
||
.note { margin-top: 15px; color: #888; font-size: 11px; text-align: center; max-width: 710px; }
|
||
.note em { color: #e94560; font-style: normal; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<h1>🤖 ESP32-S3 BALANCE — Waveshare Touch LCD 1.28</h1>
|
||
<p class="subtitle">ESP32-S3 240 MHz | QMI8658 IMU | GC9A01 1.28″ LCD | CH343G USB-UART | SN65HVD230 CAN</p>
|
||
|
||
<div class="container">
|
||
<div class="board-wrap">
|
||
<div class="board">
|
||
<!-- LCD circle -->
|
||
<div class="lcd">
|
||
<div class="lcd-inner">GC9A01<br>1.28″ round<br>240×240<br>SPI</div>
|
||
</div>
|
||
<div class="mcu-label">ESP32-S3<br>240 MHz / 8MB</div>
|
||
|
||
<!-- USB CH343G -->
|
||
<div class="usb-label">USB-A CH343G (UART0 debug/flash)</div>
|
||
<div class="usb"></div>
|
||
|
||
<!-- Left-side pins (onboard fixed) -->
|
||
<div class="pin-row pins-left">
|
||
<div class="pin imu">
|
||
<div class="dot"></div>
|
||
<span class="name">GPIO6</span>
|
||
<span class="sublabel">IMU SDA (I2C-0)</span>
|
||
</div>
|
||
<div class="pin imu">
|
||
<div class="dot"></div>
|
||
<span class="name">GPIO7</span>
|
||
<span class="sublabel">IMU SCL (I2C-0)</span>
|
||
</div>
|
||
<div class="pin imu">
|
||
<div class="dot"></div>
|
||
<span class="name">GPIO3</span>
|
||
<span class="sublabel">QMI8658 INT</span>
|
||
</div>
|
||
<div class="pin uart">
|
||
<div class="dot"></div>
|
||
<span class="name">GPIO43</span>
|
||
<span class="sublabel">UART0 TX (CH343G)</span>
|
||
</div>
|
||
<div class="pin uart">
|
||
<div class="dot"></div>
|
||
<span class="name">GPIO44</span>
|
||
<span class="sublabel">UART0 RX (CH343G)</span>
|
||
</div>
|
||
<div class="pin uart">
|
||
<div class="dot"></div>
|
||
<span class="name">UART1 TX</span>
|
||
<span class="sublabel">Inter-board → IO (TBD)</span>
|
||
</div>
|
||
<div class="pin uart">
|
||
<div class="dot"></div>
|
||
<span class="name">UART1 RX</span>
|
||
<span class="sublabel">Inter-board ← IO (TBD)</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Right-side pins (external) -->
|
||
<div class="pin-row pins-right">
|
||
<div class="pin can">
|
||
<div class="dot"></div>
|
||
<span class="name">CAN TX</span>
|
||
<span class="sublabel">→ SN65HVD230 D (TBD)</span>
|
||
</div>
|
||
<div class="pin can">
|
||
<div class="dot"></div>
|
||
<span class="name">CAN RX</span>
|
||
<span class="sublabel">← SN65HVD230 R (TBD)</span>
|
||
</div>
|
||
<div class="pin spi">
|
||
<div class="dot"></div>
|
||
<span class="name">LCD SPI</span>
|
||
<span class="sublabel">GC9A01 (onboard)</span>
|
||
</div>
|
||
<div class="pin pwr">
|
||
<div class="dot"></div>
|
||
<span class="name">5V</span>
|
||
<span class="sublabel">USB / ext 5V in</span>
|
||
</div>
|
||
<div class="pin pwr">
|
||
<div class="dot"></div>
|
||
<span class="name">3.3V</span>
|
||
<span class="sublabel">LDO out</span>
|
||
</div>
|
||
<div class="pin pwr">
|
||
<div class="dot"></div>
|
||
<span class="name">GND</span>
|
||
<span class="sublabel">Common ground</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="legend">
|
||
<h2>📌 Pin Assignments</h2>
|
||
<div class="legend-item">
|
||
<div class="swatch" style="background:#e94560"></div>
|
||
<span><b>IMU (QMI8658)</b> — I2C-0 SDA=GPIO6, SCL=GPIO7, INT=GPIO3</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="swatch" style="background:#FF9800"></div>
|
||
<span><b>CAN (SN65HVD230)</b> — TX/RX TBD; confirm in <code>esp32/balance/src/config.h</code></span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="swatch" style="background:#2196F3"></div>
|
||
<span><b>UART0</b> GPIO43/44 — CH343G USB bridge (debug + flash)</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="swatch" style="background:#2196F3"></div>
|
||
<span><b>UART1</b> TBD — Inter-board @ 460800 baud → ESP32-S3 IO</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="swatch" style="background:#9C27B0"></div>
|
||
<span><b>LCD SPI</b> — GC9A01 1.28″ round 240×240 (onboard, fixed pins)</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="swatch" style="background:#4CAF50"></div>
|
||
<span><b>Power</b> — 5V USB input; 3.3V LDO for logic + sensors</span>
|
||
</div>
|
||
|
||
<div class="legend-section">
|
||
<h3>🔌 CAN Bus Topology</h3>
|
||
<div class="legend-item">
|
||
<span>Orin → CANable 2.0 → <b>CANH/CANL</b> (500 kbps)</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span>BALANCE: SN65HVD230 on CAN bus</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span>VESC Left: ID <b>0x44</b> (68) | VESC Right: ID <b>0x38</b> (56)</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span>120 Ω termination at each bus end</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="legend-section">
|
||
<h3>📡 Inter-Board Protocol</h3>
|
||
<div class="legend-item">
|
||
<span>UART @ 460800 baud, 8N1</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span>Frame: <code>[0xAA][LEN][TYPE][PAYLOAD][CRC8]</code></span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span>Types: see <code>esp32/shared/protocol.h</code></span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="legend-section">
|
||
<h3>⚡ Safety</h3>
|
||
<div class="legend-item"><span>Motors NEVER spin on power-on — ARM required</span></div>
|
||
<div class="legend-item"><span>RC kill switch checked every loop</span></div>
|
||
<div class="legend-item"><span>CAN watchdog: 500 ms → RC-only mode</span></div>
|
||
<div class="legend-item"><span>ESTOP: CAN 0x303 + 0xE5 → all motors off</span></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="note">
|
||
⚠️ CAN TX/RX GPIO assignments are <em>TBD</em> — confirm in <code>esp32/balance/src/config.h</code> before wiring.
|
||
All inter-board UART GPIO also TBD. LCD and IMU pins are fixed by Waveshare hardware.
|
||
</p>
|
||
|
||
</body>
|
||
</html>
|