jim hamblen
/
Shiftbrite_Sequencer
Shiftbrite sequencer demo program. Controls a chain of 35 shiftbrites
Revision 0:fc0ddaee005d, committed 2011-04-21
- Comitter:
- 4180_1
- Date:
- Thu Apr 21 15:03:38 2011 +0000
- Commit message:
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r fc0ddaee005d main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Apr 21 15:03:38 2011 +0000 @@ -0,0 +1,414 @@ +#include "mbed.h" +// Shiftbrite Sequencer Demo Program +// +//Bits for Shiftbrite latch and enable pins +DigitalOut latch(p15); +DigitalOut enable(p16); +//DigitalOut myled(LED1); + +// SPI connections for LED chain +SPI spi(p11, p12, p13); + +//Serial PC(USBTX, USBRX); + +Timer time_counter; + +// number of LEDS in chain +#define num_LEDS 35 + +// number of color values to sequence through +#define Sequence_Length 17 + +// number of steps in fade effect +#define Fade_Steps 64 + + +// Each LED'S RGB color values for each step in sequence is stored in an array +int LED_Color [Sequence_Length][num_LEDS][3] = {0}; + +// delay times in seconds for each RGB color value in sequence +// can be different for each sequence step +float Sequence_Delay[Sequence_Length]; +int Sequence_Effect[Sequence_Length] = {0}; + + +// Write (Shift out) 10-bit RGB values to a single LED +void Write_LED(int red, int green, int blue) { + unsigned int low_color=0; + unsigned int high_color=0; + red=red; + green=green; + blue=blue; + high_color=(blue<<4)|((red&0x3C0)>>6); + low_color=(((red&0x3F)<<10)|(green)); + spi.write(high_color); + spi.write(low_color); +} +// Sends Initial Current limits to all LEDs in array +// used to correct for different RGB brightness levels in LEDs +void Write_Init_Command(int red_level, int green_level, int blue_level) { + unsigned int Init_Command = 0x40000000; + int i=0; + Init_Command = 0x40000000|(blue_level<<20)|(red_level<<10)|green_level; + for (i=0; i<num_LEDS; i++) { + spi.write(Init_Command>>16&0xFFFF); + spi.write(Init_Command&0xFFFF); + } + wait(.000015); + latch=1; + wait(.000015); + latch=0; +} + +// Sets all LEDs in a sequence step to a default background color +void Set_Background_Color(int Seq_Step, int red, int green, int blue) { + int i=0; + for (i=0; i<num_LEDS; i++) { + LED_Color[Seq_Step][i][0] = red; + LED_Color[Seq_Step][i][1] = green; + LED_Color[Seq_Step][i][2] = blue; + } +} + +// Set a single LED in a Sequence Step to a color +// Last LED in chain is LED #0 +// +// LED address in 5x7 array +// 35 in chain serpantine style +// 34 33 32 31 30 29 28 +// 27 26 25 24 23 22 21 +// 20 19 18 17 16 15 14 +// 13 12 11 10 09 08 07 +// 06 05 04 03 02 01 00 +void Set_LED_Color(int Seq_Step, int LED_num, int red, int green, int blue) { + LED_Color[Seq_Step][LED_num][0] = red; + LED_Color[Seq_Step][LED_num][1] = green; + LED_Color[Seq_Step][LED_num][2] = blue; +} + +int main() { + int i=0; + int j=0; + int k=0; + int red, green, blue; + bool odd=false; + spi.format(16,0); + spi.frequency(500000); + enable=0; + latch=0; + int flicker = 0; + // Set currents using Allegro A6281's command mode + Write_Init_Command(120, 100, 100); + // Do once during initialization + // OK at power on, but a reset could set it to an invalid mode + // + // See page 7 in A6281 datasheet + // This feature can be used to adjust for different LED + // brightness levels - values suggested from Macetech doc + +// Clear out initial sequence values + for (i=0; i<Sequence_Length; i++) { + for (j=0; j<num_LEDS; j++) { + for (k=0; k<4; k++) { + LED_Color[i][j][k]=0; + } + } + Sequence_Delay[i]=0; + Sequence_Effect[i]=0; + } +// Color data values for LEDs to sequence through +// Sequence step 0 + Set_Background_Color(0, 1023, 0, 0); //LEDs RED + Sequence_Delay[0] = 1; + Sequence_Effect[0] = 0; +// Sequence step 1 + LED_Color[1][0][0] = 0; + Set_Background_Color(1, 0, 1023, 0); //LEDs GREEN + Sequence_Delay[1] = 2; + Sequence_Effect[1] = 1; //Fade from RED to GREEN Effect +// Sequence step 2 + Set_Background_Color(2, 0, 0, 1023); //LEDs BLUE + Sequence_Delay[2] = 2; + Sequence_Effect[2] = 1; //Fade from GREEN to BLUE Effect +// Sequence step 3 + Set_Background_Color(3, 0, 0, 1023); + Sequence_Delay[3] = 1; //Stay at this value for 1 seconds + Sequence_Effect[3] = 0; +// Sequence step 4 + Set_Background_Color(4,1023,200,0); //LEDs all ORANGE + Sequence_Delay[4] = 5; + Sequence_Effect[4] = 2; //Flicker or Twinkle Effect +// Sequence step 5 + Set_Background_Color(5,1023,1023,0); //LEDs all YELLOW + Sequence_Delay[5] = 5; + Sequence_Effect[5] = 3; //Flashing Marquee Sign Effect +// Sequence step 6 + LED_Color[6][0][0] = 1023; //LED 0 RED + LED_Color[6][0][1] = 0; + LED_Color[6][0][2] = 0; + LED_Color[6][1][0] = 1023; + LED_Color[6][1][1] = 1023; + LED_Color[6][1][2] = 1023; //LED 1 WHITE + LED_Color[6][2][0] = 0; + LED_Color[6][2][1] = 0; + LED_Color[6][2][2] = 1023; //LED 1 BLUE + Sequence_Delay[6] = 5; + Sequence_Effect[6] = 4; //Shift Colors +// Sequence step 7 + Set_Background_Color(7,1023,1023,1023); //LEDs all WHITE + Sequence_Delay[7] = 1; + Sequence_Effect[7] = 0; +//Sequence step 8 + Set_Background_Color(8,0,0,0); //LEDs all Black + Sequence_Delay[8] = 2; + Sequence_Effect[8]= 1; //Fade to Black +//Sequence step 9 + Set_Background_Color(9,0,0,0); //LEDs all Black + Sequence_Delay[9] = 1.5; + Sequence_Effect[9]= 0; +//Sequence step 10 + Sequence_Delay[10] = 6; + Sequence_Effect[10]= 5; //Random Bright Colors +//Sequence step 11 + Set_Background_Color(11,100,100,100); //LEDs all dim WHITE + Set_LED_Color(11,34,0,0,1023); //char M + Set_LED_Color(11,33,0,0,1023); + Set_LED_Color(11,32,0,0,1023); + Set_LED_Color(11,31,0,0,1023); + Set_LED_Color(11,30,0,0,1023); + Set_LED_Color(11,29,0,0,1023); + Set_LED_Color(11,28,0,0,1023); + Set_LED_Color(11,22,0,0,1023); + Set_LED_Color(11,16,0,0,1023); + Set_LED_Color(11,17,0,0,1023); + Set_LED_Color(11,8,0,0,1023); + Set_LED_Color(11,0,0,0,1023); + Set_LED_Color(11,1,0,0,1023); + Set_LED_Color(11,2,0,0,1023); + Set_LED_Color(11,3,0,0,1023); + Set_LED_Color(11,4,0,0,1023); + Set_LED_Color(11,5,0,0,1023); + Set_LED_Color(11,6,0,0,1023); + Sequence_Effect[11] = 0; + Sequence_Delay[11] = 3; +//Sequence step 12 + Set_Background_Color(12,100,100,100); //LEDs all dim WHITE + Set_LED_Color(12,34,0,0,1023); // char b + Set_LED_Color(12,33,0,0,1023); + Set_LED_Color(12,32,0,0,1023); + Set_LED_Color(12,31,0,0,1023); + Set_LED_Color(12,30,0,0,1023); + Set_LED_Color(12,29,0,0,1023); + Set_LED_Color(12,28,0,0,1023); + Set_LED_Color(12,27,0,0,1023); + Set_LED_Color(12,24,0,0,1023); + Set_LED_Color(12,20,0,0,1023); + Set_LED_Color(12,17,0,0,1023); + Set_LED_Color(12,12,0,0,1023); + Set_LED_Color(12,11,0,0,1023); + Sequence_Effect[12] = 0; + Sequence_Delay[12] = 3; + //Sequence step 13 + Set_Background_Color(13,100,100,100); //LEDs all dim WHITE + Set_LED_Color(13,34,0,0,1023); //char E + Set_LED_Color(13,33,0,0,1023); + Set_LED_Color(13,32,0,0,1023); + Set_LED_Color(13,31,0,0,1023); + Set_LED_Color(13,30,0,0,1023); + Set_LED_Color(13,29,0,0,1023); + Set_LED_Color(13,28,0,0,1023); + Set_LED_Color(13,27,0,0,1023); + Set_LED_Color(13,24,0,0,1023); + Set_LED_Color(13,21,0,0,1023); + Set_LED_Color(13,20,0,0,1023); + Set_LED_Color(13,17,0,0,1023); + Set_LED_Color(13,14,0,0,1023); + Set_LED_Color(13,13,0,0,1023); + Set_LED_Color(13,7,0,0,1023); + Set_LED_Color(13,6,0,0,1023); + Set_LED_Color(13,0,0,0,1023); + Sequence_Effect[13] = 0; + Sequence_Delay[13] = 3; + //Sequence step 14 + Set_Background_Color(14,100,100,100); //LEDs all dim WHITE + Set_LED_Color(14,5,0,0,1023); //char d + Set_LED_Color(14,4,0,0,1023); + Set_LED_Color(14,3,0,0,1023); + Set_LED_Color(14,6,0,0,1023); + Set_LED_Color(14,2,0,0,1023); + Set_LED_Color(14,1,0,0,1023); + Set_LED_Color(14,0,0,0,1023); + Set_LED_Color(14,13,0,0,1023); + Set_LED_Color(14,10,0,0,1023); + Set_LED_Color(14,20,0,0,1023); + Set_LED_Color(14,17,0,0,1023); + Set_LED_Color(14,26,0,0,1023); + Set_LED_Color(14,25,0,0,1023); + Sequence_Effect[14] = 0; + Sequence_Delay[14] = 3; + //Sequence step 15 + Set_Background_Color(15,0,0,0); //LEDs all Black + Sequence_Delay[15] = 2; + Sequence_Effect[15]= 1; //Fade to Black + //Sequence step 16 + Set_Background_Color(16,0,0,0); //LEDs all Black + Sequence_Delay[16] = 2; + Sequence_Effect[16]= 0; //Black +// add more steps or LEDs if needed and change #defines + + wait(1); + // Repeat Sequence Forever + while (1) { + Write_Init_Command(120, 100, 100); + //Step through the Sequence Values + for (j = 0; j < Sequence_Length; j++) { + // myled= !myled; + switch (Sequence_Effect[j]) { + case 0: { + // Step through each LED in chain at each sequence step + for (i = 0; i < num_LEDS; i++) { + //Writes 32-bits of RGB color data to LED using SPI hardware + Write_LED( LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + // Uncomment to get status info on serial port + // printf("i= %d, j= %d\n\r",i,j); + // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + } + //Load in new values just shifted out to LED chain by setting latch high + wait(.000015); + latch=1; + wait(.000015); + latch=0; + //Delay for this step in the sequence + wait(Sequence_Delay[j]); + break; + } + case 1: { + //Lighing Effect: Fade into new color from previous color (note: can't fade first sequence step!) + for (k = 0; k<=Fade_Steps; k++) { + // Step through each LED in chain at each fade sequence step + for (i = 0; i < num_LEDS; i++) { + red = LED_Color[j-1][i][0] + k*(LED_Color[j][i][0]-LED_Color[j-1][i][0])/Fade_Steps; + green = LED_Color[j-1][i][1] + k*(LED_Color[j][i][1]-LED_Color[j-1][i][1])/Fade_Steps; + blue = LED_Color[j-1][i][2] + k*(LED_Color[j][i][2]-LED_Color[j-1][i][2])/Fade_Steps; + //Writes 32-bits of RGB color data to LED using SPI hardware + Write_LED(red, green, blue); + // Uncomment to get status info on serial port + // printf("i= %d, j= %d\n\r",i,j); + // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + } + //Load in new values just shifted out to LED chain by setting latch high + wait(.000015); + latch=1; + wait(.000015); + latch=0; + //Delay for this step in the fade sequence + wait(Sequence_Delay[j]/Fade_Steps); + } + break; + } + case 2: { + //Lighting Effect: Flicker or Twinkle somewhat like a flame + time_counter.reset(); + time_counter.start(); + while (time_counter.read()<Sequence_Delay[j]) { + for (i = 0; i < num_LEDS; i++) { + flicker = rand(); + if (flicker>0x40000000) + //Writes 32-bits of RGB color data to LED using SPI hardware + Write_LED( LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + // Uncomment to get status info on serial port + // printf("i= %d, j= %d\n\r",i,j); + // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + else + Write_LED( LED_Color[j][i][0]/2, LED_Color[j][i][1]/2, LED_Color[j][i][2]/2); + } + //Load in new values just shifted out to LED chain by setting latch high + wait(.000015); + latch=1; + wait(.000015); + latch=0; + wait(.05); + } + time_counter.stop(); + break; + } + case 3: { + //Lighting Effect: Flashing Broadway Marquee Sign Style + time_counter.reset(); + time_counter.start(); + while (time_counter.read()<Sequence_Delay[j]) { + for (i = 0; i < num_LEDS; i++) { + if (((i+odd)&0x01)==0) + //Writes 32-bits of RGB color data to LED using SPI hardware + Write_LED( LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + // Uncomment to get status info on serial port + // printf("i= %d, j= %d\n\r",i,j); + // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + else + Write_LED( LED_Color[j][i][0]/4, LED_Color[j][i][1]/4, LED_Color[j][i][2]/4); + } + //Load in new values just shifted out to LED chain by setting latch high + wait(.000015); + latch=1; + wait(.000015); + latch=0; + wait(.15); + odd = !odd; + } + time_counter.stop(); + break; + } + case 4: { + //Lighting Effect: Circular Shift of Colors + time_counter.reset(); + time_counter.start(); + k=0; + while (time_counter.read()<Sequence_Delay[j]) { + k = (k+1)%num_LEDS; + for (i = 0; i < num_LEDS; i++) { + + //Writes 32-bits of RGB color data to LED using SPI hardware + Write_LED( LED_Color[j][(i+k)%num_LEDS][0], LED_Color[j][(i+k)%num_LEDS][1], LED_Color[j][(i+k)%num_LEDS][2]); + // Uncomment to get status info on serial port + // printf("i= %d, j= %d\n\r",i,j); + // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + } + //Load in new values just shifted out to LED chain by setting latch high + wait(.000015); + latch=1; + wait(.000015); + latch=0; + wait(.10); + } + time_counter.stop(); + break; + case 5: { + //Random Bright Colors + time_counter.reset(); + time_counter.start(); + k=0; + while (time_counter.read()<Sequence_Delay[j]) { + k = (k+1)%num_LEDS; + for (i = 0; i < num_LEDS; i++) { + + //Writes 32-bits of RGB color data to LED using SPI hardware + Write_LED( (rand()&0x00F000)>>6,(rand()&0x00F000)>>6,(rand()&0x00F000)>>6); + // Uncomment to get status info on serial port + // printf("i= %d, j= %d\n\r",i,j); + // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); + } + //Load in new values just shifted out to LED chain by setting latch high + wait(.000015); + latch=1; + wait(.000015); + latch=0; + wait(.08); + } + time_counter.stop(); + break; + } + } + } + } + } +} \ No newline at end of file
diff -r 000000000000 -r fc0ddaee005d mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Apr 21 15:03:38 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912