
Panel
sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.
Panel2 is an open-source printed circuit board by sean618, from the sean618/MakerTiles repository on GitHub, published under the MIT licence. It is a 2-layer board of 188.5 × 167.3 mm with 585 parts on 647 nets, routed with 6,356 tracks and 1,104 vias.
It is built around the STM32G030F6P6, STM32F103C8T6 and STM32G030K6T6, with the DRV8833PWP, LTR-381RGB-01 and WS2812B among its other parts. It belongs with the STM32 boards of this library.
MakerTiles is a system of modular, snap-together electronic tiles. Each tile is a small STM32-based board with a single job — a strip of LEDs, a joystick, a motor, a distance sensor, a screen, a speaker, and so on. Tiles connect on a shared bus, a USB tile bridges the bus to a PC, and a Python daemon on the PC discovers every connected tile and lets you read its inputs and drive its outputs.
This repository holds the whole stack: the hardware (KiCad board designs), the firmware (STM32 board projects + shared driver libraries), the protocols that move data over the bus, and the daemon that talks to it all from a PC.
[ tile ]──[ tile ]──[ tile ]── … ──[ USB tile ]──USB──▶ [ PC / Python daemon ]
└───────────────────────────────────┘
shared SPI bus (MicroBus + Field Protocol)Two protocols stacked on top of each other carry everything:
One tile acts as the master (the USB tile, which also bridges the bus to a host PC). Every other tile is a node. On the PC, the daemon opens the USB serial port, discovers the attached tiles, and exposes each one as an object you can interact with.
hardware/ KiCad designs for every tile (Boards/) + shared symbol/footprint
libraries, 3D models and BOMs (Libraries/). Old/ holds retired
prototype boards.
firmware/ STM32 firmware.
Boards/ One STM32CubeIDE project per tile (Button, LedStrip, Motor,
Joystick, Screen, USB, …). Mostly STM32G030 nodes; the USB
master is an STM32F103.
Libraries/ Shared C/C++ drivers used across boards (ledStrip, screen,
imu, speaker, servos, …) plus helpers (myAssert, fonts).
Documents/ NewBoardSetup.txt — the checklist for bringing up a new tile
(CubeMX peripheral config + firmware wiring).
protocol/ The shared protocol code, host-buildable and testable.
microbus/ MicroBus transport (C++). Leaf component.
fieldprotocol/ Field Protocol (C++), depends on microbus. Also built as the
masterNodeSystem shared library the Python daemon loads.
stm32/ STM32 glue binding the protocols to real SPI hardware
(stm32F1SpiMaster, stm32Node). Boards reach this via a
Core/stm32 symlink.
daemon/ Python daemon (the PC side). Opens the USB serial port, runs
board discovery, and drives tiles over the Field Protocol.
src/makertiles/ is the package; tests/ holds its test suites.The daemon is a Python package (makertiles, src-layout under daemon/). At a
high level you point it at a serial port and it hands you back the discovered
tiles:
import makertiles
tiles, manager = makertiles.start(port_name="/dev/ttyUSB0")
tiles.led_strip.colour = makertiles.red # set an output field
position = tiles.dial.position # read an input fieldIt can drive the C protocol two ways: over serial to real hardware in
production, or — in tests — by loading the masterNodeSystem shared library
directly via ctypes, so the real Python daemon exercises the real C protocol
without any hardware attached. That same library is what catches drift between
the C and Python sides of the wire contract.
Optional extras: Pillow (images) for the screen image-drawing helpers.
The C components and the Python daemon build in one CMake tree, and every test suite runs from a single command:
./build_and_test.shThis configures, builds (MicroBus, the Field Protocol + its shared library, and
the system test), then runs ctest. Python test deps (pytest, pyserial) are
installed automatically if missing.
To re-run only the failures, verbosely:
ctest --test-dir build --rerun-failed --output-on-failure| CTest name | What it covers |
|---|---|
microbus_unit | MicroBus transport unit tests (host). |
fieldprotocol_unit | Field Protocol unit tests against a mock MicroBus. |
system_integration | Full C stack (node + master) over the real MicroBus. |
python_unit | Python Field-Protocol encode/decode round trips. |
python_integration | The real Python daemon driving the C protocol via the .so. |
python_integration is the suite that exercises both languages together, so it
is the one that catches C↔Python wire-contract drift.
The firmware board projects under firmware/Boards/ are separate
STM32CubeIDE/CMake projects and are not part of the host build above — they
are flashed to real tiles. See firmware/Documents/NewBoardSetup.txt for the
per-board hardware and firmware bring-up checklist.
Each firmware/Boards/<Tile>/ directory is its own STM32 project (.ioc for
CubeMX, a linker script for the target part, and CubeIDE debug launch configs).
Nodes are generally STM32G030; the USB master is an STM32F103. The protocol
sources are shared into each board via symlinks (Core/stm32,
Core/Libraries, etc.) rather than copied — see the setup checklist for the
exact links and the required SPI/timer/interrupt peripheral configuration.
Released under the MIT License.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 64 | 75R | boards:R_0402_1005Metric | BATR1, BATR2, BATR3, BATR4, BEXR5, BEXR6, BEXR7, BEXR8, BLKR1, BLKR2, BLKR3, BLKR4, BTSR1, BTSR2, BTSR3, BTSR4 +48 |
| 64 | WS2812B | boards:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm | MATD1, MATD2, MATD10, MATD11, MATD12, MATD13, MATD14, MATD15, MATD16, MATD17, MATD18, MATD19, MATD20, MATD21, MATD22, MATD23 +48 |
| 62 | 4.7uF | boards:C_0402_1005Metric | BATC2, BATC8, BATC9, BATC13, BATC14, BEXC4, BEXC8, BEXC9, BLKC2, BLKC8, BLKC9, BTSC2, BTSC8, BTSC9, BUTC2, BUTC8 +46 |
| 50 | M2.5MountingHole | boards:MountingHole_2.7mm_M2.5_ISO7380 | BATH1, BATH2, BEXH1, BEXH2, BEXH3, BEXH4, BLKH1, BLKH2, BLKH3, BLKH4, BTSH1, BTSH2, BTSH3, BTSH4, BUTH1, BUTH2 +34 |
| 33 | FFC_connector_16p_hinge_lock | boards:FFC_connector_16p_hinge_lock | BATJ1, BATJ3, BEXJ5, BEXJ7, BLKJ3, BLKJ5, BTSJ3, BTSJ5, BUTJ1, BUTJ3, DIAJ1, DIAJ2, DISJ3, DISJ5, JOYJ2, JOYJ5 +17 |
| 22 | 10K | boards:R_0402_1005Metric | BATR18, BATR19, BLKR5, BLKR6, BLKR7, BLKR8, BLKR9, BTSR5, BTSR6, BTSR7, BTSR8, BTSR9, BUTR5, DIAR5, DISR5, DISR6 +6 |
| 19 | 22uF_25V | boards:C_0805_2012Metric | BATC5, BATC10, BATC11, MOTC4, MOTC10, MOTC11, MOTC12, MOTC13, MOTC14, MOTC15, MOTC16, SERC10, SERC11, SERC12, SERC13, SERC14 +3 |
| 18 | 0.1uF | boards:C_0402_1005Metric | BATC1, BATC3, BEXC3, BLKC1, BTSC1, BUTC1, DIAC1, DISC11, JOYC1, LEDC1, LIGC1, MATC4, MOTC1, SCRC1, SERC4, TMPC1 +2 |
| 18 | ME6211C33M5G-N | boards:SOT-23-5 | BATU2, BEXU2, BLKU2, BTSU2, BUTU2, DIAU2, DISU2, JOYU2, LEDU2, LIGU2, MATU1, MOTU2, SCRU2, SERU2, TMPU2, USBU2 +2 |
| 17 | 01x06_2.54mm_Female | boards:01x06_2.54mm_Female | BATJ6, BEXJ3, BLKJ2, BTSJ2, BUTJ5, DIAJ5, DISJ2, JOYJ3, LEDJ3, LIGJ2, MATJ2, MOTJ7, SCRJ2, SERJ3, TMPJ2, USBJ3 +1 |
| 17 | 01x06_2.54mm_Male | boards:01x06_2.54mm_Male | BATJ7, BEXJ1, BLKJ1, BTSJ1, BUTJ2, DIAJ3, DISJ1, JOYJ1, LEDJ1, LIGJ1, MATJ1, MOTJ5, SCRJ1, SERJ1, TMPJ1, USBJ1 +1 |
| 17 | swd_4pin | boards:swd_header | BATJ4, BEXJ4, BLKJ4, BTSJ4, BUTJ4, DIAJ4, DISJ4, JOYJ4, LEDJ4, LIGJ4, MATJ3, MOTJ4, SCRJ4, SERJ4, TMPJ4, USBJ4 +1 |
| 13 | STM32G030F6P6 | boards:TSSOP-20_4.4x6.5mm_P0.65mm | BATU3, BLKU3, BTSU3, BUTU3, DIAU3, JOYU3, LEDU3, LIGU3, MATU2, MOTU3, SCRU3, TMPU3, WIRU3 |
| 10 | button_6x6x7 | boards:SW_SPST_PTS645 | BLKSW1, BLKSW2, BLKSW3, BLKSW4, BLKSW6, BTSSW1, BTSSW2, BTSSW3, BTSSW4, BTSSW6 |
| 9 | 22uF_10V | boards:C_0603_1608Metric | MATC6, MATC7, MATC8, MATC11, MATC12, MATC13, MATC15, MATC16, WIRC13 |
| 8 | Conn_01x03_Pin | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | SERJ2, SERJ5, SERJ6, SERJ7, SERJ8, SERJ9, SERJ10, SERJ11 |
| 6 | 12pF | boards:C_0402_1005Metric | DISC6, DISC7, USBC6, USBC7, WIRC5, WIRC6 |
| 5 | 1K | boards:R_0402_1005Metric | BUTR6, LEDR5, LEDR7, MATR2, MATR4 |
| 5 | 5.1K | boards:R_0402_1005Metric | BATR11, BATR12, BATR17, USBR1, USBR2 |
| 5 | N_MOSFET | boards:SOT-23 | BATQ5, BUTQ1, LEDQ3, MATQ1, SCRQ2 |
| 4 | + | boards:BoardText | BATIGNORE4, BATIGNORE4, BATIGNORE7, BATIGNORE7 |
| 4 | - | boards:BoardText | BATIGNORE5, BATIGNORE5, BATIGNORE6, BATIGNORE6 |
| 4 | 120R | boards:R_0402_1005Metric | WIRR1, WIRR2, WIRR3, WIRR4 |
| 4 | 1N4148W | Diode_SMD:D_SOD-123 | BLKD2, BTSD2, BUTD3, DIAD2 |
| 3 | 100K | boards:R_0402_1005Metric | BATR14, BATR15, BATR20 |
| 3 | Crystal_16M_small | boards:Crystal_SMD_2016-4Pin_2.0x1.6mm | DISY1, USBY2, WIRY2 |
| 2 | 0.2R | Resistor_SMD:R_1210_3225Metric | MOTR5, MOTR6 |
| 2 | 5V | boards:BoardText | LEDIGNORE4, SERIGNORE3 |
| 2 | Buttons v0.5 | boards:BoardText | BLKIGNORE1, BTSIGNORE1 |
| 2 | ConnBattery_JST_S2B-PH-K-S | boards:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | BATJ5, BATJ8 |
| 2 | Conn_02x11_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x11_P2.54mm_Vertical | BEXJ2, BEXJ6 |
| 2 | DATA | boards:BoardText | LEDIGNORE3, SERIGNORE4 |
| 2 | GND | boards:BoardText | LEDIGNORE2, SERIGNORE2 |
| 2 | PMOS_2A | boards:SOT-23 | BATQ2, BATQ6 |
| 2 | S2B-ZR-SM4A-TF | boards:S2B-ZR-SM4A-TF | MOTJ8, MOTJ9 |
| 2 | SM06B-SRSS-TB | Connector_JST:JST_SH_SM06B-SRSS-TB_1x06-1MP_P1.00mm_Horizontal | MOTJ2, MOTJ6 |
| 2 | STM32F103C8T6 | Package_QFP:LQFP-48_7x7mm_P0.5mm | DISU3, USBU1 |
| 2 | STM32G030K6T6 | Package_QFP:LQFP-32_7x7mm_P0.8mm | BEXU1, SERU1 |
| 1 | 0.01R | boards:R_0805_2012Metric | BATR13 |
| 1 | 0.1uF_50V | boards:C_0402_1005Metric | MOTC5 |
| 1 | 1 | boards:BoardText | BEXIGNORE2 |
| 1 | 1 battery! | boards:BoardText | BATIGNORE9 |
| 1 | 1.5K | boards:R_0402_1005Metric | USBR12 |
| 1 | 1.5pF | boards:C_0402_1005Metric | WIRC10 |
| 1 | 10R | boards:R_0402_1005Metric | SCRR5 |
| 1 | 10nF | boards:C_0402_1005Metric | BATC6 |
| 1 | 10pF | boards:C_0402_1005Metric | BATC7 |
| 1 | 11 | boards:BoardText | BEXIGNORE3 |
| 1 | 12 | boards:BoardText | BEXIGNORE4 |
| 1 | 150K | boards:R_0402_1005Metric | BATR10 |
| 1 | 1pF | boards:C_0402_1005Metric | WIRC7 |
| 1 | 1uH_3.2A | Inductor_SMD:L_1008_2520Metric | BATL1 |
| 1 | 2.2nF | boards:C_0402_1005Metric | WIRC4 |
| 1 | 2.2uF | boards:C_0402_1005Metric | MOTC6 |
| 1 | 2.7nH | boards:C_0402_1005Metric | WIRL4 |
| 1 | 22 | boards:BoardText | BEXIGNORE5 |
| 1 | 22K | boards:R_0402_1005Metric | WIRR6 |
| 1 | 3.9nH | boards:C_0402_1005Metric | WIRL3 |
| 1 | 330R | boards:R_0402_1005Metric | BATR16 |
| 1 | 33nF | boards:C_0402_1005Metric | WIRC3 |
| 1 | 4.7pF | boards:C_0402_1005Metric | WIRC14 |
| 1 | 47uF_16V | boards:C_1210_3225Metric | LEDC4 |
| 1 | 510K | boards:R_0402_1005Metric | BATR9 |
| 1 | 8.2nH | boards:C_0402_1005Metric | WIRL1 |
| 1 | Antenna_MIFA_Cypress | boards:Antenna_cypress_MIFA | WIRAE1 |
| 1 | Battery v0.5 | boards:BoardText | BATIGNORE1 |
| 1 | Button Expansion v0.5 | boards:BoardText | BEXIGNORE1 |
| 1 | Button v0.5 | boards:BoardText | BUTIGNORE1 |
| 1 | DRV8833PWP | boards:HTSSOP-16-1EP_4.4x5mm_P0.65mm_EP3.4x5mm_Mask2.46x2.31mm_ThermalVias | MOTU1 |
| 1 | Dial v0.5 | boards:BoardText | DIAIGNORE1 |
| 1 | Distance v0.5 | boards:BoardText | DISIGNORE1 |
| 1 | FFC_connector_22p_dual_sided | boards:FFC_connector_22p_hinge_lock | SCRJ3 |
| 1 | HDC1080 | Package_SON:Texas_PWSON-N6 | TMPU1 |
| 1 | INA180A3 | boards:SOT-23-5 | BATU6 |
| 1 | Joystick | boards:Joystick | JOYU1 |
| 1 | Joystick v0.5 | boards:BoardText | JOYIGNORE1 |
| 1 | LED v0.5 | boards:BoardText | LEDIGNORE1 |
| 1 | LTR-381RGB | boards:LTR-381RGB | LIGU1 |
| 1 | LedMatrix v0.5 | boards:BoardText | MATIGNORE1 |
| 1 | LightSound v0.5 | boards:BoardText | LIGIGNORE1 |
The 550 most common of 585 parts.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

sean618/MakerTiles
Modular STM32 electronic-tile system: hardware, firmware, the MicroBus + Field Protocol stack, and a Python daemon.

Tomoshibi-technology/RCJ-Japan2024-Circuit
RoboCup JapanOpen 2024とEindohoven 2024に向けての回路開発

mcapdeville/esp32s3aprs
ESP32s3 APRS beacon/tracker/logger, USB kiss TNC , USB audio FM tranceiver with Micropython shell
/2-ECAD/1-Main/EVT-PCB.kicad_pcb.jpg?size=s&soon)

Janky-Jingle-Crew/SouthPoleLevitator
2025 Christmas card "South Pole Levitator"

apantelic/ohmsprint_kicad
Energy measurement system designed in KiCad, including schematic, BOM, and 2-layer PCB layout


It measures 188.5 × 167.3 mm and has 2 copper layers, 1.6 mm thick.
585 parts, built around the STM32G030F6P6, STM32F103C8T6, STM32G030K6T6 and DRV8833PWP. 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 sean618/MakerTiles repository on GitHub, at the commit this page was made from: the board is hardware/Boards/Extra/Panel2/v0.5/Panel2.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).