Skip to the content
PCBKitNew board
2 layers100 × 100 mmPixels64, the printed circuit board in 3D

Pixels64 is an 8x8 grid of 64 individually addressable RGB LEDs using the WS2812B package. It’s powered by an ESP32 running CircuitPython with the neopixel library for control. It features a custom-designed circuit board and a 3D-printable housing.

Size
100 × 100 mm
Copper layers
2
Thickness
1.6 mm
Parts
40
Nets
19
Pads
112
Tracks, vias
289, 16
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
23 Jan 2025
Updated
29 Jul 2026

Overview

Pixels64 is an open-source printed circuit board by TravisBumgarner, from the TravisBumgarner/pixels64 repository on GitHub. It is a 2-layer board of 100 × 100 mm with 40 parts on 19 nets, routed with 289 tracks and 16 vias.

It is built around the CL10B104KA8NNN and WS2812B-MINI-V3/W. Its parts include 16 capacitors and 16 diodes. It belongs with the lEDs and displays boards and the ESP32 boards of this library.

Main components

2

README

README.md

Pixels64

Pixels64 is an 8x8 grid of 64 individually addressable RGB LEDs using the WS2812B package. It’s powered by an ESP32 running CircuitPython with the neopixel library for control. It features a custom-designed circuit board and a 3D-printable housing.

(Need help? Join the community!)

Logo

This repository includes all the files needed to build the Pixel64 display.

  • cad - 3D models for housing
  • circuit - PCB diagram and schematic
  • code - Code for showing various displays
  • web - Browser control UI, pairs with bluetooth-experimental over Web Bluetooth
  • displays Collection of displays to get inspired. Check them out on Instagram.

Additionally

  • my_displays - What I am currently tinkering on to display.

The PCB is designed to be modular, allowing multiple boards to be combined in an N x M configuration for any display size.

Setup

Tools

  • Wire cutters
  • Soldering Iron

Components

  • esp32
  • Three different colors of wire (Red, Black, Blue)
  • White Filament
  • Black Filament
  • 4x pixel64 Boards
  • 16x M3x6x4.2 Brass Knurled Nuts
  • 16x M3x5 Metal Screws

