Skip to the content
4 layers125 × 111.3 mmPanel, the printed circuit board in 3D

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

Size
125 × 111.3 mm
Copper layers
4
Thickness
1.6 mm
Parts
273
Nets
359
Pads
1,377
Tracks, vias
3,432, 625
Pours
16
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
21 Jun 2026
Updated
21 Jun 2026

Overview

Panel is an open-source printed circuit board by sean618, from the sean618/MakerTiles repository on GitHub, published under the MIT licence. It is a 4-layer board of 125 × 111.3 mm with 273 parts on 359 nets, routed with 3,432 tracks and 625 vias.

It is built around the STM32G030F6P6, STM32F103C8T6 and NRF24L01, with the LTR-381RGB-01, VL53L3CXV0DH/1 and ME6211C33M5G-N among its other parts. It belongs with the STM32 boards of this library.

Main components

9

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

273
QtyValueFootprintReferences
394.7uFboards:C_0402_1005MetricBTSC2, BTSC8, BTSC9, BUTC2, BUTC8, BUTC9, DIAC2, DIAC8, DIAC9, DISC3, DISC4, DISC5, DISC8, DISC9, JOYC2, JOYC8 +23
3675Rboards:R_0402_1005MetricBTSR1, BTSR2, BTSR3, BTSR4, BUTR1, BUTR2, BUTR3, BUTR4, DIAR1, DIAR2, DIAR3, DIAR4, DISR7, DISR8, DISR9, DISR10 +20
28M2.5MountingHoleboards:MountingHole_2.7mm_M2.5_ISO7380BTSH1, BTSH2, BTSH3, BTSH4, BUTH1, BUTH2, DIAH1, DIAH2, DIAH3, DIAH4, DISH1, DISH2, JOYH1, JOYH2, JOYH3, JOYH4 +12
22FFC_connector_16p_hinge_lockboards:FFC_connector_16p_hinge_lockBTSJ3, BTSJ5, BUTJ1, BUTJ3, DIAJ1, DIAJ2, DISJ3, DISJ5, JOYJ2, JOYJ5, LEDJ5, LEDJ7, LIGJ3, LIGJ5, POWJ5, POWJ6 +6
1410Kboards:R_0402_1005MetricBTSR5, BTSR6, BTSR7, BTSR8, BTSR9, BUTR5, DIAR5, DISR5, DISR6, JOYR6, LIGR5, LIGR6, TMPR5, TMPR6
1101x06_2.54mm_Femaleboards:01x06_2.54mm_FemaleBTSJ2, BUTJ5, DIAJ5, DISJ2, JOYJ3, LEDJ3, LIGJ2, POWJ3, TMPJ2, USBJ3, WIRJ2
1101x06_2.54mm_Maleboards:01x06_2.54mm_MaleBTSJ1, BUTJ2, DIAJ3, DISJ1, JOYJ1, LEDJ1, LIGJ1, POWJ1, TMPJ1, USBJ1, WIRJ1
11ME6211C33M5G-Nboards:SOT-23-5BTSU2, BUTU2, DIAU2, DISU2, JOYU2, LEDU2, LIGU2, TMPU2, USBU2, WIRU1, WIRU2
100.1uFboards:C_0402_1005MetricBTSC1, BUTC1, DIAC1, DISC11, JOYC1, LEDC1, LIGC1, TMPC1, USBC4, WIRC1
10swd_4pinboards:swd_headerBTSJ4, BUTJ4, DIAJ4, DISJ4, JOYJ4, LEDJ4, LIGJ4, TMPJ4, USBJ4, WIRJ4
8STM32G030F6P6boards:TSSOP-20_4.4x6.5mm_P0.65mmBTSU3, BUTU3, DIAU3, JOYU3, LEDU3, LIGU3, TMPU3, WIRU3
612pFboards:C_0402_1005MetricDISC6, DISC7, USBC6, USBC7, WIRC5, WIRC6
5button_6x6x7boards:SW_SPST_PTS645BTSSW1, BTSSW2, BTSSW3, BTSSW4, BTSSW6
4120Rboards:R_0402_1005MetricWIRR1, WIRR2, WIRR3, WIRR4
45.1Kboards:R_0402_1005MetricPOWR1, POWR2, USBR1, USBR2
31Kboards:R_0402_1005MetricBUTR6, LEDR5, LEDR7
31N4148WDiode_SMD:D_SOD-123BTSD2, BUTD3, DIAD2
3Crystal_16M_smallboards:Crystal_SMD_2016-4Pin_2.0x1.6mmDISY1, USBY2, WIRY2
2N_MOSFETboards:SOT-23BUTQ1, LEDQ3
2STM32F103C8T6Package_QFP:LQFP-48_7x7mm_P0.5mmDISU3, USBU1
2USBLC6-4SC6boards:SOT-23-6POWIC1, USBIC1
2USB_C_connector_16Pboards:USB_C_Receptacle_16PPOWJ2, USBJ2
11.5Kboards:R_0402_1005MetricUSBR12
11.5pFboards:C_0402_1005MetricWIRC10
11pFboards:C_0402_1005MetricWIRC7
12.2nFboards:C_0402_1005MetricWIRC4
12.7nHboards:C_0402_1005MetricWIRL4
122Kboards:R_0402_1005MetricWIRR6
122uF_10Vboards:C_0603_1608MetricWIRC13
13.9nHboards:C_0402_1005MetricWIRL3
133nFboards:C_0402_1005MetricWIRC3
14.7pFboards:C_0402_1005MetricWIRC14
147uF_16Vboards:C_1210_3225MetricLEDC4
15Vboards:BoardTextLEDIGNORE4
18.2nHboards:C_0402_1005MetricWIRL1
1Antenna_MIFA_Cypressboards:Antenna_cypress_MIFAWIRAE1
1Button v0.5boards:BoardTextBUTIGNORE1
1Buttons v0.5boards:BoardTextBTSIGNORE1
1DATAboards:BoardTextLEDIGNORE3
1Dial v0.5boards:BoardTextDIAIGNORE1
1Distance v0.5boards:BoardTextDISIGNORE1
1GNDboards:BoardTextLEDIGNORE2
1HDC1080Package_SON:Texas_PWSON-N6TMPU1
1Joystickboards:JoystickJOYU1
1Joystick v0.5boards:BoardTextJOYIGNORE1
1LED v0.5boards:BoardTextLEDIGNORE1
1LTR-381RGBboards:LTR-381RGBLIGU1
1LightSound v0.5boards:BoardTextLIGIGNORE1
1NRF24L01boards:QFN-20-1EP_4x4mm_P0.5mm_EP2.5x2.5mmWIRU4
1RotaryEncoder_Switchboards:RotaryEncoderEC12DDIASW7
1Temp v0.5boards:BoardTextTMPIGNORE1
1TerminalBlock_3P_3.8_blackboards:TerminalBlock_03_P3.81mm_HorizontalLEDJ2
1USB v0.5boards:BoardTextUSBIGNORE1
1USBPower v0.5boards:BoardTextPOWIGNORE1
1VL53L3CXV0DHboards:VL53L3CXV0DHDISU1
1WMM7027ATSN1-4/TRPackage_LGA:LGA-4LIGU4
1Wireless v0.5boards:BoardTextWIRIGNORE1
1button_6x6x7Button_Switch_SMD:SW_SPST_PTS645BUTSW2
1ws2812b_1615boards:WS2812B_1615BUTD2

