
CUBE
BenjaminJAnderson/CUBE
CUBE is a miniature, six-faced OLED display cube built from a stack of custom interconnected PCBs. The current design combines an ESP32-S2 motherboard, five further display boards, a magnet-held 3D-printed frame and…

CUBE is a miniature, six-faced OLED display cube built from a stack of custom interconnected PCBs. The current design combines an ESP32-S2 motherboard, five further display boards, a magnet-held 3D-printed frame and…
D1(Motherboard) is an open-source printed circuit board by BenjaminJAnderson, from the BenjaminJAnderson/CUBE repository on GitHub, published under the MIT licence. It is a 4-layer board of 38 × 35 mm with 51 parts on 74 nets, routed with 245 tracks and 23 vias.
It is built around the ESP32-S2-MINI-1-N4, FAN5331SX and ICM-20602, with the MIC5353-3.3YMT-TR, 1N4148WS-7-F-CN and B2B-PH-K-S among its other parts. Its parts include 21 capacitors, 12 resistors, 6 ICs, 6 diodes and 3 connectors. It belongs with the computers and single-board computers boards and the ESP32 boards of this library.
CUBE is a miniature, six-faced OLED display cube built from a stack of custom interconnected PCBs. The current design combines an ESP32-S2 motherboard, five further display boards, a magnet-held 3D-printed frame and bring-up firmware for SPI displays and motion sensing.

CUBE is a handheld, self-contained display object rather than a conventional LED matrix. Each of its six faces carries a 1.5-inch, 128×128 RGB OLED module driven by an SSD1351 controller, giving 98,304 addressable pixels across the cube. The aim is to make a small object whose faces can show independent graphics and respond to movement, while remaining easy to open, charge and repair.
The project began in December 2021 after seeing Greg Davill's miniature LED cube and Pol Pla's research on Display Blocks. Both demonstrated the appeal of a compact, tactile display device. CUBE takes that idea in a different direction: instead of an FPGA and an LED matrix, it uses a microcontroller, six square OLED modules and a modular PCB-and-frame construction.
Status: design-stage prototype. The repository records work from December 2021 to May 2022. It contains the electrical and mechanical design files, photographs of a fabricated motherboard and several printed frame prototypes, and display and IMU bring-up sketches. The final assembled cube and an integrated application firmware are not present.
.sch and .pro format.
The assembled motherboard, showing the ESP32-S2 module, USB-C connector, battery connector, FFC connector and power circuitry.

Motherboard schematic sheets covering the 13 V and 3.3 V supplies, battery management, USB input, IMU, display interface and ESP32-S2.

Mechanical reference for the 1.5-inch, 128×128 RGB OLED module, including its active area, bezel and FFC tail.

Two frame halves with the PCB assembly test-fitted inside.

An early FDM-printed frame, printed flat and folded like origami to avoid overhangs.

Individual SLA-printed panels with magnet pockets, produced through JLCPCB's 3D printing service.

