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
- Cibles :
esp32dev(prototype actuel) etesp32-s3(cible finale, cf.docs/hardware.md) - Libs :
U8g2pour 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
(extension VSCode ou pipx install platformio), puis :
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 :
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 :
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 DMASERVO_CMD: contrôle PWM des servos de têteLED_CMD: animations NeoPixel- Bascule de
SerialversSerial2pour la liaison Pi ↔ ESP32