saltylab-firmware/docs/wiring-diagram.md
sl-mechanical a2c554c232 cleanup: remove all Mamba/F722S/STM32F722 refs — replace with ESP32-S3 BALANCE/IO
- 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>
2026-04-04 09:06:09 -04:00

196 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SAUL-TEE Wiring Reference
**Authoritative reference:** [`docs/SAUL-TEE-SYSTEM-REFERENCE.md`](SAUL-TEE-SYSTEM-REFERENCE.md)
This document is a quick-access wiring summary. For pin assignments, CAN frame formats,
RC channel mapping, and serial commands, see the full reference doc.
---
## System Block Diagram
```
┌──────────────────────────────────────────────────────────┐
│ JETSON ORIN NANO SUPER │
│ (Top plate, 25W) │
│ │
│ USB-A ──── CANable 2.0 USB↔CAN (can0, 500 kbps) │
│ USB-A ──── RealSense D435i (USB 3.1) │
│ USB-A ──── RPLIDAR A1M8 (CP2102, 115200) │
│ USB-C ──── SIM7600A 4G/LTE modem │
│ CSI-A ─── 2× IMX219 cameras (front + left) │
│ CSI-B ─── 2× IMX219 cameras (rear + right) │
│ 40-pin ── ReSpeaker 2-Mic HAT │
└──────────────────────┬───────────────────────────────────┘
│ USB-A → CANable 2.0
│ can0, 500 kbps
┌────────────────────────────────┴──────────────────────────────────┐
│ CAN BUS (CANH / CANL / GND) │
│ 120 Ω ─┤ ├─ 120 Ω │
└───────────┬──────────────────────────────────────────┬────────────┘
│ │
┌───────────┴────────────┐ ┌─────────────┴──────────┐
│ ESP32-S3 BALANCE │ │ VESC left (ID 68) │
│ Waveshare Touch LCD │ │ VESC right (ID 56) │
│ 1.28 — CH343 USB │ │ FSESC 6.7 Pro Mini │
│ │ │ Dual │
│ QMI8658 IMU (I2C) │ └──────┬─────────────────┘
│ SN65HVD230 (CAN) │ │ Phase wires
│ │ ┌────────┴─────────────┐
│ UART ──────────────┐ │ │ Hub motors (4×) │
└────────────────────────┘ │ FL / FR / RL / RR │
↕ 460800 baud binary │ └──────────────────────┘
inter-board proto │
┌───────────────────────┘
│ ESP32-S3 IO (bare board)
│ JTAG USB
│ UART0 ── TBS Crossfire RX (CRSF @ 420000)
│ UART2 ── ELRS receiver (CRSF failover @ 420000)
│ PWM ──── 4× BTS7960 H-bridge motor drivers
│ I2C ──── NFC + Barometer + ToF (shared bus)
│ RMT ──── WS2812B LED strip
│ GPIO ─── Horn / Headlight / Fan / Buzzer
└──────────────────────────────────────────────
```
---
## Wire-by-Wire Connections
### 1. Orin ↔ CAN Bus (via CANable 2.0)
| From | To | Notes |
|------|----|-------|
| Orin USB-A | CANable 2.0 USB | `/dev/canable0``can0` |
| CANable CANH | CAN bus CANH | Twisted pair |
| CANable CANL | CAN bus CANL | Twisted pair |
| CANable GND | CAN GND | Common |
Setup: `ip link set can0 up type can bitrate 500000`
### 2. ESP32-S3 BALANCE ↔ CAN Bus
| Signal | GPIO | CAN bus |
|--------|------|---------|
| CAN TX | TBD | → SN65HVD230 D pin |
| CAN RX | TBD | ← SN65HVD230 R pin |
> TBD pins — confirm in `esp32/balance/src/config.h`
### 3. ESP32-S3 BALANCE ↔ ESP32-S3 IO (Inter-Board UART)
| Signal | BALANCE GPIO | IO GPIO | Baud |
|--------|-------------|---------|------|
| TX | TBD | TBD (RX) | 460800 |
| RX | TBD (RX) | TBD (TX) | 460800 |
| GND | GND | GND | — |
Frame: `[0xAA][LEN][TYPE][PAYLOAD…][CRC8]` — see `esp32/shared/protocol.h`
### 4. ESP32-S3 IO ↔ TBS Crossfire RX (UART0)
| IO GPIO | Signal | Crossfire pin | Notes |
|---------|--------|---------------|-------|
| GPIO43 | TX | RX | CRSF telemetry to TX module |
| GPIO44 | RX | TX | CRSF RC frames in |
| GND | GND | GND | |
| 5V | — | VCC | Power from 5V bus |
Baud: 420000 (CRSF). Failsafe: disarm after 300 ms without frame.
### 5. ESP32-S3 IO ↔ ELRS Receiver (UART2, failover)
| IO GPIO | Signal | ELRS pin |
|---------|--------|----------|
| TBD | TX | RX |
| TBD | RX | TX |
| GND | GND | GND |
| 5V | — | VCC |
Baud: 420000 (CRSF). Activates automatically if Crossfire link lost >300 ms.
### 6. ESP32-S3 IO ↔ BTS7960 Motor Drivers (4×)
TBD GPIO assignments — see `esp32/io/src/config.h`.
| Signal | Per-driver | Notes |
|--------|-----------|-------|
| RPWM | GPIO TBD | Forward PWM |
| LPWM | GPIO TBD | Reverse PWM |
| R_EN | GPIO TBD | Enable H |
| L_EN | GPIO TBD | Enable H |
| Motor+ / Motor | Hub motor | 36V via B+ / B on BTS7960 |
### 7. ESP32-S3 IO I2C Sensors
| Device | I2C Address | Notes |
|--------|-------------|-------|
| NFC (PN532) | 0x24 | NFC tag read/write |
| Barometer (BMP280/388) | 0x76 | Altitude + temp |
| ToF range (VL53L0X) | 0x29 | Proximity/obstacle |
> SDA / SCL GPIOs TBD — confirm in `esp32/io/src/config.h`
### 8. Power Distribution
```
36V BATTERY
├── VESC left (36V) ─── Front-left + Rear-left hub motors
├── VESC right (36V) ─── Front-right + Rear-right hub motors
├── BTS7960 boards (B+/B) — 36V motor power
├── DC-DC 12V ──── Fan / Headlight / Accessories
└── DC-DC 5V ─┬── Jetson Orin (USB-C PD)
├── ESP32-S3 BALANCE (USB 5V)
├── ESP32-S3 IO (USB 5V)
├── TBS Crossfire RX (5V)
├── ELRS RX (5V)
├── WS2812B strip (5V)
├── RPLIDAR A1M8 (5V via USB)
└── Sensors (3.3V from ESP32-IO LDO)
```
---
## Orin USB Peripherals
| Device | Interface | Node |
|--------|-----------|------|
| CANable 2.0 | USB-A | `can0` (after `ip link set can0 up type can bitrate 500000`) |
| RealSense D435i | USB 3.1 | `/dev/bus/usb/...` |
| RPLIDAR A1M8 | USB-UART | `/dev/rplidar` |
| SIM7600A 4G | USB | `/dev/ttyUSB02` |
| ESP32-S3 BALANCE debug | USB-A (CH343) | `/dev/esp32-balance` |
| ESP32-S3 IO debug | USB-A (JTAG/CDC) | `/dev/esp32-io` |
---
## ReSpeaker 2-Mic HAT (Orin 40-pin)
| Orin Pin | Signal | Function |
|----------|--------|----------|
| Pin 12 (GPIO 18) | I2S BCLK | Audio bit clock |
| Pin 35 (GPIO 19) | I2S LRCLK | Audio left/right clock |
| Pin 38 (GPIO 20) | I2S DIN | Audio data in (from mics) |
| Pin 40 (GPIO 21) | I2S DOUT | Audio data out (to speaker) |
| Pin 3 (GPIO 2) | I2C SDA | WM8960 codec (i2c-7) |
| Pin 5 (GPIO 3) | I2C SCL | WM8960 codec (i2c-7) |
| Pin 2, 4 | 5V | Power |
| Pin 6, 9 | GND | Ground |
Codec: Wolfson WM8960 (0x1A). Use: voice commands, wake word, audio feedback.
---
## SIM7600A 4G/LTE HAT (Orin USB)
| Connection | Detail |
|-----------|--------|
| Interface | USB (micro-B on HAT → USB-A on Orin) |
| Device nodes | `/dev/ttyUSB0` (AT), `/dev/ttyUSB1` (PPP/data), `/dev/ttyUSB2` (GPS NMEA) |
| Power | 5V from USB (peak 2A during TX) |
| SIM | Nano-SIM slot |