HUB75 Wiring Guide

Physical wiring, panel arrangement, and the settings that let one firmware drive panels it was not built for.

Settings, Not Solder

Use a standard HUB75 cable, unmodified. There is one pin map for both boards, and nothing about your panel needs a custom firmware build β€” it is all settings on the Hardware tab, applied on reboot.
SettingUse it when
RGB channel orderColours are wrong β€” orange looks pink, sky looks teal, yellow looks violet
Panel driver chipThe panel stays blank or ghosts (some panels need an FM6126A/ICN2038S-style init)
Custom pin mapYou wired to different GPIOs, or colours are wrong on only one half of the panel
Panel arrangementWhich panels you attached β€” see Panel Arrangement

The tab also carries a test pattern (three bars labelled R, G and B) and a restore built-in wiring button. Both work in setup (AP) mode, so a panel left dark by a bad setting can always be recovered without a USB cable.

The Pin Map

There is one pin map, and it is the MatrixPortal's. Those GPIOs are fixed in the MatrixPortal's PCB, and the firmware ships them as its compiled default for both boards β€” so a generic ESP32-S3 wired to match behaves identically, and any HUB75 tutorial or rainbow cable works on either.

MatrixPortal ESP32-S3

Nothing to wire. Plug the panel's cable into the built-in HUB75 connector.

ESP32-S3 N8R2 DevKit (Generic)

Wire to the table below, pin for pin. Cable colours are the common rainbow-ribbon convention and repeat down the run β€” trust the HUB75 label, not the colour, if a cable disagrees.

#ColorHUB75GPIO
1BrownR142
2OrangeG141
3YellowB140
4GreenGNDGND
5BlueR238
6PurpleG239
7GrayB237
8WhiteE21
9BlackA45
10RedB36
11OrangeC48
12YellowD35
13GreenCLK2
14BlueLAT47
15PurpleOE14
16WhiteGNDGND

Standard HUB75 Pinout Reference

Top Row (Pins 1-8):
β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”
β”‚ R1 β”‚ G1 β”‚ B1 β”‚GND β”‚ R2 β”‚ G2 β”‚ B2 β”‚ E  β”‚
β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”˜

Bottom Row (Pins 9-16):
β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”
β”‚ A  β”‚ B  β”‚ C  β”‚ D  β”‚CLK β”‚LAT β”‚ OE β”‚GND β”‚
β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”˜

Wrong Colours Are a Setting, Not a Rewire

The six colour pins β€” R1 G1 B1 R2 G2 B2 β€” carry no meaning in the wire. Which colour arrives on which pin is decided by the RGB channel order, a setting on the Hardware tab. So if your colours come out wrong, do not unplug anything: change the order and reboot.

What "wrong" looks like: orange renders pink, sky renders teal, yellow renders violet β€” the image is sharp and correctly positioned, only the hues are off.

  1. Hardware β†’ Test pattern. Three bars labelled R, G and B.
  2. If a letter sits on the wrong colour, pick the order that matches what you see.
  3. Save and reboot. Repeat if needed β€” there are only six permutations, and the test pattern identifies the right one immediately.

This is also why the two boards need no separate wiring: the MatrixPortal's connector happens to present green and blue transposed, so its default order is RBG where the generic board's is RGB. Same pins, different label β€” and both are just the factory value of a setting you can change.

Which setting fixes which problem

What you seeFix
Colours wrong, whole panel consistentlyRGB channel order. One permutation, six options, test pattern identifies it in seconds
Colours wrong on the top half only, or bottom onlyCustom pin map β€” swap those two GPIO values
Blank, garbled, half-lit, or interleaved rowsNot a colour fault. Check the address/control wiring (A B C D E, CLK, LAT, OE), the panel arrangement, and the panel driver chip
The one thing settings cannot fix: a wire that is not actually connected, or is shorted. Settings can describe any working wiring; they cannot conjure a signal that never arrives. If a pin reads dead no matter which GPIO you assign it to, it is the cable or the joint.

Panel Arrangement

Which panels you attached is a setting, on the Hardware tab, applied on reboot. One firmware drives all three arrangements.

SettingPanelsPixels
128Γ—32 β€” 2Γ— 64Γ—32 panels, chained2Γ— 64Γ—32 side by side128Γ—32
128Γ—64 β€” 4Γ— 64Γ—32 panels, 2Γ—2 grid4Γ— 64Γ—32 in a 2Γ—2 serpentine128Γ—64
128Γ—64 β€” 2Γ— 64Γ—64 chained, or one 128Γ—64 module2Γ— 64Γ—64 side by side, or a single 128Γ—64 module128Γ—64
Two of the three are 128Γ—64, so the pixel size does not tell you which one you have β€” count the panels. Picking the wrong one gives a scrambled or half-lit display; change the setting and reboot, nothing is damaged.

A single 128Γ—64 module uses the 2Γ— 64Γ—64 setting

