Color fading shiftbrites either from user set colors or a random number generator.

Dependencies:   mbed

Committer:
bh27
Date:
Mon Mar 21 23:07:13 2011 +0000
Revision:
1:15ed52686283
Parent:
0:e719aa5eed4d
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bh27 1:15ed52686283 1 // Brent Hearn
bh27 1:15ed52686283 2 // 03/2011
bh27 1:15ed52686283 3
bh27 0:e719aa5eed4d 4 // shiftbrite fading. Color patterns can eiher be user input or a random number generator can pick out values to use.
bh27 0:e719aa5eed4d 5 // Rate of fading can also be changed.
bh27 0:e719aa5eed4d 6 // Note: Watch for current spikes when transitioning between colors with multiple Shiftbrites in a chain.
bh27 0:e719aa5eed4d 7 // Setting the Current Control register to lower values (eg 31 instead of 127) can mediate this effect at the cost of brightness.
bh27 0:e719aa5eed4d 8
bh27 0:e719aa5eed4d 9 // Color fading example code from: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1253503406
bh27 0:e719aa5eed4d 10 // Shift register code from: http://mbed.org/users/ChriX/notebook/shift-register-function/
bh27 0:e719aa5eed4d 11 // Shiftbrite Arduino code from: http://macetech.com/blog/node/54
bh27 0:e719aa5eed4d 12
bh27 0:e719aa5eed4d 13 #include "mbed.h"
bh27 0:e719aa5eed4d 14
bh27 0:e719aa5eed4d 15 DigitalOut datapin(p30);
bh27 0:e719aa5eed4d 16 DigitalOut latchpin(p29);
bh27 0:e719aa5eed4d 17 DigitalOut enablepin(p28);
bh27 0:e719aa5eed4d 18 DigitalOut clockpin(p27);
bh27 0:e719aa5eed4d 19
bh27 0:e719aa5eed4d 20 volatile int colorSelected[3];
bh27 0:e719aa5eed4d 21 bool fadeComplete = true;
bh27 0:e719aa5eed4d 22
bh27 0:e719aa5eed4d 23 unsigned long SB_CommandPacket;
bh27 0:e719aa5eed4d 24 int SB_CommandMode;
bh27 0:e719aa5eed4d 25 int SB_ColorCommand[3];
bh27 0:e719aa5eed4d 26 int No_of_shiftbrites = 4;
bh27 0:e719aa5eed4d 27
bh27 0:e719aa5eed4d 28 // Current Control between 0 and 127
bh27 0:e719aa5eed4d 29 int Cur = 31;
bh27 0:e719aa5eed4d 30
bh27 0:e719aa5eed4d 31 void shiftOut(DigitalOut data, DigitalOut clk, int sodata) {
bh27 0:e719aa5eed4d 32
bh27 0:e719aa5eed4d 33 int i;
bh27 0:e719aa5eed4d 34
bh27 0:e719aa5eed4d 35 for (i = 7; i >= 0; i--) {
bh27 0:e719aa5eed4d 36
bh27 0:e719aa5eed4d 37 clk = 0;
bh27 0:e719aa5eed4d 38
bh27 0:e719aa5eed4d 39 if(sodata & (1 << i)){
bh27 0:e719aa5eed4d 40 data = 1;
bh27 0:e719aa5eed4d 41 } else {
bh27 0:e719aa5eed4d 42 data = 0;
bh27 0:e719aa5eed4d 43 }
bh27 0:e719aa5eed4d 44
bh27 0:e719aa5eed4d 45 clk = 1;
bh27 0:e719aa5eed4d 46 data = 0;
bh27 0:e719aa5eed4d 47 }
bh27 0:e719aa5eed4d 48
bh27 0:e719aa5eed4d 49 return;
bh27 0:e719aa5eed4d 50
bh27 0:e719aa5eed4d 51 }
bh27 0:e719aa5eed4d 52
bh27 0:e719aa5eed4d 53
bh27 0:e719aa5eed4d 54 void SB_SendPacket() {
bh27 0:e719aa5eed4d 55
bh27 0:e719aa5eed4d 56 for (int y = No_of_shiftbrites-1; y >= 0; y--) {
bh27 0:e719aa5eed4d 57 SB_CommandPacket = SB_CommandMode & 0xB11;
bh27 0:e719aa5eed4d 58 SB_CommandPacket = (SB_CommandPacket << 10) | (SB_ColorCommand[0] & 1023);
bh27 0:e719aa5eed4d 59 SB_CommandPacket = (SB_CommandPacket << 10) | (SB_ColorCommand[1] & 1023);
bh27 0:e719aa5eed4d 60 SB_CommandPacket = (SB_CommandPacket << 10) | (SB_ColorCommand[2] & 1023);
bh27 0:e719aa5eed4d 61
bh27 0:e719aa5eed4d 62 shiftOut(datapin, clockpin, SB_CommandPacket >> 24);
bh27 0:e719aa5eed4d 63 shiftOut(datapin, clockpin, SB_CommandPacket >> 16);
bh27 0:e719aa5eed4d 64 shiftOut(datapin, clockpin, SB_CommandPacket >> 8);
bh27 0:e719aa5eed4d 65 shiftOut(datapin, clockpin, SB_CommandPacket);
bh27 0:e719aa5eed4d 66
bh27 0:e719aa5eed4d 67
bh27 0:e719aa5eed4d 68 wait_ms(1);
bh27 0:e719aa5eed4d 69 latchpin = 1;
bh27 0:e719aa5eed4d 70 wait_ms(1);
bh27 0:e719aa5eed4d 71 latchpin = 0;
bh27 0:e719aa5eed4d 72 }
bh27 0:e719aa5eed4d 73
bh27 0:e719aa5eed4d 74 return;
bh27 0:e719aa5eed4d 75
bh27 0:e719aa5eed4d 76 }
bh27 0:e719aa5eed4d 77
bh27 0:e719aa5eed4d 78 void Current_Control() {
bh27 0:e719aa5eed4d 79
bh27 0:e719aa5eed4d 80 int Comm = 0xB01;
bh27 0:e719aa5eed4d 81 int Cont1 = Cur;
bh27 0:e719aa5eed4d 82 int Cont2 = Cur;
bh27 0:e719aa5eed4d 83 int Cont3 = Cur;
bh27 0:e719aa5eed4d 84 unsigned long CommandPacket;
bh27 0:e719aa5eed4d 85
bh27 0:e719aa5eed4d 86 for (int y = No_of_shiftbrites-1; y >= 0; y--) {
bh27 0:e719aa5eed4d 87 CommandPacket = Comm & 0xB11;
bh27 0:e719aa5eed4d 88 CommandPacket = (CommandPacket << 10) | (Cont1 & 1023);
bh27 0:e719aa5eed4d 89 CommandPacket = (CommandPacket << 10) | (Cont2 & 1023);
bh27 0:e719aa5eed4d 90 CommandPacket = (CommandPacket << 10) | (Cont3 & 1023);
bh27 0:e719aa5eed4d 91
bh27 0:e719aa5eed4d 92 shiftOut(datapin, clockpin, CommandPacket >> 24);
bh27 0:e719aa5eed4d 93 shiftOut(datapin, clockpin, CommandPacket >> 16);
bh27 0:e719aa5eed4d 94 shiftOut(datapin, clockpin, CommandPacket >> 8);
bh27 0:e719aa5eed4d 95 shiftOut(datapin, clockpin, CommandPacket);
bh27 0:e719aa5eed4d 96
bh27 0:e719aa5eed4d 97
bh27 0:e719aa5eed4d 98 wait_ms(1);
bh27 0:e719aa5eed4d 99 latchpin = 1;
bh27 0:e719aa5eed4d 100 wait_ms(1);
bh27 0:e719aa5eed4d 101 latchpin = 0;
bh27 0:e719aa5eed4d 102 }
bh27 0:e719aa5eed4d 103
bh27 0:e719aa5eed4d 104 return;
bh27 0:e719aa5eed4d 105
bh27 0:e719aa5eed4d 106 }
bh27 0:e719aa5eed4d 107
bh27 0:e719aa5eed4d 108 void colorSelect()
bh27 0:e719aa5eed4d 109 {
bh27 0:e719aa5eed4d 110 for (int i = 0; i <= 2; i++)
bh27 0:e719aa5eed4d 111 {
bh27 0:e719aa5eed4d 112 colorSelected[i] = (rand() % 1023);
bh27 0:e719aa5eed4d 113 //if (colorSelected[i] > 1023) colorSelected[i] = 1023;
bh27 0:e719aa5eed4d 114 }
bh27 0:e719aa5eed4d 115
bh27 0:e719aa5eed4d 116 return;
bh27 0:e719aa5eed4d 117 }
bh27 0:e719aa5eed4d 118
bh27 0:e719aa5eed4d 119 void fadeall(int rate, int fromred, int fromgreen, int fromblue, int tored, int togreen, int toblue) {
bh27 0:e719aa5eed4d 120
bh27 0:e719aa5eed4d 121 for (int i = 0; i < 33; i++) {
bh27 0:e719aa5eed4d 122 SB_ColorCommand[0] = (fromblue * (32 - i) + toblue * i) / 32;
bh27 0:e719aa5eed4d 123 SB_ColorCommand[1] = (fromred * (32 - i) + tored * i) / 32;
bh27 0:e719aa5eed4d 124 SB_ColorCommand[2] = (fromgreen * (32 - i) + togreen * i) / 32;
bh27 0:e719aa5eed4d 125
bh27 0:e719aa5eed4d 126 SB_CommandMode = 0xB00;
bh27 0:e719aa5eed4d 127 SB_SendPacket();
bh27 0:e719aa5eed4d 128
bh27 0:e719aa5eed4d 129
bh27 0:e719aa5eed4d 130 Current_Control();
bh27 0:e719aa5eed4d 131 wait_ms(rate);
bh27 0:e719aa5eed4d 132 }
bh27 0:e719aa5eed4d 133
bh27 0:e719aa5eed4d 134 return;
bh27 0:e719aa5eed4d 135
bh27 0:e719aa5eed4d 136 }
bh27 0:e719aa5eed4d 137
bh27 0:e719aa5eed4d 138 int main() {
bh27 0:e719aa5eed4d 139 // Initialise previous color to start at Red.
bh27 0:e719aa5eed4d 140 int Prev_color[3] = {1023, 0, 0};
bh27 0:e719aa5eed4d 141
bh27 0:e719aa5eed4d 142 Current_Control();
bh27 0:e719aa5eed4d 143
bh27 0:e719aa5eed4d 144 while(1) {
bh27 0:e719aa5eed4d 145
bh27 0:e719aa5eed4d 146 // Fade using random color generation
bh27 0:e719aa5eed4d 147 colorSelect();
bh27 0:e719aa5eed4d 148 fadeall(50, Prev_color[0], Prev_color[1], Prev_color[2], colorSelected[0], colorSelected[1], colorSelected[2]);
bh27 0:e719aa5eed4d 149 for (int i = 0; i < 3; i++) Prev_color[i] = colorSelected[i];
bh27 0:e719aa5eed4d 150
bh27 0:e719aa5eed4d 151 // Fade using specified pattern
bh27 0:e719aa5eed4d 152 // eg. Red to Blue to Yellow back to Red as below
bh27 0:e719aa5eed4d 153 //fadeall(50, 1023, 0, 0, 0, 0, 1023);
bh27 0:e719aa5eed4d 154 //fadeall(50, 0, 0, 1023, 1023, 1023, 0);
bh27 0:e719aa5eed4d 155 //fadeall(50, 1023, 1023, 0, 1023, 0, 0);
bh27 0:e719aa5eed4d 156
bh27 0:e719aa5eed4d 157 }
bh27 0:e719aa5eed4d 158 }