Skip to the content
PCBKitNew board
4 layers88 × 60 mmCombined, the printed circuit board in 3D

Firmware for experimental ISM-band audio transmission

Size
88 × 60 mm
Copper layers
4
Thickness
1.6 mm
Parts
55
Nets
68
Pads
284
Tracks, vias
358, 330
Pours
3
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
18 Mar 2026
Updated
2 May 2026

Overview

Combined is an open-source printed circuit board by activexray, from the activexray/hyperactive_radio repository on GitHub. It is a 4-layer board of 88 × 60 mm with 55 parts on 68 nets, routed with 358 tracks and 330 vias.

It is built around the PAM8406DR, PCM3060PW and BLM18PG221SN1, with the SJ-3524-SMT-TR, DMG2305UX and EC11E18244A5 among its other parts. Its parts include 25 capacitors, 7 connectors, 5 resistors, 5 ICs and 1 transistor. It belongs with the audio and music boards and the RP2040 boards of this library.

Main components

7

README

README.md

Hyperactive//2026 Radio

Experimental real-time, long-range, high-quality, wireless digital audio for Hyperactive 2026.

Audio quality

ParameterValue
CodecOpus (fixed-point)
Bitrate64 kbps
ChannelsStereo
Sample rate48 kHz
Frame size20 ms
Encoder complexity5 / 10
ADCPCM1808 (24-bit I2S)

64 kbps stereo Opus at 48 kHz should be transparent for most program material — comparable to a good 128 kbps MP3, but with lower latency and better behaviour at the edges of the bitrate. The fixed-point build removes float entirely; no performance penalty on Cortex-M33 which has a hardware FPU but where the float Opus path was benchmarked to be slower than fixed-point.

End-to-end latency is approximately one frame (20 ms) of algorithmic delay plus radio airtime (~1.6 ms at 100 kbps for a 160-byte packet) plus any playout buffer on the receiver.

Radio

ParameterValue
Radio ICSX1276
Band915 MHz (US ISM)
ModulationGFSK
Air rate100 kbps
TX power+20 dBm (100 mW)
Target range~300 m / ~1000 ft mixed indoor/outdoor
Link margin~18 dB at 100 kbps GFSK

Regulatory (FCC Part 15.247)

No frequency hopping required. Part 15.247 has two compliance paths — FHSS is one, but digital modulation is the other: fixed frequency, up to +30 dBm EIRP, with two constraints:

  • 6 dB bandwidth ≥ 500 kHz — requires high frequency deviation; at 100 kbps, ±200 kHz deviation gets you there (BW_6dB ≈ 2 × f_dev + bit_rate). Lower deviation (e.g. ±50 kHz) only yields ~200 kHz and does not qualify.
  • PSD ≤ 8 dBm in any 3 kHz band — GFSK spectral peaks at ±f_dev must stay under this limit at the chosen TX power.

The exact deviation and power settings need to be verified against both constraints once the RF configuration is finalised. At +20 dBm with sufficiently high deviation the path is viable, but the numbers need to be checked.

Packet structure

Each 20 ms Opus frame encodes to roughly 160 bytes at 64 kbps. With ~10 bytes of framing (sequence number, network ID, CRC) the total packet is ~170 bytes, for an effective air rate of ~68 kbps — well within the 100 kbps channel.

Performance

MCU runs at 270 MHz (overclocked from the 150 MHz default; stable at stock 1.1 V).

Benchmarked on hardware against broadband LCG noise (worst case for Opus — no clear pitch, flat spectrum):

OperationCycles (avg)Time (avg)Frame budget used
Opus encode, stereo, 64 kbps, 20 ms2,299,6038.5 ms42.6%
Opus decode, stereo, 64 kbps, 20 ms895,4203.3 ms16.6%

Frame budget = 20 ms = 5,400,000 cycles at 270 MHz.

The encoder leaves 11.5 ms of headroom per frame for I2S DMA and SPI radio management. The decoder uses only 16.6% of the frame, leaving ample margin for playout buffering and output DMA.

Firmware architecture

Written in Rust (no_std, Embassy async runtime).

text
ha_radio/          # firmware binary (bench + main)
embedded-opus/     # safe Rust wrapper around libopus
opus-sys/          # raw FFI bindings; builds libopus via cc crate

embedded-opus/build.rs compiles a host-side C probe at build time to determine the exact encoder and decoder state sizes, so buffers are sized precisely without a runtime heap.

Planned: dual-core pipeline

The encode headroom is comfortable at 270 MHz, but the dual-core split is still planned for clean separation of concerns once the ADC arrives:

  • Core 0 — I2S DMA capture, SX1276 SPI, radio management
  • Core 1 — Opus encode only

A pair of Embassy Channel queues (depth 2) connect the cores: PCM frames inbound, encoded packets outbound.

Build

sh
cargo build --release --bin ha_radio
cargo build --release --bin bench

Requires a Rust nightly toolchain and the thumbv8m.main-none-eabihf target (see rust-toolchain.toml).

