Shiftbrite sequencer demo program. Controls a chain of 35 shiftbrites

Dependencies:   mbed

Files at this revision

API Documentation at this revision

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