Files
Crossfire-to-Multi-telemetr…/01_telemetry_reader/README.md
Francesco Zanin e22a47fce1 Snapshot iniziale: bridge telemetria CRSF->LTM/MAVLink (ESP-NOW)
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>
2026-06-23 19:32:11 +02:00

212 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 ~510 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