Files
Crossfire-to-Multi-telemetr…/01_telemetry_reader
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
..

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:

    #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 BackpackTelemetry → 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:

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