A PCB and display test-fitted into a printed frame panel.
CUBE is built from six boards arranged as the faces of a cube. D1 is the motherboard and also carries one display. D2–D6 are display boards with the same electrical function: each accepts the incoming bus, drives one OLED and passes the bus to the next face. The boards are approximately 38 mm across and use two copper layers. The FreeCAD frame envelope is approximately 52 mm cubed.
The interconnect is a 20-way, 0.5 mm pitch FFC bus. It carries the shared SPI clock and data lines, the data/command line, 3.3 V, the 13 V OLED supply, ground and the chip-select lines that have not yet been consumed. D1 uses one select locally and forwards five to D2. Each subsequent board consumes one select and forwards the remainder, so the number of active select lines decreases along the chain until, in the intended design, D6 receives the final line. Because every display has its own chip-select, the microcontroller can update one face without disturbing the others.
The motherboard is built around an ESP32-S2-MINI-1U. The module's native USB interface removes the need for a separate USB-to-UART bridge, reducing component count and board area. The 1U variant was selected for its external-antenna option.
The main subsystems are:
D2–D6 share the same basic layout and component set, although the chip-select wiring changes along the chain. Each board contains one 1.5-inch 128×128 SSD1351 OLED module, two 20-pin FFC connectors for the daisy chain, decoupling capacitors and series components for the display signals. There is no local microcontroller; all rendering is performed by the ESP32-S2 and sent over the shared bus.
The D6 directory currently contains copies of the D5 files, including the D5 chip-select assignment. This is a known naming and versioning artefact: D6 is intended to be the sixth display face, and the duplicate was left in place so that a single side could be modified later without changing the other four. Before D6 can act as the sixth face, its netlist needs to be changed to consume only Display6_CS.
The enclosure was developed in FreeCAD and exported as STEP and STL files. The frame is approximately 52 mm cubed and uses 3 mm neodymium magnets to hold its sections together so that the cube can be opened for charging or repair. The repository includes the FreeCAD source, the six wall panels, a compound assembly and several earlier design iterations in Hardware/Frame/OLD.
Three fabrication approaches were explored:
The design direction recorded in the project notes is a final frame made from two evenly sized three-sided sections, printed in SLA, with improved magnet pockets. Keeping each section to three sides makes assembly easier while still allowing the cube to be opened.
The software is a collection of Arduino sketches rather than a finished application. The sequence in Software/Display/Testing progresses from a single display to test routines for all six faces. 1_Display_SW initialises one display, and the later sketches add calls for more faces. The progression is not fully consistent: 3_Display_SW initialises OLED4 but not OLED3, while 5_Display_SW and 6_Display_SW call drawing routines on the fifth and sixth displays without calling begin() on those objects. The sketches use software SPI with the following pins:
| Signal | GPIO |
|---|---|
| SCLK | 36 |
| MOSI | 35 |
| DC | 5 |
| CS 1 | 6 |
| CS 2 | 12 |
| CS 3 | 14 |
| CS 4 | 18 |
| CS 5 | 17 |
| CS 6 | 11 |
The display sketches use the Adafruit GFX drawing API and the Adafruit SSD1351 driver. The vendored driver files in Software/Display/lib have been renamed to Multi_SSD1351, but the source still includes Adafruit_SSD1351.h; the upstream Adafruit SSD1351 library should therefore be installed when building the sketches.
The IMU sketches in Software/IMU use an MPU6050 and Jeff Rowberg's DMP library over I2C. They print yaw, pitch and roll over serial for orientation experiments, but they do not drive the ICM-20602 fitted to the motherboard. An ICM-20602 SPI driver and the integration between sensing, rendering and power management remain to be written.
Six displays could not each have a dedicated SPI peripheral, and duplicating the bus would have added wiring and pins. The chosen approach shares clock, data and data/command lines while giving every display its own chip-select. Each board consumes one select line and passes the unused lines to the next board, so the ESP32-S2 can still address any face individually without carrying all six selects to the end of the chain. The staged one-to-six test sketches provide an incremental validation path for this arrangement.
Small, high-resolution square OLED modules are uncommon. The available 1.5-inch 128×128 SSD1351 modules have relatively large bezels, which limits the visible area of each face. The design accepts this trade-off because the modules are readily available, have an integrated controller and use a simple SPI interface. Smaller square OLEDs may become easier to source as the VR and wearable markets grow.
Each frame process exposed a different limitation: FDM printing gave poor surface finish and tolerances, SLA printing was brittle and difficult to clean up, and individual magnet panels were fragile under diagonal loads. The current design direction is two three-sided SLA sections with improved magnet pockets, balancing print quality, ease of assembly and serviceability. The prototype frames in the repository are development iterations, not the final enclosure.
An early constraint was fitting the electronics into a small cube. The ESP32-S2's native USB removed the USB-to-UART bridge and its associated circuitry, and the ESP32-S2-MINI-1U provided the processing and wireless capability in a small module. The remaining power path was kept modular: USB-C input, a LiPo charger with load sharing, a 3.3 V rail and a dedicated 13 V boost for the displays.
The repository contains evidence of the following work:
There is no automated test suite, no captured frame-rate or power-consumption measurements, and no integrated application firmware in this repository. The final cube has not been assembled from the final frame design.
Known limitations:
begin() calls: 3_Display_SW does not initialise OLED3, and 5_Display_SW and 6_Display_SW do not initialise the fifth and sixth display objects..sch and .pro formats.Open Hardware/PCB/D1(Motherboard)/D1(Motherboard).kicad_pro in KiCad for the motherboard. The display boards are in Hardware/PCB/D2 through Hardware/PCB/D6; D6 contains a copy of the D5 project.
The schematic and layout can also be viewed online through CADLAB.io.
Software/Display/Testing. Start with 1_Display_SW for a single display, then move up to 6_Display_SW.begin() calls (for example, OLED3 in 3_Display_SW, and OLED5 and OLED6 in the later sketches).For the IMU experiment, open Software/IMU/DMP_CodeESP32/DMP_CodeESP32.ino, install the MPU6050 library and connect an MPU6050 over I2C. This sketch is an experiment for the MPU6050 and is not a driver for the ICM-20602 on the motherboard.
The editable frame source is Hardware/Frame/Frame.FCStd. Exports include Frame-Walls.step, Frame-Left.step, Frame-Compound002.step and Frame-Walls.stl. Earlier frame versions are kept in Hardware/Frame/OLD.
The Blender presentation file is Renders/Blender/Cube Render.blend.
CUBE/
├── Hardware/
│ ├── PCB/
│ │ ├── D1(Motherboard)/ # Motherboard, power, IMU and display interface
│ │ ├── D2/ # Display board
│ │ ├── D3/ # Display board
│ │ ├── D4/ # Display board
│ │ ├── D5/ # Display board
│ │ └── D6/ # Sixth display face; currently a copy of D5
│ └── Frame/ # FreeCAD source, STEP exports and STL files
├── Renders/
│ ├── Blender/ # Blender presentation scene
│ ├── CubeDesign.png # High-resolution render
│ └── Test.png # Render
├── Software/
│ ├── Display/ # SSD1351 libraries, examples and bring-up tests
│ └── IMU/ # MPU6050 DMP experiments
├── docs/images/ # README images
├── LICENSE
└── README.mdThe project source and design files are released under the MIT License, copyright 2022 Benjamin J Anderson.
Third-party material:
Software/Display/Resources/Adafruit-SSD1351-library-1.1.0.Software/Display/Resources include material from the Rotatey_Balls project, distributed under the MIT licence.Hardware/PCB/D1(Motherboard)/Resources remain subject to their publishers' terms.The project is also indexed on CADLAB.io.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 9 | 0.1u | Capacitor_SMD:C_0603_1608Metric | C2, C3, C7, C10, C11, C12, C13, C16, C19 |
| 5 | 4.7u | Capacitor_SMD:C_0603_1608Metric | C1, C9, C14, C18, C20 |
| 4 | 100k | Resistor_SMD:R_0603_1608Metric | R7, R9, R10, R11 |
| 4 | 1u | Capacitor_SMD:C_0603_1608Metric | C6, C15, C17, C21 |
| 3 | 10k | Resistor_SMD:R_0603_1608Metric | R1, R6, R8 |
| 2 | 10u | Capacitor_SMD:C_0603_1608Metric | C4, C8 |
| 2 | 1N4148WS-7-F | Diode_SMD:D_SOD-323 | D1, D2 |
| 2 | 1k | Resistor_SMD:R_0603_1608Metric | R3, R12 |
| 2 | GREEN | LED_SMD:LED_0603_1608Metric | D3, D6 |
| 1 | 2k | Resistor_SMD:R_0603_1608Metric | R2 |
| 1 | 4.7u | Capacitor_Tantalum_SMD:CP_EIA-3216-18_Kemet-A | C5 |
| 1 | 47R | Resistor_SMD:R_0603_1608Metric | R4 |
| 1 | 560k | Resistor_SMD:R_0603_1608Metric | R5 |
| 1 | B2B-PH-K-S | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J3 |
| 1 | BAT54GWJ | Diode_SMD:D_SOD-123 | D4 |
| 1 | BATG54GWJ | Diode_SMD:D_SOD-123 | D5 |
| 1 | CHS-02A | Button_Switch_SMD:SW_DIP_SPSTx02_Slide_Copal_CHS-02A_W5.08mm_P1.27mm_JPin | SW1 |
| 1 | ESP32-S2-MINI-1 | Espressif:ESP32-S2-MINI-1U | U1 |
| 1 | FAN5331SX | Package_TO_SOT_SMD:SOT-23-5 | U5 |
| 1 | ICM-20602 | Package_LGA:LGA-16_3x3mm_P0.5mm_LayoutBorder3x5y | U2 |
| 1 | MCP73831-2-OT | Package_TO_SOT_SMD:SOT-23-5 | U6 |
| 1 | MIC5353-3.3YMT | Package_DFN_QFN:MLF-6-1EP_1.6x1.6mm_P0.5mm_EP0.5x1.26mm | U4 |
| 1 | NX2301P.215 | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | SRR4028-100Y | D1(Motherboard):L_Bourns-SRN4028 | L1 |
| 1 | SSD1351 | D1(Motherboard):WR-FPC_0.5mm_ZIF_H | U3 |
| 1 | USB_C_Receptacle_USB2.0 | D1(Motherboard):GCT_USB4120-03-C | J2 |
| 1 | WR-FPC_0.5mm_ZIF_V | D1(Motherboard):WR-FPC_0.50_SMT_ZIF_V | J1 |

BenjaminJAnderson/CUBE
CUBE is a miniature, six-faced OLED display cube built from a stack of custom interconnected PCBs. The current design combines an ESP32-S2 motherboard, five further display boards, a magnet-held 3D-printed frame and…




Acmex2564/Z31-DigiDash
Reverse Engineering of the 300zx (Z31) Digital Cluster & Design of replacement PCBs

oomlout/oomlout_oomp_project_bot_v_2

SuperJSBros/roaster-monitor-sensor
Temperature monitor for my coffee bean roaster


Starman3787/btc-split-flap
Project to display the value of bitcoin on a split-flap display.
It measures 38 × 35 mm and has 4 copper layers, 1.6 mm thick.
51 parts, built around the ESP32-S2-MINI-1-N4, FAN5331SX, ICM-20602 and MIC5353-3.3YMT-TR. 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 BenjaminJAnderson/CUBE repository on GitHub, at the commit this page was made from: the board is Hardware/PCB/D1(Motherboard)/D1(Motherboard).kicad_pcb and its schematic Hardware/PCB/D1(Motherboard)/D1(Motherboard).kicad_sch. 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).