C5VRX: Analoge 5,8 GHz FPV-videontvanger voor ESP32-C5

Dit project maakt het mogelijk om van live 5,8 GHz FPV-video naar real-time analoge CVBS te gaan met één Seeed Studio XIAO ESP32-C5 en een passieve 6-bit resistor DAC. Er komt live FM-video binnen en er gaat composiet PAL/NTSC uit voor gebruik met FPV-brillen.

De versie C5VRX-5 maakt gebruik van één live demodulator. Het bewijs van de ontvangstketen is vastgelegd in docs/FINDINGS.md. De U85Q-studie waarop dit is gebaseerd, inclusief correcties in de score en mislukte experimenten, is bewaard in docs/pr190-key-findings.md en docs/recent-pr-receiver-findings.md. Het IQLaneFusion-onderzoek is host-only; de read-only firmware-shadow J is op 12-10-2026 verwijderd en is geen aangetoonde verbetering van video of bereik.

Functionaliteiten

  • U85Q-demodulator in de TX BitScrambler: Een ongetrainde 32-fase tracker die het beeld in lock houdt bij VTX-afwijkingen, off-centre carriers en multipath, in plaats van het signaal te verliezen. gevalideerd op echte video.
  • Vaste ultra-fijne IQ: (ADC-bits 9, 6, 5, 4) op 40 MS/s, zonder CPU in het sample-pad.
  • Direct Gain V6: V5-gaincontrole plus carrier-geheugen bij korte fades en resets binnen dezelfde context, met een geleerde, opgeslagen gain-map. De instelling GAIN selecteert opgeslagen AUTO (standaard), MAX of een vaste gain.
  • Smal analoog filter: Eén keer per board gemeten bij opstarten; de laagste ruisbandbreedte die nog steeds 12 MHz doorlaat (plus een 10 MHz-klasse voor VTX'en met lage afwijking en een 16 MHz-klasse voor brede VTX'en; gebaseerd op simulatie, board-test volgt).
  • Kalibratie uitsluitend bij opstarten: Alles wat het beeld onderbreekt, wordt één keer na het inschakelen uitgevoerd (alleen wat ontbreekt) of via het menu-item CALIBRATE, nooit tijdens de vlucht. De bril toont wat er gebeurt en hoe lang dit duurt.
  • VTX-matched profiel: (Smal voor VTX'en met lage afwijking, breed 16 MHz voor brede VTX'en) alleen na een nieuwe meting. Elke boot start met het standaardprofiel; het smalle profiel wordt alleen gekozen als deze boot de VTX in de opstartfase heeft gemeten. Continue VTX-matching meet vervolgens passief elke 30 seconden de afwijking op live video (burst-bevestigde sync, C/N >= 8 dB, geen clipping, behouden gain; geen AFC-lock nodig, aangezien een carrier-offset de sync-to-porch span niet verandert). Elk resultaat wordt gelogd (PROFILE live), getoond in T met agree/mismatch-streaks en voedt de kp-ladder's afwijkingsklasse. Met de live-switch aan (standaard, console A, NVS prof_live) verandert een betrouwbaar resultaat het profiel tijdens de vlucht: breder (narrow -> DEFAULT -> WIDE) na één resultaat, smaller pas na twee overeenstemmende resultaten en mits de AFC is gelockt (een smal filter vereist een gecentreerde carrier). Elke wijziging gaat via een filter-relock plus de geverifieerde tracker-restart (een paar ms, gedeelde 5 s cooldown; board-test volgt). Indien uitgeschakeld (off), wordt het resultaat alleen gerapporteerd en wacht het op de volgende boot of CALIBRATE.
  • Velddiagnostiek: (Seriële poort D, R): wat er daadwerkelijk actief is en waarom elke dropout is gebeurd, voor zover de ontvanger dit kan bepalen (docs/FIELD_TEST.md).
  • DC-correctie: Voor elke gain-rij, ook met de VTX aan. Ontbrekende rijen worden één keer bij opstarten gemeten op een rustig kanaal, zodat ontvangst met hoge gain geen ongecorrigeerde DC heeft.
  • Automatische zorg voor de ontvangstketen: Per-gain DC-correctie, geverifieerde live DC-tests, passieve monitoring van de sampling-fase en AFC carrier-centrering.
  • Sync flywheel: Instelling ON/OFF, standaard ON (een opgeslagen OFF wordt behouden). Acceptatie door camera/monitor blijft experimenteel; vergelijk OFF op de grond.
  • Eenvoudig menu: Band, kanaal, scan, videostandaard, kalibratie, output-niveau, gain, flywheel, exit.

