Overzicht
ESP32-DATV is een software- en hardwareproject dat een digitale DVB-S/DVB-S2 videozender realiseert met behulp van de native 2,4 GHz RF-hardware van de ESP32-C3. Het systeem stelt gebruikers in staat om video-signalen uit te zenden in de 13 cm-band zonder dat er een externe modulator nodig is.
Werking
Het proces begint op een Linux-PC, waar FFmpeg een MPEG-transportstream creëert en DVB-S/S2-codering toepast. Deze data wordt via native USB naar de ESP32-C3 verzonden. De chip past een root-raised-cosine filter toe en schrijft de I/Q-samples direct naar de Wi-Fi DAC, waarna het RF-blok het signaal uitzendt.
Technische Specificaties
- Modulaties: Ondersteunt QPSK, 8PSK, 16APSK en 32APSK.
- Snelheden: Symboolsnelheden variëren van 33 kS/s tot 1 MSymbol/s.
- Frequentiebereik: Tussen 2300 en 2450 MHz.
- Hardware-integratie: Mogelijkheid om een externe Power Amplifier (PA) aan te sturen via GPIO3.
Installatie en Bediening
De setup vereist een ESP32-C3 board, Linux, Python 3 en FFmpeg. De zender kan op twee manieren worden bediend:
- GUI: Een grafische interface voor het beheren van videobronnen, profielen en uplink-frequenties.
- CLI: Een command-line interface voor directe configuratie via Python-scripts.
Het project is beschikbaar onder de PolyForm Noncommercial License 1.0.0.
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
| Modulatie | Standaard | Symboolsnelheden (kS/s) | Status |
| QPSK | DVB-S, DVB-S2 | 33, 66, 125, 250, 333, 500, 1000 | Werkend |
| 8PSK | DVB-S2 | 33, 66, 125, 250, 333, 500, 1000 | Werkend |
| 16APSK | DVB-S2 | 33, 66, 125, 250, 333, 500, 1000 | Werkend |
| 32APSK | DVB-S2 | 33, 66, 125, 250 | Werkend (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
| Optie | Doel |
--film video.mp4 | Codeer en loop een eigen videobestand |
--test | Genereer een testpatroon en testtoon |
--ts stream.ts | Loop een bestaande CBR MPEG transportstream; --ts - leest van stdin |
--port /dev/ttyACM0 | Selecteer het board (standaard wordt Espressif USB geprefereerd) |
--frame short | Gebruik DVB-S2 korte frames |
--pilots | Activeer pilots |
| `--apsk-pl outer\ | unit` | 32APSK PL amplitude: bestaande outer-ring schaal of unit PL symbolen voor E=1 ontvangers |
--ppm N | Compenseer de kristalfout van het board |
--cal file.json | Gebruik een eigen I/Q-kalibratiebestand (--no-cal om kalibratie uit te schakelen) |
--amp N | DAC amplitude (Standaard: 300 voor QPSK, 400 voor 32APSK, 420 voor 8PSK/16APSK) |
--pa-enable | Activeer een externe PA via GPIO3 tijdens verzending |
--service-name NAME | Servicemetadata 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) | SPS | Resultaat |
| 250 | 8 | 32 | Gedecodeerd; 0 TS continuiteitsfouten |
| 125 | 1.5 | 12 | Gedecodeerd; 0 TS continuiteitsfouten |
| 66 | 1.584 | 24 | Gedecodeerd; 10 TS continuiteitsfouten in 38 s |
| 33 | 1.584 | 48 | TX 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
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
| Modulatie | Standaard | Symboolsnelheden (kS/s) | Status |
| QPSK | DVB-S, DVB-S2 | 33, 66, 125, 250, 333, 500, 1000 | Werkend |
| 8PSK | DVB-S2 | 33, 66, 125, 250, 333, 500, 1000 | Werkend |
| 16APSK | DVB-S2 | 33, 66, 125, 250, 333, 500, 1000 | Werkend |
| 32APSK | DVB-S2 | 33, 66, 125, 250 | Werkend (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
| Optie | Doel |
--film video.mp4 | Codeer en loop een eigen videobestand |
--test | Genereer een testpatroon en testtoon |
--ts stream.ts | Loop een bestaande CBR MPEG transportstream; --ts - leest van stdin |
--port /dev/ttyACM0 | Selecteer het board (standaard wordt Espressif USB geprefereerd) |
--frame short | Gebruik DVB-S2 korte frames |
--pilots | Activeer pilots |
| `--apsk-pl outer\ | unit` | 32APSK PL amplitude: bestaande outer-ring schaal of unit PL symbolen voor E=1 ontvangers |
--ppm N | Compenseer de kristalfout van het board |
--cal file.json | Gebruik een eigen I/Q-kalibratiebestand (--no-cal om kalibratie uit te schakelen) |
--amp N | DAC amplitude (Standaard: 300 voor QPSK, 400 voor 32APSK, 420 voor 8PSK/16APSK) |
--pa-enable | Activeer een externe PA via GPIO3 tijdens verzending |
--service-name NAME | Servicemetadata 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) | SPS | Resultaat |
| 250 | 8 | 32 | Gedecodeerd; 0 TS continuiteitsfouten |
| 125 | 1.5 | 12 | Gedecodeerd; 0 TS continuiteitsfouten |
| 66 | 1.584 | 24 | Gedecodeerd; 10 TS continuiteitsfouten in 38 s |
| 33 | 1.584 | 48 | TX 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