Parts

55
QtyValueFootprintReferences
1010uCapacitor_SMD:C_0805_2012MetricC1, C3, C6, C8, C10, C12, C13, C14, C15, C17
7100nCapacitor_SMD:C_0805_2012MetricC4, C7, C9, C11, C18, C19, C20
6BLM18PG221SN1Inductor_SMD:L_0603_1608MetricFB1, FB6, FB7, FB8, FB9, FB10
4220pCapacitor_SMD:C_0603_1608MetricC23, C24, C25, C26
31uCapacitor_SMD:C_0805_2012MetricC21, C22, C27
34.7kResistor_SMD:R_0805_2012MetricR2, R3, R4
3MountingHole_PadMountingHole:MountingHole_3.2mm_M3_DIN965_Pad_TopBottomH1, H2, H4
2AudioJack3_SwitchTConnector_Audio:Jack_3.5mm_CUI_SJ-3524-SMT_HorizontalJ8, J9
2Conn_01x02Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ3, J7
1100kResistor_SMD:R_0805_2012MetricR1
122kResistor_SMD:R_0805_2012MetricR7
122uCapacitor_SMD:C_0805_2012MetricC2
1Ai-Thinker-Ra-01RF_Module:Ai-Thinker-Ra-01-LoRaU2
1Barrel_Jack_MountingPinConnector_BarrelJack:BarrelJack_HorizontalJ1
1Conn_01x03_PinConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ2
1Conn_CoaxialConnector_Coaxial:SMA_Samtec_SMA-J-P-H-ST-EM1_EdgeMountJ4
1DMG2305UXPackage_TO_SOT_SMD:SOT-23Q1
1LD1117S50TR_SOT223Package_TO_SOT_SMD:SOT-223-3_TabPin2U1
1PAM8406DPackage_SO:SOIC-16_3.9x9.9mm_P1.27mmU6
1PCM3060Package_SO:TSSOP-28_4.4x9.7mm_P0.65mmU3
1RaspberryPi_PicoModule:RaspberryPi_Pico_SMD_HandSolderA1
1RotaryEncoder_Switch_MPRotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mmSW1
1SG-210STFOscillator:Oscillator_SMD_SeikoEpson_SG210-4Pin_2.5x2.0mmY1
1SSD1306Library:SSD1306_0.96_OledU4

Questions

How big is the Combined PCB?

It measures 88 × 60 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Combined use?

55 parts, built around the PAM8406DR, PCM3060PW, BLM18PG221SN1 and SJ-3524-SMT-TR. 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 Combined KiCad files?

From the activexray/hyperactive_radio repository on GitHub, at the commit this page was made from: the board is hardware/combined/combined.kicad_pcb and its schematic hardware/combined/combined.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Combined design in my own project?

Its repository states no licence, so its author keeps all rights: ask activexray before reusing the design.

Similar boards

  • 4 layers100 × 65 mmSi5351AVFO, the printed circuit board in 3D

    Si5351AVFO

    etherkit/Si5351AVFO

    After any schematic change, run tools/exportdocs.sh (needs KiCad 10 kicad-cli). It rewrites docs/Si5351AVFOschematic.pdf, the netlist, SVGs and docs/erc.rpt.

    140 parts
  • 4 layers300 × 120 mmLedaw, the printed circuit board in 3D

    Ledaw

    wang-edward/ledaw

    Le DAW!!!

    265 parts5MIT
  • 4 layers130 × 110 mmOpenBeacon2, the printed circuit board in 3D

    OpenBeacon2

    etherkit/OpenBeacon2

    Multimode MEPT based on OpenBeacon

    261 parts15
  • 2 layers175 × 115 mmLaser Controllerv2 only for pcb test, the printed circuit board in 3D

    Laser Controllerv2 only for pcb test

    Andre1Becker/GalvOS

    Open-source ESP32-S3 laser show controller — built to replace proprietary OEM controllers in RGB galvo laser projectors

    122 parts11GPL-3.0
  • 4 layers118 × 60 mmHeron clock, the printed circuit board in 3D

    Heron clock

    Austin-Hunter1/HERON

    2026-2027 Graduate Project HERON:

    112 parts1
  • 6 layers56.7 × 54.7 mmBetter md80, the printed circuit board in 3D

    Better md80

    darshp848/bldc-controller-60v

    60 V, 20 A / 80 A peak BLDC motor controller that fits the MD80 v3.0 mounting. KiCad 10, 6 layers.

    144 parts1
  • 2 layers140.5 × 106 mmPcbgalapagos, the printed circuit board in 3D

    Pcbgalapagos

    catuta0/HAB-payload

    Carrier PCB for a high-altitude balloon payload. An ESP32 DevKitC V4 (WROOM-32) plugs into the board together with breakout modules for GPS (NEO-8M, I2C or UART header, fit only one), INA260 power monitor, BME280…

    62 parts
  • 2 layers50 × 50 mmTalkclock, the printed circuit board in 3D

    Talkclock

    dholth/mesh

    53 parts