
SO4R Interlock
wa1hco/SO4R_Interlock
Baseline capability for one SSB/CW radio plus 3 WSJTX radios

External VOX using voice activity detection and automatic echo cancellation
VOXboard is an open-source printed circuit board by wa1hco, from the wa1hco/VOX repository on GitHub. It is a 2-layer board with 66 parts on 74 nets.
It is built around the HT7533, BAS316 and APCW3216-222P2T, with the MM3Z3V6 among its other parts. Its parts include 29 capacitors, 22 resistors, 5 diodes, 3 connectors and 2 ICs. It belongs with the STM32 boards of this library.
A small-board VOX circuit using adaptive echo cancellation (AEC) and voice activity detection (VAD) to reliably key PTT from microphone audio while ignoring receive audio and background noise.
MIC LED: microphone port activity/level presentRX LED: receive-audio port activity/level presentVAD LED: speech probability indicates likely operator voiceAEC LED: receive-audio leakage is being reduced by echo cancellationPTT LED: transmit keying output is activesudo apt install cmake libasound2-dev libspeexdsp-devFor the Qt GUI on Linux:
sudo apt install qt6-base-devmkdir build && cd build
cmake ..
make./vox_linux -h 500Qt GUI run:
./vox_qtThe Qt test GUI shows:
By default on Linux desktop systems, vox_linux auto-selects:
MICRXOptions:
--list-devices — print available capture devices and exit-m <device> — microphone capture device (default auto)-r <device> — receive-reference capture device (default auto)-h <ms> — PTT hang time in milliseconds (default 500)-M <level> — MIC LED activity threshold (default 300)-R <level> — RX LED activity threshold (default 300)-V <pct> — VAD LED probability threshold percent (default 60)-E <pct> — AEC LED reduction threshold percent (default 20)Device string formats:
hw:0,0, plughw:CARD=PCH,DEV=0, alsa:hw:0,0pulse:<source_name>To pick a specific mic + speaker-monitor pair on the current host, list the
devices first and copy two strings into -m / -r:
./vox_linux --list-devices
./vox_linux -m pulse:<your_mic_source> -r pulse:<your_sink>.monitor -h 500The exact source names differ per machine — running across the desktop and
laptop is expected to give different -m/-r values.
The Linux runner prints LED transitions:
MIC LED from raw mic level activityRX LED from receive reference level activityPTT LED from VOX state machineVAD LED from Speex VAD decision/probabilityAEC LED from measured mic-energy reduction while RX reference is activecd build
ctest --output-on-failureFunctional tests use synthetic audio. Regression tests load raw audio files from tests/regression/data/ (see that directory for file format).
src/ Core library: vox.c, aec.c, vad.c
platform/linux/ Linux ALSA/Pulse audio + Qt GUI
platform/mcu/
core/ Platform-independent MCU scaffold
vox_mcu_board.h Pin-config interface (VoxMcuPinConfig)
vox_mcu_pins.h GPIO port/pin uint8 encoding
vox_mcu_decimator.{h,c} 32 MHz ADC → 8 kHz DSP CIC decimator
boards/
common/
hco_pin_assignment.h Shared HCO logical pin map
stm32g474_vox_cb/ Custom STM32G474CBT3 board (LQFP48)
board_pins.h LQFP48 pin table + analog-front-end notes
board.c Pin-config descriptor
board.cmake Per-board CMake fragment
stm32g474_nucleo/ NUCLEO-G474RE + HCO-mirrored shield
board_pins.h LQFP64 pin table + Nucleo-specific notes
board.c
board.cmake
cmake/
arm-none-eabi.cmake ARM cross-compile toolchain file
tests/ Functional and regression tests (host)
docs/ User manual and design descriptionThe current MCU firmware is bring-up only: it blinks an LED, prints a counter once a second on the debug UART, and proves the cross toolchain
stm32g474_nucleo — NUCLEO-G474RE dev board with a prototype shield
that mirrors the HCO custom-board pinout. Bring-up uses the on-board
ST-Link VCP (USART2 PA2/PA3 → /dev/ttyACM0).stm32g474_vox_cb — VOX HCO custom board (STM32G474CBT3, LQFP48).
Bring-up uses USART1 PA9/PA10 with an external 3.3V USB-serial adapter.Both boards share the same logical GPIO assignment via
platform/mcu/boards/common/hco_pin_assignment.h, so most MCU code is
identical between them. Per-board files describe the package pinout
and any board-specific quirks (e.g. on the Nucleo, PA5 also drives the
on-board LD2 user LED, which is benign — it just mirrors LED_MIC).
Sample-rate plan (deferred until ADC driver lands):
sudo apt-get update
sudo apt-get install -y \
gcc-arm-none-eabi binutils-arm-none-eabi \
libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib \
stlink-tools openocd \
picocomgcc-arm-none-eabi is the Cortex-M cross compiler; stlink-tools
provides st-flash / st-info; openocd is an alternative flasher
and SWD debug bridge; picocom is a tiny serial terminal for watching
UART output (screen or minicom work too).
After install, sanity-check:
arm-none-eabi-gcc --version # expect 13.2.x
st-info --probe # expect to see a connected ST-Link if Nucleo plugged inPlug the Nucleo into USB. Linux should enumerate two devices:
NODE_G474RE (for drag-drop flashing)/dev/ttyACM0 (115200 8N1)Then:
# Configure (cross-compile)
cmake -S . -B build-nucleo \
-DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake \
-DBOARD=stm32g474_nucleo
# Build the firmware (.elf + .bin + size report)
cmake --build build-nucleo
# Flash to the chip via the on-board ST-Link
cmake --build build-nucleo --target flash
# Open the VCP in another terminal to see "tick=N" lines and confirm life
picocom -b 115200 /dev/ttyACM0
# ↑ Ctrl-A Ctrl-X to quit picocomExpected output on /dev/ttyACM0:
VOX bringup: board=stm32g474_nucleo sysclk=16MHz (HSI16)
LD2 (PA5) should be blinking at ~1 Hz.
tick=0
tick=1
tick=2
...LD2 (the green LED next to the USER button) blinks at roughly 1 Hz.
cmake -S . -B build-vox-cb \
-DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake \
-DBOARD=stm32g474_vox_cb
cmake --build build-vox-cb
cmake --build build-vox-cb --target flash # needs an external SWD probeThere is no on-board ST-Link, so connect an external probe (a Nucleo
used as ST-Link works) to the SWD pads, and an external 3.3V USB-serial
adapter to PA9/PA10 to see the tick=N output.
If you want to verify the board descriptor + decimator compile but
haven't installed arm-none-eabi-gcc yet:
cmake -S . -B build-nucleo-host -DBOARD=stm32g474_nucleo
cmake --build build-nucleo-host --target vox_mcu_boardThis builds libvox_mcu_board.a with the host gcc — the firmware
executable is intentionally skipped in this mode.
Design docs (in docs/):
SET_MODE commandStill to come:
user_manual.md — installation and operation (placeholder)design_description.md — architecture and algorithm details (placeholder)TBD
| Qty | Value | Footprint | References |
|---|---|---|---|
| 7 | 100n | Capacitor_SMD:C_01005_0402Metric | C8, C11, C14, C16, C18, C25, C27 |
| 5 | 470p | Capacitor_SMD:C_01005_0402Metric | C12, C13, C19, C22, C23 |
| 3 | 10K | Resistor_SMD:R_01005_0402Metric | R7, R8, R26 |
| 3 | 10K 0.1% | Resistor_SMD:R_01005_0402Metric | R18, R19, R21 |
| 3 | 1u | Capacitor_SMD:C_01005_0402Metric | C15, C26, C34 |
| 3 | BAS316 | Diode_SMD:D_SOD-323 | D3, D5, D21 |
| 2 | .1u | Capacitor_SMD:C_01005_0402Metric | C2, C21 |
| 2 | 100p | Capacitor_SMD:C_01005_0402Metric | C4, C9 |
| 2 | 10u | Capacitor_SMD:C_01005_0402Metric | C17, C33 |
| 2 | 13k | Resistor_SMD:R_01005_0402Metric | R14, R15 |
| 2 | 1n | Capacitor_SMD:C_01005_0402Metric | C24, C29 |
| 2 | 220 | Resistor_SMD:R_01005_0402Metric | R9, R10 |
| 2 | 27 | Resistor_SMD:R_01005_0402Metric | R5, R6 |
| 2 | 470n film | Capacitor_SMD:C_01005_0402Metric | C7, C10 |
| 2 | 47p | Capacitor_SMD:C_01005_0402Metric | C1, C3 |
| 2 | 4k7 | Resistor_SMD:R_01005_0402Metric | R20, R22 |
| 2 | 5K1 | Resistor_SMD:R_01005_0402Metric | R1, R2 |
| 2 | APCW3216-222P2T | Inductor_SMD:L_CommonMode_Wurth_WE-CNSW-1206 | FL1, FL2 |
| 2 | FerriteBead_Small | Inductor_SMD:L_0805_2012Metric | FB1, FB2 |
| 2 | MM3Z3V6 | Diode_SMD:D_SOD-323 | D1, D2 |
| 1 | 0 | Resistor_SMD:R_01005_0402Metric | R17 |
| 1 | 0.1u | Capacitor_SMD:C_01005_0402Metric | C6 |
| 1 | 1K5 | Resistor_SMD:R_01005_0402Metric | R16 |
| 1 | 27k | Resistor_SMD:R_01005_0402Metric | R23 |
| 1 | 2K2 | Resistor_SMD:R_01005_0402Metric | R11 |
| 1 | 2N7002 | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | 2k2 | Resistor_SMD:R_01005_0402Metric | R3 |
| 1 | 4.7n | Capacitor_SMD:C_01005_0402Metric | C28 |
| 1 | 47 | Resistor_SMD:R_01005_0402Metric | R4 |
| 1 | HT7533 | Package_TO_SOT_SMD:SOT-89-3 | U7 |
| 1 | MicJack | Connector_Audio:Jack_3.5mm_CUI_SJ1-3513N_Horizontal | J3 |
| 1 | RJ45_LED | Connector_RJ:RJ45_Amphenol_RJHSE538X | J8 |
| 1 | STM32G474CBTx | Package_QFP:LQFP-48_7x7mm_P0.5mm | U2 |
| 1 | USB-C 2.0 16P | Connector_USB:USB_C_Receptacle_G-Switch_GT-USB-7010ASV | J1 |

wa1hco/SO4R_Interlock
Baseline capability for one SSB/CW radio plus 3 WSJTX radios


wa1hco/WIMS
The WIMS window opens. Start Operate or the site server there, and the console opens in the browser at . If that window is already open, double-clicking the icon brings it to the front.

eddyem/mmpp
MMPP (Multimode photometer-polarimeter) for the telescope Zeiss-1000 of SAO RAS.

wa1hco/Synthesizer-VHF
35 MHz–4.4 GHz ADF4351 synthesizer: ATtiny1616 + USB-C, 10 MHz ref in/out, JLCPCB-ready KiCad board for a Hammond die-cast box

eddyem/stm32samples
Code samples and ready projects based on bare-metal STM32


wa1hco/rotator_controller
Clean slate rebuild of full featured rotator controller.
66 parts, built around the HT7533, BAS316, APCW3216-222P2T and MM3Z3V6. 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 wa1hco/VOX repository on GitHub, at the commit this page was made from: the board is hardware/VOXboard/VOXboard.kicad_pcb and its schematic hardware/VOXboard/VOXboard.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask wa1hco before reusing the design.