No magic
Stanislav Dombrovsky
Mobile Developer in the past. Former product manager in AppCode. Engineer.
· 1 min read

RF-001 prototype

This is a short post about my main embedded side-project.

Overview

It’s a musical pedal that transmits real-time audio over the air. The purpose is a flexible monitoring solution for professional musicians: sometimes you need to monitor a specific subset of band members during rehearsal, and it would be nice to have such ability without lots of wires.

Features

  • Universal transceiver module and case design. Modules can be combined into a supermodule (stacked side to side using the 9-pin D-subs):
  • Real-time low-latency audio, 32-bit 44100 Khz mono channel (stereo in the future).
  • Full software control over the codec functions, analog mixing for modules connected:
    • EQ
    • Volume
    • Balance
    • Other functions
  • DFU update over the USB.
  • Desktop software for device management:
  • Single encoder / push-button control over the OLED screen.
  • Line / mic input, headphones (single output) / line out (single output)
  • Inter-module communication: ability to have the first module connected to the laptop as a master module for controlling other modules (to easily change settings)

Details of the prototype / schematics:

  • STM32F103RCT6 as a core.
  • AK4954AEN as a codec. Custom module board from the reference schematics:
  • SSD1306 OLED screen module
  • Amicom A7190 transceiver module as RF core for audio transmission.
  • 8k-bit EEPROM (from STM, random one)

Early version testing (first successfull full-speed audio transfer):

All together (single module prototype):

Project architecture / parts

  • DFU Bootloader (standard one)
  • Firmware:
    • HAL part (generated via STM32Cube for faster prototyping)
    • FreeRTOS (because of queues and ability to structure the code properly)
    • C/C++ mix (generated sources in C, my code in C++)
    • RTT for debugging / logging
    • Drivers for peripherals (with abstract drivers for easier work with DMA / non-DMA transfers)
    • All peripherals configured with DMA (maximum speed)
    • Small custom UI framework (rendering based on the Adafruit Driver, to be changed in the future)
    • Catch tests with simple mocks for peripherals / interfaces:
  • UI simulator:
  • Granular run configurations for the whole project:
  • CMake as a build system