digital clapperboard (using STM32F103 micro-controller, 7-segment displays, buttons, piezo-buzzer, shake switch)
Go to file
King Kévin a05fa023e5 button press and character input reset sleep timeout 2018-04-30 14:40:01 +02:00
lib switch UART baudrate to standard 115200 2018-04-30 14:38:33 +02:00
libopencm3@ad5ec6af08 add libopencm3 and STM32duino-bootloader submodules dependencies 2016-01-15 15:36:00 +01:00
.gitignore ignore generated documentation 2016-08-14 19:26:46 +02:00
.gitmodules remove STM32duino-bootloader 2016-08-14 19:03:17 +02:00
Doxyfile add changes from spark abacus project 2016-10-23 17:42:27 +02:00
Makefile switch cross-compiler from ELLCC to GCC 2018-04-30 14:39:24 +02:00 fix list indentation 2017-05-21 14:36:20 +02:00
global.c add core board definition 2017-04-01 14:13:55 +02:00
global.h add final prototype documentation 2017-05-21 13:43:56 +02:00
main.c button press and character input reset sleep timeout 2018-04-30 14:40:01 +02:00



This is the firmware for a digital clapperboard.


Clapperboards are used to synchronize audio and video tracks by clapping two wooden pieces. This is then visible on the video and the sharp sound is also present on the audio. Using the scene and take number written on the clapperboard and announced at the beginning of the recording it is possible to know which sound track corresponds to which video track.

This clapper board improves this system with some features:

  • use 7-segment displays to show number, instead of having to manually write and erase it on the board
    • episode, scene, and take
    • two audio and video track numbers (number used in the file names or the recordings)
    • current date, time, and frame number
  • automatically increment the take and recording numbers

The numbers on the board can be adjusted by hand using buttons.


The current implementation uses a core board. The underlying template supports additional board.


  • 1x 8-digit 7-segment display based on the MAX7219 to display the date
  • 1x 8-digit 7-segment display based on the MAX7219 to display the time (hours, minutes, seconds) and frame number
  • 7x 4-digit 7-segment display based on the TM1637 to display recording information
    • 1x to display the episode (or chapter)
    • 1x to display the scene
    • 1x to display the take
    • 2x to display the video file number
    • 2x to display the audio file number
  • 1x 16-channel multiplexer to communicate with the 7-segments individually
  • 8x2 button switches to adjust the recording numbers and seconds
  • 1x button switch to detect clap
  • 1x shake sensor to detect movement and switch on the clapper board
  • 1x DS1307 RTC to keep track of the time (using a tiny RTC module)
  • 1x I2C EEPROM to save numbers (also present on the tiny RTC module)
  • 1x power switching board (to switch off power completely)
  • 1x battery + protection, charge, and 5V step up circuit


Connect the peripherals the following way (peripheral signal; peripheral pin; micro-controller pin; micro-controller signal; comment):

  • DS1307 RTC to get the date and EEPROM to save the numbers
    • VCC; 8; ; +5V;
    • GND; 4; ; GND;
    • SCL; 6; PB10; I2C2_SCL;
    • SDA; 5; PB11; I2C2_SDA;
    • SQW; 7; PBO; GPIO; to synchronize the seconds
  • 2x MAX7219 in chain to show date and time
    • VCC; 19; ; +5V;
    • GND; 4; ; GND;
    • CLK; 13; PB13; SPI2_CLK;
    • DIN; 1; PB15; SPI2_MOSI;
    • LOAD; 12; PB12; SPI2_NSS; used as GPIO
  • 7x TM1637 to show the recording numbers
    • VDD; 16; ; +5V;
    • GND; 1; ; GND;
    • DIO; 17; PB7; GPIO; display with no clock signal will ignore data activity
    • CLK; 18; 3-9; I0-I6; on analog multiplexer
  • 1x CD74HC4067 16-channel multiplexer
    • VCC; 24; ; +5V;
    • GND; 12; ; GND;
    • common input; 1; PB6; GPIO; clock for TM1637
    • -E; 15; PB9; GPIO; to enable on low
    • S0; 10; PB3; GPIO; to select output
    • S1; 11; PB4; GPIO; to select output
    • S2; 14; PB5; GPIO; to select output
    • S3; 13; ; GND;
    • I0; 9; 18; CLK; TM1637 for audio 2
    • I1; 8; 18; CLK; TM1637 for video 2
    • I2; 7; 18; CLK; TM1637 for audio 1
    • I3; 6; 18; CLK; TM1637 for video 1
    • I4; 5; 18; CLK; TM1637 for episode
    • I5; 4; 18; CLK; TM1637 for scene
    • I6; 3; 18; CLK; TM1637 for take
  • 1x power board (custom), including SW-18015P shake switch between collector of PNP and emitter (with pull-down resistor and diode between shake switch and emitter)
    • GND; ; GND; step up voltage regulator;
    • IN; ; 5V; step up voltage regulator;
    • OUT; ; +5V; all other peripherals
    • base of PNP; SWITCH; PB8; to control power to all peripherals
    • not-collector connected pin of shake switch; ACTIVITY; PB1; to detect power-up activity
  • 1x clap switch
    • pin 1; 1; ; GND;
    • pin 2; 2; PB14; ; to detect clapping action (add pull-up resistor to improve detection)
  • 16x buttons, in a 4x4 matrix
    • 4x row 0 buttons; ; PA0; ; row 0
    • 4x row 1 buttons; ; PA1; ; row 1
    • 4x row 2 buttons; ; PA2; ; row 2
    • 4x row 3 buttons; ; PA3; ; row 3
    • 4x column 0 buttons; ; PA4; ; column 0, with a pull-down resistor
    • 4x column 1 buttons; ; PA5; ; column 1, with a pull-down resistor
    • 4x column 2 buttons; ; PA6; ; column 2, with a pull-down resistor
    • 4x column 3 buttons; ; PA15; ; column 3, with a pull-down resistor
  • 1x piezo-electric element (buzzer, without driver)
    • pin 1; ; PA7; TIM1_CH1; PWM with 4 kHz used
    • pin 2; ; PA8; TIM1_CH1N; PWM with 4 kHz used

All pins are configured using defines in the corresponding source code.



The source code uses the libopencm3 library. The projects is already a git submodules. To initialize and it you just need to run once: git submodule init and git submodule update.


To compile the firmware run make.


To generate doxygen documentation run make doc.


The firmware will be flashed using SWD (Serial Wire Debug). For that you need an SWD adapter. The Makefile uses a ST-Link V2 along OpenOCD software (per default), or a Black Magic Probe. To flash using SWD run make flash.


SWD also allows to debug the code running on the micro-controller using GDB. To start the debugging session run make debug.


The firmware offers serial communication over USART1 and USB (using the CDC ACM device class). Date and time can be set over serial.

You can also reset the board by setting the serial width to 5 bits over USB. To reset the board run make reset. This only works if the USB CDC ACM is running correctly and the micro-controller isn't stuck.