

Node pcb
Kinetic Art Clock consisting of LCD displays
- Size
- 44 × 44 mm
- Copper layers
- 4
- Thickness
- 1.61 mm
- Parts
- 55
- Nets
- 70
- Pads
- 229
- Tracks, vias
- 466, 105
- Pours
- 4
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 12 Jun 2026
- Updated
- 7 Nov 2026
Overview
Node pcb is an open-source printed circuit board by marino222, from the marino222/digital-clock72 repository on GitHub, published under the MIT licence. It is a 4-layer board of 44 × 44 mm with 55 parts on 70 nets, routed with 466 tracks and 105 vias.
It is built around the RP2040, THVD1450DRBR and W25Q32JVSSIQ, with the AP2112K-3.3TRG1, CL21A106KAYNNNE and 0402CG150J500NT among its other parts. Its parts include 20 capacitors, 17 resistors, 5 connectors, 4 ICs and 2 diodes. It belongs with the lEDs and displays boards and the ESP32 and RP2040 boards of this library.
Main components
12RP2040
LQFN-56(7x7)12bit 133MHz 30 LQFN-56(7x7) Microcontrollers (MCU/MPU/SOC) ROHSRaspberry PiMicrocontrollers (MCU/MPU/SOC)THVD1450DRBR
VSON-8(3x3)-40℃~+125℃ 1 1 1uA 256 3V~5.5V 50Mbps Half-Duplex Transceiver ±18kV VSON-8(3x3) RS-485 / RS-422 ICs ROHSTexas InstrumentsRS-485 / RS-422 ICsW25Q32JVSSIQ
SOIC-8-208mil-40℃~+85℃ 100,000 cycles 133MHz 1uA 2.7V~3.6V 20 Years 32Mbit 3ms SPI SOIC-8-208mil NOR FLASH ROHSWinbondNOR FLASHAP2112K-3.3TRG1
SOT-25-5-40℃~+85℃@(Ta) 1 250mV@(600mA) 3.3V 50uVrms 55uA 600mA 65dB@(1kHz) 6V Fixed Over Current Protection、Thermal Shutdown、Enable control Positive SOT-25-5 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSDiodes IncorporatedVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsCL21A106KAYNNNE
080510uF 25V X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSSamsung Electro-MechanicsMultilayer Ceramic Capacitors MLCC - SMD/SMT0402CG150J500NT
040215pF 50V C0G ±5% 0402 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSGuangdong Fenghua Advanced Tech (FH)Multilayer Ceramic Capacitors MLCC - SMD/SMTB5819W SL
SOD-1231A 40V 600mV@1A 9A Independent SOD-123 Schottky Diodes ROHSJiangsu Changjing Electronics Technology (CJ)Schottky DiodesBM08B-GHS-TBT(LF)(SN)
SMD,P=1.25mm-25℃~+85℃ 1 1.25mm 13.25mm 1A 1x8P 4.05mm 4.32mm 50V 8 8P Auxiliary Solder Pin GH PA9T Phosphor bronze Surface Mount,Vertical Tin UL94V-0 White SMD,P=1.25mm Wire To Board Connector ROHSJSTWire To Board ConnectorABM8-272-T3
SMD3225-4P-40℃~+85℃ 10pF 12MHz 50Ω SMD crystal oscillator ±30ppm ±30ppm SMD3225-4P Crystals ROHSAbraconCrystalsAFC11-S12ICA-00
SMD,P=0.5mm0.3mm 0.5mm 12P 4.4mm Copper alloy Single-side Contact/Vertical Slide Lock Surface Mount,Vertical Tin SMD,P=0.5mm FFC, FPC (Flat Flexible) Connector Assemblies ROHSJUSHUOFFC, FPC (Flat Flexible) Connector AssembliesS8050
SOT-23-55℃~+150℃ 1 NPN 100MHz 100nA 120 25V 300mW 500mA 5V 600mV NPN SOT-23 Bipolar (BJT) ROHShongjiachengBipolar (BJT)TS-1187A-B-A-B
SMD-4P,5.1x5.1mm-30℃~+85℃ 1.5mm 1.6N 100,000 cycles 12V 5.1mm 5.1mm 50mA Gold No Round Button SPST Surface Mount,Vertical Without Bracket SMD-4P,5.1x5.1mm Tactile Switches ROHSXKB ConnectionTactile Switches
README
README.mdDigital Kinetic Art Clock
This project is the digital successor to my ClockClock24 Project, a replica of the kinetic art piece by Humans Since 1982. The original features physical clock hands driven by stepper motors, which brings challenges around power supply and makes scaling difficult.
This version replaces the clock hands with round LCD displays, which opens up new possibilities beyond just showing the time: animations, a snake game across all displays, or custom widgets.
Table of contents
🌅 Vision
The goal is to build a wall mounted array of round LCD displays that act together as one big synchronized screen. Each display sits in its own spot in a grid, similar to the clocks in the predecessor, but instead of physical hands every spot now has its own small screen.
At first, the array will simply show the time. But since every spot is now a real screen and not just a pair of clock hands, I plan to add more features over time. This includes smooth animations where the hands ease in and out instead of jumping, geometric patterns that move across the whole grid, a snake game that can be played across all displays at once, and small widgets like weather or notifications.
One central computer (likely a Raspberry Pi) will control the whole array and decide what should be shown. It sends this information to every display, and each display takes care of showing its own part of the picture.
🧩 Concept
| Aspect | Choice | Why |
|---|---|---|
| Architecture | Master for calulation / Slave for rendering | Real time pixel drawing and global logic need different hardware |
| Master | Raspberry Pi 3, headless Linux broadcasts state at 60 Hz | Global logic and the web UI run better on a Pi than on a microcontroller |
| Node (Slave) | 1× bare RP2040 + 1× GC9A01 round LCD, on a small custom PCB | One identical board, JLCPCB assembled, just replicated |
| Bus | RS485, daisy chained node to node | Carries tiny state packets instead of full frames, so it scales cleanly |
| Applications | Time, animated patterns, array wide games (Snake) | All just different states broadcast by the master |
⚙️ How it works
To make the vision above work, the project splits the thinking and the drawing onto different controllers. One controller calculates the global image/animation and broadcasts these to the nodes. Each node controller then renders its individual pixels and displays them.
┌───────────────────────────────────────────────┐
│ MASTER (Raspberry Pi 3) │
│ • Headless Linux, C# │
│ • Time sync, global vector math, game logic │
│ • Web UI for control/config │
└───────────────────────┬───────────────────────┘
│ RS485 bus (broadcast)
│ tiny state packets @ 60 FPS
┌───────────┬───────────┼───────────┬───────────┐
▼ ▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ NODE │ │ NODE │ │ NODE │ │ NODE │ │ NODE │
│RP2040│ │ + │ │ + │ │ + │ │ + │
│GC9A01│ │ LCD │ │ LCD │ │ LCD │ │ LCD │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘
Each node renders its own pixels locally from the shared global state.The master and the slave nodes
One computer, the master controller, runs the whole logic. It keeps track of time, decides what the array should be displaying, and runs a simple web page so it can be controlled. Every screen has its own slave controller, together they make up a node. Each node holds the picture for its own screen and draws it fast enough to keep up with all the others. It also knows its own position in the grid, so it only draws its own little piece of the bigger picture. The work is split this way because one controller can think for the whole array, but it cannot draw fast enough on dozens of screens by itself. And a tiny slave controller is fast enough to draw one screen, but it is too small to run all the planning logic. Splitting the work lets both sides do what they are good at. There is also a hard numeric reason the nodes have to render locally. One screen is 240×240 pixels at 16-bit color (RGB565), so one full frame is 240 × 240 × 2 bytes ≈ 112.5 KiB. The RP2040 on each node has 264 KiB of SRAM, so it comfortably fits a double buffer for its own screen (≈225 KiB) with room to spare.
Read more about the master controller in master/README.md, about the nodes in slave/README.md, and about the
hardware behind them in pcb/README.md.
How the data is sent to the nodes
Here is the idea that makes the whole array possible. The master does not send a full picture to every screen, sixty times a second. That would be far too much data. Instead, it sends a tiny instruction, something like "the hand should now point at 45 degrees" or "the snake is now at position 12, 2." Every node controller receives the exact same tiny instruction at the exact same moment, and draws its own piece of the picture from it. Streaming one full frame to one screen at 60 FPS is 112.5 KiB × 60 ≈ 6.6 MB/s, for a single screen alone. For 9 nodes that is already ≈ 60 MB/s, at the full 72-node array it is ≈ 475 MB/s. A wired RS485 bus, the kind of connection this project uses, realistically carries somewhere in the low single-digit Mbit/s over a long daisy chain, several hundred times too little. A state instruction, on the other hand, is a handful of bytes sent once, at 60 Hz, no matter how many screens are listening. That gap is the entire reason the master only ever sends instructions, never pixels. This has three nice side effects. It needs very little data, since an instruction is just a handful of bytes instead of a full image. It keeps everything in sync automatically, since every screen hears the same instruction at the same time. And it scales easily, since adding more screens does not change how much data the brain has to send.
To reliably send state instruction a Data Protocol needs to be defined. Read more about this in master/README.md and slave/README.md.
What actually will be displayed
This instruction can describe anything, which is what makes the project exciting. So far the plan includes:
- Time: the original purpose, digits and clock faces drawn across the grid.
- Geometric and animated patterns: motion across the whole grid, with easing animations instead of sudden jumps.
- A snake game: one game played across the entire array at once.
- Small widgets: controlled from the brain's simple web page.
- Gifs
📦 Repository layout & component status
Digital Clock 72/
├── 3D files/
│ ├── final/
│ └── test/
├── docs/
│ ├── datasheets/
│ └── images/
├── master/
│ └── README.md
├── slave/
│ └── README.md
├── pcb/
│ ├── node-pcb/
│ └── README.md
├── tests/
│ ├── phase-1.1-display-performance/
│ └── README.md
└── README.md| Path | Tech | Role | Status |
|---|---|---|---|
| master/ | C# on Pi 3 | Global logic, time sync, vector math, games, web UI, RS485 broadcast | Conceptual |
| slave/ | C++ (PlatformIO), RP2040 | Framebuffer + SPI/DMA rendering, RS485 receive, local draw, auto-addressing | Conceptual |
| node_pcb/ | KiCad | Single-node board (RP2040 + GC9A01 display header + RS485 + power + USB-C/SWD) | In design |
| tests/ | — | Bring-up plan test procedures and recorded results, one folder per phase | Not started |
🗺️ Roadmap
This roadmap tracks the project progress. The approach is to test cheap, risky parts first before committing to PCB production. The prototype is a 2×2 (4-node) array, large enough to validate the bus, addressing, and power distribution without high cost. Notes for each phase are listed in tests/.
| Phase | Goal | Status |
|---|---|---|
| 1 | Test a single display at 60 FPS and measure power | ✅ Completed |
| 2 | Prove the RS485 link with a disposable test sender | ✅ Completed |
| 3 | Prove the state protocol and slave firmware on breadboards | ✅ Completed |
| 4 | Confirm the display hardware | ⚙ In progress |
| 5 | Build small prototype | ⚙ Not started |
| 6 | Scale to 24, then 72 nodes | ⬜ Not started |
| 7 | Add applications and the web UI | ⬜ Not started |
1. Test a single display at 60 FPS and measure power
1.1 Display performance (breadboard)
- One GC9A01 dev board driven by a Pico
- Aim for 60 FPS
1.2 Power measurement (run during 1a)
- Measure how much power a single display and Pico consume
2. Prove the RS485 link with a disposable test sender
A slave can't be tested without something transmitting packets, so a sender has to exist this early, but it doesn't need to be the real master. A minimal, throwaway sender (a second Pico, or even a PC-side script) is enough to put bytes on the bus.
2.1 RS485 link (breadboard)
- Two Picos + two cheap RS485 breakout modules (MAX3485 / THVD1450).
- One Pico runs a minimal, disposable packet sender the other renders them as a slave.
- The packet should contain very basic instructions so the slave can draw something
3. Prove the state protocol and slave firmware on breadboards
Develop and test the state protocol and rendering pipeline on breadboards before committing to custom PCBs. Use a Pico as a sender.
3.1 Protocol design
- Define and implement the state protocol: time display, basic drawing instructions, interface to implement widgets later
- Build the slave display-list executor: the firmware loop that parses commands, calls into a graphics library (TFT_eSPI or LovyanGFX) and displays pictures
3.2 Physical testing
- Test sync accross multiple nodes on 2–3 Picos: one sender, two slaves rendering the same broadcast
- Addressing here is manual, daisy-chain auto-addressing comes later
4. Confirm the display hardware
4.1 Display hardware samples
- Order a handful of the chosen GC9A01 breakout displays before finalizing any PCB.
- Confirm the breakout's pinout/pin order and its mounting-hole pattern / board outline, so the node board's mating board-to-board header position and any standoffs line up
5. Build small prototype
Before any further testing we should design the PCB as best as we can. Since the minimum order on JLCPCB is 5 pieces, 4 of them should be used to build a 2x2 prototype.
5.1 PCB Prototype design
- Design PCB
- Order a small batch (5 Pcs.) and bring up one board: power rails, USB enumeration, flashing, display, RS485 loopback.
- Test if the board works fine: Try to send data packets via RS485 using the sender from Phase 1b
- Measure the power consumption of this board
5.2 2x2 prototype
- Add daisy-chain auto-addressing in firmware, now that multiple nodes make it meaningful.
- Create a first version of the master controller in C#
- Assemble prototype and run tests
- Watch for voltage drops along the chain and try the mid-chain injection point to see how much it helps.
6. Scale to 24, then 72 nodes
6.1 Scale
- With real power numbers and a working board/bus, scale up.
- Power distribution will probably need its own pass at this size (multiple supplies, injection points, trace/connector currents).
- Adjust PCB design if anything arises
7. Add applications and the web UI
7.1 Applications & web UI
- Patterns, Snake, widgets. Once the transport feels solid, this part is mostly open-ended.
❓ Open questions
- Power at scale. See node_pcb's
- Broadcast protocol definition. Exact protocol definition. Needs to be implemented in
masterandslave. - Addressing scheme (firmware). Daisy-chain auto-addressing to be implemented in firmware.
- Syncing How to make sure all displays run in sync
Parts
55| Qty | Value | Footprint | References |
|---|---|---|---|
| 11 | 100nF | JLCPCB:C0402 | C1, C2, C3, C4, C5, C6, C7, C8, C9, C15, C20 |
| 6 | 1k | JLCPCB:R0402 | R6, R7, R14, R15, R16, R17 |
| 4 | 10k | JLCPCB:R0402 | R5, R9, R10, R13 |
| 4 | 10uF | JLCPCB:C0805 | C10, C11, C12, C16 |
| 3 | 1uF | JLCPCB:C0402 | C13, C14, C19 |
| 2 | 15pF | JLCPCB:C0402 | C17, C18 |
| 2 | 33 | JLCPCB:R0402 | R3, R4 |
| 2 | 5.1k | JLCPCB:R0603 | R1, R2 |
| 2 | B5819WSL | JLCPCB:SOD-123_L2.7-W1.6-LS3.7-RD-1 | D1, D2 |
| 2 | BM08B-GHS-TBT(LF)(SN) | JLCPCB:CONN-SMD_BM08B-GHS-TBT-LF-SN | J2, J3 |
| 1 | 120 | JLCPCB:R0402 | R8 |
| 1 | 2.2k | JLCPCB:R0402 | R12 |
| 1 | 47 | JLCPCB:R0805 | R11 |
| 1 | ABM8-272-T3 | JLCPCB:CRYSTAL-SMD_4P-L3.2-W2.5-BL | Y1 |
| 1 | AFC11-S12ICA-00 | JLCPCB:CONN-SMD-12P_AFC11-S12ICA-00 | J5 |
| 1 | AP2112K-3.3 | JLCPCB:SOT-25-5_L2.9-W1.6-P0.95-LS2.8-BL | U1 |
| 1 | Conn_01x05_Pin | Connector_PinSocket_1.27mm:PinSocket_1x05_P1.27mm_Vertical | J4 |
| 1 | RP2040 | JLCPCB:LQFN-56_L7.0-W7.0-P0.4-EP | U3 |
| 1 | S8050 | JLCPCB:SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR | Q1 |
| 1 | Solder Jumper | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP1 |
| 1 | THVD1450DR | JLCPCB:SOIC-8_L4.9-W3.9-P1.27-LS6.0-BL | U4 |
| 1 | TP_1V1 | TestPoint:TestPoint_Pad_D1.0mm | TP3 |
| 1 | TP_3V3 | TestPoint:TestPoint_Pad_D1.0mm | TP2 |
| 1 | TP_5V | TestPoint:TestPoint_Pad_D1.0mm | TP1 |
| 1 | TS-1187A-B-A-B | JLCPCB:SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL_H1.5 | SW1 |
| 1 | TYPE-C-31-M-12 | JLCPCB:USB-C_SMD-TYPE-C-31-M-12_1 | J1 |
| 1 | W25Q32JVSSIQ | JLCPCB:SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL | U2 |
Questions
How big is the Node pcb PCB?
It measures 44 × 44 mm and has 4 copper layers, 1.61 mm thick.
What parts does the Node pcb use?
55 parts, built around the RP2040, THVD1450DRBR, W25Q32JVSSIQ and AP2112K-3.3TRG1. 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 Node pcb KiCad files?
From the marino222/digital-clock72 repository on GitHub, at the commit this page was made from: the board is pcb/node-pcb/node-pcb.kicad_pcb and its schematic pcb/node-pcb/node-pcb.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Node pcb 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).
Similar boards
- 2 layers37.3 × 31.8 mm