Hardware

Componenten

Gebruik een XIAO ESP32-C5. De DAC is aangesloten op D4..D9 (GPIO 23, 24, 11, 12, 8, 9; LSB eerst) met een passieve resistor DAC en een 200$\Omega$ load, zoals beschreven in C5VRX-3/4 (schema). De ontvanger gebruikt de eigen Wi-Fi radio van de ESP32-C5; er zijn geen extra RF-onderdelen nodig.

Bedrading van de resistor DAC

Zes weerstanden, één per XIAO-pin, allemaal verbonden op één knooppunt: dit knooppunt is de video-uitgang (CVBS). Een zevende weerstand van dat knooppunt naar GND is de load.

XIAO pinGPIODAC bitWeerstand naar output-knooppunt
D423bit 0 (LSB)8.2 k$\Omega$
D524bit 13.9 k$\Omega$
D611bit 22.0 k$\Omega$
D712bit 31.0 k$\Omega$
D88bit 4470 $\Omega$
D99bit 5 (MSB)240 $\Omega$
GND-load200 $\Omega$ (output knooppunt naar GND)

Schema: D4 --[8.2k]--+ D5 --[3.9k]--+ D6 --[2.0k]--+ D7 --[1.0k]--+-----------> CVBS out (bril / monitor AV-in, video) D8 --[470R]--+ | D9 --[240R]--+ [200R] (optioneel: 470 pF van het knooppunt naar GND, | improvement unproven) GND ---------------+------> GND (bril / monitor AV-in ground)

Belangrijke opmerkingen:

  • De volgorde van de pinnen is cruciaal: de grootste weerstand (8.2k) gaat op D4 en de kleinste (240R) op D9. Een verwisselde set geeft een verstoerd, gebandeerd beeld.
  • Verbind het output-knooppunt met de video-ingang (center/tip) van de bril, een DVR of een analoge monitor, en de XIAO GND met de ground daarvan. Een gemeenschappelijke ground is vereist.
  • Alle waarden zijn standaard E24; 1% metaalfilmweerstanden zijn prima. Houd de draden van de pinnen naar het knooppunt kort.
  • Beeld te donker of te zwak: Probeer OUTPUT in het menu (0.5-5.0x, wordt opgeslagen). Hogere niveaus kunnen clippen; controleer de belaste output op je display.
  • De XIAO wordt gevoed via USB-C of de 5V-pin; de DAC heeft geen aparte voeding nodig.
  • Controleer de build met de DAC-zelftest voordat je naar beeldproblemen gaat zoeken: een testpatroon voor de bril en een multimeter-check die een verwisselde, open of verkeerde weerstand identificeert. Zie Building and testing the resistor DAC.

Eerste opstart

Flash de firmware (zie hieronder) en zet de ontvanger onder stroom, bij voorkeur met de VTX uit, gedurende enkele minuten (maximaal acht): de bril toont CALIBRATING met de voortgang. Firmware met een nieuwe kalibratiegeneratie negeert de kalibratie van eerdere firmware en kalibreert volledig opnieuw. Met een actieve VTX kalibreert hij het filter op een rustig kanaal en keert daarna terug.

Resultaten worden opgeslagen; latere boots slaan over wat al is gemeten. De eerste DC-meting is het sjabloon voor elk kanaal: het wisselen van kanalen vereist geen nieuwe DC-zoektocht, zelfs niet met de VTX aan. Wanneer een boot het eigen kanaal rustig vindt (VTX uit), meet hij dat kanaal en vervangt hij de sjabloonrijen door zijn eigen waarden; er worden tabellen bijgehouden voor zes kanalen.

