
Type f
google/mozc-devices
Circuit diagrams and firmware source code for Gboard DIY keyboards

APRS station on a single ESP32
APRS Radio Interface is an open-source printed circuit board by hiperiondev, from the hiperiondev/esp32idf_APRS repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 95 × 72 mm with 25 parts on 19 nets, routed with 156 tracks and 0 vias.
Its parts include 9 resistors, 5 capacitors, 4 diodes, 3 connectors and 1 IC. It belongs with the radio and wireless and interfaces and adapters boards and the ESP32 boards of this library.
IGate · Digipeater · Tracker · Weather · Telemetry, with a built-in web admin, an on-chip AFSK/FSK soft-modem, APRS-IS uplink, a runtime sensor-driver framework and OTA firmware updates.
esp32idf_APRS turns a bare ESP32 DevKit plus a cheap audio interface into a complete, self-contained APRS station. Everything runs on the ESP32 itself — there is no Arduino core, no PlatformIO, and no external DSP library. The entire signal chain, from the correlator demodulator through DPLL bit recovery, NRZI, the HDLC framer, the AX.25 codec and Reed–Solomon FX.25 forward error correction, executes on the microcontroller using only the SAR-ADC in continuous/DMA mode, the DAC, and a general-purpose timer.
In one sentence, the firmware demodulates AFSK/FSK audio from a radio's speaker or discriminator output, decodes HDLC/AX.25 (optionally FX.25 error-corrected) frames, gates them to APRS-IS over Wi-Fi, digipeats them back on RF, beacons its own position, weather and telemetry, modulates and transmits frames back through the ESP32's 8-bit DAC — and is configured entirely through a web admin served by the device itself. No serial console, no recompilation for ordinary settings.
📖 The full, exhaustive documentation lives at esp32idf-aprs.readthedocs.io — trilingual (English / Español / Italiano), with getting-started guides, hardware wiring, the DSP signal chain, the configuration engine, HTTP routes and troubleshooting. This README is only a presentation. For anything beyond a first look, go to the docs.
qAR/qAO construction, payload-type gating, callsign budlists, a local range gate (haversine distance), a prefix whitelist and, on the INET→RF side, a position requirement, a locally-heard source test and per-source spacing that keep a wide APRS-IS subscription off the local channel. Up to four APRS-IS servers can be listed, with automatic failover between the enabled ones.APBMxx tocall, a DMR path alias or a named entry gateway identifies it. Its own page, off by default. No DMR connection of any kind is involved.?APRS?/?WX?/?IGATE?/?QRU? queries and the directed set (?APRSD/?APRSH/?APRSM/?APRSO/?APRSP/?APRSS/?APRST/?PING?), each with per-type and per-source rate limits, plus an optional periodic station-capabilities beacon.T#nnn reports and metadata.CALLSIGN@winlink.org mail through the WLNK-1 service — challenge/response login with the password never on the air, a paced one-command-at-a-time session, and a browser terminal whose mailbox listing carries per-message read/reply/forward/delete buttons — and, separately, relays a neighbouring RF station's own Winlink session through its IGate.sensors_local) — includes a BME280/BMP280 (I²C) driver out of the box, plus an optional BMP180 one on the same bus.ota_0/ota_1 app slots; a failed image rolls back automatically on the next boot.| Area | Notes |
|---|---|
| AFSK 1200 Bd Bell 202 | Up to twelve parallel demodulators, default profile |
| AFSK 1200 Bd V.23 · AFSK 300 Bd · G3RUH 9600 Bd FSK | Multiple selectable modem profiles |
| HDLC / AX.25 UI frame RX + TX | Full soft-modem TX/RX path |
| FX.25 (Reed–Solomon FEC over AX.25) | RX-only / RX+TX modes |
| PTT keying | Compile-time GPIO + polarity, minimum-unkey hold |
| CSMA / TX time-slot / TXDelay preamble / TXTail | preamble, tx_tail (TXTail, default 20 ms), tx_timeslot, csma_persist, csma_slot_ms (SlotTime), csma_busy_max_s (busy-channel wait, 0 = unlimited) |
| Transmit duty-cycle limiter | Optional ceiling over a rolling 10-minute window |
| APRS-IS IGate RF→INET & INET→RF | Filters, dedup, budlist, third-party unwrap opt-in, INET→RF flood gates |
| APRS-IS multiserver failover | 4 server slots, circular retry over the enabled ones |
| Local range gate & prefix gate | Haversine distance + callsign-prefix whitelist |
| BrandMeister APRS interconnect | Recognition, gating and message routing over the existing APRS-IS session; no DMR link |
| Digipeater | Configurable n-N alias table (trace/flood), hop trapping, dup-suppression |
| Objects / Items · Bulletins | Up to 5 each, RF and/or INET, expiry/decay |
| Telegram bot | Long polling, per-user/chat authorization, message & bulletin routing, Mini App button |
| Messaging + ack/retry · Chat UI | RF and/or INET |
| Winlink radio e-mail (APRSLink) | Own mailbox over WLNK-1, plus gateway for local stations |
| GNSS receiver (NMEA, own UART) | Master switch, live view page, Use GPS position fill on every page |
| Live GPS tracking + SmartBeaconing | Tracker beacon only; speed-adaptive interval and corner-pegging |
| APRS query responder | General ?APRS?/?WX?/?IGATE?/?QRU? + directed set, rate-limited; capabilities beacon |
| Weather Report | 1 Hz sensor refresh, optional averaging |
| Telemetry | Analog A1–A5 + digital B1–B8, T#nnn + metadata |
| Sensor driver framework | Dynamic registry, BME280/BMP280 driver included |
| Web admin | 22 pages, live dashboard, live traffic log + last-heard feed, console log viewer, per-option contextual help |
| Storage | LittleFS 512 KB, upload/download/delete/format |
| Networking | Wi-Fi AP/STA/AP+STA, scan, TX power, SNTP (UTC clock, selectable timezone for display) |
| CPU frequency control | 80 / 160 / 240 MHz |
| OTA update | ota_0/ota_1 slots, auto-rollback |
| Localization | EN / ES / IT, compile-time, labels and help balloons alike |
GPIO33 (ADC1). GPIO 32–39 only — ADC2 is unusable while Wi-Fi is up.GPIO25. GPIO 25 or 26 only — the ESP32 DAC is hard-wired to those pads.GPIO26, polarity selectable at compile time.GPIO16 (RX, from the module's TX) and GPIO17 (TX). Set in main/include/gps.h. Unusable on an ESP32-WROVER, where those pins belong to the SPI PSRAM die.Board wiring (audio pins, PTT pin/polarity, ADC sample rate) is set as compile-time constants in the top-level CMakeLists.txt. A KiCad radio-interface schematic is included under schematics/.
The audio interface itself can be as small as one coupling capacitor and one level trimmer per direction: the Radiomodem page carries an Audio interface section that biases the ADC input from the pad's own pull resistors, sets the transmit output swing and sample rate, warns on receive over-range and bounds how long the transmitter may stay keyed. Every one of those settings defaults to the behaviour an interface board with its own bias network, attenuators and reconstruction filter expects, so an existing build is unaffected. Two buttons next to LOOP TEST — RX LEVEL and TX TEST — set the two trimmers once a transceiver has replaced the loopback jumper.
Full pinout tables and wiring constraints are in the Hardware chapter of the documentation.
# Requires ESP-IDF v6.1 (tested and locked at 6.1)
idf.py set-target esp32
idf.py build
idf.py -p PORT flash monitorOn first boot the device brings up a Wi-Fi AP; connect and open the web admin to configure your callsign, radio and services. After the one-time USB/UART flash, all further updates can be done from the web admin's About / Firmware page over OTA.
📖 The step-by-step first-run guide is in Getting Started.
Everything is documented in full at 👉 esp32idf-aprs.readthedocs.io
The documentation is trilingual and organised into Functionalities (what the station does), Capabilities (cross-cutting properties), Internals (how it is built) and a Reference section:
This README is a presentation only — please consult the documentation for installation, wiring, configuration and internals.
Created by Emiliano Augusto González (LU3VEA).
Built on ideas from earlier projects — VP-Digi, ESP32APRS and LibAPRS; please refer to their authors for more information.
Released under the GNU General Public License v3. See LICENSE.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | 10k | APRS_IF:R_AX_P10.16 | R3, R5, R6, R10 |
| 2 | 10uF | APRS_IF:CP_RAD_P2.54 | C1, C4 |
| 2 | 15nF | APRS_IF:C_DISC_P5.08 | C2, C3 |
| 2 | 1k | APRS_IF:R_AX_P10.16 | R7, R9 |
| 2 | 2k2 | APRS_IF:R_AX_P10.16 | R1, R2 |
| 2 | BAT54/1N4148 | APRS_IF:D_DO35_P7.62 | D1, D2 |
| 2 | LED | APRS_IF:LED_P2.54 | D3, D4 |
| 1 | 10k | APRS_IF:TRIM_3362P | RV2 |
| 1 | 1k | APRS_IF:TRIM_3362P | RV1 |
| 1 | 1nF | APRS_IF:C_DISC_P5.08 | C5 |
| 1 | 220R | APRS_IF:R_AX_P10.16 | R8 |
| 1 | 2N2222 | APRS_IF:TO92 | Q1 |
| 1 | ESP32 | APRS_IF:HDR_1x05 | J3 |
| 1 | PC817 | APRS_IF:DIP4 | U1 |
| 1 | TRS 2.5mm | APRS_IF:HDR_1x03 | J1 |
| 1 | TS 3.5mm | APRS_IF:HDR_1x02_13 | J2 |

google/mozc-devices
Circuit diagrams and firmware source code for Gboard DIY keyboards

davidphilipbarr/Sweep
Sweep - a small promicro based keyboard inspired by the Ferris.


hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

xyphro/UsbGpib
Versatile, cheap and portable USB to GPIB converter (USBTMC class based)


jes/scamp-cpu
A homebrew 16-bit CPU with a homebrew Unix-like-ish operating system.

It measures 95 × 72 mm and has 2 copper layers, 1.6 mm thick.
25 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the hiperiondev/esp32idf_APRS repository on GitHub, at the commit this page was made from: the board is schematics/APRS_Radio_Interface/APRS_Radio_Interface.kicad_pcb and its schematic schematics/APRS_Radio_Interface/APRS_Radio_Interface.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).