- 4 layers50 × 36 mm

Minicontrol
Jotrorox/minicontrol
RP2354A + 868 MHz LoRa (Ai-Thinker Ra-01SH) USB-C controller board, designed in KiCad 10.
66 partsBSD-2-Clause - 2 layers276 × 87.1 mm

- 4 layers58 × 70 mm

Probelab
enkhbold470/kicad-projects
Five KiCad 10 boards (4- and 6-layer): ESP32-S3 industrial gateway, USB-C PD bench supply, RP2040 logic analyzer, FOC motor controller, iCE40 FPGA board.
88 partsCERN-OHL-S-2.0 - 2 layers30.5 × 68.6 mm

- 4 layers86 × 34 mm

Bsl drv v1
jackw01/scanlight
A better light source for scanning color negative film
157 parts397CERN-OHL-W-2.0 - 2 layers100 × 64 mm

Rf power monitor rev2
TheKingOfChaos/RF-Power-Monitor
A 2-layer carrier board for the WIZnet W5500-EVB-Pico-PoE. It is 80 x 51.5 mm: exactly as long as the module, so both short edges line up with the module.
129 parts - 4 layers30 × 30 mm

Controller
andrewsharmon/rp2350-stepper-controller
Low-cost 10-axis sine-microstepping controller for small steppers on the RP2350 (PIO + DMA). WIP.
63 partsMIT