ti-pote/apps/robot-hardware
2026-04-09 03:14:43 +02:00
..
2026-04-08 18:37:08 +02:00
2026-04-08 18:37:08 +02:00
2026-04-09 02:47:53 +02:00
2026-04-09 02:58:29 +02:00
2026-04-09 03:14:43 +02:00
2026-04-08 18:37:08 +02:00
2026-04-09 02:58:29 +02:00
2026-04-08 18:37:08 +02:00

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) 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 (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 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