Polish radio amateur Kacper Kidała, SP8ESA, published on GitHub experimentálny SSB/CW vysielač pre pásmo 2,4 GHz postavený na module SX1280 (LoRa1280F27-TCXO) in combination with the Raspberry Pi Pico 2 microcontroller. The project is primarily designed to work via a narrowband transponder geostationary satellite QO-100 (Es'hail 2), no funguje aj vo všeobecnom pásme 2,4 GHz. Kód a firmware are freely available on GitHub under the CC BY-NC 4.0 license (non-commercial use including amateur radio free).
In the article you will read
Transmitter solution from Kacper Kidał SP8ESA
The core of the solution is the LoRa1280F27-TCXO module, originally designed for LoRa technology in the 2.4 GHz band. It is a small (16 × 32 mm) and inexpensive transceiver chip with a built-in PA with output power up to +27 dBm (about 500 mW) and a temperature-compensated oscillator with an accuracy of ±0.5 ppm. Instead of using the module for its original purpose – transmitting digital LoRa packets – SP8ESA programmed it as a universal SSB/CW (and later also FM) transmitter.

Photo: SparkFun Electronics /
Wikimedia Commons,
CC BY 2.0.
The control element is a Raspberry Pi Pico 2 with a dual-core RP2350 processor (ARM Cortex-M33). The firmware architecture uses both cores in parallel: Core0 takes care of receiving audio (via USB or from a microphone ADC) and real-time signal processing (bandpass, equalizer, compressor), while Core1 performs Hilbert transform, I/Q modulation and sending data to the SX1280 via SPI at 8 kHz. The author states in the repository that he used the help of the Claude Opus 4 and GPT 5.2 language models when developing the code.
The SP8ESA solution is notable precisely because it uses a cheap commercial LoRa module outside its original purpose - as a universal SSB/CW driver for the 2.4 GHz band.
Required components
| Component | Description |
|---|---|
| Raspberry Pi Pico 2 | RP2350 microcontroller, dual-core Cortex-M33 |
| LoRa1280F27-TCXO | SX1280 module with PA (+27 dBm) and TCXO oscillator (0.5 ppm) |
| MAX4466 Microphone Module | Electret microphone with amplifier, 3.3 V power supply |
| OLED display SSD1306 128×64 | I2C display, 0.96″ |
| Rotary encoder with push button | Type KY-040 or similar (3-pin + SW) |
| PTT button / CW key | Normal button (normally open) |
| Antenna for 2.4 GHz | SMA or u.FL connector |
When ordering a LoRa module, it is necessary to select the variant with the TCXO attribute (i.e. with an accuracy of 0.5 ppm), because a cheaper variant with a regular 10ppm oscillator is also available, which is not suitable for frequency stability at 2.4 GHz. The connection between the Raspberry Pi Pico 2 and the LoRa module is simple - SPI bus (MISO, NSS, SCK, MOSI), control signals RESET, BUSY, TCXO_EN and RX/TX switching. The author publishes the complete connection diagram in the WIRING.txt file in the repository.
Video: SSB TX test
Features
The firmware supports audio input in two ways – the Raspberry Pi Pico 2 appears to the computer as a standard USB sound card (audio at 48 kHz, downsampled to 8 kHz for the DSP chain), or an electret microphone module can be connected directly to the ADC input for standalone operation without a computer. Switching between audio sources is possible via the encoder menu or via the GUI. The microphone branch includes hardware processing with DC component removal and AGC with noise gate.
The real-time DSP chain includes a bandpass, equalizer and compressor, whose parameters can be changed via serial CDC commands or via the GUI. The firmware also supports FM mode with adjustable deviation (200 Hz – 100 kHz) and CTCSS tónmi – tento mód je však autorom výslovne označený ako nevhodný pre transponder QO-100, which accepts only SSB and CW; FM transmission on this transponder causes interference and is prohibited. The frequency range of the device covers the entire 2300–2450 MHz band, including the QO-100 range (2400,000–2400,500 MHz).
The device achieves sub-hertz tuning accuracy by combining PLL steps (resolution of approximately 198 Hz) and DSP fine tuning. The SSD1306 display shows frequency, mode, broadcast status, sound source and current parameter in real time. Control without a computer is provided by a rotary encoder (step ±100 Hz), a short press switches the carrier TUNE, and a long press enters the parameter editing mode. The device can be powered from a power bank - if a USB host is not detected within three seconds, it automatically switches to microphone input.
| Parameters | Value |
|---|---|
| Frequency range | 2300.000 – 2450.000 MHz (QO-100: 2400.000 – 2400.500 MHz) |
| Output power | up to +27 dBm (adjustable -18 to +13 dBm directly on the chip) |
| Modulation | SSB (USB), CW, FM (with CTCSS) |
| Audio input | USB 48 kHz (PC) or ADC 8 kHz (MAX4466 microphone) |
| SPI clock signal | 18MHz |
| TCXO stability | ±0.5 ppm |
| Frequency resolution | sub-Hz (PLL steps + fine DSP offset) |
Practical experience with the transmitter
Practical verification of the project published by Mirek, SP5GNI, from the HF5L club. When measuring the output power through a meter based on the AD8318 with a 30 dB attenuator, they measured the following values: the quiescent current consumption from the USB is approximately 110 mA. At the "TX Power" setting of -6 dBm, the consumption is around 140 mA and the actual output power is 12 dBm (about 16 mW). At 0 dBm, the consumption is 200 mA and the power is 18 dBm (about 63 mW). At 6 dBm, the consumption is 290 mA and the power is 23 dBm (about 200 mW). At 10 dBm, the consumption is 360 mA and the power is 25 dBm (about 300 mW). At the maximum setting of 13 dBm, the consumption is around 400 mA and the output power is 26 dBm (about 400 mW). The author of the test points out that the "TX Power" values in the GUI (range -18 to +13 dBm) do not directly correspond to the actual output power of the module, and the second tested piece of the SX1280 module reached a maximum power of only 24 dBm (approximately 200 mW) - so there is a variance between the individual pieces of modules.
In a test with my own system on the QO-100 (13 m cable, 30 dB amplifier, helix antenna), setting the "TX Power" to -3 dBm was enough to get the signal on WebSDR accepted at S9 level. SP5GNI also tested power supply and control of the transmitter via a 20-meter USB-RJ45 extender with a remote antenna without an amplifier - in this connection, the supply voltage on the module decreased with increasing output power (at a 13 dBm setting, the voltage at the Raspberry input dropped to 3.2 V, which is outside the permitted limits, and communication failures occurred), but even in this modest connection, the signal on the WebSDR was audible at the S6 level - enough to make a connection.
The tester recommends a separate power supply for the LoRa module for field operation (for example, a standard 13.8 V with a reduced voltage to 5 V for the module and powering an added 2–5 W amplifier), which eliminates the problem of voltage drop with longer cables. For the software, he recommends version 1.5.1 from Adam SP9ACQ, who contributed to the development with his own variant of the repository with the bundled files gui.kopia.3.py, SX1280SDR.uf2 and the configuration sx1280_profile.json.
Conclusion
The SP8ESA solution proves that getting into operation via QO-100 in SSB mode does not necessarily require an expensive upconverter and high-power transceiver – a cheap LoRa module with a built-in PA in combination with a Raspberry Pi Pico 2 is enough to achieve a functional signal with a power of the order of hundreds of milliwatts, which is fully sufficient for a satellite transponder with a sensitive receiver. The design is open, actively developed (the current version v2.2.0 adds smoothing of TX transitions to eliminate clicks when switching) and documented on GitHub along with wiring diagrams. Anyone who decides to build the project will find detailed instructions, diagrams and practical notes on the SP8ESA website and SP8NTP, as well as in the practical test of the HF5L club.