If your display is one 128Γ—64 module with a single HUB75 connector rather than two chained 64Γ—64 panels, choose the 2Γ— 64Γ—64 chained, or one 128Γ—64 module setting. There is no separate option, and none is needed β€” the driver only ever uses the panel width and the chain length multiplied together, and both descriptions give 128 pixels per row. The only physical difference is the cabling: one connector instead of two with a ribbon between them.

64-high panels need the E line. A 64Γ—32 panel addresses 16 rows with four address bits (A–D) and holds E low permanently, so a 13-wire harness happens to work. A 64Γ—64 panel addresses 32 rows and needs all five. Omit E and the panel lights up looking plausible, with the top and bottom halves showing the same content.

One exception is worth knowing about, and it is scan type rather than panel count: a minority of 128Γ—64 modules use a non-standard internal scan map (typically 1/16-scan "outdoor" panels) and need a remap this firmware does not currently apply. You cannot identify these from the pixel dimensions. The symptom is distinctive β€” interleaved or garbled rows, where the image is there but shredded.

Panel Chain Order

The two chained arrangements β€” 2Γ— 64Γ—32 and 2Γ— 64Γ—64 β€” put the panels side by side. Getting the order right matters: reversing them causes a split or mirrored image. (The 2Γ—2 grid chains in a serpentine instead, and a single 128Γ—64 module has no chain at all.)

Orientation: When looking at the back of the panels, the controller board (MatrixPortal S3 or ESP32-S3) connects to the leftmost panel. Chain left to right.
  Back of panels (facing you)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Panel 1    β”‚    β”‚   Panel 2    β”‚
β”‚              β”‚    β”‚              β”‚
β”‚  IN ←── OUT ─┼────┼→ IN    OUT  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  β–²
  β”‚ HUB75 cable
  β”‚
[Controller Board]
  • Connect the controller's HUB75 output to Panel 1 IN (left panel, viewed from behind)
  • Connect Panel 1 OUT to Panel 2 IN using a short HUB75 ribbon cable
  • Panel 2 OUT is unused
Quick check: If your display looks split in half or mirrored, swap the two panels.

Power Connections

SpojBoard draws 0.3-0.7A during normal operation, with transient peaks up to 1.6A during WiFi connection, OTA updates, or boot.

MatrixPortal S3

  • Connect panels to MatrixPortal's screw terminals (5V/GND)
  • Connect USB-C to MatrixPortal (5V 2A+ adapter)
  • USB-C powers both MatrixPortal and panels via screw terminals

ESP32-S3 N8R2

  • LED panels require their own 5V power supply (2A+ minimum) via screw terminals
  • The same PSU can also power the ESP32-S3 (connect to ESP32's 5V/GND pins)
  • Or power ESP32 separately via USB (ensure common GND with panels)
⚠️ Common Ground: If powering the ESP32 and panels from separate supplies, always connect their GNDs together. Without a common ground reference, HUB75 signals won't work reliably β€” expect wrong colors, flickering, or a blank display.

Power Topology Comparison

MatrixPortal S3 (Serial)

USB-C β†’ MatrixPortal β†’ Panels
        (passes power through)

USB-C powers the board, which passes power to panels via screw terminals.

ESP32-S3 N8R2 (Parallel)

        β”Œβ†’ ESP32-S3
PSU 5V ──
        β””β†’ Panels

ESP32-S3 cannot pass through enough current. PSU powers both in parallel.

Power Supply Recommendations

SupplyRatingSuitability
USB-C Wall Adapter5V 2A (10W)βœ… Adequate
USB-C Wall Adapter5V 3A (15W)βœ… Recommended
USB-C Wall Adapter5V 1A (5W)❌ Insufficient
Screw Terminal PSU5V 2-3Aβœ… For ESP32-S3 N8R2
Never power the panels from the ESP32's 5V pin β€” it cannot supply enough current and will cause resets.

Why Lower Than Specs?

Published HUB75 specs cite 4-6A at full brightness with all white LEDs. SpojBoard's real-world usage is much lower:

  • Text displays use far fewer LEDs than solid colors
  • Mixed colors draw less than white
  • Default brightness (90/255 = 35%) reduces power
  • Most pixels are black (off) in typical display

Troubleshooting

Colors are wrong

Do not rewire. Go to Hardware β†’ Test pattern and change the RGB channel order β€” see Wrong Colours Are a Setting above. Only if the colours are wrong on one half of the panel is a pin change involved, and that is the custom pin map, still a setting.

Panel doesn't light up, or is scrambled

  • Check the panel arrangement on the Hardware tab matches the panels you actually attached β€” two of the three options are 128Γ—64
  • Try a different panel driver chip; some panels need an FM6126A/ICN2038S-style init before they show anything
  • On 64-high panels, confirm the E line is wired β€” without it the top and bottom halves show the same content
  • Check panel has separate 5V power connected
  • Verify GND connection between ESP32 and panel
  • Check all 16 signal wires connected
Stuck with a dark panel and no way in? The Hardware tab and the restore built-in wiring button both work in setup (AP) mode, so you never need a USB cable to undo a bad setting.

Flickering or artifacts

  • Ensure common ground between ESP32 and panel
  • Check for loose connections
  • Verify power supply provides sufficient current