2026-04-08 18:37:08 +02:00

116 lines
4.0 KiB
Markdown

# robot-hardware
Firmware ESP32 de Ti-Pote. Gère l'OLED (yeux animatroniques), et
à terme l'audio I2S, les servos et les LEDs. Communique avec le
`robot-client` (Pi Zero / laptop en dev) via un protocole binaire
sur UART.
## Stack
- **Framework** : Arduino via [PlatformIO](https://platformio.org/)
- **Cibles** : `esp32dev` (prototype actuel) et `esp32-s3` (cible finale, cf. `docs/hardware.md`)
- **Libs** : `U8g2` pour l'OLED SSD1309
## Layout
```
apps/robot-hardware/
├── platformio.ini # envs esp32dev + esp32-s3
├── include/
│ └── protocol_types.h # Référence du protocole (C++) — mirroir TS côté robot-client
├── src/
│ └── main.cpp # setup/loop : RX frames → dispatch → Eyes
├── lib/
│ ├── Protocol/ # Encoder/decoder binaire + CRC8
│ └── Eyes/ # Rendu des 10 émotions sur SSD1309
└── legacy/ # Prototypes .ino originaux (référence)
```
## Protocole UART (v0)
```
┌────────┬──────┬──────────┬──────────┬─────────────┬──────┐
│ START │ TYPE │ LENGTH_H │ LENGTH_L │ PAYLOAD │ CRC8 │
│ 0xAA │ 1B │ 1B │ 1B │ 0..65535 B │ 1B │
└────────┴──────┴──────────┴──────────┴─────────────┴──────┘
```
CRC8 : polynôme `0x07`, init `0x00`, calculé sur
`TYPE + LENGTH + PAYLOAD`.
Types de messages implémentés dans cette itération :
| Code | Nom | Direction | Payload |
|---------|--------------------|-------------|----------------------------|
| `0x05` | `STATUS` | host → fw | vide (heartbeat) |
| `0x08` | `ACK` | fw → host | opaque (contexte) |
| `0x20` | `DISPLAY_EMOTION` | host → fw | 1 byte (code émotion 0..9) |
| `0x21` | `DISPLAY_CLEAR` | host → fw | vide |
| `0xF0` | `PING` | host → fw | opaque |
| `0xF1` | `PONG` | fw → host | echo du PING |
| `0xFD` | `LOG` | fw → host | texte UTF-8 |
| `0xFE` | `ERROR` | fw → host | texte UTF-8 |
Les codes `0x01..0x09` sont réservés pour la Phase 2 (audio, servos,
LEDs) — voir `docs/hardware.md`.
## Build & flash
Installe [PlatformIO Core](https://docs.platformio.org/en/latest/core/installation/index.html)
(extension VSCode ou `pipx install platformio`), puis :
```bash
cd apps/robot-hardware
# Compile
pio run
# Flash (auto-détection du port)
pio run -t upload
# Terminal série — tu verras les LOG frames en binaire + les
# bytes bruts. Pour un monitor plus lisible pendant le bring-up,
# préfère la demo TypeScript (voir ci-dessous).
pio device monitor
```
Pour cibler l'ESP32-S3 :
```bash
pio run -e esp32-s3 -t upload
```
## Câblage OLED (SSD1309, 4-wire HW SPI)
| OLED | ESP32 (VSPI) |
|------|--------------|
| VCC | 3.3V |
| GND | GND |
| SCK | GPIO18 |
| SDA | GPIO23 |
| CS | GPIO5 |
| DC | GPIO16 |
| RES | GPIO17 |
Si tu changes ces pins, modifie `EyesPins` dans `src/main.cpp` (ou
passe des pins custom à `Eyes{EyesPins{...}}`).
## Tester depuis le robot-client
Avec l'ESP32 branché en USB sur ton laptop :
```bash
export HARDWARE_SERIAL_PORT=/dev/ttyUSB0 # ou /dev/ttyACM0, /dev/tty.usbserial-XXXX…
pnpm --filter @ti-pote/robot-client hw:demo
```
La demo fait un `ping` puis cycle sur les 10 émotions. Tu dois
voir les yeux changer toutes les 1.2 s sur l'OLED.
## Phase 2 (à venir)
- `AUDIO_UP` / `AUDIO_DOWN` : streaming I2S 16 kHz via buffer DMA
- `SERVO_CMD` : contrôle PWM des servos de tête
- `LED_CMD` : animations NeoPixel
- Bascule de `Serial` vers `Serial2` pour la liaison Pi ↔ ESP32