Sulabh Sethi · Blog ← Main Site

DIY 4x4x4 LED Cube

A 4x4x4 LED cube driven by an Arduino UNO and 64 LEDs, with the layer-and-column multiplexing code that animates it.

Embedded Systems · 9 August 2023 · 2 min read · Updated 11 August 2023

DIY 4x4x4 LED cube

A DIY 4x4x4 LED cube, based on an Arduino UNO and 64 LEDs. The cube is multiplexed: one helper turns a single LED on by its (x, y, z) coordinate, another switches the layers, and the animation in loop() paints patterns by lighting columns layer by layer with small delays.

void l(int x, int y, int z) {
if (y == 0) { digitalWrite(2, LOW); }
else if (y == 1) { digitalWrite(3, LOW); }
else if (y == 2) { digitalWrite(4, LOW); }
if (x == 0) {
if (z == 0) { digitalWrite(9, HIGH); }
else if (z == 1) { digitalWrite(11, HIGH); }
else if (z == 2) { digitalWrite(13, HIGH); }
}
if (x == 1) {
if (z == 0) { digitalWrite(8, HIGH); }
else if (z == 1) { digitalWrite(10, HIGH); }
else if (z == 2) { digitalWrite(12, HIGH); }
}
if (x == 2) {
if (z == 0) { digitalWrite(6, HIGH); }
else if (z == 1) { digitalWrite(7, HIGH); }
else if (z == 2) { digitalWrite(5, HIGH); }
}
}
void ol(int num) { // layer on
if (num == 1) { digitalWrite(2, HIGH); }
if (num == 2) { digitalWrite(3, HIGH); }
if (num == 3) { digitalWrite(4, HIGH); }
}
void onl(int num) { // layer off
if (num == 1) { digitalWrite(2, LOW); }
if (num == 2) { digitalWrite(3, LOW); }
if (num == 3) { digitalWrite(4, LOW); }
}
void off(int x) {
for (int p = 5; p <= 13; p++) digitalWrite(p, LOW);
delay(x);
}
void setup() {
for (int p = 2; p <= 13; p++) pinMode(p, OUTPUT);
}
void loop() {
onl(1); onl(2); onl(3);
l(1, 0, 1);
delay(500);
off(50);
l(0,0,0); l(1,0,0); l(2,0,0);
l(2,0,1); l(2,0,2); l(1,0,2);
l(0,0,2); l(0,0,1);
delay(350);
ol(2); ol(3);
delay(350);
off(0);
ol(2);
l(0,0,0); l(2,0,0); l(2,0,2); l(0,0,2);
delay(400);
off(100);
}

Originally published on sslabs.in.