esp32idf_APRS: Build a Complete APRS Station on a Single ESP32 with Native ESP-IDF

TL;DR: esp32idf_APRS by Emiliano Augusto González (LU3VEA) is a standalone, open-source APRS station firmware written in pure C for ESP-IDF v6.1. It turns a standard ESP32 DevKit into an all-in-one AFSK/FSK soft-modem, bidirectional IGate, WIDEn-N digipeater, GPS tracker, weather station, telemetry encoder, Winlink email terminal, BrandMeister bridge, and Telegram bot. With an on-chip multi-slicer DSP engine, scope-free web tuning, and 22 responsive web-admin pages, it replaces dedicated soundcard PCs and external hardware TNCs.


What Is esp32idf_APRS?

esp32idf_APRS is an open-source amateur radio firmware for the dual-core ESP32 microcontroller that provides a complete, self-contained Automatic Packet Reporting System (APRS) station without relying on external computer hosts, Arduino abstraction layers, or dedicated DSP modem chips. Developed by Emiliano Augusto González (LU3VEA) and released under the GNU General Public License v3.0, the firmware executes the entire signal processing chain directly on the ESP32 hardware.

+-----------------------------------------------------------------------------+
|                          esp32idf_APRS Architecture                         |
|                     (Native ESP-IDF v6.1 · Pure C · FreeRTOS)                |
+--------------------------------------+--------------------------------------+
                                       |
        +------------------------------+------------------------------+
        |                                                             |
        v                                                             v
+-----------------------------------+     +-----------------------------------+
|       On-Chip DSP Soft-Modem      |     |     APRS Network & Services       |
| · 76.8 kHz Continuous DMA ADC1    |     | · Bidirectional APRS-IS IGate     |
| · 8:1 Decimation FIR + High-Pass  |     | · 4-Server Failover Uplink        |
| · Up to 8 Parallel Slicers (Twist)|     | · Configurable WIDEn-N Digipeater |
| · FX.25 Reed-Solomon FEC Decode   |     | · SmartBeaconing GPS Tracking     |
| · CRC-16 Syndrome Bit Repair      |     | · Weather & Telemetry Engine      |
| · 38.4 kHz 8-bit DAC Output       |     | · Winlink APRSLink Mail Terminal  |
| · Bell 202, V.23, HF 300, 9600 FSK|     | · BrandMeister DMR APRS Bridge    |
+-----------------+-----------------+     +-----------------+-----------------+
                  |                                         |
                  +--------------------+--------------------+
                                       |
                                       v
+-----------------------------------------------------------------------------+
|                     Responsive Web Admin & Management                       |
| · 22 Touch-Friendly Web Pages (HTTP Basic Auth) · Live JSON Packet Monitor  |
| · Scope-Free Loopback & Audio Calibration · Telegram Bot Bridge & Alerts   |
| · Dual-Slot OTA Updates with Auto-Rollback · LittleFS Storage Management    |
+-----------------------------------------------------------------------------+

Traditionally, setting up an amateur radio APRS IGate or digipeater required multiple interconnected hardware modules: an analog radio transceiver, an external hardware Terminal Node Controller (such as a TNC-X, Mobilinkd, or Kantronics KPC-3) or a dedicated single-board computer (such as a Raspberry Pi) running soundcard modem software like Direwolf. While microcontroller ports of APRS existed previously, many relied on simplified Arduino libraries, single-threaded processing loops, or external modem ICs (like the FX614 or MX614).

esp32idf_APRS eliminates external computing hardware entirely. By leveraging the dual-core Xtensa architecture of the classic ESP32, the firmware separates continuous real-time audio sampling, digital signal processing, AX.25 packet assembly, Wi-Fi networking, and responsive web management into dedicated FreeRTOS tasks.


The Architecture: Why Native ESP-IDF Matters

Building an amateur radio digital signal processing stack on a microcontroller requires deterministic timing and microsecond-level interrupt control. Standard Arduino cores introduce background overhead, generic interrupt dispatching, and dynamic memory allocation routines (String class heap fragmentation) that can cause audio buffer under-runs or packet frame drops.

esp32idf_APRS is written exclusively in native C targeting ESP-IDF v6.1. This deliberate design choice unlocks critical hardware advantages:

