Skip to the content
2 layers47.4 × 28.3 mm05 a radio, the printed circuit board in 3D

An FM radio receiver built using an ESP12E, interfaced with the RDA5807M module. Powered by a Li-Ion battery with a TP4056 charging module, amplified by a PAM8403, and output through a 10-watt speaker. Features station switching via a button.

Size
47.4 × 28.3 mm
Copper layers
2
Thickness
1.6 mm
Parts
15
Nets
35
Pads
76
Tracks, vias
84, 16
Pours
3
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
1 Sep 2024
Updated
29 Oct 2026

Overview

05 a radio is an open-source printed circuit board by ItzzInfinity, from the ItzzInfinity/FM-Radio-Using-ESP-12E-and-RDA5807M repository on GitHub, published under the MIT licence. It is a 2-layer board of 47.4 × 28.3 mm with 15 parts on 35 nets, routed with 84 tracks and 16 vias.

It is built around the RDA5807M, ESP-12E and AMS1117-3.3. Its parts include 4 capacitors and 1 IC. It belongs with the radio and wireless and power boards and the ESP32, ESP8266 and RISC-V boards of this library.

Main components

3

README

README.md

FM Radio — RDA5807M 📻

Platform Language License

📋 Overview

A small FM receiver built around the RDA5807M, driven over I2C by either an ESP32-C3 SuperMini or an ESP-12E — the carrier board has a footprint for both and the firmware picks its pin map from whichever core you compile for.

Audio leaves the board on a 2-pin header to a PAM8403 amplifier and a speaker; a telescopic antenna solders to a plated mounting hole. Beyond the original button-cycles-presets behaviour, the current firmware brings up Wi-Fi and serves a web UI at http://radio.local for presets, volume, seek and manual tuning, supports OTA reflashing, and optionally drives an SSD1306/SH1106 OLED.

Assembled board, top view

🔧 Hardware

The board is a 2-layer 47.4 × 28.2 mm carrier. Reference designators differ between the schematic and the PCB silkscreen — both are listed below.

SchSilkscreenPartNotes
U1ESP32C3 SuperMiniESP32-C3 SuperMiniTop side, through-hole module
U2ESP12EESP-12EBottom side — the alternate MCU, see below
U3U3RDA5807M module (RRD-102/120 style)I2C 0x10 (sequential) / 0x11 (indexed)
U43V3 RegAMS1117-3.3, SOT-223Only needed for the ESP-12E build
C1, C2C1, C2Ceramic disc, 5 mm THTAMS1117 input side
C3, C4C3, C4Ceramic disc, 5 mm THTAMS1117 output side
J2GND1×4 headerI2C breakout: SDA, SCL, 3V3, GND — for the OLED
J35V1×2 header5 V supply in
J4LO1×2 headerAudio out: LOUT, ROUT → PAM8403
SW1RST1×2 headerReset, broken out for an external button
SW2BTN1×2 headerPreset button, broken out for an external button
H1H1M3 mounting hole
H2H2M3 plated mounting holeCarries the ANT net — solder the antenna here

Notes on the BOM:

  • The capacitor values are not set in the schematic. C1–C4 are drawn as generic C with 5 mm disc footprints. Fill them in before ordering; the AMS1117 datasheet wants at least 10 µF on the output for stability, which a disc ceramic will not give you.
  • SW1/SW2 are drawn as push buttons but laid out as 2-pin headers, so the buttons live off-board. The tactile switches visible on the render are the SuperMini module's own boot/reset buttons, not board parts.
  • H3 and H4 exist in the schematic but were never placed on the PCB.
  • The PAM8403 amplifier, speaker, Li-Ion cell and TP4056 charger are off-board and not in this project.

📐 Schematic

Schematic

Click for the full-resolution PDF.

Board

TopBottom
TopBottom

The KiCad 9 project is in hardware/. Both custom 3D models (ESP32-C3 supermini v5.step, RDA5807m-RRD-120.step) are committed and referenced through ${KIPRJMOD}, so a fresh clone renders identically:

bash
mkdir -p docs/images

kicad-cli sch export pdf -o docs/images/schematic.pdf "hardware/05_a radio.kicad_sch"
pdftoppm -r 200 -png -singlefile docs/images/schematic.pdf docs/images/schematic

kicad-cli pcb render --side top --quality high --perspective \
  --rotate '-25,0,25' --zoom 0.7 --width 1600 --height 1200 --floor \
  --background opaque -o docs/images/pcb-top.png "hardware/05_a radio.kicad_pcb"

kicad-cli pcb render --side bottom --quality high --perspective \
  --rotate '25,0,25' --zoom 0.52 --width 1600 --height 1200 --floor \
  --background opaque -o docs/images/pcb-bottom.png "hardware/05_a radio.kicad_pcb"

