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

PCB designs and code for a motion-reactive, battery-powered hexagonal glowy object.
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.
PCB designs and code for a motion-reactive, battery-powered hexagonal glowy object.
It's a hexagon. Colors swirl & shift as you move it. Pixels fall towards the earth. The triangle stays put. USB-C Rechargable.
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.
The project is built using PlatformIO in Visual Studio Code.
You will likely need to run
git submodule update --initin the source after git clone in order to fetch the submodules for building.
The PlatformIO project has a number of build environments:
PlatformIO should fetch the apprpriate version of each dependency on first build.
Pattern code is in src/patterns.h
You can write your own new pattern by subclassing Pattern.
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.
void setup() {
# ...
patternManager.registerPattern<MyAwesomePatternIdea>();
# ...
}This list defines the order that patterns run when you click the button.
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:
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.

| Qty | Value | Footprint | References |
|---|---|---|---|
| 271 | SK9822-EC20 | motionhexa:LED-SK9822-EC20 | D1, D10, D11, D100, D101, D102, D103, D104, D105, D106, D107, D108, D109, D110, D111, D112 +255 |
| 20 | 10uF | Capacitor_SMD:C_0402_1005Metric | C1, C2, C3, C4, C5, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20 +4 |
| 13 | 100nF | Capacitor_SMD:C_0402_1005Metric | C21, C23, C24, C26, C27, C28, C29, C30, C31, C32, C60, C64, C65 |
| 8 | 1uF | Capacitor_SMD:C_0402_1005Metric | C25, C37, C38, C48, C53, C58, C59, C61 |
| 5 | 4.7k | Resistor_SMD:R_0402_1005Metric | R14, R15, R19, R20, R32 |
| 5 | 5.1k | Resistor_SMD:R_0402_1005Metric | R2, R3, R16, R17, R18 |
| 4 | 10k | Resistor_SMD:R_0402_1005Metric | R6, R9, R31, R37 |
| 4 | 1k | Resistor_SMD:R_0402_1005Metric | R10, R13, R24, R36 |
| 3 | 1M | Resistor_SMD:R_0402_1005Metric | R12, R21, R22 |
| 3 | 4.7uF | Capacitor_SMD:C_0402_1005Metric | C22, C33, C39 |
| 3 | 470nF | Capacitor_SMD:C_0402_1005Metric | C45, C46, C47 |
| 3 | D_Schottky | motionhexa:DFN1608D-2 | DD1, DD2, DD10 |
| 3 | Q_Photo_NPN | Resistor_SMD:R_0603_1608Metric | Q1, Q2, Q3 |
| 2 | 10uF | Capacitor_SMD:C_0603_1608Metric | C52, C62 |
| 2 | 15pF | Capacitor_SMD:C_0402_1005Metric | C40, C41 |
| 2 | 2.2uF | Capacitor_SMD:C_0402_1005Metric | C36, C63 |
| 2 | 20k | Resistor_SMD:R_0402_1005Metric | R8, R33 |
| 2 | 27 | Resistor_SMD:R_0402_1005Metric | R4, R5 |
| 2 | 3.3V LDO | Package_DFN_QFN:OnSemi_XDFN4-1EP_1.0x1.0mm_EP0.52x0.52mm | U3, U10 |
| 2 | 33k | Resistor_SMD:R_0402_1005Metric | R11, R25 |
| 2 | 4.7uF | motionhexa:C_0402_1005Metric_Pad_Gap | C34, C35 |
| 2 | D_Schottky | Diode_SMD:D_SOD-882D | DD6, DD7 |
| 2 | LED | LED_SMD:LED_0402_1005Metric | DD8, DD9 |
| 1 | 0 | Resistor_SMD:R_0402_1005Metric | R26 |
| 1 | 1.8M | Resistor_SMD:R_0402_1005Metric | R7 |
| 1 | 12MHz | Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm | Y1 |
| 1 | 3.3u | motionhexa:L_pol_2016 | L1 |
| 1 | 33 | Resistor_SMD:R_0402_1005Metric | R1 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q4 |
| 1 | BMI270 | Package_LGA:Bosch_LGA-14_3x2.5mm_P0.5mm | U14 |
| 1 | BQ27427YZFR | Package_BGA:BGA-9_1.6x1.6mm_Layout3x3_P0.5mm | U1 |
| 1 | Conn_01x02_Socket | Connector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_Horizontal | J1 |
| 1 | Conn_01x02_Socket | motionhexa:SMD_Pad_01x02_2.54mm | J3 |
| 1 | Conn_01x03_Pin | motionhexa:SMD_Pad_01x03_2.54mm | J4 |
| 1 | LMD4030T261-OA1 | motionhexa:MIC-SMD_8P-L4.0-W3.0 | U11 |
| 1 | LOGO | motionhexa:sds9090 | G*** |
| 1 | LY4176D | Package_DFN_QFN:DFN-8-1EP_2x2mm_P0.5mm_EP0.6x1.2mm | U12 |
| 1 | MMC5603NJ | motionhexa:MMC5603NJ_WLP-4_0.8x0.8mm_P0.4mm | U13 |
| 1 | RP2354A | motionhexa:RP2350-QFN-60-1EP_7x7_P0.4mm_EP3.4x3.4mm_ThermalVias | U4 |
| 1 | SW_Push | motionhexa:SW-SMD_4P-L6.2-W6.2-P4.00-LS10.0 | SW2 |
| 1 | SW_Push | motionhexa:KEY-SMD_L3.0-W2.5-LS4.0 | SW1 |
| 1 | TPGLF72101CSP4 | motionhexa:YZV0004ADAD | U8 |
| 1 | USBLC6-2P6 | Package_TO_SOT_SMD:SOT-666 | U2 |
| 1 | USB_C_Receptacle | motionhexa:USB-SMD_USB-TYPE-C-020 | J2 |
The 386 most common of 387 parts.
It measures 78 × 67.5 mm and has 4 copper layers, 1.61 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask starduststorm before reusing the design.
Jotrorox/minicontrol
RP2354A + 868 MHz LoRa (Ai-Thinker Ra-01SH) USB-C controller board, designed in KiCad 10.


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

sequoia-hope/ultraroute
PCB autorouting experiments around copperroute: route jobs, leaderboards, board morphing

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.

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


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