Skip to the content
2 layers188.5 × 167.3 mmPanel2, the printed circuit board in 3D

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

Size
188.5 × 167.3 mm
Copper layers
2
Thickness
1.6 mm
Parts
585
Nets
647
Pads
2,573
Tracks, vias
6,356, 1,104
Pours
23
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
21 Jun 2026
Updated
21 Jun 2026

Overview

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.

Main components

11

README

README.md

MakerTiles

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.

text
    [ tile ]──[ tile ]──[ tile ]── … ──[ USB tile ]──USB──▶ [ PC / Python daemon ]
       └───────────────────────────────────┘
          shared SPI bus  (MicroBus + Field Protocol)

How it fits together

Two protocols stacked on top of each other carry everything:

  • MicroBus — the transport. A master/multi-node protocol over a shared SPI-style link between microcontrollers, built for speed and very low RAM: fixed-size packets, a time-slotted schedule the master broadcasts in every packet, and a small per-node sliding window that gives reliable, in-order delivery with no dynamic allocation.
  • Field Protocol — the application layer. Rides inside a MicroBus packet and describes each tile as a set of named, typed fields (e.g. a LED strip's colour, a dial's position). The daemon enumerates tiles, reads their field tables, and gets/sets field values without knowing the tile type in advance.

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.

Repository layout

text
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 PC daemon

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:

python
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 field

It 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.

Building and testing

The C components and the Python daemon build in one CMake tree, and every test suite runs from a single command:

bash
./build_and_test.sh

This 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:

bash
ctest --test-dir build --rerun-failed --output-on-failure

Test suites

CTest nameWhat it covers
microbus_unitMicroBus transport unit tests (host).
fieldprotocol_unitField Protocol unit tests against a mock MicroBus.
system_integrationFull C stack (node + master) over the real MicroBus.
python_unitPython Field-Protocol encode/decode round trips.
python_integrationThe 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.

Building firmware for a tile

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.

License

Released under the MIT License.

Parts

