
Test board motor driver
TiboDevC/clockclock
Personal project of a kinetic clock inspired by Humans Since 1982, using 48 stepper motors to display time in an artistic and dynamic way.

Personal project of a kinetic clock inspired by Humans Since 1982, using 48 stepper motors to display time in an artistic and dynamic way.
Clockclock main is an open-source printed circuit board by TiboDevC, from the TiboDevC/clockclock repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 226.3 × 90.5 mm with 132 parts on 330 nets, routed with 1,445 tracks and 189 vias.
It is built around the ESP32-C3-DEVKITM-1, 74HCT595D and TXB0102DCT(LX), with the ECA1HM471B among its other parts. Its parts include 63 capacitors, 26 ICs, 4 connectors, 2 resistors and 2 switches. It belongs with the ESP32 and RISC-V boards of this library.
Personal project of a kinetic clock inspired by Humans Since 1982, using 48 stepper motors to display time in an artistic and dynamic way.

This project aims to create a kinetic clock with the following constraints:
The ClockClock architecture is built around a highly efficient, centralized control system that manages all 48 stepper motors from a single ESP32-C3 microcontroller. This approach contrasts with typical multi-motor projects that require multiple microcontrollers or complex distributed systems.
ESP32-C3 → TPIC6C595 Shift Registers (×12) → VID6606 Motor Drivers (×12) → BKA30D-R5 Motors (×48)
↓ ↓ ↓ ↓
3 GPIO 96 bits 2 signals per motor 2 bits per motor
pins (SPI @ 10MHz) (STEP + DIR) (individual control)Minimal GPIO Usage: The entire system uses only 3 GPIO pins (MOSI, SCK, SS) thanks to the shift register cascade. This leaves the ESP32-C3's remaining pins available for other peripherals (I2C for RTC, buttons, encoder, etc.).
Serial-to-Parallel Conversion: The 12 cascaded TPIC6C595 shift registers convert the serial SPI data stream into 96 parallel outputs. Each motor requires 2 control bits (STEP and DIR), allowing precise control of all 48 motors simultaneously.
Hierarchical Organization:
Data Flow Pipeline:
Time/Animation Logic → Motor Position Calculation → SPI Data Preparation →
Hardware SPI Transfer (10µs) → Parallel Latch → Simultaneous Motor Update
All motor blocks are linked together
A motor block
Features:
The motor itself with its PCB to connect to the motor driver
Each VID6606 driver (or equivalent AX1201728SG/STI6606z) can control 4 motors with only 2 signals per motor:
The AX1201728SG driver is connected to 4 motors (the two connectors on its right and left). On top, the shift register
Key Advantages:
The firmware implements European rules:
Files: elec/clockclock_main/ → PDF Schematic
Main board fully wired
Clock starts
| Component | Reference | Quantity | Function |
|---|---|---|---|
| Microcontroller | ESP32-C3-DevKitM-1 | 1 | Central control (RISC-V) |
| Shift Registers | TPIC6C595 | 12 | Output expansion |
| Motor Drivers | VID6606 / AX1201728SG | 12 | 4 motors per driver |
| RTC | DS3231 | 1 | Real-time clock |
| Radio Receiver | DCF77 CANADUINO | 1 | Atomic sync |
Buttons:
Rotary Encoder:
Only one button is connected (the orange button here), and it is used to enter the "shutdown" mode
Files: elec/clokclock_stepper/ → PDF Schematic
Each board is very simple and connects a BKA30D-R5 motor to its VID6606 driver.
Total: 24 identical motor boards
Row of motors mounted on the main frame
This is the part that took most of the design time! I tried many different materials and manufacturing methods before settling on laser-cut acrylic hands.
The challenge is to be able to manufacture hands that can be unmounted/remounted easily and that fit perfectly on the
motor shaft.
In addition, the hands should be as close together as possible in order to maintain a good viewing angle when looking at
the clock from the side.
Mounted hands
Here is the final solution I adopted:
Hands assembly
Both the top and bottom hands are in two acrylic parts glued together.
The top one as a 1mm acrylic part glued to a 3mm part that fits on the motor shaft.
The bottom one is a 3mm part glued to a 3mm part that fits on the motor shaft.
firmware/
├── platformio.ini # Project configuration
├── include/
│ └── cfg.hpp # Global constants (motors count, pins, etc.)
└── src/
├── main.cpp # Entry point
├── time_manager.* # Time management and DST
├── ntp_sync.* # Optional NTP sync (dev only)
├── animation/ # Animation system
│ ├── animation_manager.*
│ ├── wave_animation.*
│ └── sync_rotation_animation.*
├── button/ # Button and encoder handling
│ └── button.*
├── mode/ # Operating modes
│ ├── mode.*
│ ├── calibration.*
│ └── cfg_time.*
└── motor/ # Motor control
├── motor_motion.* # Mapping and sequences
├── motion.* # Display logic
├── shift_register.* # SPI interface
└── AccelStepper.* # Movement libraryThe firmware implements several operation modes:
The AnimationManager enables choreographed animations:
Available Animations:
Triggering:
PlatformIO dependencies:
NorthernWidget/DS3231@1.1.2: RTC interfacearduino-libraries/NTPClient@^3.2.1: Optional NTP sync# Install PlatformIO CLI
pip install platformio
# Or via VSCode: Install "PlatformIO IDE" extensioncd firmware/
pio run# Via USB
pio run --target upload
# Serial monitor
pio device monitorTo enable NTP sync during development, enable NTP_WIFI_SYNC define in main.cpp and configure your WiFi credentials.
Note: In production, WiFi is not required thanks to the DCF77 module.
Motor speed and acceleration can be adjusted in firmware/src/motor/motor_motion.cpp.
The firmware is configured for Central European Time (CET/CEST) by default. To change timezone, modify the DST
configuration in main.cpp.
| Document | Path | Format |
|---|---|---|
| Main board schematic | elec/clockclock_main/output/clockclock_main.pdf | |
| Main board PCB | elec/clockclock_main/clockclock_main.kicad_pcb | KiCad |
| Motor board schematic | elec/clokclock_stepper/output/clokclock_stepper.pdf | |
| Motor board PCB | elec/clokclock_stepper/clokclock_stepper.kicad_pcb | KiCad |
| Driver test board | elec/test_board_motor_driver/ | KiCad |
All datasheets are available in the datasheet/ folder:
The code includes conditional debug flags that can be enabled in respective source files:
DEBUG - General messagesDEBUG_MOTION - Motor control debugDEBUG_TIME_MGMT - Time management debugDEBUG_ANIMATION - Animation debugDEBUG_MODE - Mode debugGit pre-commit configuration available: .pre-commit-config.yaml
pip install -r requirements.txt
pre-commit installThis project is open-source. Free to use and modify.
Inspired by the artistic work of Humans Since 1982.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 38 | 100nF | Capacitor_SMD:C_0805_2012Metric | C1, C2, C11, C12, C14, C16, C17, C19, C21, C22, C24, C26, C27, C29, C31, C32 +22 |
| 24 | 4.7µF | Capacitor_SMD:C_0805_2012Metric | C10, C13, C15, C18, C20, C23, C25, C28, C30, C33, C35, C38, C40, C43, C45, C48 +8 |
| 12 | 74HCT595 | Package_SO:SOIC-16_3.9x9.9mm_P1.27mm | U3, U5, U7, U9, U11, U13, U15, U17, U19, U21, U23, U25 |
| 12 | Conn motor 0 | Connector_JST:JST_PH_B8B-PH-K_1x08_P2.00mm_Vertical | M1, M3, M5, M7, M9, M11, M13, M15, M17, M19, M21, M23 |
| 12 | Conn motor 1 | Connector_JST:JST_PH_B8B-PH-K_1x08_P2.00mm_Vertical | M2, M4, M6, M8, M10, M12, M14, M16, M18, M20, M22, M24 |
| 12 | VID6606 | Package_SO:SOP-28_8.4x18.16mm_P1.27mm | U4, U6, U8, U10, U12, U14, U16, U18, U20, U22, U24, U26 |
| 2 | 10k | Resistor_SMD:R_0805_2012Metric | R1, R2 |
| 2 | rotary_encoder | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J1, J4 |
| 1 | AM_DATA | TestPoint:TestPoint_Pad_1.5x1.5mm | TP5 |
| 1 | Button mode | Samacsys:FSM4JH | S2 |
| 1 | Button shutdown | Samacsys:FSM4JH | S1 |
| 1 | DATA_OUT | TestPoint:TestPoint_Pad_D1.0mm | TP8 |
| 1 | DCF77 board | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical | J2 |
| 1 | ECA-1HM471 | Capacitor_THT:CP_Radial_D10.0mm_P5.00mm | C3 |
| 1 | ESP32-C3-DEVKITM-1 | Snapeda:ESP32-C3-DEVKITM-1_XCVR_ESP32-C3-DEVKITM-1 | U1 |
| 1 | GND | TestPoint:TestPoint_THTPad_2.0x2.0mm_Drill1.0mm | GND_DCDC1 |
| 1 | RTC | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J3 |
| 1 | TP_GND | TestPoint:TestPoint_Pad_1.5x1.5mm | TP2 |
| 1 | TP_LATCH_CLK | TestPoint:TestPoint_Pad_2.0x2.0mm | TP4 |
| 1 | TP_LATCH_CLK | TestPoint:TestPoint_Pad_D1.0mm | TP6 |
| 1 | TP_SHIFT_CLK | TestPoint:TestPoint_Pad_2.0x2.0mm | TP3 |
| 1 | TP_SHIFT_CLK | TestPoint:TestPoint_Pad_D1.0mm | TP7 |
| 1 | TP_VCC | TestPoint:TestPoint_Pad_1.5x1.5mm | TP1 |
| 1 | TXB0102DCT | Package_SO:VSSOP-8_2.3x2mm_P0.5mm | U2 |
| 1 | USB power to ESP32 | TestPoint:TestPoint_2Pads_Pitch2.54mm_Drill0.8mm | JP1 |
| 1 | VCC 5V | TestPoint:TestPoint_Keystone_5005-5009_Compact | VCC_DCDC1 |
It measures 226.3 × 90.5 mm and has 2 copper layers, 1.6 mm thick.
132 parts, built around the ESP32-C3-DEVKITM-1, 74HCT595D, TXB0102DCT(LX) and ECA1HM471B. 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 TiboDevC/clockclock repository on GitHub, at the commit this page was made from: the board is elec/clockclock_main/clockclock_main.kicad_pcb and its schematic elec/clockclock_main/clockclock_main.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

TiboDevC/clockclock
Personal project of a kinetic clock inspired by Humans Since 1982, using 48 stepper motors to display time in an artistic and dynamic way.

TiboDevC/clockclock
Personal project of a kinetic clock inspired by Humans Since 1982, using 48 stepper motors to display time in an artistic and dynamic way.

ayaamghi/4C
4 Channel motor controller board for high voltage high amperage solutions. Integrated PID.


TheYoctoJester/dutler
A bench butler for your Device Under Test: turns a Raspberry Pi Pico into a USB-serial console bridge with power-relay and MOSFET strap/reset control for embedded-Linux bring-up and hardware-in-the-loop.


rumbletech/Slug_v1.0
Slug ( Slog/Serial Logger ) is an open source firmware and an open source hardware project , it implements logging of serial buses like USART,I2C,SPI to an SD Card.