Gerbers are not committed — the exports under hardware/Drill/ predated the current layout, so they are gitignored. Regenerate with kicad-cli pcb export gerbers before ordering.

⚡ Wiring

SignalESP32-C3 (U1)ESP-12E (U2)Goes to
SDAGPIO8GPIO4 (D2)RDA5807M + J2 (OLED)
SCLGPIO9GPIO5 (D1)RDA5807M + J2 (OLED)
ButtonGPIO3GPIO3 (RXD)BTN header → GND
Reset—RSTRST header → GND

These are the same values the firmware compiles in; the pin map lives in section 2 of the sketch, keyed off ESP8266 / ARDUINO_ARCH_ESP32.

Three things that will bite you

Populate one MCU, not both. The ESP-12E sits on the bottom copper and the SuperMini on the top, so nothing physically stops you fitting both — but they share the I2C bus and the 3V3 rail. Pick one.

Two regulators land on the same 3V3 net. U1's 3.3 pin and the AMS1117's output are the same node. With the SuperMini fitted, its onboard LDO already powers the rail from the 5 V input, so leave 3V3 Reg (U4) and C3/C4 unpopulated. The AMS1117 is only there for the ESP-12E build.

GPIO8 and GPIO9 are ESP32-C3 strapping pins. They are also the I2C bus here. The chip samples both at reset — GPIO9 low selects download mode, and GPIO8 must not be low — so the bus pull-ups have to be strong enough that nothing on the bus drags either line down during boot. If the board only enumerates as a serial port and never runs, this is the first thing to check.

On the ESP-12E, pinMode() on GPIO3 detaches it from UART0 RX: serial output keeps working, serial input does not. That is inherited from the original board and left as-is.

🧠 Design notes

No radio library. The RDA5807M driver is ~180 lines in section 4 of the sketch. The chip is simple enough — 16-bit big-endian registers, two I2C addresses (0x10 auto-incrementing, 0x11 indexed) — that a dependency buys nothing and costs portability across the two cores.

One sketch, two targets, no manual switch. Everything board-specific is behind #if defined(ESP8266) / #elif defined(ARDUINO_ARCH_ESP32): pin map, network headers, the web server type, and the persistence backend (EEPROM on the ESP8266, Preferences on the ESP32). Selecting the board in the IDE is the only choice you make.

The OLED type is a runtime setting, not a compile-time one. SSD1306 and SH1106 are indistinguishable over I2C, so the firmware auto-detects that an OLED is present and lets you switch the controller from the web page. Getting the wrong module in a batch costs a click instead of a reflash. OLED_ENABLED 0 compiles the whole display path out.

Audio survives an OTA update. The RDA5807M only needs the MCU to change station — it keeps playing on its own while flash is being rewritten. Both OTA paths (the Arduino IDE network port and the browser upload at /update) are guarded by OTA_PASSWORD, because otherwise anyone on the LAN can replace the firmware. A failed transfer rolls back to the old image; only a successfully written but broken sketch means opening the box.

Credentials are gitignored. This repo is public, so Wi-Fi and OTA passwords live in secrets.h, which is not tracked. secrets.h.example is the template.

HTTP API

The web page is served from flash at / and drives these endpoints:

EndpointPurpose
GET /api/statusCurrent frequency, volume, stereo/RSSI, preset list
GET /api/presetSelect a preset slot
GET /api/tuneTune to a frequency
GET /api/volumeSet volume 0–15
GET /api/seekHardware seek up/down
GET /api/preset/setRewrite a preset slot (persisted)
GET /api/oledSwitch controller: ssd1306 / sh1106 / none
GET/POST /updateBrowser firmware upload

🔨 Build

bash
cp Src/test_I2C_Radio/secrets.h.example Src/test_I2C_Radio/secrets.h
$EDITOR Src/test_I2C_Radio/secrets.h

# ESP32-C3 SuperMini
arduino-cli compile --fqbn esp32:esp32:esp32c3 Src/test_I2C_Radio

# ESP-12E
arduino-cli compile --fqbn esp8266:esp8266:nodemcuv2 Src/test_I2C_Radio

Requires the Adafruit SSD1306, Adafruit SH110X, Adafruit GFX and Adafruit BusIO libraries unless you set OLED_ENABLED 0.

Verified with arduino-cli 1.5.1, esp32 core 3.3.8, esp8266 core 3.1.2:

TargetFlashRAM
ESP32-C31,130,767 / 1,310,720 B (86%)44,252 / 327,680 B (13%)
ESP-12E340,684 / 1,048,576 B (32%)31,864 / 80,192 B (39%)