Quick Setup

  1. Print base-plate.stl and walls.stl in black. Print case.stl in white.
  2. Upload files in jlcpcb and order from JLCPCB
  3. Cut wire to length
    • 3x 25mm Red
    • 3x 25mm Blue
    • 3x 25mm Black
    • 1x 12mm Red
    • 1x 12mm Blue
    • 1x 12mm Black
  4. Solder boards together.
    • Blue (data) goes to the center pad. Red (power) to the square pad. Black (power) to the circle pad.
    • Solder the short wires to the DataIn1 of the first PCB.
    • Solder the long wires from Dataout1 to the DataIn1 of the next PCB.
    • Repeat the previous step two more times.
  5. Use a soldering iron to press fit the brass knurled nuts into the risers on the base-plate.stl.
  6. Screw in the boards.
    • Note that all of the boards are oriented with DataIn1 at the bottom.
    • The arrangement of boards is
    text
    3 4
    1 2
  7. Setup virtual environment python -m venv venv inside the code directory
  8. Use virtual environment `source venv/bin/activate
  9. Install dependencies pip install -r requirements.txt
  10. Setup device
    1. Wipe device esptool.py --chip esp32 --port [device] erase_flash
    2. Download MicroPython - Your device may be different.
    3. esptool.py --chip esp32 --port [device] --baud 460800 write_flash -z 0x1000 file.uf2
  11. Run write.sh script to upload files to device.
  12. Pres the en button to shuffle the displays.

Additional Notes

CAD

Case
  • The case.stl services as the "screen" of the pixel64. It can be challenging to get a clean print of such a size. You'll need very good first layer adhesion. An alternative here would be to make a case out of white acrylic instead or cover the walls with a white sheet of paper.

Code

Useful commands
  • Get a list of connected devices
    • ls /dev/cu.* /dev/tty.*
    • The desired device should look something like tty.usbserial-0001
  • Get a terminal to esp32
    • mpremote
    • Note - you can't use the print statement while uploading code.
    • Be sure to setup your Python virtual environment before running mpremote.
    • ctrl + ] to exit
    • ctrl + c and ctrl + d to soft reboot and cycle through displays.
  • Send file to esp32
    • ampy --port /dev/tty.usbserial-0001 put boot.py
    • If put fails, reconnect device.
    • Push button with "en" to launch code.
  • Remove a file
    • ampy --port /dev/tty.usbserial-0001 rm boot.py
  • List files
    • ampy --port /dev/tty.usbserial-0001 ls

Circuit

NeoPixel Mapping

The LED circuit board I designed supports multiple configurations, meaning the default ordering of NeoPixels may not match the expected layout. For example, setting neopixel[0] = (255, 255, 255) won't necessarily light up the top-left LED.

This script cycles through each pixel one at a time, allowing you to determine the actual order. Once identified, we can remap the ordering. For example, the physical layout might be:

text
 3  2  1  0
 7  6  5  4
11 10  9  8
15 14 13 12

We can then transform it into a more intuitive sequence:

text
 0  1  2  3
 4  5  6  7
 8  9 10 11
12 13 14 15

This remapping ensures easier indexing and consistent control over the LEDs.

Take the following code and save it to main.py

text
import machine
import time
import neopixel

NEO_PIXEL_PIN = 13
NEO_PIXEL_COUNT = 64

neo_pin = machine.Pin(NEO_PIXEL_PIN, machine.Pin.OUT)
np = neopixel.NeoPixel(neo_pin, NEO_PIXEL_COUNT)


def set_pixel(i, r, g, b):
    np[i] = (r, g, b)
    np.write()


def main():
    while True:
        for i in range(64):
            set_pixel(i, 255, 0, 0)
            time.sleep_ms(2000)
            set_pixel(i, 0, 0, 0)


if __name__ == "__main__":
    main()

Upload the code to the esp32

text
ampy --port [replace with your device] put main.py

Place a sheet of paper over the LEDs and tape in place.

Press the en button on the esp32 to run the code.

You should see the LEDs light up in a red color.

Mark the first LED that lights up as 0 and complete until done.

Now, starting from the top left, write the numbers of the LEDs in a left to right top to bottom order in the config.py file, replacing the variable LOOKUP.

Parts

40
QtyValueFootprintReferences
16C1590Capacitor_SMD:C_0805_2012MetricC1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
16C527089LED_SMD:LED_WS2812B-Mini_PLCC4_3.5x3.5mmD1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16
4Conn_01x03_PinConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalDataIn1, DataOut0, DataOut1, DataOut2
4MountingHoleMountingHole:MountingHole_3.2mm_M3_DIN965_PadH1, H2, H3, H4

Questions

How big is the Pixels64 PCB?

It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Pixels64 use?

40 parts, built around the CL10B104KA8NNN and WS2812B-MINI-V3/W. 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 Pixels64 KiCad files?

From the TravisBumgarner/pixels64 repository on GitHub, at the commit this page was made from: the board is circuit/v1.0/kicad/kicad.kicad_pcb and its schematic circuit/v1.0/kicad/kicad.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Pixels64 design in my own project?

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

Similar boards

  • 8 layersFIRM v1.1, the printed circuit board in 3D

    FIRM v1.1

    NCSU-High-Powered-Rocketry-Club/FIRM-KiCad

    Full and open hardware design for FIRM

    108 parts1MIT
  • 2 layers32 × 32 mmMagfield node, the printed circuit board in 3D

    Magfield node

    airpocket-soundman/magfield-nodes

    24 partsMIT
  • 2 layers139.7 × 73.7 mm134pin 7-967288-1, the printed circuit board in 3D

    134pin 7-967288-1

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    40 parts1.2k
  • 2 layers149.4 × 177.4 mmLightsculpture, the printed circuit board in 3D

    Lightsculpture

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    40 parts915
  • 2 layers150 × 50 mmEleLab v2 Bus150, the printed circuit board in 3D

    EleLab v2 Bus150

    Chrismettal/EleLab_v2

    Cheap DIY lab system for hobbyists and the tinkering folk

    40 parts531GPL-3.0
  • 2 layers66.4 × 48.1 mmRaspberry, the printed circuit board in 3D

    Raspberry

    Chrismettal/flipper-zero-backpacks

    Backpack-style addon boards for the Flipper Zero!

    40 parts456
  • 2 layers44 × 44 mmTrackball, the printed circuit board in 3D

    Trackball

    jfedor2/rp2040-pmw3360

    RP2040+PMW3360 PCB and code

    40 parts432
  • 2 layers90.8 × 53.3 mmABSIS Bus Master, the printed circuit board in 3D

    ABSIS Bus Master

    jrsteensen/OpenHornet

    OpenHornet 1:1 F/A-18C Simulator Repository

    40 parts431