Het project esp32-sdr-trx maakt gebruik van ongedocumenteerde functies in de ESP32-S3 chip om een software-defined transceiver te realiseren zonder dat er een FPGA nodig is.
Belangrijkste functionaliteiten:
- Ontvanger (
espdr-rx): Werkt in het bereik van 1,84 tot 2,79 GHz en fungeert als een rtl_tcp-server, waardoor het compatibel is met software zoals SDR++ en GNU Radio.
- Zender (
espdr-tx): Bedoeld voor de 13 cm amateurband (2,32 tot 2,45 GHz) en ondersteunt FM, SSB en RTTY. Voor gebruik is een amateurradio-licentie vereist.
- Temperatuurcorrectie: Om frequentieverschuivingen door warmte te voorkomen, bevat de software een compensatiesysteem op basis van de interne temperatuursensor van de chip.
Technische details en installatie:
De software draait op Linux en vereist Python 3.10+. De firmware wordt direct in het RAM van het board geladen via een USB-verbinding. Naast de standaardfuncties is er geëxperimenteerd met raw I/Q-transmissie en LoRa-modulatie op 13 cm.
Beperkingen:
Het project is experimenteel; het uitgangsvermogen is zeer laag (microwatts) en de hardware is niet gekalibreerd, wat kan leiden tot spurs en beperkte gevoeligheid.
esp32-sdr-trx: Een software-defined transceiver op basis van één ESP32-S3 board
Elke ESP32-S3 beschikt over een 2,4 GHz Wi-Fi-radio. In deze chip bevindt zich een I/Q-stroom en een testtoon-generator die door Espressif niet worden gedocumenteerd. Dit project maakt gebruik van beide functies op een standaard dev-board met een USB-kabel, zonder dat er een FPGA nodig is.
Functionaliteiten
Ontvanger (espdr-rx)
- Bereik: 1,84 tot 2,79 GHz.
- Prestaties: 250 of 333 ksps van 8-bit I/Q.
- Werking: De chip decimeert zelf zijn 16 Msps ADC-stroom; een bridge maakt hiervan een
rtltcp-server. Hierdoor kan SDR++, GNU Radio en andere software die rtltcp ondersteunt, de ontvanger gebruiken.
Zender (espdr-tx)
- Bereik: Smalbandige FM en SSB (USB/LSB) spraak en RTTY in de 13 cm amateurband (2320 tot 2450 MHz).
- Bronnen: WAV-bestanden, pipes, geluidskaarten of tekst.
- Kenmerken:
- Bevat een compensatie voor de thermische drift van de draaggolf via het temperatuursensorelement van de chip (met de
--thermal optie en een modelbestand).
- De draaggolf van de chip wordt in frequentie en amplitude aangestuurd door software (polaire modulatie), waardoor er geen sample-buffers nodig zijn en de zender onbeperkt kan draaien.
- De chip beschikt ook over een raw I/Q-playback engine (samples uit SRAM tot 80 Msps), maar de huidige zender maakt hier nog geen gebruik van.
- Let op: Voor het zenden is een amateurradio-licentie vereist. Raadpleeg eerst de zenderhandleiding.
Technische Specificaties
| Kenmerk | Ontvanger (espdr-rx) | Zender (espdr-tx) |
| Bereik | 1,84 tot 2,79 GHz | 2,32 tot 2,45 GHz |
| Bandbreedte | 250 ksps (±100 kHz) of 333 ksps (±133 kHz) | Spraak: 300 tot 3000 Hz; RTTY: 170 Hz shift |
| Modi | rtl_tcp server | FM (±2,5 kHz), USB, LSB, RTTY |
| Bronnen | Wi-Fi front-end | WAV-bestand, pipe (-), geluidskaart; RTTY: tekst of tekstbestand |
| Status | Stabiel, één board getest | Experimenteel, één board getest |
Installatie
Vereisten:
- Een ESP32-S3 board met twee USB-poorten (de tweede poort is een USB-UART bridge waarmee tools de firmware kunnen laden zonder dat er knoppen ingedrukt hoeven te worden).
- Een USB-kabel voor elke poort.
- Linux.
- Python 3.10 of nieuwer.
Stappen:
- Download het wheel-bestand
esp32sdrtrx-X.Y.Z-py3-none-any.whl en install-linux.sh van de releases-pagina.
- Voer de volgende commando's uit:
chmod +x install-linux.sh
./install-linux.sh esp32_sdr_trx-X.Y.Z-py3-none-any.whl --audio
(De optie --audio is nodig voor het gebruik van een geluidskaart als bron voor de zender).
Dit proces maakt een eigen virtuele omgeving aan, plaatst espdr-rx en espdr-tx in ~/.local/bin en configureert de udev-rule. De firmware-images zijn inbegrepen in het pakket; er hoeft niets gecompileerd te worden.
Gebruik
Ontvanger
espdr-rx
- Laadt de ontvanger-firmware en start de
rtl_tcp server op 127.0.0.1:1234.
- In SDR++: Selecteer bron
RTL-TCP, host 127.0.0.1, poort 1234 en druk op play.
Zender
Voorbeelden van zendcommando's:
- FM spraak vanuit een WAV-bestand:
``bash espdr-tx --accept-licence -f 2350 -i speech.wav ` (De optie --accept-licence` is alleen de eerste keer nodig).
- SSB vanuit de geluidskaart (6 dB onder maximale sterkte):
``bash espdr-tx -f 2350 -m usb -i soundcard --power -6 ``
- Raw samples via een pipe:
``bash arecord -f S16_LE -r 16000 -c 1 | espdr-tx -f 2350 -m usb -i - --rate 16000 ``
- RTTY (45,45 baud, 170 Hz shift):
``bash espdr-tx -f 2350 -m rtty --text "RYRY CQ CQ DE <your call sign> K" ``
Opmerkingen over firmware: Beide tools laden automatisch de juiste firmware in het RAM van het board. Er wordt niets naar de flash geschreven, tenzij expliciet gevraagd via espdr-rx --flash. Gebruik -h voor alle opties.
Temperatuurcorrectie voor de zender (--thermal)
Waarom correctie nodig is
De zender warmt op tijdens het verzenden; de interne temperatuursensor stijgt binnen enkele minuten van ongeveer 42 °C (of 20 °C bij rust) naar 57 °C. Hierdoor verandert de frequentie van het 40 MHz kristal, waardoor de draaggolf op 2,35 GHz verschuift.
Bij metingen tegen een PlutoSDR liep de frequentie op één board met +2000 Hz af in 120-150 seconden, en op een ander board met +4400 Hz. Dit is te veel voor RTTY (waar een 170 Hz shift slechts ongeveer 85 Hz tolereert) en voor SSB, waarbij de stem alleen correct klinkt als men exact op de draaggolf is afgestemd.
Hoe het werkt
De firmware leest de on-chip temperatuursensor (TXOPTEMP) tussen transmissies door. De host voorspelt de frequentiefout op basis van de temperatuur aan het begin en de verstreken tijd, gebruikmakend van een klein model van het kristal. Er wordt vervolgens een tegenovergestelde correctie toegevoegd aan het frequentieveld van elk record. Dit werkt voor FM, SSB en RTTY en heeft geen invloed op de ontvangende zijde.
Gebruik van de correctie
De optie --thermal auto is de standaardinstelling: de correctie wordt uitgevoerd als er een modelbestand aanwezig is.
- Automatisch (gebruikt
~/.config/espdr/thermal-<bridge serial>.json):
``bash espdr-tx -f 2350 -m usb -i speech.wav --ppm 5.4 ``
- Controleren welk modelbestand wordt gezocht:
``bash espdr-tx -f 2350 -m rtty --text "..." -v ``
- Nominale temperatuur (geen sensoruitlezing):
``bash espdr-tx -f 2350 -m rtty --text-file message.txt --thermal nominal ``
- Correctie volledig uitschakelen:
``bash espdr-tx -f 2350 -m usb -i speech.wav --thermal off ``
- Eigen modelbestand gebruiken:
``bash espdr-tx -f 2350 -m usb -i speech.wav --thermal-model my-board.json ``
Om een eigen model te maken, kunnen de scripts scripts/drift/abseries.py, abanalyse.py en fit_thermal.py worden gebruikt (vereist ongeveer 40 minuten zenden op 2350 MHz met een PlutoSDR als ontvanger).
Onderzoek en Experimenten
Research branch: Raw I/Q-transmissie (research/iq-tx)
Deze branch bevat experimenten met de I/Q-playback engine van de chip, waarbij samples vanuit SRAM naar de transmit DAC worden gestuurd tot 80 Msps. Dit onderdeel maakt geen deel uit van de officiële releases.
LoRa op 13 cm (Experimenteel)
Het is aangetoond dat dit board LoRa (chirp spread spectrum) kan verzenden in de amateurband op twee manieren:
- I/Q playback engine: Verzendt korte frames (tot ca. 400 $\mu$s) in één buffer met 4 of 8 MHz bandbreedte, of langere frames in echte SX1280 bandbreedtes (0,8125 en 1,625 MHz).
- Polaire modulatie: Verzendt smalle LoRa (tot 80 kHz bandbreedte) met SF5 tot SF10 bij 62,5 kHz.
Status LoRa:
- Werkt: Frames kunnen in de lucht worden gedecodeerd. De decoder van
pluto-tx kan smalle SF7 en SF8 frames lezen; de eigen ontvanger van de ESP32 kan SF7 tot SF9 decoderen bij 62,5 kHz.
- Beperkingen: Er is geen echte LoRa-chip gebruikt als ontvanger. Er is geen ondersteuning voor 433/868 MHz, LoRaWAN, Meshtastic of MeshCore. De symbol-by-symbol methode verliest ongeveer 5 dB aan gevoeligheid.
Beperkingen
- Hardware: Getest op één generiek ESP32-S3-WROOM-1 dev-board met twee USB-C poorten. Windows en macOS zijn niet getest.
- Zender: Het uitgangsvermogen is niet gekalibreerd (schatting: enkele microwatts bij de antenne van een dev-board). Harmonischen en spurieuzen emissies zijn niet gemeten. De frequentie-accuraatheid is afhankelijk van het kristal op het board (tot $\pm$ 24 kHz; corrigeer dit met
--ppm).
- Ontvanger: Geen gekalibreerde niveaus. Er zijn spurs aanwezig op 2400,000 en 2440,000 MHz (de 60e en 61e harmonische van het kristal). De gevoeligheid is vergelijkbaar met die van Wi-Fi.
Credits en Licentie
Dit project is gebaseerd op eSpDR door h0m3us3r, die ontdekte hoe de ongedocumenteerde radio dump path van de ESP32-S3 gelezen kan worden. De toevoegingen (de on-chip decimator, USB-stream, flash boot, de rtl_tcp bridge, de zender, de tools en de documentatie) zijn ontwikkeld door Jochen Hammes met Claude (Anthropic) als code-assistent.
Licentie: Zero-Clause BSD licence. Niet gelieerd aan of onderschreven door Espressif.
esp32-sdr-trx: Een software-defined transceiver op basis van één ESP32-S3 board
Elke ESP32-S3 beschikt over een 2,4 GHz Wi-Fi-radio. In deze chip bevindt zich een I/Q-stroom en een testtoon-generator die door Espressif niet worden gedocumenteerd. Dit project maakt gebruik van beide functies op een standaard dev-board met een USB-kabel, zonder dat er een FPGA nodig is.
Functionaliteiten
Ontvanger (espdr-rx)
- Bereik: 1,84 tot 2,79 GHz.
- Prestaties: 250 of 333 ksps van 8-bit I/Q.
- Werking: De chip decimeert zelf zijn 16 Msps ADC-stroom; een bridge maakt hiervan een
rtltcp-server. Hierdoor kan SDR++, GNU Radio en andere software die rtltcp ondersteunt, de ontvanger gebruiken.
Zender (espdr-tx)
- Bereik: Smalbandige FM en SSB (USB/LSB) spraak en RTTY in de 13 cm amateurband (2320 tot 2450 MHz).
- Bronnen: WAV-bestanden, pipes, geluidskaarten of tekst.
- Kenmerken:
- Bevat een compensatie voor de thermische drift van de draaggolf via het temperatuursensorelement van de chip (met de
--thermal optie en een modelbestand).
- De draaggolf van de chip wordt in frequentie en amplitude aangestuurd door software (polaire modulatie), waardoor er geen sample-buffers nodig zijn en de zender onbeperkt kan draaien.
- De chip beschikt ook over een raw I/Q-playback engine (samples uit SRAM tot 80 Msps), maar de huidige zender maakt hier nog geen gebruik van.
- Let op: Voor het zenden is een amateurradio-licentie vereist. Raadpleeg eerst de zenderhandleiding.
Technische Specificaties
| Kenmerk | Ontvanger (espdr-rx) | Zender (espdr-tx) |
| Bereik | 1,84 tot 2,79 GHz | 2,32 tot 2,45 GHz |
| Bandbreedte | 250 ksps (±100 kHz) of 333 ksps (±133 kHz) | Spraak: 300 tot 3000 Hz; RTTY: 170 Hz shift |
| Modi | rtl_tcp server | FM (±2,5 kHz), USB, LSB, RTTY |
| Bronnen | Wi-Fi front-end | WAV-bestand, pipe (-), geluidskaart; RTTY: tekst of tekstbestand |
| Status | Stabiel, één board getest | Experimenteel, één board getest |
Installatie
Vereisten:
- Een ESP32-S3 board met twee USB-poorten (de tweede poort is een USB-UART bridge waarmee tools de firmware kunnen laden zonder dat er knoppen ingedrukt hoeven te worden).
- Een USB-kabel voor elke poort.
- Linux.
- Python 3.10 of nieuwer.
Stappen:
- Download het wheel-bestand
esp32sdrtrx-X.Y.Z-py3-none-any.whl en install-linux.sh van de releases-pagina.
- Voer de volgende commando's uit:
chmod +x install-linux.sh
./install-linux.sh esp32_sdr_trx-X.Y.Z-py3-none-any.whl --audio
(De optie --audio is nodig voor het gebruik van een geluidskaart als bron voor de zender).
Dit proces maakt een eigen virtuele omgeving aan, plaatst espdr-rx en espdr-tx in ~/.local/bin en configureert de udev-rule. De firmware-images zijn inbegrepen in het pakket; er hoeft niets gecompileerd te worden.
Gebruik
Ontvanger
espdr-rx
- Laadt de ontvanger-firmware en start de
rtl_tcp server op 127.0.0.1:1234.
- In SDR++: Selecteer bron
RTL-TCP, host 127.0.0.1, poort 1234 en druk op play.
Zender
Voorbeelden van zendcommando's:
- FM spraak vanuit een WAV-bestand:
``bash espdr-tx --accept-licence -f 2350 -i speech.wav ` (De optie --accept-licence` is alleen de eerste keer nodig).
- SSB vanuit de geluidskaart (6 dB onder maximale sterkte):
``bash espdr-tx -f 2350 -m usb -i soundcard --power -6 ``
- Raw samples via een pipe:
``bash arecord -f S16_LE -r 16000 -c 1 | espdr-tx -f 2350 -m usb -i - --rate 16000 ``
- RTTY (45,45 baud, 170 Hz shift):
``bash espdr-tx -f 2350 -m rtty --text "RYRY CQ CQ DE <your call sign> K" ``
Opmerkingen over firmware: Beide tools laden automatisch de juiste firmware in het RAM van het board. Er wordt niets naar de flash geschreven, tenzij expliciet gevraagd via espdr-rx --flash. Gebruik -h voor alle opties.
Temperatuurcorrectie voor de zender (--thermal)
Waarom correctie nodig is
De zender warmt op tijdens het verzenden; de interne temperatuursensor stijgt binnen enkele minuten van ongeveer 42 °C (of 20 °C bij rust) naar 57 °C. Hierdoor verandert de frequentie van het 40 MHz kristal, waardoor de draaggolf op 2,35 GHz verschuift.
Bij metingen tegen een PlutoSDR liep de frequentie op één board met +2000 Hz af in 120-150 seconden, en op een ander board met +4400 Hz. Dit is te veel voor RTTY (waar een 170 Hz shift slechts ongeveer 85 Hz tolereert) en voor SSB, waarbij de stem alleen correct klinkt als men exact op de draaggolf is afgestemd.
Hoe het werkt
De firmware leest de on-chip temperatuursensor (TXOPTEMP) tussen transmissies door. De host voorspelt de frequentiefout op basis van de temperatuur aan het begin en de verstreken tijd, gebruikmakend van een klein model van het kristal. Er wordt vervolgens een tegenovergestelde correctie toegevoegd aan het frequentieveld van elk record. Dit werkt voor FM, SSB en RTTY en heeft geen invloed op de ontvangende zijde.
Gebruik van de correctie
De optie --thermal auto is de standaardinstelling: de correctie wordt uitgevoerd als er een modelbestand aanwezig is.
- Automatisch (gebruikt
~/.config/espdr/thermal-<bridge serial>.json):
``bash espdr-tx -f 2350 -m usb -i speech.wav --ppm 5.4 ``
- Controleren welk modelbestand wordt gezocht:
``bash espdr-tx -f 2350 -m rtty --text "..." -v ``
- Nominale temperatuur (geen sensoruitlezing):
``bash espdr-tx -f 2350 -m rtty --text-file message.txt --thermal nominal ``
- Correctie volledig uitschakelen:
``bash espdr-tx -f 2350 -m usb -i speech.wav --thermal off ``
- Eigen modelbestand gebruiken:
``bash espdr-tx -f 2350 -m usb -i speech.wav --thermal-model my-board.json ``
Om een eigen model te maken, kunnen de scripts scripts/drift/abseries.py, abanalyse.py en fit_thermal.py worden gebruikt (vereist ongeveer 40 minuten zenden op 2350 MHz met een PlutoSDR als ontvanger).
Onderzoek en Experimenten
Research branch: Raw I/Q-transmissie (research/iq-tx)
Deze branch bevat experimenten met de I/Q-playback engine van de chip, waarbij samples vanuit SRAM naar de transmit DAC worden gestuurd tot 80 Msps. Dit onderdeel maakt geen deel uit van de officiële releases.
LoRa op 13 cm (Experimenteel)
Het is aangetoond dat dit board LoRa (chirp spread spectrum) kan verzenden in de amateurband op twee manieren:
- I/Q playback engine: Verzendt korte frames (tot ca. 400 $\mu$s) in één buffer met 4 of 8 MHz bandbreedte, of langere frames in echte SX1280 bandbreedtes (0,8125 en 1,625 MHz).
- Polaire modulatie: Verzendt smalle LoRa (tot 80 kHz bandbreedte) met SF5 tot SF10 bij 62,5 kHz.
Status LoRa:
- Werkt: Frames kunnen in de lucht worden gedecodeerd. De decoder van
pluto-tx kan smalle SF7 en SF8 frames lezen; de eigen ontvanger van de ESP32 kan SF7 tot SF9 decoderen bij 62,5 kHz.
- Beperkingen: Er is geen echte LoRa-chip gebruikt als ontvanger. Er is geen ondersteuning voor 433/868 MHz, LoRaWAN, Meshtastic of MeshCore. De symbol-by-symbol methode verliest ongeveer 5 dB aan gevoeligheid.
Beperkingen
- Hardware: Getest op één generiek ESP32-S3-WROOM-1 dev-board met twee USB-C poorten. Windows en macOS zijn niet getest.
- Zender: Het uitgangsvermogen is niet gekalibreerd (schatting: enkele microwatts bij de antenne van een dev-board). Harmonischen en spurieuzen emissies zijn niet gemeten. De frequentie-accuraatheid is afhankelijk van het kristal op het board (tot $\pm$ 24 kHz; corrigeer dit met
--ppm).
- Ontvanger: Geen gekalibreerde niveaus. Er zijn spurs aanwezig op 2400,000 en 2440,000 MHz (de 60e en 61e harmonische van het kristal). De gevoeligheid is vergelijkbaar met die van Wi-Fi.
Credits en Licentie
Dit project is gebaseerd op eSpDR door h0m3us3r, die ontdekte hoe de ongedocumenteerde radio dump path van de ESP32-S3 gelezen kan worden. De toevoegingen (de on-chip decimator, USB-stream, flash boot, de rtl_tcp bridge, de zender, de tools en de documentatie) zijn ontwikkeld door Jochen Hammes met Claude (Anthropic) als code-assistent.
Licentie: Zero-Clause BSD licence. Niet gelieerd aan of onderschreven door Espressif.