Stato di partenza prima dei fix. Il repo git era inizializzato a meta' (config.lock + objects/ mancante, zero commit): riparato. my_config.h (UID reale, tutti e 3 i sottoprogetti) escluso via .gitignore; aggiunto my_config.h.example. .pio/ escluso. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
INAV Telemetry Reader via ELRS Backpack (ESP-NOW)
Leggere su seriale la telemetria di un aeromodello INAV, ritrasmessa dal modulo TX ExpressLRS tramite il backpack via ESP-NOW, usando un ESP32 DevKit a terra. Primo passo verso un antenna tracker.
1. Come funziona (catena dati)
INAV FC (GPS)
│ CRSF (UART)
▼
RX ELRS sull'aereo
│ link RF 2.4 / 900 MHz (telemetria downlink)
▼
Modulo TX ELRS (RadioMaster)
│ TX Backpack (ESP integrato)
│ ESP-NOW (WiFi 2.4 GHz, canale 1, indirizzato al MAC = UID)
▼
ESP32 DevKit a terra ──► parsing CRSF (terseCRSF) ──► Serial Monitor
Punti chiave:
- Il TX Backpack ritrasmette ogni frame di telemetria CRSF che il modulo riceve
dall'aereo, via ESP-NOW. Funzione introdotta in ELRS 3.4+ (voce Lua
Backpack -> Telemetry). - I frame ESP-NOW sono indirizzati a un MAC derivato (hash) dalla bind phrase: l'UID. Il nostro ESP32 imposta il proprio MAC = UID, così li riceve.
- Il frame CRSF grezzo (sync
0xC8, len, type, payload, crc) è preceduto da un header di 8 byte del backpack: lo saltiamo nella callback.
2. Prerequisiti
Hardware
- ESP32 DevKit (ESP32-WROOM) + cavo USB dati.
- Radio con modulo TX ELRS backpack-capable (RadioMaster Zorro/Pocket/interno: OK).
- Aereo con RX ELRS + FC INAV + GPS.
Firmware/versioni
- ELRS TX e RX: ≥ 3.4 (consigliato 3.5+/4.x, stessa major su TX e RX).
- TX Backpack: ≥ 1.5.1.
- Stessa bind phrase ovunque.
Software PC
- VSCode + estensione PlatformIO IDE.
- Driver USB-UART del DevKit (CP2102 → Silicon Labs, oppure CH340).
3. Setup ambiente (VSCode + PlatformIO)
PlatformIO è la scelta migliore qui: il progetto è già platformio.ini, gestisce
da solo toolchain xtensa, core arduino-esp32 e librerie. Non serve Arduino IDE.
- Installa VSCode.
- In VSCode: Extensions → cerca PlatformIO IDE → Install. Attendi il primo setup (scarica il core).
- File → Open Folder... → apri questa cartella
(
Crossfire_INAV_Telemetry_tracker). PlatformIO la riconosce dalplatformio.ini.
Nota sul pin di versione:
platformio.inibloccaplatform = espressif32@6.9.0(arduino-esp32 2.0.17). Il codice usa la firma della callback ESP-NOW del core 2.x. Se aggiorni a platform 7.x (core 3.x) va adattataOnDataRecv(commento nel file).
4. Genera il tuo UID dalla bind phrase
-
Inserisci la bind phrase identica a quella del tuo sistema ELRS.
-
Annota i 6 numeri dell'UID mostrato.
-
Apri
src/my_config.he sostituisci:#define MY_CUSTOM_UID { 0, 0, 0, 0, 0, 0 } // <-- i TUOI 6 numeri
Se l'UID è sbagliato, l'ESP32 non riceve nulla (è il filtro principale).
5. Configura la radio (ELRS Lua script)
- Accendi la radio, entra nel Lua script ExpressLRS.
- Sezione Backpack → Telemetry → imposta su
ESPNOW. - Esci dallo script.
Imposta anche un Telemetry Ratio ragionevole (es. da 1:2 a 1:16 a seconda del packet rate) così arrivano frame di telemetria frequenti.
Nota: il footprint RF dell'ESP-NOW è basso (OFDM come un hotspot WiFi), ma conviene disattivarlo (
Telemetry = Off) quando non lo usi, specie in volo con altri.
6. Configura INAV (lato aereo)
Serve che INAV invii telemetria CRSF al RX ELRS:
- La UART del FC collegata al RX ELRS deve avere il protocollo Serial RX = CRSF e Telemetry abilitata sulla stessa porta (CRSF è bidirezionale).
- GPS attivo e con fix (3D fix, satelliti sufficienti) per avere lat/lon validi.
Verifica finale prima dell'ESP32: sulla radio (EdgeTX → Model → Telemetry, Discover new sensors) devono comparire i sensori GPS/coordinate. Se li vedi lì, il backpack li ritrasmetterà.
7. Compila e carica sull'ESP32
Con la cartella aperta in PlatformIO:
- Collega l'ESP32 via USB.
- Barra di stato PlatformIO (in basso):
- ✓ (Build) per compilare.
- → (Upload) per flashare. Alla prima volta PlatformIO scarica core e
terseCRSFda solo. - 🔌 (Serial Monitor) per aprire il monitor (115200 baud).
Da terminale PlatformIO (CLI), equivalente:
pio run # build
pio run -t upload # build + upload
pio device monitor # monitor seriale (115200)
Se l'upload non parte: tieni premuto BOOT sull'ESP32 mentre inizia il caricamento (alcuni DevKit lo richiedono), oppure controlla la porta COM.
8. Cosa vedi sul Serial Monitor
Una "dashboard" aggiornata a 1 Hz:
----------------------------------------------------
Pkt ricevuti : 1234
GPS : lat 45.4642100 lon 9.1900000 sat 11
alt 152 m speed 0.0 km/h hdg 0.0 deg
Batteria : 16.4 V 1.2 A 350 mAh 78%
Assetto : pitch 0.5 roll -1.2 yaw 270.0 deg
Flight mode : ACRO
Link : RSSI -52dBm LQ 100% SNR 9dB TXpwr enum 3
Mappatura frame CRSF → campi (libreria terseCRSF):
| Frame | ID | Dati |
|---|---|---|
| GPS | 0x02 | lat, lon (1e-7 deg), groundspeed, heading, alt, sats |
| Battery | 0x08 | tensione, corrente, mAh, % residuo |
| Link statistics | 0x14 | RSSI, LQ, SNR, TX power |
| Attitude | 0x1E | pitch, roll, yaw |
| Flight mode | 0x21 | stringa (es. ACRO, ANGL, ...) |
9. Troubleshooting
- Nessun pacchetto (
Pkt ricevutiresta 0):- UID errato in
my_config.h(la causa più comune). Backpack -> Telemetrynon suESPNOW.- Backpack non bindato / bind phrase diversa.
- Distanza: il link backpack è WiFi punto-punto, tieni ESP32 entro ~5–10 m dalla radio.
- UID errato in
- Pacchetti sì ma GPS a 0: l'aereo non ha fix GPS, oppure INAV non manda GPS via CRSF (controlla i sensori sulla radio).
altstrana: il valore CRSF ha offset di 1000 m, già gestito dalla libreria.- Errore di compilazione sulla callback ESP-NOW: hai un core arduino-esp32
3.x. Mantieni
platform = espressif32@6.9.0oppure adattaOnDataRecv.
10. Roadmap → Antenna Tracker
Una volta che leggi GPS in modo stabile:
- Home position: memorizza la posizione del tracker (GPS locale o punto fisso noto).
- Calcolo puntamento: da (home, posizione aereo) calcola azimuth (bearing) ed elevazione (da differenza di quota e distanza haversine).
- Attuazione: 2 servo/stepper (pan/tilt) o un gimbal; PID/smoothing sul puntamento.
- Bussola/IMU sul tracker per orientare l'azimuth assoluto, oppure procedura di allineamento iniziale.
- (Opzionale) reuse del progetto Sentinel AAT come riferimento: usa la stessa sorgente di telemetria backpack.
File del progetto
platformio.ini # build config (esp32dev, core 2.x pinnato, lib terseCRSF)
src/main.cpp # firmware RX-only: ESP-NOW -> parsing CRSF -> Serial
src/my_config.h # il TUO UID (da bind phrase) <-- DA COMPILARE
Riferimenti
- ELRS Backpack Telemetry / Sentinel: https://www.expresslrs.org/software/backpack-telemetry/
- Esempio ESP-NOW di partenza: https://github.com/druckgott/ELRS-Backpack-Example-ESPNOW
- Parser CRSF: https://github.com/zs6buj/terseCRSF