Skip to content

Instantly share code, notes, and snippets.

@jdiez17
Created July 22, 2012 00:18
Show Gist options
  • Save jdiez17/3157677 to your computer and use it in GitHub Desktop.
Save jdiez17/3157677 to your computer and use it in GitHub Desktop.
4x4x4 cube driver
#include <avr/pgmspace.h>
#define LAYER_TIME 3333
#define LAYER_BITS 16
#define FRAME_TIME 20
PROGMEM prog_uchar drip[] =
{
/* snip */
};
PROGMEM prog_uchar reverse_drip[] =
{
/* snip */
};
PROGMEM prog_uchar diagonal[] =
{
/* snip */
};
PROGMEM prog_uchar spin[] =
{
/* snip */
};
PROGMEM prog_uchar on_and_off[] =
{
/* snip */
};
PROGMEM prog_uchar snake[] =
{
/* snip */
};
PROGMEM prog_uchar wireframe[] =
{
/* snip */
};
prog_uchar* animation_order[] =
{
wireframe,
wireframe,
wireframe,
drip,
diagonal,
spin,
on_and_off,
reverse_drip,
snake,
NULL
};
int leds[] = {15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
int layers[] = {16, 17, 18, 19};
void setup() {
for(int i = 0; i < LAYER_BITS; i++) {
pinMode(leds[i], OUTPUT);
}
for(int i = 0; i < 4; i++) {
pinMode(layers[i], OUTPUT);
}
}
void do_animation(prog_uchar* animation) {
byte layer_buffer[LAYER_BITS];
int pointer = 0;
unsigned long pattern_time, target_time;
do {
memcpy_P(layer_buffer, animation + pointer, LAYER_BITS);
pointer += LAYER_BITS;
pattern_time = pgm_read_byte_near(animation + pointer++);
target_time = millis() + pattern_time * FRAME_TIME;
while(millis() < target_time) {
int group = 0;
for(int p = 0; p < 4; p++) {
int pin = 0;
if(p == 0)
digitalWrite(layers[3], LOW);
else
digitalWrite(layers[p-1], LOW);
for(int row = 0; row < 4; row++) {
for(int col = 0; col < 4; col++) {
digitalWrite(leds[pin++], layer_buffer[group] & (1 << col));
}
group++;
}
digitalWrite(layers[p], HIGH);
delayMicroseconds(LAYER_TIME);
}
}
} while(pattern_time > 0);
}
void loop() {
int pointer = 0;
do {
do_animation(animation_order[pointer++]);
} while(animation_order[pointer] != NULL);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment