ESP32-DATV: Digitale DVB-S Amateurs-TV Zender via ESP32-C3

Werking

Het proces werkt als volgt: de PC gebruikt FFmpeg om een MPEG-transportstream te maken, past DVB-S of DVB-S2-codering toe en verzendt de symbolen via native USB. De ESP32-C3 past vervolgens een root-raised-cosine filter toe (roll-off 0,35) en schrijft de I/Q-samples direct naar de Wi-Fi DAC. Het RF-blok van de chip produceert het verzonden signaal, waardoor een externe modulator overbodig is.

Ondersteunde modulaties en symboolsnelheden

ModulatieStandaardSymboolsnelheden (kS/s)Status
QPSKDVB-S, DVB-S233, 66, 125, 250, 333, 500, 1000Werkend
8PSKDVB-S233, 66, 125, 250, 333, 500, 1000Werkend
16APSKDVB-S233, 66, 125, 250, 333, 500, 1000Werkend
32APSKDVB-S233, 66, 125, 250Werkend (zie details beneden)

De firmware middelt CPU-cyclusintervallen waar nodig om de gevraagde gemiddelde symboolsnelheid te bereiken. Houd rekening met kristalfouten; gebruik de --ppm parameter voor uw specifieke board. De DAC-sample-rate wordt automatisch geselecteerd op basis van de modulatie en symboolsnelheid.

Voor 32APSK bij 250 kS/s wordt 8 MS/s (32 SPS) gebruikt; smallere 32APSK-modi maken gebruik van de tragere C-loop.

Installatie

Vereisten

  • Een ESP32-C3 board met native USB Serial/JTAG.
  • Een Linux PC.
  • Python 3.
  • FFmpeg.

Firmware installeren

Installeer en activeer ESP-IDF (getest met versie 6.2.0), en voer vervolgens de volgende commando's uit om de firmware te bouwen en te flashen:

git clone https://github.com/SP8ESA/ESP32-DATV.git
cd ESP32-DATV/firmware
idf.py set-target esp32c3
idf.py -p /dev/ttyACM0 build flash
cd ..

(Vervang /dev/ttyACM0 door de poort van uw board indien nodig.)

Host-software installeren

Installeer de afhankelijkheden vanuit de hoofdmap van de repository:

python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -r host/requirements.txt

Alternatief: Prebuilt firmware Prebuilt firmware is beschikbaar in de 'Releases'. Download het ZIP-bestand, pak het uit en voer ./flash.sh /dev/ttyACM0 uit (vereist python3 -m pip install esptool). Dit pakket is bedoeld voor ESP32-C3 met 4 MB flash.

Gebruik

Grafische Interface (GUI)

Om de desktop GUI te gebruiken, installeert u de benodigde pakketten en start u het programma:

python3 -m pip install -r host/requirements-gui.txt
./uruchom_nadajnik.sh

De GUI maakt het mogelijk om video, TS-bestanden of een V4L2-camera te selecteren en beheert de TX-functies, start/stop-acties en profielen. Door op een QO-100 WB-kanaal te klikken, wordt de uplink-frequentie ingesteld. Wijzigingen in een actieve zender worden toegepast via 'Apply/Restart'.

  • Level slider: Maakt gebruik van relatieve dB (0 dB is de standaardamplitude). De minimumwaarde wordt bepaald door minleveldb in host/txguiconfig.json (standaard -27 dB).
  • PA enable: Bestuurt GPIO3 (3,3 V tijdens TX, 0 V na Stop of USB-timeout). Standaard staat dit uit.
  • Kalibratie: I/Q-kalibratie wordt geladen uit het geselecteerde JSON-bestand (standaard: 0 ppm, DC I/Q 0, Q gain 1, Q phase 0).
  • Service-informatie: De servicenaam en provider zijn aanpasbaar voor video-, camera-, test- en TS-URL-bronnen.

Command Line Interface (CLI)

Voer de volgende voorbeelden uit vanuit de hoofdmap met de geactiveerde .venv. In deze voorbeelden wordt de meegeleverde Sintel-trailer in loop afgespeeld op 2370 MHz; FFmpeg past de video en audio aan aan de kanaalcapaciteit.

DVB-S, QPSK, 1 MS/s, FEC 1/2

python3 host/tx_dvbs.py --freq 2370 --baud 1000000 --fec 1/2

DVB-S2, 8PSK, 333 kS/s, FEC 3/5

python3 host/tx_dvbs.py --freq 2370 --baud 333000 --dvbs2 --mod 8psk --fec 3/5

DVB-S2, 16APSK, 1 MS/s, FEC 2/3

python3 host/tx_dvbs.py --freq 2370 --baud 1000000 --dvbs2 --mod 16apsk --fec 2/3 --pilots