+-----------------------------------------------------------------------------+
|                           Dual-Core Task Isolation                          |
+--------------------------------------+--------------------------------------+
|             CORE 0 (DSP & Ingest)    |        CORE 1 (TX & Services)        |
+--------------------------------------+--------------------------------------+
| · Continuous SAR-ADC1 DMA ISR        | · Level-3 GPTimer DAC Sample Clock   |
| · High-Priority RX DSP Task (4 KB)   | · Beacon Scheduler Task (14 KB)      |
| · Modem Packet Service Task (6 KB)   | · APRS Service 1 Hz Tick Task (10 KB)|
| · AX.25 / FX.25 Frame Decoder        | · IGate TCP APRS-IS Uplink (6 KB)    |
| · Real-Time Audio Filter Engine      | · Native Web Server httpd (20 KB)    |
+--------------------------------------+--------------------------------------+

1. Dual-Core Interrupt Isolation

In the ESP32 architecture, calling portENTER_CRITICAL_ISR() masks Level 1 to Level 3 interrupts on the local core. The ESP-IDF ADC DMA driver performs memory copies inside an ISR critical section. If the transmit DAC sample clock runs on the same core, this memory copy masks the DAC clock for up to 11 microseconds (10% of a 9600 baud symbol period), causing severe transmit jitter and decoding failures at high speeds.

esp32idf_APRS enforces core separation at compile time:

  • Core 0: Dedicated to SAR-ADC1 continuous DMA capture and the receive DSP task.
  • Core 1: Dedicated to the Level-3 General Purpose Timer (GPTimer) driving the 38.4 kHz DAC sample clock.

Because critical sections on Core 0 spin on a hardware lock rather than masking interrupts on Core 1, the DAC sample clock maintains zero-jitter timing regardless of receiver load.

2. Static Memory Architecture and FreeRTOS Tasks

The firmware allocates memory statically wherever possible. The AX.25 frame buffers, decimation FIR delay lines, correlator tone magnitude structures, and LittleFS JSON caches reside in designated memory blocks, preventing heap fragmentation during months of unattended mountain-top or field operation.


The DSP Soft-Modem: Under the Hood

The integrated radio amateur modem component (components/esp32idf_radioamateur_modem) represents a major engineering achievement in microcontroller DSP. It turns the raw analog voltages at the ESP32 pins into verified digital packets and vice versa.

+-----------------------------------------------------------------------------+
|                             Receive DSP Signal Chain                        |
+-----------------------------------------------------------------------------+
 [Radio Audio Out] (Speaker / Discriminator)
        │
        ▼
 [GPIO33 / SAR-ADC1] ──── Continuous DMA Ingest @ 76,800 Hz (Core 0 ISR)
        │
        ▼
 [Ingest Stage] ───────── DC-Offset Removal & Wideband RMS Ingest Meter
        │
        ▼
 [Decimation FIR] ─────── 48-Tap Linear-Phase FIR (8:1 Decimation) ─► 9,600 Hz
        │
        ▼
 [High-Pass Filter] ───── 300 Hz High-Pass (Strips CTCSS, AC Hum & Low Rumble)
        │
        ▼
 [Audio Gate & Ring] ──── Tone-Band RMS Detector (900-2600 Hz) + 3-Block Buffer
        │
        ▼
 [Automatic Gain] ─────── In-Band Digital AGC (0.25 Attack / 0.002 Release)
        │
        ▼
 [Correlator Banks] ───── Dual Tilted Bandpass Prefilters (+5 dB / -9 dB)
        │                 True Tone Magnitude: sqrt(I² + Q²)
        ▼
 [Multi-Slicer Set] ───── Up to 8 Parallel Demodulators Stepping 3.5 dB
        │
        ▼
 [DPLL Bit Recovery] ──── Digital Phase-Locked Loop Clock Recovery & NRZI Decode
        │
        ▼
 [HDLC / AX.25 Engine] ── Bit De-stuffing, HDLC Framing & Cross-Demod Dup Drop
        │
        ├──► [CRC-16/X.25 Error Repair] ── GF(2) Syndrome Single/Pair Bit Fix
        │
        └──► [FX.25 FEC Engine] ────────── Reed-Solomon Forward Error Correction
        │
        ▼
 [Valid APRS Frame Delivered to Application Layer]

