Skip to the content
2 layersMotorCtrl, the printed circuit board in 3D

Wireless control and live telemetry for a dual 12 V BLDC motor controller, built on the WeAct STM32WB55 (Cortex-M4 + Bluetooth LE 5.0).

Copper layers
2
Thickness
1.6 mm
Parts
29
Nets
19
Pads
96
Tracks, vias
0, 0
Routed
Not yet
KiCad
KiCad 10.0 (file 20260206)
Created
4 Jun 2026
Updated
18 Jun 2026

Overview

MotorCtrl is an open-source printed circuit board by Vaneiges, from the Vaneiges/MotorCtrl-ble-STM32 repository on GitHub. It is a 2-layer board with 29 parts on 19 nets.

It is built around the AMS1117-3.3 and SS14. Its parts include 9 capacitors, 9 resistors, 4 connectors, 3 switches and 2 ICs. It belongs with the robots and motor control boards and the STM32 boards of this library.

Main components

2

README

README.md

MotorCtrl BLE — STM32WB55 Dual BLDC Motor Controller (Phase 2)

Wireless control and live telemetry for a dual 12 V BLDC motor controller, built on the WeAct STM32WB55 (Cortex-M4 + Bluetooth LE 5.0). Phase 2 adds BLE control plus a Web Bluetooth dashboard — drive the motors and watch live data from a phone or laptop, with no app install. The original push-button control still works in parallel.

🌐 Live dashboard: https://motafared.github.io/MotorCtrl-ble-STM32/ — open in Chrome / Edge on desktop or Android (no install). Needs Bluetooth on; Android also needs Location enabled for BLE scanning.

📄 Full delivery document: docs/phase2_delivery.md (styled HTML) — scope, BOM, wiring, flashing, GATT reference, dashboard usage, troubleshooting.

Repository layout (monorepo)

text
Phase2-Project/
├── firmware/   STM32WB55 application (STM32CubeIDE) + BLE GATT services
├── WebApp/     Web Bluetooth dashboard (single-page, no install)
├── kicad/      Hardware design (KiCad, generated from SKiDL)
└── docs/       Delivery doc + connection diagrams

At a glance

  • Two BLDC motors, closed-loop PID speed control (100 ms tick), tachometer feedback.
  • Three run modes: Timed run (default 35 s) · Continuous (CONTINUE button: run while held; app command: latched until Stop) · Stopped.
  • Live telemetry: actual speed, cumulative rotations, elapsed time, and run state.
  • Buttons + BLE in parallel — the dashboard tracks physical button presses live.

Hardware

ItemDetail
MCUWeAct STM32WB55 Core Board (STM32WB55CGU6, 64 MHz, BLE 5.0)
Motors2× BLDC 12 V 4-wire
PWMPA0 (M1) / PA1 (M2) — TIM2, 20 kHz
TachometerPA8 (M1) / PA9 (M2) — TIM1 input capture
PID tickTIM16 — 100 ms
ButtonsPA2 STOP, PA3 START, PA4 CONTINUE — EXTI, active-HIGH, internal pull-down
Status LEDPE4 (blue) — ON running, 5 Hz heartbeat

BLE GATT

Advertised name MotorCtrl. All multi-byte values little-endian.

Control service 0x0001

CharUUIDTypeAccessMeaning
TSM10x0002u16R/WTarget speed M1 (RPM)
TSM20x0003u16R/WTarget speed M2 (RPM)
CT0x0004u16R/WCycle time (s)
CMD0x0005u8W0x01 start timed · 0x02 stop · 0x03 start continuous

Telemetry service 0x0010 (Read / Notify)

CharUUIDTypeMeaning
ASM1 / ASM20x0011 / 0x0012u16Actual speed M1 / M2 (RPM)
RM1 / RM20x0013 / 0x0014u32Cumulative rotations M1 / M2
ET0x0015u16Elapsed time (s)
STATUS0x0016u8Run state: 0 idle · 1 timed · 2 continuous

Reads return live values (refreshed from firmware state on each read). STATUS is notified on every transition — BLE command, timed auto-stop, and physical button presses.

Build & flash (firmware)

This project is STM32CubeIDE only.

  1. One-time: flash the CPU2 BLE stack with STM32CubeProgrammer — stm32wb5x_FUS_fw.bin at 0x080EC000 (skip if FUS ≥ 1.2.0), then stm32wb5x_BLE_Stack_full_fw.bin at 0x080C0000.
  2. Open firmware/ in STM32CubeIDE → Build All → Run to flash the application.

Build modes — one switch in firmware/Core/Inc/main.h:

MOTOR_MODETacho PPRPWM polarityUse
MODE_KHALED2non-invertedbench testing
MODE_TOON6invertedclient hardware