Zet de VTX aan. Zonder opgeslagen kanaal start de ontvanger op A1 (5865 MHz); gebruik het menu of de scanfunctie om jouw kanaal te vinden.

Bediening

Via de BOOT-knop

  • Korte druk: Volgende kanaal in de band.
  • Lang indrukken (0.6 s): Open het menu.

Via het menu

  • Korte druk: Volgende item.
  • Lang indrukken (0.6 s): Item bevestigen.

Menu-items:

  • BAND: Volgende band.
  • CHANNEL: Volgende kanaal.
  • SCAN: Scan alle 48 kanalen, selecteert de sterkste gecentreerde analoge video.
  • VIDEO: (AUTO / NTSC / PAL voor het menubeeld; AUTO volgt de camera).
  • CALIBRATE: Op de grond opnieuw meten.
  • OUTPUT: DAC-niveau aanpassen (0.5-5.0x, wordt opgeslagen).
  • GAIN: (AUTO / MAX / vast G78..G24, wordt opgeslagen).
  • FLYWHEEL: (ON/OFF, wordt opgeslagen, standaard ON).
  • DAC TEST: Alleen voor de werkbank: testpatroon; houd ingedrukt voor multimeter-stappen (zie DAC-gids).
  • EXIT: Sluit het menu.

Het menu sluit automatisch na 30 seconden inactiviteit (5 minuten bij DAC TEST). Bij het openen/sluiten van het menu is er een relock-gap van 150 ms; verifieer het beeld op de aangesloten monitor.