1. 76,800 Hz Continuous DMA Ingest

The modem samples audio input on GPIO33 (ADC1) at 76,800 Hz. While standard 1200 baud AFSK only requires a modest sample rate, 76.8 kHz provides exactly 8 samples per symbol for 9600 baud G3RUH FSK. Earlier microcontroller modems running at 38.4 kHz had only 4 samples per symbol, causing the DPLL clock recovery to jitter into transition edges and fail on clock drift.

2. In-Place 8:1 Decimation FIR and 300 Hz High-Pass Filter

The 76.8 kHz stream is downsampled to 9,600 Hz using a 48-tap linear-phase FIR filter. The decimation algorithm processes samples in-place, eliminating secondary RAM buffers. A subsequent 300 Hz high-pass filter strips sub-audible CTCSS tones, 50/60 Hz power supply hum, and mechanical rumble before they can reach the tone correlators.

3. Multi-Slicer Demodulator with 25 dB Tone Twist Coverage

In real-world VHF operations, radio audio stages apply varying pre-emphasis and de-emphasis curves. A transmitter with pre-emphasis heard on a discriminator receiver presents a space tone (2200 Hz) up to 12 dB stronger than the mark tone (1200 Hz). On a speaker output, receiver de-emphasis reverses this tilt.

To solve tone twist without manual adjustment, esp32idf_APRS employs two tilted prefilters coupled to eight parallel slicers. The prefilters introduce opposite frequency tilts, while the slicers apply weighted threshold decisions stepping across a 25 dB range (-15.5 dB to +9 dB on flat audio; -8.5 dB to +16 dB on speaker audio). Each slicer calculates the true mathematical magnitude sqrt(I^2 + Q^2) rather than the noisy |I| + |Q| approximation.

4. Dual Error Recovery: CRC Syndrome Bit Repair & FX.25 FEC

Weak signal reception is fortified by two independent error recovery systems:

  • CRC-16 Syndrome Bit Repair: Because CRC-16/X.25 is affine over Galois Field GF(2), the modem calculates error syndromes to detect and correct single bit flips and adjacent bit pairs (caused by NRZI transitions) in real time.
  • FX.25 Forward Error Correction: Implements Reed-Solomon FEC wrapping around standard AX.25 UI frames. In poor signal-to-noise conditions, FX.25 reconstructs corrupted packets that would otherwise fail CRC checks.

5. Multi-Profile Transmit Engine

On the transmit side, audio is synthesized on GPIO25 (DAC) at 38,400 Hz using a 32-bit phase accumulator and a 512-entry sine lookup table. The firmware supports four distinct modulation profiles:

+-----------------------------------------------------------------------------+
|                         Supported Modulation Profiles                       |
+---------------------+-------------+-------------------+---------------------+
| Modulation Mode     | Baud Rate   | Tone Frequencies  | Common Application  |
+---------------------+-------------+-------------------+---------------------+
| Bell 202 AFSK       | 1200 baud   | 1200 / 2200 Hz    | Standard VHF APRS   |
| ITU-T V.23 AFSK     | 1200 baud   | 1300 / 2100 Hz    | European Standard   |
| HF AFSK             | 300 baud    | 1600 / 1800 Hz    | 30m / 20m HF APRS   |
| G3RUH FSK           | 9600 baud   | Direct FM FSK     | High-Speed 70cm / 2m|
+---------------------+-------------+-------------------+---------------------+

Full APRS Station Capabilities

esp32idf_APRS is not just a modem; it is a full-featured APRS host operating autonomously.

