Some Dude
/
Shift_brite_fade
Color fading shiftbrites either from user set colors or a random number generator.
main.cpp@1:15ed52686283, 2011-03-21 (annotated)
- 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?
User | Revision | Line number | New 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 | } |