Skip to the content
PCBKitNew board
4 layers78 × 67.5 mmUnified pcb, the printed circuit board in 3D

PCB designs and code for a motion-reactive, battery-powered hexagonal glowy object.

Size
78 × 67.5 mm
Copper layers
4
Thickness
1.61 mm
Parts
387
Nets
623
Pads
2,000
Tracks, vias
4,743, 756
Pours
13
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
23 Feb 2024
Updated
29 Sep 2026

Overview

Unified pcb is an open-source printed circuit board by starduststorm, from the starduststorm/motionhexa repository on GitHub. It is a 4-layer board of 78 × 67.5 mm with 387 parts on 623 nets, routed with 4,743 tracks and 756 vias.

It is built around the RP2354A, MMC5603NJ and BMI270, with the LMD4030T261-OA1, LY4176D and TPGLF72101CSP4 among its other parts. Its parts include 271 diodes, 55 capacitors, 30 resistors, 10 ICs and 4 transistors. It belongs with the power boards and the RP2350 boards of this library.

Main components

9

README

README.md

motionhexa

PCB designs and code for a motion-reactive, battery-powered hexagonal glowy object.

photo of motionhexa pixels panel photo of back of assembled motionhexa

What is it?

It's a hexagon. Colors swirl & shift as you move it. Pixels fall towards the earth. The triangle stays put. USB-C Rechargable.

Controls

There is a button on that back of an assembled hexa that you can press by squeezing through the front and back of the case for a single click.

  • Single click: Next Pattern
  • Double click: Previous Pattern
  • Long (1-second) squeeze: Power on and off
  • Very long (10-second) squeeze: Soft reset

Hardware

v8

  • RP2354 dual-core ARM processor
  • BMI270 motion sensor
  • LMD4030 PDM microphone
  • BQ27427 battery monitor
  • SK9822-EC20 pixels
  • LY4176D lipo charger

v5-v6

  • RP2040 dual-core ARM processor
  • ICM-20948 motion sensor
  • LMD4030 PDM microphone
  • BQ27421 battery monitor
  • SK9822-EC20 pixels
  • LP28013HQVF lipo charger

Project layout

  • hexacontroller/ contains the pcb for the logic, power, and motion circuitry.
  • hexa/ contains the pcb for the hexagonal lattice of 271 SK9822-EC20 pixels wired in zig-zag order
  • src/ all project-specific source
  • lib/ submodule dependencies dustlib and BQ27427 Battery Fuel Gauge

The project is built using PlatformIO in Visual Studio Code.

Building

You will likely need to run

text
git submodule update --init

in the source after git clone in order to fetch the submodules for building.

Build environment

The PlatformIO project has a number of build environments:

  • v5 - MakerFaire 2025 hardware
  • v6 - online orders 2025-Sept 2026
  • v8 - MakerFaire 2026 hardware and subsequent online orders

Libraries & Dependencies

PlatformIO should fetch the apprpriate version of each dependency on first build.

  • FastLED - A library for fast 8-bit math and rendering colors onto pixels
  • SparkFun_ICM-20948 - A library for interfacing with the ICM-20948 Motion sensor
  • edrean/BQ27427 Battery Fuel Gauge - A library for interfacing with the BQ27421 (very similar to BQ27427) battery monitor (PlatformIO should build against my BQ27427 Battery Fuel Gauge fork)
  • dustlib, my work-in-progress pixel library

How to write patterns

Please be aware that modifying the code is at your own risk

Pattern code is in src/patterns.h

You can write your own new pattern by subclassing Pattern.