+-----------------------------------------------------------------------------+
|                         Station Functional Capabilities                     |
+-----------------------------------------------------------------------------+
| [RF Transceiver] <==== AFSK/FSK Audio ====> [ESP32 Modem Core]              |
|                                                     │                       |
|         ┌─────────────────┬─────────────────┼─────────────────┐             |
|         │                 │                 │                 │             |
|         ▼                 ▼                 ▼                 ▼             |
|  +--------------+  +--------------+  +--------------+  +--------------+     |
|  | Bidirectional|  |  WIDEn-N     |  | SmartBeacon  |  | Weather &    |     |
|  | IGate Uplink |  |  Digipeater  |  | GNSS Tracker |  | Telemetry    |     |
|  | (4 Failovers)|  | (Alias Table)|  | (NMEA UART)  |  | (I2C Sensors)|     |
|  +──────┬───────+  +──────────────+  +──────────────+  +──────────────+     |
|         │                                                                   |
|         ├─────────────────┬─────────────────┬─────────────────┐             |
|         │                 │                 │                 │             |
|         ▼                 ▼                 ▼                 ▼             |
|  +--------------+  +--------------+  +--------------+  +--------------+     |
|  | Winlink Mail |  | BrandMeister |  | APRS Text    |  | Telegram Bot |     |
|  | APRSLink     |  | DMR Bridge   |  | Messaging &  |  | Bridge &     |     |
|  | (WLNK-1)     |  | (APBMxx)     |  | Query Server |  | Alert Push   |     |
|  +──────────────+  +──────────────+  +──────────────+  +──────────────+     |
|         │                                                                   |
|         v                                                                   |
|  [APRS-IS Internet Network]                                                 |
+-----------------------------------------------------------------------------+

1. Bidirectional APRS-IS IGate

  • RF to Internet (RF->INET): Formats valid AX.25 frames with qAR/qAO path tokens, deduplicates packets across multi-demodulator channels, and pushes them to APRS-IS over an active TCP socket.
  • Internet to RF (INET->RF): Gating traffic to local RF requires strict discipline to prevent channel saturation. The station enforces local-station proximity checks (haversine range limits), heard-on-RF time windows, hop limits, and third-party unwrap options.
  • 4-Server Multi-Host Failover: Operators can define up to four APRS-IS server endpoints with automatic circular failover upon connection drops.
  • Live Dynamic Filter Updates: Server filter changes (e.g. r/3.14/101.69/50) update on the live socket via #filter command strings without dropping the TCP connection.

2. Flexible WIDEn-N Digipeater

The built-in digipeater features a 4-row alias table supporting WIDE1-1, WIDE2-2, TRACEn-N, or custom local aliases. Each entry allows independent hop-count trapping, flood/trace routing selection, fill-in-only operation, and a duplicate suppression cache.

3. GNSS Receiver and SmartBeaconing

Connecting an external NMEA GPS module (such as an ATGM336H, NEO-6M, or Beitian BN-220) to UART2 turns the device into a smart tracker:

  • Parses $GPRMC, $GPGGA, $GPGSA, $GPGSV, and $GPVTG sentences.
  • Implements speed-adaptive SmartBeaconing, automatically extending beacon intervals when stationary and triggering immediate position updates during vehicle cornering.
  • Includes a web-based “Use GPS” button that populates station coordinates across configuration pages with a single click.

4. Weather Station (APRS WX Reports)

The weather subsystem polls local sensors at 1 Hz, computes rolling averages, and broadcasts standard APRS Weather Reports (!DDMM.mmN/DDDMM.mmW_...):

  • Supports wind direction/speed/gust, ambient temperature, relative humidity, barometric pressure, rainfall (1h / 24h / midnight), snow, luminosity, and flood level metrics.
  • Emits software identifier xESP matching APRS101 specifications.

5. Full Telemetry Reporting Engine

Transmits 5 analog channels (A1-A5) and 8 digital status bits (B1-B8):

  • Automatically generates metadata definition messages (:MYCALL :PARM..., :UNIT..., :EQNS..., :BITS...) so remote receiving software (like APRSIS32 or aprs.fi) accurately scales voltages and sensor readings.
  • Embeds compact APRS 1.2 Base-91 Comment Telemetry (|ss1122|) directly into position beacon comments.

6. Dynamic Sensor Framework (sensors_local)

A modular sensor registry auto-detects I2C sensors at boot. It includes native drivers for Bosch BME280 (temperature, humidity, pressure), BMP280, and BMP180 sensors, with clean interfaces for adding new sensor hardware.

7. Winlink Radio Email (APRSLink)

The firmware interfaces directly with the global Winlink network via WLNK-1:

  • Client Mode: An interactive in-browser mailbox interface lets operators read, compose, forward, and delete Winlink radio emails. Authentication uses a challenge-response algorithm so login passwords never travel over the air in cleartext.
  • Gateway Mode: Transparently relays Winlink sessions for nearby amateur radio operators between local RF and the Internet.

8. BrandMeister DMR APRS Interconnect

