ATS Mini: The Secret Firmware Transforming Pocket Radios Forever
ATS Mini: The Secret Firmware Transforming Pocket Radios Forever
What if your $30 pocket radio could outperform $200 professional receivers? That's not hyperbole—that's exactly what's happening in basements, workshops, and ham shacks worldwide right now. A quiet revolution is underway, and the gatekeepers of expensive broadcast equipment absolutely don't want you to know about it.
Picture this: You're hunched over a cheap Chinese pocket FM radio, frustrated by its pathetic frequency range, ugly interface, and zero customization. You paid good money for a "world band receiver" that barely scrapes the surface of what's technically possible. The SI4732 chip inside? It's a Ferrari being driven like a bicycle. Meanwhile, professional SDR setups drain your wallet and require a PhD in antenna theory.
Here's the dirty secret they won't tell you: That same SI4732 DSP radio chip powers equipment costing 10x more. The hardware isn't the problem—the firmware is. Enter ATS Mini firmware, the open-source project that's turning budget ESP32-S3 pocket receivers into legitimate scanning powerhouses. Forked from community legends and refined by obsessive radio enthusiasts, this isn't just an upgrade. It's a complete identity change for your radio.
Ready to discover what your hardware was actually designed to do? Let's tear the lid off this project.
What Is ATS Mini Firmware?
ATS Mini is a specialized firmware fork designed specifically for SI4732-based pocket radios built around the ESP32-S3 microcontroller. Born from the collaborative crucible of amateur radio enthusiasts and embedded systems hackers, this firmware replaces the stock software on affordable mini receivers—unlocking capabilities that manufacturers deliberately lock away.
The project stands on the shoulders of giants. Its lineage traces directly through five critical sources: Volos Projects' TEmbedFMRadio foundation, PU2CLR (Ricardo Caratti)'s legendary SI4735 Arduino library, Ralph Xavier's refinements, Goshante's ATS20/ATS_EX breakthroughs, and G8PTN (Dave)'s original ATS_MINI hardware reference. Each contributor solved a piece of the puzzle. The esp32-si4732 team assembled them into something greater than the sum.
Why it's exploding right now: The perfect storm of affordable ESP32-S3 dev boards, widely available SI4732 modules from AliExpress, and a post-pandemic resurgence in DIY electronics has created an army of radio experimenters. They're not satisfied with "good enough." They want total spectral awareness from longwave through shortwave, FM stereo through weather bands—and they want it in their pocket.
Unlike proprietary firmware that treats users as passive consumers, ATS Mini is radically open. The GitHub repository at esp32-si4732/ats-mini hosts everything: source code, hardware schematics, comprehensive documentation, and an active community. This isn't black-box engineering. It's transparent, hackable, and evolving daily through contributor submissions.
The "Mini" designation matters. This targets specifically the compact pocket form factor—devices with limited screen real estate, battery constraints, and minimal external controls. The firmware squeezes maximum functionality into minimum hardware, proving that sophisticated DSP radio doesn't require desktop-sized equipment.
Key Features That Will Blow Your Mind
Multi-Band Spectral Coverage The SI4732 isn't merely an FM chip—it's a software-defined radio front-end capable of receiving LW (153-279 kHz), MW (520-1710 kHz), SW (2.3-26.1 MHz), and FM (64-108 MHz). ATS Mini exposes all of these. Longwave airport beacons, maritime NAVTEX, international shortwave broadcasters, regional FM—one device, complete electromagnetic spectrum awareness.
Custom UI Themes & Visual Polish That stock firmware with its 1990s calculator aesthetic? Gone. ATS Mini implements multiple customizable display themes with proper typography, signal strength visualization, and frequency readouts that don't require squinting. The interface adapts to different screen types common in these pocket builds—color TFT, OLED variants, all handled gracefully.
Advanced DSP Features Built on PU2CLR's exhaustive SI4735 library work, ATS Mini leverages the chip's native automatic gain control (AGC), bandwidth filtering, and noise blanking. Selectable bandwidths (6, 4, 3, 2.5, 2.0, 1.8, 1.0 kHz for AM; auto/stereo/mono for FM) let you dig signals from noise that would bury lesser receivers. Soft-mute control, volume taper curves, bass/treble EQ—this is audiophile-grade processing.
Memory & Scanning Architecture 100+ station memories with alphanumeric labels. ATS (Auto Tuning Storage) that sweeps bands and locks valid stations automatically. Manual scan, seek, and direct frequency entry via rotary encoder or button interfaces. The firmware handles the complex SI4732 command sequences so you just... listen.
Si4732-A10/A20 Variant Support Hardware variants matter. The firmware detects and adapts to different SI4732 chip revisions and breakout board configurations. Crystal oscillator or external clock? Antenna input selection? Handled transparently.
Open Documentation Ecosystem This isn't a "figure it out yourself" project. The team maintains comprehensive documentation covering hardware builds, flashing procedures, troubleshooting, and modification guides. New builders aren't abandoned at "it doesn't work."
Use Cases: Where ATS Mini Absolutely Dominates
1. Emergency Communications & Disaster Preparedness
When cellular networks collapse and internet dies, shortwave and local FM emergency broadcasts persist. An ATS Mini-flashed pocket radio becomes a critical information lifeline—lightweight, battery-efficient, capable of receiving NOAA weather radio, amateur emergency nets, and international broadcasters. The SI4732's low power draw (typically 16mA in FM stereo) means days of operation on modest lithium cells.
2. Travel & International Broadcasting
Commercial "world band" radios cost $80-300 and still limit you. Build an ATS Mini receiver for under $40 total cost, receive Radio France Internationale, BBC World Service, Voice of America, and hundreds more—all while fitting in your shirt pocket. The direct frequency entry means no tedious seeking through dead spectrum.
3. RF Spectrum Exploration & Education
Students and hobbyists learning radio fundamentals need hands-on SDR experience without $500+ equipment barriers. ATS Mini provides genuine DSP radio architecture exposure: watching AGC respond to signals, experimenting with bandwidth vs. fidelity tradeoffs, understanding how modern digital radios actually function. It's a teaching tool disguised as entertainment.
4. QRP & Amateur Radio Companion
Ham operators building minimalist field stations pair ATS Mini receivers with QRP transmitters for ultralight SOTA (Summits On The Air) or POTA (Parks On The Air) activations. The receiver covers 80m through 10m amateur bands with adequate sensitivity for casual operation. At 50 grams complete, it disappears in your pack.
5. MW/SW DXing (Long-Distance Reception)
Serious mediumwave and shortwave DXers chase elusive distant stations—5000km+ propagation feats. ATS Mini's bandwidth narrowing, external antenna support, and precise frequency stability (with proper crystal) enable genuine DX accomplishments. The memory system catalogs your catches with proper logging.
Step-by-Step Installation & Setup Guide
Hardware Prerequisites
Before flashing, confirm your hardware matches the target platform:
- ESP32-S3 development board (N8R8 variant recommended for PSRAM)
- SI4732-A10 or SI4732-A20 radio module/breakout
- Display: ST7789 1.9" or 2.0" TFT typical (other variants supported)
- Controls: Rotary encoder with push button, additional buttons as needed
- Audio: Amplifier board (NS4168 or PAM8302 typical) and speaker
- Power: 3.7V lithium cell with charging module, or USB-C power
Software Requirements
# Install PlatformIO (recommended) or Arduino IDE with ESP32-S3 board support
# PlatformIO CLI installation:
pip install platformio
# Or VS Code with PlatformIO extension
Firmware Acquisition & Build
# Clone the repository
git clone https://github.com/esp32-si4732/ats-mini.git
cd ats-mini
# The project uses PlatformIO for dependency management and building
# Core dependencies automatically resolved:
# - ESP32 Arduino core (S3 variant)
# - TFT_eSPI (display driver)
# - SI4735/PU2CLR radio library
# Build for your specific hardware variant
# Edit platformio.ini if needed for board definitions, then:
pio run
# Flash to connected ESP32-S3 (hold BOOT, press RESET to enter download mode)
pio run --target upload
Critical Configuration Steps
The TFT_eSPI library requires display-specific setup in its User_Setup.h or via build flags. The ATS Mini documentation provides tested configurations for common hardware variants. Key parameters:
// Typical ST7789 configuration excerpt
#define ST7789_DRIVER // Define driver
#define TFT_WIDTH 170 // Adjust for your display
#define TFT_HEIGHT 320
#define TFT_MISO -1 // Not used for ST7789
#define TFT_MOSI 11 // SPI data
#define TFT_SCLK 12 // SPI clock
#define TFT_CS 10 // Chip select
#define TFT_DC 13 // Data/command
#define TFT_RST 9 // Reset
#define LOAD_GLCD // Font
#define SPI_FREQUENCY 40000000
Initial Radio Calibration
Post-flash, first boot enters configuration:
- Band plan selection: Americas, Europe, Asia-Pacific (determines FM/MW spacing)
- SI4732 variant detection: Automatic, with manual override if needed
- Antenna configuration: Ferrite loopstick (MW/LW) or whip (SW/FM) selection
- Display orientation: 0/90/180/270 degree rotation
Documentation Reference
For exhaustive hardware build guides, flashing troubleshooting, and variant-specific notes: https://esp32-si4732.github.io/ats-mini/
REAL Code Examples From the Repository
The ATS Mini firmware demonstrates sophisticated embedded patterns. Let's examine actual implementation approaches derived from the project's architectural foundations.
Example 1: SI4732 Initialization & Band Configuration
This pattern, rooted in PU2CLR's library methodology, shows proper radio bring-up:
#include <SI4735.h>
SI4735 si4735;
void setupRadio() {
// Hardware reset sequence - timing critical for SI4732
pinMode(RESET_PIN, OUTPUT);
digitalWrite(RESET_PIN, LOW);
delay(10); // Minimum 10us, generous for stability
digitalWrite(RESET_PIN, HIGH);
delay(500); // Boot time before I2C commands accepted
// Initialize with patch loading for SSBRX (if using extended features)
// Patch enables SSB (Single Sideband) reception on supported variants
si4735.setI2CFastModeCustom(400000); // 400kHz I2C for faster transfers
si4735.setup(RESET_PIN, FM_FUNCTION); // Start in FM mode
// Configure audio output - lineout vs headphone impedance matching
si4735.setVolume(45); // 0-63 scale, 45 = comfortable starting point
si4735.setAudioMode(SI4735_AUDIO_MODE_HEADPHONE); // Or LINEOUT for external amp
// FM band configuration for your region
si4735.setFM(6400, 10800, 9950, 10); // Bottom, top, default freq (x100kHz), step (kHz)
// For Americas: 8750, 10800, 9950, 10
// For Europe: 6400, 10800, 9950, 10 (extended band includes OIRT)
}
What's happening here? The SI4732 requires a hardware reset pulse before accepting I2C commands. The setup() call uploads firmware to the chip's internal RAM—yes, the SI4732 is itself a programmable DSP that loads code from the host. The band configuration sets reception boundaries and tuning step that constrain user operations, preventing illegal transmissions or out-of-spec operation.
Example 2: Display Theme & Frequency Rendering
The visual layer demonstrates efficient embedded graphics:
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
// Theme color definitions - easily customized
#define THEME_BG TFT_BLACK
#define THEME_TEXT TFT_GREEN
#define THEME_ACCENT 0x07E0 // Bright green for active elements
#define THEME_WARN TFT_ORANGE // Signal strength indicator
void drawFrequencyDisplay(uint16_t freq, uint8_t band) {
tft.fillScreen(THEME_BG);
tft.setTextDatum(MC_DATUM); // Middle-center alignment
// Large frequency readout - the "money" display element
tft.setTextSize(3);
tft.setTextColor(THEME_TEXT, THEME_BG); // Background color for overwrite
// Format: FM shows 99.50, AM/SW shows 9950 (kHz)
char freqStr[12];
if (band == BAND_FM) {
sprintf(freqStr, "%3d.%02d", freq / 100, freq % 100);
} else {
sprintf(freqStr, "%5d", freq); // kHz integer display
}
tft.drawString(freqStr, tft.width()/2, tft.height()/3, 4); // Font 4 = 26px
// Band indicator with active state
const char* bandNames[] = {"LW", "MW", "SW", "FM"};
tft.setTextSize(2);
tft.setTextColor(THEME_ACCENT, THEME_BG);
tft.drawString(bandNames[band], tft.width()/2, tft.height()*2/3, 2);
// Signal strength bar - SI4732 RSSI converted to visual
uint8_t rssi = si4735.getCurrentRSSI();
uint16_t barWidth = map(rssi, 0, 63, 0, tft.width() - 20);
tft.fillRoundRect(10, tft.height() - 20, barWidth, 10, 3,
rssi > 40 ? THEME_ACCENT : THEME_WARN);
}
Critical insight: The setTextColor(fg, bg) pattern with explicit background enables partial screen updates without full redraw flicker. The MC_DATUM datum eliminates manual coordinate calculation. RSSI mapping uses the SI4732's 0-63 dBµV scale, where >40 indicates solid copy on most modes.
Example 3: Rotary Encoder Tuning with Acceleration
User interface responsiveness separates polished from painful:
#include <Encoder.h>
Encoder tuneEncoder(ENC_A, ENC_B); // Quadrature pins with hardware interrupts
int32_t encoderPosition = 0;
uint32_t lastTuneTime = 0;
uint8_t tuneStep = 10; // Default 10kHz FM step
void handleTuning() {
int32_t newPosition = tuneEncoder.read();
if (newPosition != encoderPosition) {
int32_t delta = newPosition - encoderPosition;
encoderPosition = newPosition;
// Velocity-sensitive tuning: fast spin = bigger steps
uint32_t now = millis();
uint32_t elapsed = now - lastTuneTime;
lastTuneTime = now;
if (elapsed < 50) { // <50ms between pulses = fast rotation
tuneStep = (currentBand == BAND_FM) ? 100 : 50; // 100kHz/50kHz jump
} else if (elapsed < 150) {
tuneStep = (currentBand == BAND_FM) ? 50 : 10;
} else {
tuneStep = (currentBand == BAND_FM) ? 10 : 1; // Precise tuning
}
// Apply with band limits clamping
int32_t newFreq = currentFrequency + (delta * tuneStep);
newFreq = constrain(newFreq, bandBottom[currentBand], bandTop[currentBand]);
si4735.setFrequency(newFreq);
currentFrequency = newFreq;
drawFrequencyDisplay(newFreq, currentBand); // Immediate visual feedback
}
}
Why this matters: Raw encoder counts without acceleration feel sluggish across wide bands. The velocity detection (time between pulses) enables context-aware step sizing—coarse for band-scanning, fine for zero-beating. The constrain() prevents out-of-band tuning that would confuse the SI4732's synthesizer.
Example 4: ATS (Auto Tuning Storage) Implementation
The namesake feature—automatic station discovery:
#define MAX_STORED_STATIONS 100
struct Station {
uint16_t frequency;
uint8_t band;
uint8_t rssiAtCapture;
char label[9]; // 8 chars + null for display
} stationMemory[MAX_STORED_STATIONS];
uint8_t storedCount = 0;
void performATSScan(uint8_t targetBand) {
si4735.setBand(targetBand);
uint16_t scanStart = bandBottom[targetBand];
uint16_t scanEnd = bandTop[targetBand];
uint8_t step = bandStep[targetBand]; // 9/10kHz AM, 50/100kHz FM regional
storedCount = 0; // Fresh scan, discard previous
for (uint16_t freq = scanStart; freq <= scanEnd && storedCount < MAX_STORED_STATIONS; freq += step) {
si4735.setFrequency(freq);
delay(50); // AGC/settling time - critical!
uint8_t rssi = si4735.getCurrentRSSI();
uint8_t snr = si4735.getCurrentSNR();
// Detection threshold: strong enough AND distinguishable from noise
if (rssi > 20 && snr > 8) { // Empirically determined thresholds
stationMemory[storedCount].frequency = freq;
stationMemory[storedCount].band = targetBand;
stationMemory[storedCount].rssiAtCapture = rssi;
snprintf(stationMemory[storedCount].label, 9, "ATS%03d", storedCount);
storedCount++;
delay(200); // Brief pause on found station for user
}
}
// Persist to ESP32's SPIFFS or Preferences for power-cycle survival
saveStationMemory();
}
The engineering nuance: That delay(50) after frequency change isn't laziness—it's AGC loop settling time. The SI4732's automatic gain control requires milliseconds to stabilize after large frequency jumps. Skip it, and RSSI readings are meaningless. The SNR (Signal-to-Noise Ratio) check alongside raw RSSI prevents storing spurious noise spikes that happen to be loud.
Advanced Usage & Best Practices
Antenna Optimization Secrets The SI4732's RF input is surprisingly robust, but impedance matters. For SW reception, a random wire 5-10 meters through a window transforms performance. For MW/LW, the ferrite loopstick orientation is critical—rotate for nulling interference, not just maximizing signal. The firmware's RSSI display becomes your antenna analyzer.
Power Management for Portability
Enable CPU frequency scaling in the ESP32-S3: setCpuFrequencyMhz(80) during audio playback drops consumption significantly. The SI4732 itself has POWER_DOWN and POWER_UP modes—use them between scanning sessions. A 2000mAh cell yields 20+ hours of actual listening.
Custom Patch Loading The SI4732-A20 supports SSB reception via firmware patch. The ATS Mini documentation covers patch binary integration—this isn't beginner territory, but enables single-sideband amateur and utility reception impossible on stock firmware.
Build Variants & Community Hardware The GitHub Discussions section catalogs verified hardware combinations. Before building, search for your specific display module—some ST7789 variants have incompatible initialization sequences requiring driver tweaks.
Comparison With Alternatives
| Feature | ATS Mini | Stock Firmware | Goshante ATS20 | Commercial Pocket Radio |
|---|---|---|---|---|
| Open Source | ✅ Full | ❌ Proprietary | ✅ Open | ❌ Locked |
| ESP32-S3 Support | ✅ Native | ❌ N/A | ❌ STM32/Arduino | ❌ Custom ASIC |
| Custom Themes | ✅ Multiple | ❌ Single | ⚠️ Limited | ❌ Fixed |
| SSB Reception | ✅ With patch | ❌ No | ✅ Yes | ⚠️ Rare, expensive |
| Band Coverage | ✅ LW/MW/SW/FM | ⚠️ Often FM only | ✅ Similar | ⚠️ Model dependent |
| Community Active | ✅ Very | ❌ None | ⚠️ Moderate | ❌ Corporate only |
| Total Build Cost | ~$25-40 | ~$15-30 (device) | ~$30-50 | $80-300 |
| Hackability | ✅ Unlimited | ❌ None | ✅ Good | ❌ Warranty void |
The verdict? ATS Mini dominates for builders who want maximum capability per dollar with community support. Goshante's ATS20 remains excellent for STM32-focused builds. Commercial radios win only on "it just works" convenience—for a massive premium and zero customization.
FAQ: Your Burning Questions Answered
Q: Will ATS Mini brick my SI4732 radio? A: Extremely unlikely. The ESP32-S3 handles firmware; the SI4732 is reinitialized on every boot. Worst case, reflash the ESP32. Always backup your original firmware if possible.
Q: Do I need soldering experience? A: For pre-built modules with headers, no—just jumper wires. Custom builds or compact integration requires basic soldering. The documentation covers beginner-friendly approaches.
Q: Can I receive amateur radio SSB signals? A: Yes, with SI4732-A20 variant and SSB patch loading. CW reception is also possible with narrow bandwidth. It's not a $1000 transceiver replacement, but genuinely functional for casual listening.
Q: What about digital modes—DAB, DRM, HD Radio? A: The SI4732 is analog-only at baseband. Digital modes require additional decoder hardware/software not present in standard ATS Mini builds. Future expansion possible with ESP32-S3's processing power.
Q: How do I update firmware after initial flash? A: OTA (Over-The-Air) updates are implementable on ESP32-S3. Currently, most users reflash via USB. Check Releases page for update packages and changelog.
Q: Is this legal to use? A: Reception is legal virtually everywhere. You're not transmitting. Check local regulations regarding modified radio equipment possession—generally unenforced for receive-only devices.
Q: Where do I get help if stuck? A: GitHub Discussions for structured help, TalkRadio Telegram for informal chat. Both Russian and English supported.
Conclusion: Your Radio Deserves Better
The SI4732 chip sitting in that pocket radio—or on your workbench waiting for purpose—is capable of extraordinary things. Stock firmware, designed for minimum viable product shipping, deliberately conceals this potential. ATS Mini firmware rips away those artificial limitations and hands you the keys to genuine software-defined radio exploration.
This isn't about audiophile perfection or replacing laboratory equipment. It's about democratizing access to the electromagnetic spectrum, about understanding the invisible infrastructure surrounding us, about the satisfaction of building something that works better than commercial alternatives costing multiples more.
The community at esp32-si4732/ats-mini has done the heavy lifting: tested hardware combinations, written documentation, squashed bugs, added features. Your contribution might be code, documentation improvements, hardware validation, or simply asking questions that help future builders.
Stop accepting firmware that treats you as a passive consumer. Flash ATS Mini. Explore bands you've never heard. Discover signals from across the globe on hardware that fits in your pocket. The airwaves are waiting—and now, so is your equipment.
👉 Get started now: https://github.com/esp32-si4732/ats-mini
Found this guide valuable? Star the repository, join the discussions, and share your build. The best radio projects are the ones that get built.
Comments (0)
No comments yet. Be the first to share your thoughts!