Two figures worth watching: the ESP32-C3 build is at 86% of the default 1.3 MB app partition, and the ESP-12E build sits at 93% of IRAM (61,551 / 65,536 B). Neither has much headroom left for new features.

🚀 First run

  1. Copy secrets.h.example → secrets.h and fill in your Wi-Fi credentials and an OTA password.
  2. Flash over USB the first time — OTA needs working firmware to update from.
  3. Solder a telescopic antenna to the plated mounting hole H2.
  4. Wire the LO header to a PAM8403 input and feed 5 V into the 5V header. Take the amplifier's ground from that same header — LO carries only LOUT and ROUT, no ground of its own.
  5. Browse to http://radio.local. If mDNS does not resolve, check the serial log for the DHCP address.
  6. With no Wi-Fi at all the board still works: the BTN header cycles presets.

📟 Original prototype

The first version of this project was a hand-soldered perfboard build on an ESP-12E with a fixed volume and 10 hard-coded stations — no Wi-Fi, no display, one button. The carrier board above replaces it.

Breadboard wiringPerfboard build
Breadboard wiringPerfboard prototype

📜 License

MIT — see LICENSE.

Parts

15
QtyValueFootprintReferences
4CCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mmC1, C2, C3, C4
2Conn_01x02_PinConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical5V, LO
2SW_PushConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalBTN, RST
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin23V3 Reg
1Conn_01x04_PinConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalGND
1ESP-12ERF_Module:ESP-12EESP12E
1ESP32-C3_SUPERMINI_THESP32-C3_SUPERMINI:MODULE_ESP32-C3_SUPERMINIESP32C3 SuperMini
1MountingHoleMountingHole:MountingHole_3.2mm_M3H1
1MountingHole_PadMountingHole:MountingHole_3.2mm_M3_DIN965_Pad_TopBottomH2
1RDA5807MPAM8403_module:RDA5807M_SMDU3

Similar boards

  • 2 layers72.8 × 32 mmMicro fm radio, the printed circuit board in 3D

    Micro fm radio

    dilshan/rda5807-fm-radio-module

    RDA5807M based stereo FM radio receiver

    56 parts8MIT
  • 4 layers100 × 69.4 mmFMTransceiver, the printed circuit board in 3D

    FMTransceiver

    Longing-Ingernot/FMTransceiver

    This is an FM radio transmitter and receiver, all in one, built around an ESP32-S3, a KT0803L

    71 parts1MIT
  • 2 layers112.6 × 85.4 mmRda5807m radio, the printed circuit board in 3D

    Rda5807m radio

    dilshan/rda5807m-receiver

    FM stereo radio receiver prototype with RDS

    64 parts23MIT
  • 2 layersPlayer, the printed circuit board in 3D

    Player

    dltech/usb_player

    simple USB SD mp3 player based on stm32 MCU

    123 parts1Apache-2.0
  • 2 layers85 × 117 mmFM radio esp32 hardware, the printed circuit board in 3D

    FM radio esp32 hardware

    kanta/GARAGE-SAILING

    KiCad 6.0 project files for the top and the bottom panel.

    47 parts1MIT
  • 2 layers56 × 52 mm299Clock, the printed circuit board in 3D

    299Clock

    Benjamin324/Alarm-Clock-Radio-ECE-299-

    Micropython and Html establishing alarm clock and radio functionality on a rasperry pi pico w.

    26 parts
  • 2 layers86.4 × 50.8 mmMega328 FM, the printed circuit board in 3D

    Mega328 FM

    mit41301/RDA5807M-arduino-nano-clone-FM-radio

    RDA5807M (+ arduino nano clone) FM radio with NEC IR remote control

    38 parts
  • 2 layers83.2 × 51.6 mmCardradio, the printed circuit board in 3D

    Cardradio

    tend876/Card-Radio-1

    The 1986 Casio RD-10 was an 86 × 54 × 2.2 mm card with a Philips TDA7020T, a CR2016 cell and a proprietary flat earphone plug. The earphone lead was also the antenna and the power switch.

    44 parts

Questions

How big is the 05 a radio PCB?

It measures 47.4 × 28.3 mm and has 2 copper layers, 1.6 mm thick.

What parts does the 05 a radio use?

15 parts, built around the RDA5807M, ESP-12E and AMS1117-3.3. 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.

Where can I download the 05 a radio KiCad files?

From the ItzzInfinity/FM-Radio-Using-ESP-12E-and-RDA5807M repository on GitHub, at the commit this page was made from: the board is hardware/05_a radio.kicad_pcb and its schematic hardware/05_a radio.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the 05 a radio design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).