Without requiring DMR transceiver hardware or hotspot code, the firmware recognizes BrandMeister DMR APRS traffic (APBMxx TOCALLs or DMR path aliases) over its existing APRS-IS uplink:

  • Routes private two-way text messages directly to DMR handheld users.
  • Sends group bulletins to specific DMR talkgroups (e.g. BLN02509 targets Talkgroup 2509).

9. Telegram Bot Integration

An integrated Telegram bot client (esp_telegram_bot + telegram_service) provides secure, mobile station control over HTTPS long-polling:

  • Forwards directed APRS messages and emergency bulletins to your personal Telegram chat or group channels.
  • Provides interactive bot commands: /status, /sensors, /uptime, /whoami, /menu, and /stats.
  • Automatically sends a restart notification upon reboot, detailing the exact hardware reset cause (e.g. power-on, brownout, software reset, watchdog trip).
  • Implements batch-mode TLS session sharing to keep RAM usage minimal.

Web Admin & Built-in Oscilloscope Diagnostics

The firmware embeds a responsive HTTP web administration server (components/webconfig) providing 22 distinct configuration pages secured by HTTP Basic authentication (Admin and Read-Only roles).

+-----------------------------------------------------------------------------+
|                           Web Admin Interface Features                      |
+-----------------------------------------------------------------------------+
| · Responsive CSS Drawer Menu: Adapts seamlessly to smartphones and desktop  |
| · Live Packet Monitor: Real-time incoming/outgoing packet stream (JSON poll)|
| · Last-Heard Table: Callsign, SSID, signal level, hops, and timestamp feed |
| · Web Console Viewer: Mirrors serial output to browser without USB cables   |
| · LittleFS File Manager: Download, upload, edit, or format JSON config files|
| · Dual-Slot OTA Upgrade: Flash new firmware over Wi-Fi with auto-rollback   |
+-----------------------------------------------------------------------------+

Scope-Free Audio Calibration

Tuning transceiver audio levels normally requires an audio generator and an oscilloscope. esp32idf_APRS includes an on-chip diagnostic system that replaces bench test equipment:

+-----------------------------------------------------------------------------+
|                         Audio Calibration Self-Tests                        |
+-----------------------------------------------------------------------------+
 
 1. Method A: Bare Modem Loopback Test (Jumper GPIO25 -> GPIO33)
    [ESP32 DAC (GPIO25)] ════════ Jumper Wire ════════► [ESP32 ADC (GPIO33)]
    * Verifies internal DAC -> ADC -> HDLC -> CRC-16 chain before connecting radio.
 
 2. Method B: Interface Board Loopback (Jumper MIC Out -> SPKR In)
    [ESP32 DAC] ──► [RV1 (TX Pot)] ──► [MIC Out]
                                          │ (Jumper Wire)
    [ESP32 ADC] ◄── [RV2 (RX Pot)] ◄── [SPKR In]
    * Reports RX Level (mV RMS), Raw ADC Swing (0-4095), and AGC Peak Gain.

Operators simply click LOOP TEST, RX LEVEL, or TX TEST in the web admin. The system displays precise voltage swings and pass/fail diagnostics, allowing trimmers to be adjusted cleanly without external test instruments.


Hardware Build: Wiring the ESP32 to Your Transceiver

Building an esp32idf_APRS node requires an ESP32 board and a simple analog interface.

Hardware Target Requirements: Use a classic dual-core ESP32 (Xtensa architecture, e.g. ESP32-WROOM-32, ESP32-DevKitC) with 4 MB flash. Single-core ESP32 chips or ESP32-S3 / C3 / C6 / H2 modules cannot run the transmit path unmodified because they lack hardware DACs.

Hardware Pinout Reference