585
QtyValueFootprintReferences
6475Rboards:R_0402_1005MetricBATR1, BATR2, BATR3, BATR4, BEXR5, BEXR6, BEXR7, BEXR8, BLKR1, BLKR2, BLKR3, BLKR4, BTSR1, BTSR2, BTSR3, BTSR4 +48
64WS2812Bboards:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mmMATD1, MATD2, MATD10, MATD11, MATD12, MATD13, MATD14, MATD15, MATD16, MATD17, MATD18, MATD19, MATD20, MATD21, MATD22, MATD23 +48
624.7uFboards:C_0402_1005MetricBATC2, BATC8, BATC9, BATC13, BATC14, BEXC4, BEXC8, BEXC9, BLKC2, BLKC8, BLKC9, BTSC2, BTSC8, BTSC9, BUTC2, BUTC8 +46
50M2.5MountingHoleboards:MountingHole_2.7mm_M2.5_ISO7380BATH1, BATH2, BEXH1, BEXH2, BEXH3, BEXH4, BLKH1, BLKH2, BLKH3, BLKH4, BTSH1, BTSH2, BTSH3, BTSH4, BUTH1, BUTH2 +34
33FFC_connector_16p_hinge_lockboards:FFC_connector_16p_hinge_lockBATJ1, BATJ3, BEXJ5, BEXJ7, BLKJ3, BLKJ5, BTSJ3, BTSJ5, BUTJ1, BUTJ3, DIAJ1, DIAJ2, DISJ3, DISJ5, JOYJ2, JOYJ5 +17
2210Kboards:R_0402_1005MetricBATR18, BATR19, BLKR5, BLKR6, BLKR7, BLKR8, BLKR9, BTSR5, BTSR6, BTSR7, BTSR8, BTSR9, BUTR5, DIAR5, DISR5, DISR6 +6
1922uF_25Vboards:C_0805_2012MetricBATC5, BATC10, BATC11, MOTC4, MOTC10, MOTC11, MOTC12, MOTC13, MOTC14, MOTC15, MOTC16, SERC10, SERC11, SERC12, SERC13, SERC14 +3
180.1uFboards:C_0402_1005MetricBATC1, BATC3, BEXC3, BLKC1, BTSC1, BUTC1, DIAC1, DISC11, JOYC1, LEDC1, LIGC1, MATC4, MOTC1, SCRC1, SERC4, TMPC1 +2
18ME6211C33M5G-Nboards:SOT-23-5BATU2, BEXU2, BLKU2, BTSU2, BUTU2, DIAU2, DISU2, JOYU2, LEDU2, LIGU2, MATU1, MOTU2, SCRU2, SERU2, TMPU2, USBU2 +2
1701x06_2.54mm_Femaleboards:01x06_2.54mm_FemaleBATJ6, BEXJ3, BLKJ2, BTSJ2, BUTJ5, DIAJ5, DISJ2, JOYJ3, LEDJ3, LIGJ2, MATJ2, MOTJ7, SCRJ2, SERJ3, TMPJ2, USBJ3 +1
1701x06_2.54mm_Maleboards:01x06_2.54mm_MaleBATJ7, BEXJ1, BLKJ1, BTSJ1, BUTJ2, DIAJ3, DISJ1, JOYJ1, LEDJ1, LIGJ1, MATJ1, MOTJ5, SCRJ1, SERJ1, TMPJ1, USBJ1 +1
17swd_4pinboards:swd_headerBATJ4, BEXJ4, BLKJ4, BTSJ4, BUTJ4, DIAJ4, DISJ4, JOYJ4, LEDJ4, LIGJ4, MATJ3, MOTJ4, SCRJ4, SERJ4, TMPJ4, USBJ4 +1
13STM32G030F6P6boards:TSSOP-20_4.4x6.5mm_P0.65mmBATU3, BLKU3, BTSU3, BUTU3, DIAU3, JOYU3, LEDU3, LIGU3, MATU2, MOTU3, SCRU3, TMPU3, WIRU3
10button_6x6x7boards:SW_SPST_PTS645BLKSW1, BLKSW2, BLKSW3, BLKSW4, BLKSW6, BTSSW1, BTSSW2, BTSSW3, BTSSW4, BTSSW6
922uF_10Vboards:C_0603_1608MetricMATC6, MATC7, MATC8, MATC11, MATC12, MATC13, MATC15, MATC16, WIRC13
8Conn_01x03_PinConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalSERJ2, SERJ5, SERJ6, SERJ7, SERJ8, SERJ9, SERJ10, SERJ11
612pFboards:C_0402_1005MetricDISC6, DISC7, USBC6, USBC7, WIRC5, WIRC6
51Kboards:R_0402_1005MetricBUTR6, LEDR5, LEDR7, MATR2, MATR4
55.1Kboards:R_0402_1005MetricBATR11, BATR12, BATR17, USBR1, USBR2
5N_MOSFETboards:SOT-23BATQ5, BUTQ1, LEDQ3, MATQ1, SCRQ2
4+boards:BoardTextBATIGNORE4, BATIGNORE4, BATIGNORE7, BATIGNORE7
4-boards:BoardTextBATIGNORE5, BATIGNORE5, BATIGNORE6, BATIGNORE6
4120Rboards:R_0402_1005MetricWIRR1, WIRR2, WIRR3, WIRR4
41N4148WDiode_SMD:D_SOD-123BLKD2, BTSD2, BUTD3, DIAD2
3100Kboards:R_0402_1005MetricBATR14, BATR15, BATR20
3Crystal_16M_smallboards:Crystal_SMD_2016-4Pin_2.0x1.6mmDISY1, USBY2, WIRY2
20.2RResistor_SMD:R_1210_3225MetricMOTR5, MOTR6
25Vboards:BoardTextLEDIGNORE4, SERIGNORE3
2Buttons v0.5boards:BoardTextBLKIGNORE1, BTSIGNORE1
2ConnBattery_JST_S2B-PH-K-Sboards:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalBATJ5, BATJ8
2Conn_02x11_Odd_EvenConnector_PinHeader_2.54mm:PinHeader_2x11_P2.54mm_VerticalBEXJ2, BEXJ6
2DATAboards:BoardTextLEDIGNORE3, SERIGNORE4
2GNDboards:BoardTextLEDIGNORE2, SERIGNORE2
2PMOS_2Aboards:SOT-23BATQ2, BATQ6
2S2B-ZR-SM4A-TFboards:S2B-ZR-SM4A-TFMOTJ8, MOTJ9
2SM06B-SRSS-TBConnector_JST:JST_SH_SM06B-SRSS-TB_1x06-1MP_P1.00mm_HorizontalMOTJ2, MOTJ6
2STM32F103C8T6Package_QFP:LQFP-48_7x7mm_P0.5mmDISU3, USBU1
2STM32G030K6T6Package_QFP:LQFP-32_7x7mm_P0.8mmBEXU1, SERU1
10.01Rboards:R_0805_2012MetricBATR13
10.1uF_50Vboards:C_0402_1005MetricMOTC5
11boards:BoardTextBEXIGNORE2
11 battery!boards:BoardTextBATIGNORE9
11.5Kboards:R_0402_1005MetricUSBR12
11.5pFboards:C_0402_1005MetricWIRC10
110Rboards:R_0402_1005MetricSCRR5
110nFboards:C_0402_1005MetricBATC6
110pFboards:C_0402_1005MetricBATC7
111boards:BoardTextBEXIGNORE3
112boards:BoardTextBEXIGNORE4
1150Kboards:R_0402_1005MetricBATR10
11pFboards:C_0402_1005MetricWIRC7
11uH_3.2AInductor_SMD:L_1008_2520MetricBATL1
12.2nFboards:C_0402_1005MetricWIRC4
12.2uFboards:C_0402_1005MetricMOTC6
12.7nHboards:C_0402_1005MetricWIRL4
122boards:BoardTextBEXIGNORE5
122Kboards:R_0402_1005MetricWIRR6
13.9nHboards:C_0402_1005MetricWIRL3
1330Rboards:R_0402_1005MetricBATR16
133nFboards:C_0402_1005MetricWIRC3
14.7pFboards:C_0402_1005MetricWIRC14
147uF_16Vboards:C_1210_3225MetricLEDC4
1510Kboards:R_0402_1005MetricBATR9
18.2nHboards:C_0402_1005MetricWIRL1
1Antenna_MIFA_Cypressboards:Antenna_cypress_MIFAWIRAE1
1Battery v0.5boards:BoardTextBATIGNORE1
1Button Expansion v0.5boards:BoardTextBEXIGNORE1
1Button v0.5boards:BoardTextBUTIGNORE1
1DRV8833PWPboards:HTSSOP-16-1EP_4.4x5mm_P0.65mm_EP3.4x5mm_Mask2.46x2.31mm_ThermalViasMOTU1
1Dial v0.5boards:BoardTextDIAIGNORE1
1Distance v0.5boards:BoardTextDISIGNORE1
1FFC_connector_22p_dual_sidedboards:FFC_connector_22p_hinge_lockSCRJ3
1HDC1080Package_SON:Texas_PWSON-N6TMPU1
1INA180A3boards:SOT-23-5BATU6
1Joystickboards:JoystickJOYU1
1Joystick v0.5boards:BoardTextJOYIGNORE1
1LED v0.5boards:BoardTextLEDIGNORE1
1LTR-381RGBboards:LTR-381RGBLIGU1
1LedMatrix v0.5boards:BoardTextMATIGNORE1
1LightSound v0.5boards:BoardTextLIGIGNORE1

