You can see how it works in this video
Main microcontroller is a mainstream STM32f070 32-bit ARM Cortex-M0, operating at 48MHz, with 32Kb of FLASH memory and 6Kb of RAM.
The embedded firmware uses three different peripherals from the micro:
- 12bit ADC to read the sound signal in continuous mode.
- TIMER configured to work at 800KHz to send PWM signal to the LEDs with the NRZ protocol.
- DMA, used for the ADC acquisition and to send data to the timer channel as a PWM signal, so the CPU is unloaded as much as possible during all the process.
it uses an omnidirectional electret microphone of 6x2,7mm with -50dB sensitivity working at frequencies from 100Hz to 10KHz. Signal is amplified with an op-amp that features rail-to-rail input and output, with a 6MHz gain-bandwidth that can be adjusted with an SMD variable resistor.
The LEDs are WS2812 chips in a 5050 package, and I use two different versions according to the needs of each project:
- WS2812B for a max brightness results, with an overall consumption of 380mA.
- WS2812C for a much long run on battery powered devices. Brightness is reduced to one-third of the B version, making overall consumption reduced to 180mA.
Button allows you to switch between different light patterns:
Sound pressure Gauge
Half ring mirrored
Half ring with rotation
With a hold-press, you can adjust the max brightness. Visit the github project page for more info.
There is a LDO voltage regulator to adjust input voltage to the 3.3V required by MCU. It accepts a max input voltage of 5.5V, but it must be down to a range of 3-4V for proper communication with LEDs, so a LiPo one-cell (1S) is a good option.
A Schottky diode protects the system from reverse polarity.
The board exposes I2C pins to acquire data from external sensors, SWD pins for MCU programming / debugging, Audio OUT pin to access the op-amp output, and WS OUT pin to attach more LEDs to the system.