Created
July 22, 2012 00:18
-
-
Save jdiez17/3157677 to your computer and use it in GitHub Desktop.
4x4x4 cube driver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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