The 550 most common of 585 parts.

More from sean618/MakerTiles

12
  • 4 layers125 × 111.3 mmPanel, the printed circuit board in 3D

    Panel

    sean618/MakerTiles

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

    273 partsMIT
  • 2 layers104.5 × 184.9 mmPanel4, the printed circuit board in 3D

    Panel4

    sean618/MakerTiles

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

    191 partsMIT
  • 4 layers75 × 25 mmLedMatrix, the printed circuit board in 3D

    LedMatrix

    sean618/MakerTiles

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

    103 partsMIT
  • 4 layers55 × 55 mmLedMatrix, the printed circuit board in 3D

    LedMatrix

    sean618/MakerTiles

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

    95 partsMIT
  • 4 layers56 × 54 mmLedMatrix, the printed circuit board in 3D

    LedMatrix

    sean618/MakerTiles

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

    80 partsMIT
  • 4 layers56 × 54 mmLedMatrix, the printed circuit board in 3D

    LedMatrix

    sean618/MakerTiles

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

    80 partsMIT
  • 2 layers56 × 25 mmBattery, the printed circuit board in 3D

    Battery

    sean618/MakerTiles

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

    63 partsMIT
  • 2 layers28 × 52 mmMotor, the printed circuit board in 3D

    Motor

    sean618/MakerTiles

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

    56 partsMIT
  • 2 layers56 × 25 mmServo, the printed circuit board in 3D

    Servo

    sean618/MakerTiles

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

    47 partsMIT
  • 2 layers56.5 × 25 mmSpeaker, the printed circuit board in 3D

    Speaker

    sean618/MakerTiles

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

    44 partsMIT
  • 2 layers56 × 25 mmMotor, the printed circuit board in 3D

    Motor

    sean618/MakerTiles

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

    40 partsMIT
  • 2 layers27 × 25 mmSense, the printed circuit board in 3D

    Sense

    sean618/MakerTiles

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

    39 partsMIT

Similar boards

  • 2 layers90 × 65 mmOHBeacon, the printed circuit board in 3D

    OHBeacon

    HoldenHalucha/office-hours-beacon

    EECS 473

    53 parts
  • 2 layers90 × 62 mmPanel, the printed circuit board in 3D

    Panel

    Tomoshibi-technology/RCJ-Japan2024-Circuit

    RoboCup JapanOpen 2024とEindohoven 2024に向けての回路開発

    120 parts1MIT
  • 2 layers100 × 62 mmEsp32s3aprs, the printed circuit board in 3D

    Esp32s3aprs

    mcapdeville/esp32s3aprs

    ESP32s3 APRS beacon/tracker/logger, USB kiss TNC , USB audio FM tranceiver with Micropython shell

    156 parts8CERN-OHL-S-2.0
  • 4 layers70.6 × 102.9 mmEVT PCB, the printed circuit board in 3D

    EVT PCB

    mquerostudio/MQ-One

    Archivos del MQ One y mi Trabajo Final de Grado :)

    265 parts58
  • 4 layers30.1 × 30.1 mmMaglev driver, the printed circuit board in 3D

    Maglev driver

    Janky-Jingle-Crew/SouthPoleLevitator

    2025 Christmas card "South Pole Levitator"

    65 parts3
  • 2 layers114.9 × 68.5 mmOhmPrvaFaza, the printed circuit board in 3D

    OhmPrvaFaza

    apantelic/ohmsprint_kicad

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

    50 parts
  • 2 layers51.3 × 47.5 mmClass 2a, the printed circuit board in 3D

    Class 2a

    rmd6502/coaster

    36 parts

Questions

How big is the Panel2 PCB?

It measures 188.5 × 167.3 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Panel2 use?

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.

Where can I download the Panel2 KiCad files?

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.

Can I use the Panel2 design in my own project?

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).