Firmware installeren (Flashing)

  • Web flasher: twotoz.github.io/C5VRX, tabblad C5VRX-5. Gebruik "Full firmware" bij overstap van een andere generatie.
  • ESP-IDF 6.0.2: Gebruik idf.py build flash in de root van de repository. Het filter en de DC-correctie vereisen de exacte libphy van IDF 6.0.2 (wordt gecontroleerd tijdens build); bij een andere PHY worden deze uitgeschakeld en geeft de build een waarschuwing.
  • Een draaiende ontvanger gaat naar USB-downloadmodus via de console-toets \ (via tools/enter_download.py`), waardoor de BOOT-knop niet nodig is voor flashing.

Seriële console (USB, 115200)

De volgende commando's zijn beschikbaar:

  • T: Status.
  • D: Range/health rapport.
  • R: Per-seconde FIELDDIAG regels aan/uit (tools/fielddiag_compare.py).
  • I: IQ-snapshot (tools/captureiqsnapshot.py).
  • o: Menu openen.
  • c: Volgende kanaal.
  • b: Volgende band.
  • n/x: Menu volgende/selecteren.
  • s: Scannen.
  • F: Opnieuw kalibreren (zoals het menu-item).
  • M: GAINMAP regels (voor een gain-map preset).
  • L: Alleen werkbank: IQ-lane vergelijking (video stopt ca. 3 s).
  • Z: DAC-zelftest (patroon, daarna multimeter-stappen; tools/dac_check.py).
  • \: Downloadmodus.
  • h: Help.
  • v: Wisselt videostandaard AUTO / NTSC / PAL.
  • e: Sluit het on-screen menu zonder het te openen als het al gesloten was.

Geavanceerde controles:

  • K: Wisselt tussen OFF / AUTO kp / AUTO kp+LP.
  • k / j: Zet kp respectievelijk rustiger of sneller.
  • P: Wisselt handmatig tussen U85Q/U85Q-LP.
  • P, k en j onthouden de instelling AUTO OFF, ook na een reboot.
  • g: Wisselt OUTPUT tussen 0.5x..5.0x in stappen van 0.5x.
  • G: Wisselt GAIN tussen AUTO (Direct Gain V6), MAX, en vaste waarden (G78 / G72 / G66 / G60 / G54 / G48 / G42 / G36 / G30 / G24).
  • U: Wisselt de opgeslagen sync flywheel (ON/OFF).

Gedetailleerde technische werking

Gain en Output

AUTO gain (Direct Gain V6) houdt de laatste gezonde gain vast tijdens tracking-resets in dezelfde context, overbrugt korte fades voor 10 ms en klimt daarna geleidelijk. De OUTPUT instelling (0.5x-5.0x) helpt bij zwakke sync, maar kan een brede VTX laten clippen. Controleer zowel de sync als het wit met een werkelijke 75-ohm load.

Sync Flywheel en Recovery

Een mislukte restart ruimt alles op voordat er één poging wordt gedaan met het laatste geverifieerde programma en de LUT, inclusief de OUTPUT instelling. Een mislukte rollback zet de live-uitvoer op OFF; de USB-status/download-taken blijven beschikbaar. AUTO stopt na een restart-fout en synchroniseert met de geverifieerde configuratie in plaats van het mislukte doel te blijven najagen.

Automatische OUTPUT (Research)

Automatische OUTPUT is uitsluitend bedoeld voor onderzoek (research/output_level.py). Het vergelijkt handmatige schaling met een ideale sync/wit-referentie gain en pedestal. Dit is geen bewezen live-estimator en stelt geen HDZero-compatibiliteit of range-gain vast.

Web-flasher

De web-flasher (twotoz.github.io/C5VRX) werkt in browsers met Web Serial (zoals Chrome of Edge) en bevat drie tabbladen:

  1. C5VRX-5: De nieuwste versie, gevolgd door on-merged PR-builds.
  2. Local File: Flash een eigen .bin bestand.
  3. Legacy builds: Gearchiveerde C5VRX-3 releases.

Terminal View: Bevat een visueel menu voor BAND, CHANNEL, SCAN, VIDEO, CALIBRATE, OUTPUT, GAIN, FLYWHEEL en EXIT. De flasher identificeert C5VRX-5 via de firmware help/status en toont actuele informatie zoals band, kanaal, frequentie, signaal en kalibratiestatus. De firmware stuurt elke 2 seconden een STATUS lijn (controlprintbeat) die door het menu wordt gelezen.

Releases en CI

De GitHub Actions workflow (.github/workflows/c5vrx5.yml) voert host-tests en research-checks uit, bouwt de firmware en publiceert deze:

  • c5vrx5-v5.0.N voor elke firmware-wijziging op main (onveranderlijk).
  • c5vrx5-pr-N als pre-release per pull request.

Onveranderde firmware-inputs zorgen ervoor dat er geen nieuwe release wordt aangemaakt bij enkel documentatie- of website-wijzigingen.

Projectstructuur

  • main/: C5VRX-5 firmware (U85Q, Direct Gain V6, kalibratie, menu, console).
  • test/: Host-tests (CI).
  • research/: Simulaties, generators en data achter de ontwerpkeuzes.
  • docs/: Bevindingen, veldtest-protocol, taakplan, DAC-schema.
  • tools/: Console/log-tools en CI/Pages helpers.
  • web/: Web-flasher (GitHub Pages).
  • legacy/: Gearchiveerde generaties (c5vrx1 t/m c5vrx4) ter referentie.

Community en Licentie

Community: Voor vragen, foto's of discussies kan men zich aansluiten bij de C5VRX Discord via de officiële website (twotoz.github.io/C5VRX).

Credits: C5VRX-5 is gebouwd op voorgaande versies (C5VRX-2..4), bijdragen van zerowidth (interference-burst gate, sampling-phase probe), Louis Hitchcock (staged overload recovery), en ESPARGOS esp-sdr (GPL-3.0) voor de C5 RX filtercontrole. Espressif leverde de GDMA EOF fix.

Licentie: C5VRX-5 is gelicenseerd onder GPL-3.0-only. Dit staat commercieel gebruik toe, inclusief de verkoop van ontvangers met deze firmware, mits de broncode (inclusief wijzigingen) onder dezelfde licentie wordt verspreid. De C5VRX-naam en logo's vallen onder aparte voorwaarden (zie assets/BRANDING.md).