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>
212 lines
7.3 KiB
Markdown
212 lines
7.3 KiB
Markdown
# 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.
|
||
|
||
1. Installa **VSCode**.
|
||
2. In VSCode: *Extensions* → cerca **PlatformIO IDE** → Install. Attendi il
|
||
primo setup (scarica il core).
|
||
3. *File → Open Folder...* → apri **questa cartella**
|
||
(`Crossfire_INAV_Telemetry_tracker`). PlatformIO la riconosce dal `platformio.ini`.
|
||
|
||
> Nota sul pin di versione: `platformio.ini` blocca `platform = 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 adattata `OnDataRecv`
|
||
> (commento nel file).
|
||
|
||
---
|
||
|
||
## 4. Genera il tuo UID dalla bind phrase
|
||
|
||
1. Apri **https://expresslrs.github.io/web-flasher/**
|
||
2. Inserisci la **bind phrase** identica a quella del tuo sistema ELRS.
|
||
3. Annota i **6 numeri** dell'UID mostrato.
|
||
4. Apri `src/my_config.h` e sostituisci:
|
||
|
||
```cpp
|
||
#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)
|
||
|
||
1. Accendi la radio, entra nel Lua script ExpressLRS.
|
||
2. Sezione **Backpack** → **Telemetry** → imposta su **`ESPNOW`**.
|
||
3. 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:
|
||
|
||
1. Collega l'ESP32 via USB.
|
||
2. Barra di stato PlatformIO (in basso):
|
||
- **✓ (Build)** per compilare.
|
||
- **→ (Upload)** per flashare. Alla prima volta PlatformIO scarica core e
|
||
`terseCRSF` da solo.
|
||
- **🔌 (Serial Monitor)** per aprire il monitor (115200 baud).
|
||
|
||
Da terminale PlatformIO (CLI), equivalente:
|
||
|
||
```bash
|
||
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 ricevuti` resta 0):**
|
||
- UID errato in `my_config.h` (la causa più comune).
|
||
- `Backpack -> Telemetry` non su `ESPNOW`.
|
||
- Backpack non bindato / bind phrase diversa.
|
||
- Distanza: il link backpack è WiFi punto-punto, tieni ESP32 entro ~5–10 m
|
||
dalla radio.
|
||
- **Pacchetti sì ma GPS a 0:** l'aereo non ha fix GPS, oppure INAV non manda
|
||
GPS via CRSF (controlla i sensori sulla radio).
|
||
- **`alt` strana:** 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.0` oppure adatta `OnDataRecv`.
|
||
|
||
---
|
||
|
||
## 10. Roadmap → Antenna Tracker
|
||
|
||
Una volta che leggi GPS in modo stabile:
|
||
|
||
1. **Home position**: memorizza la posizione del tracker (GPS locale o punto fisso noto).
|
||
2. **Calcolo puntamento**: da (home, posizione aereo) calcola **azimuth** (bearing)
|
||
ed **elevazione** (da differenza di quota e distanza haversine).
|
||
3. **Attuazione**: 2 servo/stepper (pan/tilt) o un gimbal; PID/smoothing sul
|
||
puntamento.
|
||
4. **Bussola/IMU** sul tracker per orientare l'azimuth assoluto, oppure procedura
|
||
di allineamento iniziale.
|
||
5. (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
|