- Heartbeat MAVLink v1 toutes les 1s (broadcast 192.168.4.255:14553) - Relais WiFi <-> UART (Jetson <-> Pi Zero) sur ports 14550-14553 - LED RGB WS2812 GPIO48 : rouge pulsé (attente), vert dim (idle), flash vert (heartbeat) - MODE_AP=true : hotspot WireClaw-CAM / false : connexion Jetson - Fix: retrait ARDUINO_USB_CDC_ON_BOOT (carte Freenove utilise CH343/UART0)
3.4 KiB
3.4 KiB
WireClaw ESP32-S3 — Contexte projet
Carte
- Freenove ESP32-S3-WROOM (8MB Flash, PSRAM OPI)
- LED RGB WS2812 sur GPIO48 (adressable, lib FastLED)
- UART2 : RX=GPIO16, TX=GPIO17 (vers Pi Zero, 57600 baud)
- Flash mode : QIO 80MHz (
board_build.flash_mode = qio)
Rôle de ce firmware
Nœud de communication drone WireClaw :
- Envoie un HEARTBEAT MAVLink v1 toutes les 1 seconde
- Relaie les trames MAVLink WiFi ↔ UART (Jetson ↔ Pi Zero)
- Indique l'état par la LED RGB (voir section LED)
Basculer entre mode AP et mode Jetson
En haut de src/main.cpp, une seule constante suffit :
#define MODE_AP true // true = ESP32 crée son propre hotspot (test sans Jetson)
// false = ESP32 se connecte au hotspot WireClaw du Jetson
MODE_AP true: hotspotWireClaw-CAM, IP fixe192.168.4.1, heartbeat broadcast192.168.4.255MODE_AP false: connexion àWIFI_SSID, heartbeat envoyé àJETSON_IP:14553
Les credentials sont dans include/credentials.h :
// Mode AP
#define AP_SSID "WireClaw-CAM"
#define AP_PASSWORD ""
// Mode STA (Jetson)
#define WIFI_SSID "WireClaw"
#define WIFI_PASSWORD ""
#define JETSON_IP "10.42.0.1"
LED RGB (GPIO48, WS2812, FastLED)
| État | Couleur | Pattern |
|---|---|---|
| Attente WiFi / AP init | Rouge | Pulsé fade in/out |
| Connecté, idle | Vert | Très dim fixe |
| Heartbeat envoyé | Vert | Flash vif 80ms — 1 Hz |
MAVLink Heartbeat
- Implémenté sans lib externe dans
include/mavlink_heartbeat.h - MAVLink v1, msg_id=0, SYS_ID=255 (GCS), CRC-16/MCRF4XX
- Séquence incrémentale
mavSeq(uint8_t, overflow auto) - Log hex dans le monitor série à chaque envoi
Ports UDP
| Constante | Port | Usage |
|---|---|---|
LOCAL_PORT |
14550 | Écoute ESP32 (commandes depuis Jetson) |
JETSON_PORT_MAVSDK |
14551 | MAVLink vers Jetson (MAVLink SDK) |
JETSON_PORT_PYMAV |
14552 | MAVLink vers Jetson (pymavlink) |
JETSON_PORT_HB |
14553 | Heartbeat vers Jetson |
Architecture réseau
Mode AP (test)
PC/smartphone → WiFi "WireClaw-CAM" → ESP32-S3 (192.168.4.1)
Mode STA (production)
Jetson (10.42.0.1) ←→ WiFi "WireClaw" ←→ ESP32-S3 (10.42.0.77)
↕ UART 57600
Pi Zero (caméra CSI)
platformio.ini points importants
board_build.flash_mode = qio— obligatoire pour cette carteboard_build.f_flash = 80000000L— 80MHz- Ne PAS utiliser
-DARDUINO_USB_CDC_ON_BOOT=1— la carte Freenove passe par un chip CH343 (UART0→COM11), pas par l'USB natif ESP32. Ce flag redirige Serial vers l'USB OTG qui n'est pas connecté → app muette. - Ne pas utiliser
board_build.arduino.memory_type = qio_opi— cause boot loop
Fichiers
wireclaw-esp32/
├── CLAUDE.md ← ce fichier
├── platformio.ini
├── include/
│ ├── credentials.h ← SSID, passwords, IP Jetson
│ └── mavlink_heartbeat.h ← construction trame MAVLink v1
└── src/
└── main.cpp ← firmware principal
Travail futur
- IP statique ESP32 via
WiFi.config()en mode STA - Valider réception heartbeat côté Jetson (pymavlink)
- Câblage UART ESP32 ↔ Pi Zero (GPIO16/17 ↔ GPIO14/15)
- Remplacer broadcast par IP Jetson fixe une fois en production