DVB-S2, 32APSK, 250 kS/s, FEC 3/4

python3 host/tx_dvbs.py --freq 2370 --baud 250000 --dvbs2 --mod 32apsk --fec 3/4 --pilots --apsk-pl unit

Camera, DVB-S2 32APSK, 250 kS/s

python3 host/tx_dvbs.py --freq 2370 --baud 250000 --dvbs2 --mod 32apsk --fec 3/4 --pilots --apsk-pl unit --camera /dev/video0 --camera-size 640x480 --camera-fps 30 --camera-format mjpeg

Ontvangstinstellingen

Stel de ontvanger in op dezelfde frequentie, standaard, modulatie, symboolsnelheid en FEC, met een roll-off van 0,35.

  • In SDRangel: activeer 'soft LDPC decoding' voor DVB-S2.
  • Start de ontvanger opnieuw op na het wijzigen van de symboolsnelheid als de lock verloren gaat.
  • Voor 32APSK (ondersteunt 2–250 kS/s): gebruik --apsk-pl unit met SDRangel voor correcte PLHEADER en pilots.

Stop de verzending met Ctrl-C. De ESP stopt ook automatisch na ongeveer 0,5 seconden zonder USB-data.

Opties Referentie

OptieDoel
--film video.mp4Codeer en loop een eigen videobestand
--testGenereer een testpatroon en testtoon
--ts stream.tsLoop een bestaande CBR MPEG transportstream; --ts - leest van stdin
--port /dev/ttyACM0Selecteer het board (standaard wordt Espressif USB geprefereerd)
--frame shortGebruik DVB-S2 korte frames
--pilotsActiveer pilots
`--apsk-pl outer\unit`32APSK PL amplitude: bestaande outer-ring schaal of unit PL symbolen voor E=1 ontvangers
--ppm NCompenseer de kristalfout van het board
--cal file.jsonGebruik een eigen I/Q-kalibratiebestand (--no-cal om kalibratie uit te schakelen)
--amp NDAC amplitude (Standaard: 300 voor QPSK, 400 voor 32APSK, 420 voor 8PSK/16APSK)
--pa-enableActiveer een externe PA via GPIO3 tijdens verzending
--service-name NAMEServicemetadata voor gegenereerde of geremuxte TS

Voor alle opties: python3 host/tx_dvbs.py --help.

Externe Versterker (PA)

Verbind GPIO3 met de 3,3 V compatibele enable-ingang van de versterker en verbind de massa's (grounds). Gebruik een 10 kΩ pull-down weerstand om de PA uitgeschakeld te houden tijdens een reset. GPIO3 is een logische output; de versterker moet een eigen voeding hebben.

Technische Specificaties en Metingen

De firmware staat frequenties toe tussen 2300 en 2450 MHz. Voor gebruik op de ether dient u een frequentie te kiezen die is toegestaan volgens uw amateurlicentie en een uitgangsfilter toe te voegen, aangezien DAC-spiegels (images) zichtbaar zijn.

Spectrummetingen

Gemeten op 2026-10-05 op 2370 MHz met een tinySA Ultra+, --amp 300 en null transport packets.

  • QPSK, 8PSK en 16APSK (33 tot 1000 kS/s): Bij 1 MS/s draait de DAC op 8 MS/s (8 samples per symbool). De eerste image peaks liggen ongeveer 27–28 dB onder de hoofdpiek.
  • 32APSK (33 tot 250 kS/s): Gemeten op 2026-10-09 met live video, FEC 3/4, pilots, --apsk-pl unit en --amp 400.

Video-ontvangsttest (32APSK)

Symboolsnelheid (kS/s)DAC (MS/s)SPSResultaat
250832Gedecodeerd; 0 TS continuiteitsfouten
1251.512Gedecodeerd; 0 TS continuiteitsfouten
661.58424Gedecodeerd; 10 TS continuiteitsfouten in 38 s
331.58448TX en spectrum gemeten; SDRangel video lock niet behaald

Bij 250 kS/s liggen de eerste image peaks nabij ±8 MHz ongeveer 39,8–40,3 dB onder de signaalpiek (RBW 10 kHz).

Amplitude-sweep: Bij 8PSK en 16APSK op 500 kS/s treedt boven een waarde van --amp 430 compressie op, wat leidt tot toegenomen uitstraling buiten de band.

Licentie

PolyForm Noncommercial License 1.0.0: U mag deze software gebruiken, wijzigen en delen voor elk niet-commercieel doel, inclusief hobby, amateurradio, onderzoek en educatie. Commercieel gebruik is niet toegestaan. De demovideo heeft een eigen licentie (CC BY 3.0).

Copyright (c) 2026 SP8ESA