+-----------------------------------------------------------------------------+
|                              Pin Assignment Table                           |
+------------------+---------------+-------------------+----------------------+
| Function         | ESP32 Pin     | Signal Type       | Notes / Constraints  |
+------------------+---------------+-------------------+----------------------+
| Audio In (RX)    | GPIO 33       | Analog ADC1_CH5   | GPIO 32-39 only (ADC1|
| Audio Out (TX)   | GPIO 25       | Analog DAC_CHAN_0 | GPIO 25 or 26 only   |
| PTT Keying       | GPIO 26       | Digital Output    | Active High / Low    |
| GNSS GPS RX      | GPIO 16       | UART2 RX          | Connects to GPS TX   |
| GNSS GPS TX      | GPIO 17       | UART2 TX          | Connects to GPS RX   |
| Status LED TX    | Optional      | Digital Output    | Default: Disabled    |
| Status LED RX    | Optional      | Digital Output    | Default: Disabled    |
+------------------+---------------+-------------------+----------------------+

Reference Audio Interface Schematic

The ESP32 operates on single-ended 0 to 3.3 V DC-biased logic, while transceivers expect AC-coupled, millivolt-level audio. The interface provides attenuation, filtering, bias, and isolation:

+-----------------------------------------------------------------------------+
|                         Reference Interface Schematics                      |
+-----------------------------------------------------------------------------+

 1. Transmit Audio Circuit (DAC GPIO25 to Radio MIC / DATA IN):
 
   ESP32 GPIO25 (DAC)
          │
         [C1] 10uF (DC Blocking)
          │
         [R1] 1k
          ├───[C2] 33nF ─── GND
          │
         [R2] 1k
          ├───[C3] 33nF ─── GND  (2-Pole Low-Pass Filter fc ≈ 4.8 kHz)
          │
         [R3] 10k
          │
          ├───[RV1] 1k Trimmer ─── GND
          │
          └───► To Radio MIC IN / DATA IN (Mini-DIN Pin 1)


 2. Receive Audio Circuit (Radio SPKR / DISC OUT to ADC GPIO33):
 
   Radio SPKR OUT / DISC OUT (Mini-DIN Pin 4)
          │
         [RV2] 10k Trimmer ─── GND
          │
         [C4] 10uF (AC Coupling)
          │
          ├───[R5] 100k ─── 3.3V
          │
          ├───[R6] 100k ─── GND  (Mid-Rail 1.65V Bias Network)
          │
          ├───[D1] 1N4148 ─── 3.3V (Rail Clamp Protection)
          ├───[D2] 1N4148 ─── GND
          │
         [R7] 1k
          ├───[C5] 100pF ─── GND (SAR ADC Kick Snubber)
          │
          └───► To ESP32 GPIO33 (ADC1)


 3. PTT Keying Circuit (Optocoupler / Transistor):
 
   ESP32 GPIO26 ───[R8] 1k ───► Base [2N2222 / BC547]
                                      │
                                  Emitter ─── GND
                                      │
                                  Collector ───► To Radio PTT Line

Connecting to Common Handhelds (Baofeng UV-5R & Kenwood 2-Pin)

For Kenwood K-plug handheld transceivers (Baofeng UV-5R, BF-888S, Quansheng UV-K5, Radioddity):

  • 3.5 mm TRS Plug (Speaker): Tip = Speaker Audio Out (connect to RV2 input); Sleeve = Ground.
  • 2.5 mm TRS Plug (Mic/PTT): Tip = Mic Audio In (connect to RV1 output); Ring = PTT Line (connect to PTT transistor collector); Sleeve = Ground.

Feature Comparison: esp32idf_APRS vs. Other APRS Solutions

+-----------------------------------------------------------------------------+
|                          APRS Platform Feature Matrix                       |
+--------------------------+---------------+---------------+------------------+
| Feature / Capability     | esp32idf_APRS | Direwolf (PC) | Arduino APRS     |
+--------------------------+---------------+---------------+------------------+
| Hardware Architecture    | ESP32 Stand-  | PC / RPi Host | ESP32 / AVR Host |
|                          | alone SoC     | + Soundcard   | + Shield         |
| Software Framework       | Native ESP-IDF| C / POSIX     | Arduino Core     |
| Multi-Slicer Tone Engine | Yes (8 Slicers| Yes (Multiple | No (Single Slicer|
|                          | +/-25 dB Twist| Demodulators) | Fixed Level)     |
| FX.25 Reed-Solomon FEC   | Yes (RX & TX) | Yes (RX & TX) | Rarely / Partial |
| CRC Syndrome Bit Repair  | Yes (GF2 Fix) | Yes           | No               |
| 9600 Baud G3RUH Support  | Yes (Native)  | Yes           | No               |
| Integrated Web Admin     | Yes (22 Pages)| No (3rd Party)| Limited / Basic  |
| Scope-Free Web Tuning    | Yes (Built-in)| No (Requires  | No               |
|                          | Diagnostics)  | Audacity/CLI) |                  |
| Bidirectional APRS-IS    | Yes (Failover)| Yes           | Usually RX Only  |
| Telegram Bot Bridge      | Yes (Native)  | No (Scripts)  | No               |
| Winlink APRSLink Mailbox | Yes (Built-in)| No (External) | No               |
| BrandMeister DMR Bridge  | Yes (Native)  | No            | No               |
| Power Consumption        | ~0.5 - 1.0 W  | 3.0 - 15.0 W  | ~0.5 - 1.0 W     |
| Total Hardware Cost      | ~$5 - $10 USD | ~$50 - $150 USD| ~$10 - $25 USD  |
+--------------------------+---------------+---------------+------------------+

Step-by-Step Installation & Quick Start

1. Prerequisites

Install ESP-IDF v6.1 following the official Espressif documentation:

# Clone and export ESP-IDF v6.1 environment
cd ~/esp
git clone -b v6.1 --recursive https://github.com/espressif/esp-idf.git esp-idf-v6.1
cd esp-idf-v6.1
./install.sh esp32
source export.sh

2. Clone and Build esp32idf_APRS

# Clone the repository
git clone https://github.com/hiperiondev/esp32idf_APRS.git
cd esp32idf_APRS

# Set target to classic ESP32 and build
idf.py set-target esp32
idf.py build

# Flash to your ESP32 connected via USB
idf.py -p /dev/ttyUSB0 flash monitor

3. First-Run Configuration

  1. Connect to Wi-Fi AP: On initial boot, the ESP32 broadcasts a Wi-Fi Access Point named ESP32_APRS_XXXXXX. Connect your smartphone or laptop to this network.
  2. Open Web Admin: Navigate to http://192.168.4.1 in your browser. Log in with the default credentials:
    • Username: admin
    • Password: admin (change immediately under the System page).
  3. Configure Callsign & Station: Navigate to Station to enter your amateur radio callsign (e.g. 9M2PJU), SSID, and station comment.
  4. Configure Wi-Fi Station Mode: Under Wi-Fi, enter your home router or mobile hotspot credentials.
  5. Run Audio Self-Test: Navigate to Radio/Modem, insert a loopback jumper between GPIO25 and GPIO33, and click LOOP TEST to confirm clean internal signal decoding.
  6. Connect Radio & Calibrate: Wire your radio interface, click RX LEVEL while receiving traffic to adjust RV2 for ~300 mV RMS, and click TX TEST to calibrate transmitter deviation to 3.0 kHz.

Frequently Asked Questions (FAQ)

Can I run esp32idf_APRS on an ESP32-S3 or ESP32-C3?

No. ESP32-S3, C3, C6, and H2 chips lack internal hardware digital-to-analog converters (DACs). Transmitting AFSK/FSK audio requires the classic dual-core ESP32 (ESP32-WROOM-32 / ESP32-DevKitC) with hardware DAC outputs on GPIO25 or GPIO26.

Why does the receiver sample at 76,800 Hz instead of 38,400 Hz?

Sampling at 76.8 kHz provides 8 samples per symbol for 9600 baud G3RUH FSK. This gives the digital clock recovery loop sufficient timing margin to prevent symbol collision and bit errors caused by transceiver clock drift.

Do I need an oscilloscope to set audio levels?

No. The web admin includes built-in diagnostic tools (LOOP TEST, RX LEVEL, and TX TEST) that measure true RMS voltage, peak-to-peak ADC range, and AGC gain, allowing complete trimmer calibration directly in your web browser.

Does the BrandMeister bridge require a DMR radio or hotspot?

No. BrandMeister’s core server network injects and subscribes to APRS traffic over standard APRS-IS sockets. The firmware identifies BrandMeister packets (APBMxx TOCALLs and DMR path aliases) over your existing Wi-Fi APRS-IS connection.

How are firmware updates handled after installation?

The ESP32 flash is configured with dual OTA partitions (ota_0 and ota_1). You can upload new compiled binary images directly through the web admin’s About / Firmware page over Wi-Fi, with automatic rollback protection on boot failure.


Sources and Further Reading


73,
9M2PJU

Post Comment