C
class MyAwesomePatternIdea : public Pattern {
public:
  MyAwesomePatternIdea() { }
  void update() {
    // Example 1: Show a rainbow down the zig-zag pixel wiring of the hexa
    for (int px = 0; px < ctx.leds.size(); ++px) {
      CRGB color = CHSV(10 * px - millis()/10, 0xFF, 0xFF);
      ctx.leds[px] = color;
    }

    // Example 2: Show a rainbow pulsing outwards from the center using axial coordinates
    /*
    Axial centerAxial = axial.axialFromPixelIndex(ctx.leds.size()/2);
    for (int px = 0; px < ctx.leds.size(); ++px) {
      Axial ax = axial.axialFromPixelIndex(px);
      // the sum of the differences of q,r,s gives us the "cube distance" which in 2d is shaped like a hexagon
      int distanceToCenter = abs(ax.q() - centerAxial.q()) + abs(ax.r() - centerAxial.r()) + abs(ax.s() - centerAxial.s());
      CRGB color = CHSV(20 * distanceToCenter - millis()/5, 0xFF, 0xFF);
      ctx.leds[px] = color;
    }
    */

    // Example 3: Show a small hexagon that moves around are you tilt the hexa
    /*

Each pattern needs to be added to the pattern list in main.cpp here. in order to run. You can add your own pattern by adding a line to the list where you find patternManager.registerPattern.

text
void setup() {
  # ...
  patternManager.registerPattern<MyAwesomePatternIdea>();
  # ...
}

This list defines the order that patterns run when you click the button.

USBBOOT (help my hexa won't boot)

If your hexagon stops doing hexagon things while you are hacking on it, does not respond to power cycle, and you are unable to re-flash it, you can put it into DFU mode using rp2040 USBBOOT.

  • Carefully open the case using a flat, blunt tool, avoiding poking the battery.

  • There is a button on the hexacontroller here:

  • location of USBBOOT button
  • Press and hold the button while plugging into a computer-attached usb port. You should see a drive (USB Mass Storage Device) appear called "RPI-RP2".

  • You can now either re-flash the hexa yourself using PlatformIO or another tool OR

  • Copy the stable binary hexa image from here onto the drive, and after the copy it should automatically reboot.

MotionHexagon

A short clip showing the hexagon being tilted side to side while a spiral pattern animates along with the motion

Parts

387
QtyValueFootprintReferences
271SK9822-EC20motionhexa:LED-SK9822-EC20D1, D10, D11, D100, D101, D102, D103, D104, D105, D106, D107, D108, D109, D110, D111, D112 +255
2010uFCapacitor_SMD:C_0402_1005MetricC1, C2, C3, C4, C5, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20 +4
13100nFCapacitor_SMD:C_0402_1005MetricC21, C23, C24, C26, C27, C28, C29, C30, C31, C32, C60, C64, C65
81uFCapacitor_SMD:C_0402_1005MetricC25, C37, C38, C48, C53, C58, C59, C61
54.7kResistor_SMD:R_0402_1005MetricR14, R15, R19, R20, R32
55.1kResistor_SMD:R_0402_1005MetricR2, R3, R16, R17, R18
410kResistor_SMD:R_0402_1005MetricR6, R9, R31, R37
41kResistor_SMD:R_0402_1005MetricR10, R13, R24, R36
31MResistor_SMD:R_0402_1005MetricR12, R21, R22
34.7uFCapacitor_SMD:C_0402_1005MetricC22, C33, C39
3470nFCapacitor_SMD:C_0402_1005MetricC45, C46, C47
3D_Schottkymotionhexa:DFN1608D-2DD1, DD2, DD10
3Q_Photo_NPNResistor_SMD:R_0603_1608MetricQ1, Q2, Q3
210uFCapacitor_SMD:C_0603_1608MetricC52, C62
215pFCapacitor_SMD:C_0402_1005MetricC40, C41
22.2uFCapacitor_SMD:C_0402_1005MetricC36, C63
220kResistor_SMD:R_0402_1005MetricR8, R33
227Resistor_SMD:R_0402_1005MetricR4, R5
23.3V LDOPackage_DFN_QFN:OnSemi_XDFN4-1EP_1.0x1.0mm_EP0.52x0.52mmU3, U10
233kResistor_SMD:R_0402_1005MetricR11, R25
24.7uFmotionhexa:C_0402_1005Metric_Pad_GapC34, C35
2D_SchottkyDiode_SMD:D_SOD-882DDD6, DD7
2LEDLED_SMD:LED_0402_1005MetricDD8, DD9
10Resistor_SMD:R_0402_1005MetricR26
11.8MResistor_SMD:R_0402_1005MetricR7
112MHzCrystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY1
13.3umotionhexa:L_pol_2016L1
133Resistor_SMD:R_0402_1005MetricR1
1AO3401APackage_TO_SOT_SMD:SOT-23Q4
1BMI270Package_LGA:Bosch_LGA-14_3x2.5mm_P0.5mmU14
1BQ27427YZFRPackage_BGA:BGA-9_1.6x1.6mm_Layout3x3_P0.5mmU1
1Conn_01x02_SocketConnector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_HorizontalJ1
1Conn_01x02_Socketmotionhexa:SMD_Pad_01x02_2.54mmJ3
1Conn_01x03_Pinmotionhexa:SMD_Pad_01x03_2.54mmJ4
1LMD4030T261-OA1motionhexa:MIC-SMD_8P-L4.0-W3.0U11
1LOGOmotionhexa:sds9090G***
1LY4176DPackage_DFN_QFN:DFN-8-1EP_2x2mm_P0.5mm_EP0.6x1.2mmU12
1MMC5603NJmotionhexa:MMC5603NJ_WLP-4_0.8x0.8mm_P0.4mmU13
1RP2354Amotionhexa:RP2350-QFN-60-1EP_7x7_P0.4mm_EP3.4x3.4mm_ThermalViasU4
1SW_Pushmotionhexa:SW-SMD_4P-L6.2-W6.2-P4.00-LS10.0SW2
1SW_Pushmotionhexa:KEY-SMD_L3.0-W2.5-LS4.0SW1
1TPGLF72101CSP4motionhexa:YZV0004ADADU8
1USBLC6-2P6Package_TO_SOT_SMD:SOT-666U2
1USB_C_Receptaclemotionhexa:USB-SMD_USB-TYPE-C-020J2

The 386 most common of 387 parts.

Questions

How big is the Unified pcb PCB?

It measures 78 × 67.5 mm and has 4 copper layers, 1.61 mm thick.

What parts does the Unified pcb use?

387 parts, built around the RP2354A, MMC5603NJ, BMI270 and LMD4030T261-OA1. 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 Unified pcb KiCad files?

From the starduststorm/motionhexa repository on GitHub, at the commit this page was made from: the board is unified_pcb/unified_pcb.kicad_pcb and its schematic unified_pcb/pixels.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Unified pcb design in my own project?

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

Similar boards

  • 4 layers50 × 36 mmMinicontrol, the printed circuit board in 3D

    Minicontrol

    Jotrorox/minicontrol

    RP2354A + 868 MHz LoRa (Ai-Thinker Ra-01SH) USB-C controller board, designed in KiCad 10.

    66 partsBSD-2-Clause
  • 4 layers50 × 85 mmPedal, the printed circuit board in 3D

    Pedal

    torvalds/GuitarPedal

    Linus learns analog circuits

    85 parts2.5kGPL-2.0
  • 2 layers136.7 × 136.7 mmHelixloop, the printed circuit board in 3D

    Helixloop

    starduststorm/helixloop

    PCB designs and code for a wreathed-spirals LED design with a self-contained controller

    449 parts2
  • 2 layers41.4 × 41.9 mmEarring, the printed circuit board in 3D

    Earring

    sequoia-hope/ultraroute

    PCB autorouting experiments around copperroute: route jobs, leaderboards, board morphing

    105 parts1MIT
  • 2 layers70.1 × 100 mmRobot, the printed circuit board in 3D

    Robot

    dyu134/ESP-HI-PLUS

    The Robot sub-module is a high-performance actuator and sensing expansion board for the ESP-HI-PLUS, designed to transform the device into a mobile or interactive robotic platform.

    86 parts
  • 2 layers63.2 × 23.8 mmWand, the printed circuit board in 3D

    Wand

    ayuusweetfish/Malletwand

    A pendulum as a hands-on musical interface for all · NIME 2024 Short Paper

    68 parts1CERN-OHL-S-2.0
  • 2 layers41.2 × 10.5 mmDumb watch, the printed circuit board in 3D

    Dumb watch

    gschuk/dumb-watch

    Exercise Lab of Lecture Advanced PCB Design @ TU Darmstadt.

    61 parts1
  • 2 layers56 × 28.1 mmLuminography, the printed circuit board in 3D

    Luminography

    ayuusweetfish/Luminography

    (🚧 ETA 2024.09) « Jeu de luminographie » — An electronic toy encouraging outdoor exploration

    145 parts