# 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