/* Based on ledcube.c from Make: September 7, 2007 weekend podcast http://blog.makezine.com/archive/2007/09/make_a_pocket_led_cube_we.html Custom animation programmed by Mark Boszko, http://stationinthemetro.com And modified by AptPupil */ #include // allows use of PROGMEM to store patterns in flash #define CUBESIZE 3 #define PLANESIZE CUBESIZE*CUBESIZE #define PLANETIME 3333 // time each plane is displayed in us -> 100 Hz refresh #define TIMECONST 3 // multiplies DisplayTime to get ms - why not =100? // LED Pattern Table in PROGMEM - last column is display time in 100ms units // TODO this could be a lot more compact but not with binary pattern representation prog_uchar PROGMEM PatternTable[] = { B000, B001, B000, B000, B010, B000, B000, B100, B000, 1080 , B000, B010, B000, B000, B010, B000, B000, B010, B000, 1080 , B000, B100, B000, B000, B010, B000, B000, B001, B000, 1080 , B000, B000, B000, B000, B111, B000, B000, B000, B000, 1080 , B000, B001, B000, B000, B010, B000, B000, B100, B000, 1080 , B000, B010, B000, B000, B010, B000, B000, B010, B000, 1080 , B000, B100, B000, B000, B010, B000, B000, B001, B000, 1080 , B000, B000, B000, B000, B111, B000, B000, B000, B000, 1080 , B000, B000, B000, B010, B010, B010, B000, B000, B000, 1080 , B010, B000, B000, B000, B010, B000, B000, B000, B010, 1080 , B000, B010, B000, B000, B010, B000, B000, B010, B000, 1080 , B000, B000, B010, B000, B010, B000, B010, B000, B000, 1080 , B000, B010, B000, B000, B010, B000, B000, B010, B000, 1080 , B010, B000, B000, B000, B010, B000, B000, B000, B010, 1080 , B000, B010, B000, B000, B000, B010, B000, B000, B010, 1080 , B000, B000, B010, B000, B000, B010, B000, B000, B010, 1080 , B000, B000, B101, B000, B000, B010, B000, B010, B000, 1080 , B000, B000, B111, B000, B010, B000, B010, B000, B000, 1080 , B000, B111, B000, B101, B000, B000, B000, B010, B000, 1080 , B111, B000, B000, B000, B111, B000, B000, B000, B101, 1080 , B000, B111, B000, B000, B000, B111, B000, B111, B000, 1080 , B000, B000, B111, B000, B111, B000, B101, B000, B000, 1080 , B000, B111, B000, B101, B000, B000, B000, B101, B000, 1080 , B101, B000, B000, B000, B101, B000, B000, B000, B010, 1080 , B000, B101, B000, B000, B000, B010, B000, B000, B111, 1080 , B000, B000, B010, B000, B000, B111, B000, B000, B000, 1080 , B000, B000, B111, B000, B000, B000, B000, B000, B111, 1080 , B000, B000, B111, B000, B000, B111, B000, B000, B111, 1080 , B000, B000, B111, B000, B000, B111, B000, B111, B000, 1080 , B000, B000, B111, B000, B111, B000, B111, B000, B000, 1080 , B000, B111, B000, B111, B000, B000, B000, B111, B000, 1080 , B111, B000, B000, B000, B111, B000, B000, B000, B111, 1080 , B000, B111, B000, B000, B000, B111, B000, B111, B000, 1080 , B000, B000, B111, B000, B111, B000, B111, B000, B000, 1080 , B000, B111, B000, B111, B000, B000, B000, B111, B000, 1080 , B111, B000, B000, B000, B111, B000, B000, B000, B111, 1080 , B000, B111, B000, B010, B010, B010, B000, B111, B000, 1080 , B100, B010, B001, B001, B010, B100, B100, B010, B001, 1080 , B010, B010, B010, B000, B111, B000, B010, B010, B010, 1080 , B001, B010, B100, B100, B010, B001, B001, B010, B100, 1080 , B000, B111, B000, B010, B010, B010, B000, B111, B000, 1080 , B100, B010, B001, B001, B010, B100, B100, B010, B001, 1080 , B010, B010, B010, B000, B111, B000, B010, B010, B010, 1080 , B001, B010, B100, B100, B010, B001, B001, B010, B100, 1080 , B000, B111, B000, B010, B010, B010, B000, B111, B000, 1080 , B100, B010, B001, B001, B010, B100, B100, B010, B001, 1080 , B010, B010, B010, B000, B111, B000, B010, B010, B010, 1080 , B001, B010, B100, B101, B010, B101, B100, B010, B001, 1080 , B000, B101, B010, B000, B101, B010, B000, B101, B010, 1080 , B000, B010, B101, B000, B010, B101, B000, B010, B101, 1080 , B010, B101, B000, B010, B101, B000, B010, B101, B000, 1080 , B101, B010, B000, B101, B010, B000, B101, B010, B000, 1080 , B000, B101, B010, B000, B101, B010, B000, B101, B010, 1080 , B000, B010, B101, B000, B010, B101, B000, B010, B101, 1080 , B010, B101, B000, B010, B101, B000, B010, B101, B000, 1080 , B101, B010, B000, B101, B010, B000, B101, B010, B000, 1080 , B000, B101, B010, B000, B101, B010, B000, B101, B010, 1080 , B000, B000, B100, B000, B000, B010, B000, B000, B001, 1080 , B000, B000, B000, B000, B000, B111, B000, B000, B000, 1080 , B000, B000, B001, B000, B000, B010, B000, B000, B100, 1080 , B000, B000, B010, B000, B000, B010, B000, B000, B010, 1080 , B000, B000, B100, B000, B000, B010, B000, B000, B001, 1080 , B000, B000, B000, B000, B000, B111, B000, B000, B000, 1080 , B000, B000, B001, B000, B000, B010, B000, B000, B100, 1080 , B000, B000, B010, B000, B000, B010, B000, B000, B010, 1080 , B000, B000, B010, B000, B010, B000, B000, B000, B010, 1080 , B000, B010, B000, B010, B000, B000, B000, B010, B000, 1080 , B010, B000, B000, B010, B000, B000, B010, B000, B000, 1080 , B100, B000, B000, B010, B000, B000, B001, B000, B000, 1080 , B000, B000, B000, B111, B000, B000, B000, B000, B000, 1080 , B001, B000, B000, B010, B000, B000, B100, B000, B000, 1080 , B010, B000, B000, B010, B000, B000, B010, B000, B000, 1080 , B100, B000, B000, B010, B000, B000, B001, B000, B000, 1080 , B000, B000, B000, B111, B000, B000, B000, B000, B000, 1080 , B001, B000, B000, B010, B000, B000, B100, B000, B000, 1080 , B010, B000, B000, B010, B000, B000, B010, B000, B000, 1080 , B000, B000, B000, B010, B000, B000, B000, B000, B000, 1080 , B000, B000, B000, B010, B010, B000, B000, B000, B000, 1080 , B000, B000, B000, B010, B010, B010, B000, B000, B000, 1080 , B000, B000, B001, B010, B010, B010, B000, B000, B100, 1080 , B000, B000, B011, B010, B010, B010, B000, B000, B110, 1080 , B000, B000, B110, B010, B010, B010, B000, B000, B011, 1080 , B000, B000, B100, B010, B010, B111, B000, B000, B001, 1080 , B000, B000, B001, B010, B010, B111, B000, B000, B100, 1080 , B000, B000, B011, B010, B010, B010, B000, B000, B110, 1080 , B000, B000, B110, B010, B010, B010, B000, B000, B011, 1080 , B000, B000, B110, B010, B010, B111, B000, B000, B011, 1080 , B000, B000, B111, B010, B010, B111, B000, B000, B111, 1080 , B000, B000, B111, B111, B010, B101, B000, B000, B111, 1080 , B001, B000, B111, B010, B010, B111, B100, B000, B111, 1080 , B010, B000, B111, B010, B010, B111, B010, B000, B111, 1080 , B100, B000, B111, B010, B010, B111, B001, B000, B111, 1080 , B000, B000, B111, B111, B010, B111, B000, B000, B111, 1080 , B001, B000, B111, B010, B010, B111, B100, B000, B111, 1080 , B010, B000, B111, B010, B010, B111, B010, B000, B111, 1080 , B100, B000, B111, B010, B010, B111, B001, B000, B111, 1080 , B000, B000, B111, B111, B010, B111, B000, B000, B111, 1080 , B001, B000, B111, B010, B010, B111, B100, B000, B111, 1080 , B010, B000, B111, B010, B010, B111, B010, B000, B111, 1080 , B100, B000, B111, B010, B010, B111, B001, B000, B111, 1080 , B000, B000, B111, B111, B010, B111, B000, B000, B111, 1080 , B001, B000, B111, B010, B010, B111, B100, B000, B111, 1080 , B010, B000, B111, B010, B010, B111, B010, B000, B111, 1080 , B100, B000, B111, B010, B010, B111, B001, B000, B111, 1080 , B111, B010, B111, B111, B010, B111, B111, B010, B111, 1080 , B111, B010, B111, B111, B111, B111, B111, B010, B111, 1080 , B111, B111, B111, B111, B010, B111, B111, B111, B111, 1080 , B111, B010, B111, B111, B111, B111, B111, B010, B111, 1080 , B010, B111, B010, B101, B010, B101, B010, B111, B010, 1080 , B101, B010, B101, B010, B111, B010, B101, B010, B101, 1080 , B010, B111, B010, B101, B010, B101, B010, B111, B010, 1080 , B101, B010, B101, B010, B111, B010, B101, B010, B101, 1080 , B111, B111, B111, B000, B000, B000, B111, B111, B111, 1080 , B000, B000, B000, B111, B111, B111, B000, B000, B000, 1080 , B111, B111, B111, B000, B000, B000, B111, B111, B111, 1080 , B000, B000, B000, B111, B111, B111, B000, B000, B000, 1080 , B000, B111, B000, B000, B111, B000, B000, B111, B000, 1080 , B111, B000, B111, B111, B000, B111, B111, B000, B111, 1080 , B000, B111, B000, B000, B111, B000, B000, B111, B000, 1080 , B100, B010, B001, B100, B010, B001, B100, B010, B001, 1080 , B010, B010, B010, B010, B010, B010, B010, B010, B010, 1080 , B001, B010, B100, B001, B010, B100, B001, B010, B100, 1080 , B000, B111, B000, B000, B111, B000, B000, B111, B000, 1080 , B100, B010, B001, B100, B010, B001, B100, B010, B001, 1080 , B010, B010, B010, B010, B010, B010, B010, B010, B010, 1080 , B001, B010, B100, B001, B010, B100, B001, B010, B100, 1080 , B000, B111, B000, B000, B111, B000, B000, B111, B000, 1080 , B100, B010, B001, B100, B010, B001, B100, B010, B001, 1080 , B010, B010, B010, B010, B010, B010, B010, B010, B010, 1080 , B010, B010, B111, B010, B010, B111, B010, B010, B111, 1080 , B010, B111, B111, B010, B111, B111, B010, B111, B111, 1080 , B111, B111, B010, B111, B111, B010, B111, B111, B010, 1080 , B111, B111, B111, B111, B111, B111, B111, B111, B111, 1080 , B000, B000, B000, B000, B000, B000, B000, B000, B000, 1080 , B111, B111, B111, B111, B111, B111, B111, B111, B111, 1080 , B000, B000, B000, B000, B000, B000, B000, B000, B000, 1080 , B111, B111, B111, B111, B111, B111, B111, B111, B111, 1080 , B111, B111, B011, B101, B111, B111, B111, B111, B101, 1080 , B011, B111, B011, B101, B011, B111, B111, B110, B101, 1080 , B011, B111, B010, B101, B010, B111, B011, B110, B101, 1080 , B001, B111, B010, B101, B000, B111, B011, B010, B101, 1080 , B001, B101, B010, B101, B000, B101, B001, B010, B101, 1080 , B000, B101, B010, B101, B000, B001, B001, B000, B101, 1080 , B000, B101, B000, B100, B000, B001, B001, B000, B001, 1080 , B000, B001, B000, B100, B000, B000, B000, B000, B001, 1080 , B000, B000, B000, B000, B010, B000, B000, B000, B000, 1080 , }; /* ** Defining pins in array makes it easier to rearrange how cube is wired ** Adjust numbers here until LEDs flash in order - L to R, T to B ** Note that analog inputs 0-5 are also digital outputs 14-19! ** Pin DigitalOut0 (serial RX) and AnalogIn5 are left open for future apps */ //int LEDPin[] = {16, 3, 1, 15, 4, 6, 14, 5, 7}; int LEDPin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10}; //int PlanePin[] = {19, 18, 17}; int PlanePin[] = {13, 12, 11}; // initialization void setup() { int pin; // loop counter // set up LED pins as output (active HIGH) for (pin=0; pin0 do { // read pattern from PROGMEM and save in array memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANESIZE ); PatternIdx += PLANESIZE; // read DisplayTime from PROGMEM and increment index DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ ); // compute EndTime from current time (ms) and DisplayTime EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST; // loop while DisplayTime>0 and current time < EndTime while ( millis() < EndTime ) { patbufidx = 0; // reset index counter to beginning of buffer // loop over planes for (plane=0; plane 0); // read patterns until time=0 which signals end }