Defaults: target 1200 RPM/motor, 35 s cycle, PID Kp = 0.012.

Run the dashboard

Hosted (no install): open https://motafared.github.io/MotorCtrl-ble-STM32/ in Chrome / Edge.

Or serve it locally:

bash
cd WebApp
python -m http.server 8000      # then open http://localhost:8000 in Chrome
  • Browsers: Chrome / Edge / Brave (desktop, Android); Bluefy on iOS.
  • Web Bluetooth needs a secure context (https:// or http://localhost); file:// won't work.
  • After flashing new firmware, hard-reload the page (Ctrl+Shift+R) to avoid a cached script.

License

Proprietary — all rights reserved. Client project for Toon.

Parts

29
QtyValueFootprintReferences
6100nFCapacitor_SMD:C_0805_2012MetricC4, C5, C6, C7, C8, C9
510kResistor_SMD:R_0805_2012MetricR1, R3, R5, R8, R9
41kResistor_SMD:R_0805_2012MetricR2, R4, R6, R7
210uFCapacitor_SMD:CP_Elec_5x5.4C2, C3
112V_DC_JackConnector_BarrelJack:BarrelJack_HorizontalJ1
1470uF/25VCapacitor_THT:CP_Radial_D8.0mm_P3.50mmC1
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U1
1CONTINUEButton_Switch_THT:SW_PUSH_6mmSW3
1LED_BLUELED_SMD:LED_0805_2012MetricD2
1Motor_M1Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ3
1Motor_M2Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ4
1SS14Diode_SMD:D_SMAD1
1STARTButton_Switch_THT:SW_PUSH_6mmSW1
1STOPButton_Switch_THT:SW_PUSH_6mmSW2
1SWDConnector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ5
1WeAct_STM32WB55Connector_PinHeader_2.54mm:PinHeader_2x12_P2.54mm_VerticalU2

Similar boards

  • 4 layers72.6 × 170 mmOpenJBOD RP2040, the printed circuit board in 3D

    OpenJBOD RP2040

    OpenJBOD/rp2040

    This repository contains the hardware design files OpenJBOD RP2040 Baseboard.

    129 parts87CERN-OHL-P-2.0
  • 2 layers90.2 × 90 mmSra dev board 2026, the printed circuit board in 3D

    Sra dev board 2026

    SRA-VJTI/sra-board-hardware-design

    ESP32-based Development Board for Robotics and Embedded Applications

    219 parts81MIT
  • 2 layers55 × 100 mmESP32AY revD2, the printed circuit board in 3D

    ESP32AY revD2

    djspawnbrest/ESP32AY

    ZxPod - ESP32 based AY multiformat player

    138 parts59GPL-3.0
  • 2 layers40 × 68 mmMULTIGW, the printed circuit board in 3D

    MULTIGW

    nuclearcat/ESP32ETH

    Simple ESP32 with native ethernet using LAN8720 phy, Arduino compatible

    32 parts30LGPL-2.1
  • 4 layers44.5 × 22.5 mmIkea fyrtur, the printed circuit board in 3D

    Ikea fyrtur

    mjuhanne/ikea-fyrtur

    ESP8266 WiFi module PCB for Ikea Fyrtur blinds

    46 parts23MIT
  • 4 layers110 × 50 mmOpenHand v1, the printed circuit board in 3D

    OpenHand v1

    AleksaHeler/OpenHand

    Our attempt at a prosthetic hand using STM32 microcontroller with custom PCB and mechanics

    214 parts13MIT
  • 2 layers90 × 74 mmFsk energymeter, the printed circuit board in 3D

    Fsk energymeter

    luftaquila/fsk-energymeter

    E-Formula electric energy meter for Formula Student Korea

    92 parts13
  • 4 layers64 × 60 mmDronemagnav, the printed circuit board in 3D

    Dronemagnav

    ajisrawi/dronemagnav

    Magnetic-anomaly navigation (MagNav) board + firmware for drones: ESP32-S3, BMI088, LIS3MDL, BMP280, u-blox GNSS, WDMAM map matching, particle filter, MAVLink, phone route planner. Proprietary - all rights reserved.

    60 parts11

Questions

What parts does the MotorCtrl use?

29 parts, built around the AMS1117-3.3 and SS14. 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.

Where can I download the MotorCtrl KiCad files?

From the Vaneiges/MotorCtrl-ble-STM32 repository on GitHub, at the commit this page was made from: the board is kicad/MotorCtrl/MotorCtrl.kicad_pcb and its schematic kicad/MotorCtrl/MotorCtrl - Copy.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the MotorCtrl design in my own project?

Its repository states no licence, so its author keeps all rights: ask Vaneiges before reusing the design.