Quick Start
Plug the board in over USB-C, connect the included FXUB1900 antenna to the IPEX connector, and follow the tab for your platform to see decoded aircraft reports from the onboard TT-SC1 receiver.
- Arduino
- MicroPython
- ESP-IDF
1. Install the platform
Install the official Espressif Arduino core for ESP32 from the Arduino IDE Boards Manager:
- Open Arduino IDE.
- Go to Tools → Board → Boards Manager.
- Search for ESP32.
- Find ESP32 by Espressif Systems and click Install.
2. Install the CH340K driver
The board's CH340K chip handles USB-to-serial communication. Without its driver, the board will not show up as a serial port.
Linux does not need a separate driver: the CH340 is supported out of the box.
On Windows, download the driver from
the WCH driver page
and run the installer. On macOS, download the driver from
the WCH macOS driver page,
open the .zip, and follow its installation instructions.
3. Install the library
Download Soldered ADS-B Receiver Arduino library at the verified commit:
In Arduino IDE, go to Sketch → Include Library → Add .ZIP Library... and select the downloaded archive.
4. Select the board
No board-specific entry for this product has been added to the Boards Manager package yet, so select the closest generic target: Tools → Board → esp32 → ESP32S3 Dev Module.
5. Upload your first program
This is the library's own 1_ReadAircraftCSV example. The library's default
wiring (UART1 on IO17/IO18, reset on IO21) already matches this board, so the
constructor needs no arguments.
#include "ADSB-Receiver-SOLDERED.h"
// Create an instance of the ADS-B object
// Using a different board? See example 7_CustomBoardWiring.
ADSBReceiver adsb;
// Called once per decoded aircraft update, with whichever fields the module had data for.
void onAircraft(const AdsbAircraft &ac)
{
Serial.print("ICAO ");
Serial.print(ac.icao);
if (ac.callsign.length())
{
Serial.print(" call=");
Serial.print(ac.callsign);
}
if (ac.hasPosition)
{
Serial.print(" lat=");
Serial.print(ac.lat, 5);
Serial.print(" lon=");
Serial.print(ac.lon, 5);
}
if (ac.hasAltBaro)
{
Serial.print(" altBaro=");
Serial.print(ac.altBaro);
Serial.print("ft");
}
if (ac.hasVelH)
{
Serial.print(" vel=");
Serial.print(ac.velH);
Serial.print("kt");
}
if (ac.squawk.length())
{
Serial.print(" squawk=");
Serial.print(ac.squawk);
}
Serial.print(" onGround=");
Serial.print(ac.onGround() ? "yes" : "no");
Serial.print(" crcValid=");
Serial.println(ac.crcValid ? "yes" : "no");
}
void setup()
{
// Start the USB serial monitor.
Serial.begin(115200);
// Open the UART link to the module at its factory-default RUN baud.
adsb.begin(115200);
// Register the function to call whenever a decoded aircraft report arrives.
adsb.onAircraft(onAircraft);
Serial.println("Waiting for ADS-B traffic...");
}
void loop()
{
// Reads incoming bytes and fires the registered callbacks. Must run every loop.
adsb.poll();
}
6. What to expect
Open Tools → Serial Monitor, set the baud rate to 115200, and reset the board. The receiver sends a CSV report for every aircraft it hears, about once per second per aircraft:
Waiting for ADS-B traffic...
ICAO 4BB865 call=PGT2DY onGround=no crcValid=yes
ICAO 4CBEA5 onGround=no crcValid=yes
ICAO 0FFA8D onGround=no crcValid=yes
ICAO 3E7FBE onGround=no crcValid=yes
ICAO 4BB865 call=PGT2DY altBaro=36975ft squawk=7140 onGround=no crcValid=yes
ICAO 4CBEA5 onGround=no crcValid=yes
ICAO 0FFA8D onGround=no crcValid=yes
ICAO 44020A squawk=7102 onGround=no crcValid=yes
ICAO 4BB87A altBaro=37000ft vel=453.00kt squawk=3031 onGround=no crcValid=yes
A line's fields depend on what the module actually decoded for that update; a field the module has no data for yet is simply left out, which is why some lines above are shorter than others.
No output beyond the first line? See Troubleshooting. Reception needs an aircraft broadcasting ADS-B within range and line of sight of the antenna.
7. Troubleshooting
If the board is not detected or the upload fails, continue with Troubleshooting.
1. Install the platform
Install Thonny (or another ESP32-S3-capable
MicroPython IDE) and the flashing tool esptool:
pip install esptool
2. Install the firmware
Download a generic ESP32-S3 MicroPython firmware build from the official MicroPython downloads page, then flash it over USB-C:
esptool.py --chip esp32s3 --port PORT erase_flash
esptool.py --chip esp32s3 --port PORT write_flash -z 0 firmware.bin
Replace PORT with your board's serial port, and firmware.bin with the
file you downloaded. Pick the SPIRAM_OCT build for this board's ESP32-S3-WROOM-1-N8R8 module, which has octal SPI PSRAM.
If esptool reports "Invalid image block, can't boot" after flashing, the
write did not fully complete. Re-run write_flash, watch for "Hash of data
verified" at the end, and confirm you flashed the SPIRAM_OCT build.
3. Install the module
Install Soldered ADSBReceiver MicroPython Library with mpremote, using
the command from the module's own README:
mpremote mip install github:SolderedElectronics/Soldered-ADSBReceiver-MicroPython-Library@a0f37376b7e51b09944f6799e0d64e939f05fe85
On Windows:
python -m mpremote mip install github:SolderedElectronics/Soldered-ADSBReceiver-MicroPython-Library@a0f37376b7e51b09944f6799e0d64e939f05fe85
Right after flashing, mpremote can fail with could not enter raw repl
even though the board boots into MicroPython fine. The serial port has not
settled yet from esptool's reset. Just run the same command again; if it
still fails, press the board's reset button once and retry.
4. Select the board and port
Connect to the board's serial port at 115200 baud (in Thonny, Run → Select interpreter → MicroPython (ESP32), then pick the port).
5. Upload your first program
This is the module's own ADSBReceiver-readAircraftCSV example. The
module's default wiring (UART1 on IO17/IO18, reset on IO21) already matches
this board.
from machine import UART
from ADSBReceiver import ADSBReceiver
# Open the UART link to the module at its factory-default RUN baud.
# Board default wiring: IO17 = module TX in, IO18 = module RX out, IO21 = RESET.
# Using a different board? See example ADSBReceiver-customBoardWiring.
uart = UART(1, baudrate=115200, rx=17, tx=18, rxbuf=4096)
adsb = ADSBReceiver(uart, reset_pin=21)
# Called once per decoded aircraft update, with whichever fields the module had data for.
def onAircraft(ac):
line = "ICAO {}".format(ac.icao)
if ac.callsign:
line += " call={}".format(ac.callsign)
if ac.hasPosition:
line += " lat={:.5f} lon={:.5f}".format(ac.lat, ac.lon)
if ac.hasAltBaro:
line += " altBaro={}ft".format(ac.altBaro)
if ac.hasVelH:
line += " vel={}kt".format(ac.velH)
if ac.squawk:
line += " squawk={}".format(ac.squawk)
line += " onGround={}".format("yes" if ac.onGround() else "no")
line += " crcValid={}".format("yes" if ac.crcValid else "no")
print(line)
# Register the function to call whenever a decoded aircraft report arrives.
adsb.onAircraft(onAircraft)
print("Waiting for ADS-B traffic...")
while True:
# Reads incoming bytes and fires the registered callbacks. Must run every loop.
adsb.poll()
Run this as main.py, or paste it into the REPL.
6. What to expect
The receiver sends a CSV report for every aircraft it hears, about once per second per aircraft:
Waiting for ADS-B traffic...
ICAO 4BCFE6 onGround=no crcValid=yes
ICAO B938F5 onGround=no crcValid=yes
ICAO 06A0B7 call=QTR65G lat=45.31171 lon=18.67066 altBaro=39975ft vel=478.0kt squawk=5302 onGround=no crcValid=yes
ICAO 4C0C85 squawk=0032 onGround=no crcValid=yes
ICAO 32B7BA onGround=no crcValid=yes
ICAO 9AB300 onGround=no crcValid=yes
ICAO 7C33BE onGround=no crcValid=yes
A line's fields depend on what the module actually decoded for that update; a field the module has no data for yet is simply left out, which is why some lines above are shorter than others.
No output beyond the first line? See Troubleshooting. Reception needs an aircraft broadcasting ADS-B within range and line of sight of the antenna.
7. Troubleshooting
If the REPL does not respond or firmware flashing fails, continue with Troubleshooting.
1. Install the platform
Install ESP-IDF by following Espressif's official Get Started guide.
idf.py is not on your system PATH by default. Each time you open a new
terminal, activate the ESP-IDF environment first: on Windows, use the ESP-IDF
Command Prompt (or ESP-IDF PowerShell) shortcut the installer created;
on Linux/macOS, run . $HOME/esp/esp-idf/export.sh (path depends on where
you installed it). Running idf.py in a plain, unactivated terminal always
fails with "not recognized" or "command not found".
2. Set the target
idf.py set-target esp32s3
3. Configure the project
Start from the official hello_world example, which needs no configuration changes to build for this module:
4. Build and flash your first program
idf.py -p PORT build flash monitor
Replace PORT with your board's serial port.
5. What to expect
After the full ESP-IDF bootloader log, the example itself prints:
Hello world!
This is esp32s3 chip with 2 CPU core(s), WiFi/BLE, silicon revision v0.2, 2MB external flash
Minimum free heap size: 400308 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
...
Restarting now.
It then reboots and repeats. Exact heap size and flash size reported depend on your build configuration.
6. Troubleshooting
If the project does not build or flash, continue with Troubleshooting.