More from sean618/MakerTiles

12
  • 2 layers188.5 × 167.3 mmPanel2, the printed circuit board in 3D

    Panel2

    sean618/MakerTiles

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

    585 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

  • 4 layers133.1 × 115.3 mmMad Bot, the printed circuit board in 3D

    Mad Bot

    Incomprehensible/Mad_Bot

    Exploratory project in Embedded and Multi-Agent Robotics

    95 parts1MIT
  • 4 layers46 × 30 mmCan distance sensor, the printed circuit board in 3D

    Can distance sensor

    nlbutts/can_distance_sensor

    This is a small CAN based Time-of-Flight (TOF) sensor. It determines the distance to an object and sends the resulting message on the CAN bus.

    74 partsMIT
  • 2 layers20 × 20 mmLightSensorPCB, the printed circuit board in 3D

    LightSensorPCB

    dwynnychuk/SmartSmoker

    Upgrades for Traeger to add smart capability

    18 parts
  • 4 layers100 × 95.1 mmMain PCB v2, the printed circuit board in 3D

    Main PCB v2

    ICRS/SSL-2024

    188 parts1Apache-2.0
  • 2 layers47.6 × 30.6 mmProgramator spi, the printed circuit board in 3D

    Programator spi

    internax/ukol_divelit

    Původní záměr byl použít ZIF socket, ten se však pro pDIP8 pouzdro prakticky nevyrábí. Zvolil jsem proto přesnou patici z doporučených komponent. Klíčovými kritérii byl nízký odpor kontaktů a zlaté pokovení pinů.

    42 partsMIT
  • 2 layers65 × 65.5 mmSchmatic, the printed circuit board in 3D

    Schmatic

    Yorha-7/Rocket

    in this repo we are simulating rocket basic physics and make a onboard flight computer which utilizes MCU, gyro, pressure sensor, fin servo controls, to get realtime target tracking abilities to a solid fuel rocket.

    77 parts
  • 2 layers95.1 × 30 mmUINIO DAPLink, the printed circuit board in 3D

    UINIO DAPLink

    uinika/UINIO-DAPLink

    the PCB board design for ARM Mbed DAP Link.

    55 parts17
  • 2 layers68.4 × 20.3 mmUINIO MCU STM32F103C8T6, the printed circuit board in 3D

    UINIO MCU STM32F103C8T6

    uinika/UINIO-MCU-STM32F103C8T6

    an Evaluation Board base on STM32F103C8T6 microcontroller.

    41 parts

Questions

How big is the Panel PCB?

It measures 125 × 111.3 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Panel use?

273 parts, built around the STM32G030F6P6, STM32F103C8T6, NRF24L01 and LTR-381RGB-01. 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 Panel KiCad files?

From the sean618/MakerTiles repository on GitHub, at the commit this page was made from: the board is hardware/Scripts/Panel.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Panel 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).