/* 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 */ #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 20 // 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[] = { // blink on and off B111, B111, B111, B111, B111, B111, B111, B111, B111, 5, B000, B000, B000, B000, B000, B000, B000, B000, B000, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 5, B000, B000, B000, B000, B000, B000, B000, B000, B000, 1, // flash each LED in sequence: // Left->Right column, then Top->Bottom row, then Upper->Lower plane B100, B000, B000, B000, B000, B000, B000, B000, B000, 1, B010, B000, B000, B000, B000, B000, B000, B000, B000, 1, B001, B000, B000, B000, B000, B000, B000, B000, B000, 1, B000, B100, B000, B000, B000, B000, B000, B000, B000, 1, B000, B010, B000, B000, B000, B000, B000, B000, B000, 1, B000, B001, B000, B000, B000, B000, B000, B000, B000, 1, B000, B000, B100, B000, B000, B000, B000, B000, B000, 1, B000, B000, B010, B000, B000, B000, B000, B000, B000, 1, B000, B000, B001, B000, B000, B000, B000, B000, B000, 1, B000, B000, B000, B100, B000, B000, B000, B000, B000, 1, B000, B000, B000, B010, B000, B000, B000, B000, B000, 1, B000, B000, B000, B001, B000, B000, B000, B000, B000, 1, B000, B000, B000, B000, B100, B000, B000, B000, B000, 1, B000, B000, B000, B000, B010, B000, B000, B000, B000, 1, B000, B000, B000, B000, B001, B000, B000, B000, B000, 1, B000, B000, B000, B000, B000, B100, B000, B000, B000, 1, B000, B000, B000, B000, B000, B010, B000, B000, B000, 1, B000, B000, B000, B000, B000, B001, B000, B000, B000, 1, B000, B000, B000, B000, B000, B000, B100, B000, B000, 1, B000, B000, B000, B000, B000, B000, B010, B000, B000, 1, B000, B000, B000, B000, B000, B000, B001, B000, B000, 1, B000, B000, B000, B000, B000, B000, B000, B100, B000, 1, B000, B000, B000, B000, B000, B000, B000, B010, B000, 1, B000, B000, B000, B000, B000, B000, B000, B001, B000, 1, B000, B000, B000, B000, B000, B000, B000, B000, B100, 1, B000, B000, B000, B000, B000, B000, B000, B000, B010, 1, B000, B000, B000, B000, B000, B000, B000, B000, B001, 10, // Some little cube - big cube fun B000, B000, B000, B000, B011, B011, B000, B011, B011, 10, B111, B111, B111, B111, B111, B111, B111, B111, B111, 10, B000, B000, B000, B000, B011, B011, B000, B011, B011, 5, B000, B000, B000, B000, B000, B000, B000, B000, B001, 2, B000, B000, B000, B000, B011, B011, B000, B011, B011, 2, B111, B111, B111, B111, B111, B111, B111, B111, B111, 2, B000, B000, B000, B000, B011, B011, B000, B011, B011, 2, B000, B000, B000, B000, B000, B000, B000, B000, B001, 2, B000, B000, B000, B000, B011, B011, B000, B011, B011, 2, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, B000, B000, B000, B000, B000, B000, B000, B000, B001, 1, B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, B100, B000, B000, B000, B000, B000, B000, B000, B000, 1, B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, B000, B000, B000, B000, B000, B000, B000, B000, B001, 1, B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, B100, B000, B000, B000, B000, B000, B000, B000, B000, 1, B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, B000, B000, B001, B000, B000, B000, B000, B000, B000, 1, B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, B000, B000, B000, B000, B000, B000, B100, B000, B000, 1, B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, B000, B000, B001, B000, B000, B000, B000, B000, B000, 1, B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, B000, B000, B000, B000, B000, B000, B100, B000, B000, 1, B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, // Diagonal wipe, starting in the center B111, B111, B111, B111, B111, B111, B111, B111, B111, 5, B111, B111, B111, B111, B111, B111, B111, B101, B111, 1, B111, B111, B111, B111, B101, B111, B111, B101, B111, 1, B111, B111, B111, B111, B101, B111, B111, B100, B111, 1, B111, B101, B111, B111, B100, B111, B111, B100, B110, 1, B111, B101, B111, B111, B100, B111, B111, B100, B110, 1, B111, B011, B111, B111, B100, B110, B111, B100, B100, 1, B111, B100, B110, B111, B100, B100, B111, B100, B000, 1, B111, B100, B100, B111, B100, B000, B111, B000, B000, 1, B111, B100, B000, B111, B000, B000, B011, B000, B000, 1, B111, B000, B000, B011, B000, B000, B001, B001, B000, 1, // 2-LED wide diaginal stripe that orbits the cube B011, B000, B000, B001, B001, B000, B000, B001, B001, 1, B001, B001, B000, B000, B001, B001, B000, B000, B011, 1, B000, B001, B001, B000, B000, B011, B000, B000, B110, 1, B000, B000, B011, B000, B000, B110, B000, B100, B100, 1, B000, B000, B110, B000, B100, B100, B100, B100, B000, 1, B000, B100, B100, B100, B100, B000, B110, B000, B000, 1, B100, B100, B000, B110, B000, B000, B011, B000, B000, 1, B110, B000, B000, B011, B000, B000, B001, B001, B000, 1, // Now, with center flashies, for flavor B011, B000, B000, B001, B001, B000, B000, B011, B001, 1, B001, B001, B000, B000, B001, B001, B000, B000, B011, 1, B000, B001, B001, B000, B000, B011, B000, B010, B110, 1, B000, B000, B011, B000, B000, B110, B000, B100, B100, 1, B000, B000, B110, B000, B100, B100, B100, B110, B000, 1, B000, B100, B100, B100, B100, B000, B110, B000, B000, 1, B100, B100, B000, B110, B000, B000, B011, B010, B000, 1, B110, B000, B000, B011, B000, B000, B001, B001, B000, 1, B011, B000, B000, B001, B011, B000, B000, B001, B001, 1, B001, B001, B000, B000, B001, B001, B000, B000, B011, 1, B000, B001, B001, B000, B010, B011, B000, B000, B110, 1, B000, B000, B011, B000, B000, B110, B000, B100, B100, 1, B000, B000, B110, B000, B110, B100, B100, B100, B000, 1, B000, B100, B100, B100, B100, B000, B110, B000, B000, 1, B100, B100, B000, B110, B010, B000, B011, B000, B000, 1, B110, B000, B000, B011, B000, B000, B001, B001, B000, 1, B011, B010, B000, B001, B001, B000, B000, B001, B001, 1, B001, B001, B000, B000, B001, B001, B000, B000, B011, 1, B000, B011, B001, B000, B000, B011, B000, B000, B110, 1, B000, B000, B011, B000, B000, B110, B000, B100, B100, 1, B000, B010, B110, B000, B100, B100, B100, B100, B000, 1, B000, B100, B100, B100, B100, B000, B110, B000, B000, 1, B100, B110, B000, B110, B000, B000, B011, B000, B000, 1, B110, B000, B000, B011, B000, B000, B001, B001, B000, 1, // Wrapping up B001, B001, B000, B000, B001, B001, B000, B000, B001, 1, B001, B001, B000, B000, B001, B001, B000, B000, B001, 1, B000, B001, B001, B000, B000, B001, B000, B000, B001, 1, B000, B000, B001, B000, B000, B001, B000, B000, B001, 1, B000, B000, B000, B000, B000, B001, B000, B000, B001, 1, B000, B000, B000, B000, B000, B000, B000, B000, B001, 5, B000, B000, B000, B000, B000, B000, B000, B000, B000, 3, B000, B000, B000, B000, B000, B000, B000, B000, B001, 5, B000, B000, B000, B000, B000, B000, B000, B000, B000, 3, B000, B000, B000, B000, B000, B000, B000, B000, B001, 5, B000, B000, B000, B000, B000, B000, B000, B000, B000, 3, B100, B100, B100, B000, B000, B000, B000, B000, B000, 2, B000, B000, B000, B100, B100, B100, B000, B000, B000, 2, B000, B000, B000, B000, B000, B000, B100, B100, B100, 2, B000, B000, B000, B000, B000, B000, B010, B010, B010, 2, B000, B000, B000, B010, B010, B010, B000, B000, B000, 2, B010, B010, B010, B000, B000, B000, B000, B000, B000, 2, B001, B001, B001, B000, B000, B000, B000, B000, B000, 2, B000, B000, B000, B001, B001, B001, B000, B000, B000, 2, B000, B000, B000, B000, B000, B000, B001, B001, B001, 2, B001, B001, B001, B000, B000, B000, B000, B000, B000, 2, B011, B011, B011, B000, B000, B000, B000, B000, B000, 2, B111, B111, B111, B000, B000, B000, B000, B000, B000, 2, B111, B111, B111, B100, B100, B100, B000, B000, B000, 2, B111, B111, B111, B110, B110, B110, B000, B000, B000, 2, B111, B111, B111, B111, B111, B111, B000, B000, B000, 2, B111, B111, B111, B111, B111, B111, B100, B100, B100, 2, B111, B111, B111, B111, B111, B111, B110, B110, B110, 2, B111, B111, B111, B111, B111, B111, B111, B111, B111, 10, B001, B001, B001, B001, B001, B001, B001, B001, B001, 2, B001, B010, B100, B001, B010, B100, B001, B010, B100, 2, B111, B000, B000, B111, B000, B000, B111, B000, B000, 2, B001, B010, B100, B001, B010, B100, B001, B010, B100, 2, B001, B001, B001, B001, B001, B001, B001, B001, B001, 2, B001, B001, B001, B001, B001, B001, B001, B001, B001, 2, B100, B010, B001, B100, B010, B001, B100, B010, B001, 2, B000, B000, B111, B000, B000, B111, B000, B000, B111, 2, B000, B000, B000, B000, B010, B000, B000, B000, B000, 2, B000, B000, B000, B000, B111, B000, B000, B000, B000, 2, B000, B000, B000, B010, B111, B010, B000, B000, B000, 2, B000, B000, B000, B111, B111, B111, B000, B000, B000, 2, B100, B100, B100, B010, B010, B010, B001, B001, B001, 2, B010, B010, B010, B010, B010, B010, B010, B010, B010, 2, B001, B001, B001, B010, B010, B010, B100, B100, B100, 2, B100, B010, B000, B100, B010, B000, B100, B010, B000, 2, B010, B010, B000, B010, B010, B000, B010, B010, B000, 2, B001, B010, B000, B001, B010, B000, B001, B010, B000, 2, B000, B011, B000, B000, B011, B000, B000, B011, B000, 2, B000, B010, B001, B000, B010, B001, B000, B010, B001, 2, B000, B010, B010, B000, B010, B010, B000, B010, B010, 2, B000, B010, B100, B000, B010, B100, B000, B010, B100, 2, B000, B110, B000, B000, B110, B000, B000, B110, B000, 2, // this is a dummy element for end of table (duration=0) B000, B000, B000, B000, B000, B000, B000, B000, B000, 0 }; /* ** 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[] = {4, 5, 6, 7, 8, 9, 10, 11, 12}; //int PlanePin[] = {19, 18, 17}; int PlanePin[] = {14, 15, 16}; // 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 }