A simple example to drive an APA-102 LED strip.
Dependencies: mbed APA102b Ping SLCD
main.cpp@1:2d02f55d47c5, 2015-03-14 (annotated)
- Committer:
- rosienej
- Date:
- Sat Mar 14 20:45:48 2015 +0000
- Revision:
- 1:2d02f55d47c5
- Parent:
- 0:afc41b8e2360
- Child:
- 2:5a9388a7ac62
Beta release... working scans
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rosienej | 0:afc41b8e2360 | 1 | #include "mbed.h" |
rosienej | 1:2d02f55d47c5 | 2 | #include "Ping.h" |
rosienej | 1:2d02f55d47c5 | 3 | #include "APA102a.h" |
rosienej | 0:afc41b8e2360 | 4 | |
rosienej | 1:2d02f55d47c5 | 5 | //SPI spi(PTA16, PTA17, PTA15); // mosi, miso, sclk |
rosienej | 1:2d02f55d47c5 | 6 | Ping ping(PTA13); |
rosienej | 1:2d02f55d47c5 | 7 | |
rosienej | 1:2d02f55d47c5 | 8 | APA102a LEDs(PTA16, PTA17, PTA15,1000000); // mosi, miso, sclk, rate |
rosienej | 0:afc41b8e2360 | 9 | |
rosienej | 0:afc41b8e2360 | 10 | // This function was downloaded from: |
rosienej | 0:afc41b8e2360 | 11 | // http://blog.saikoled.com/post/43693602826/why-every-led-light-should-be-using-hsi |
rosienej | 0:afc41b8e2360 | 12 | // Blog Post attributed to Brian Neltner |
rosienej | 0:afc41b8e2360 | 13 | |
rosienej | 0:afc41b8e2360 | 14 | // Function example takes H, S, I, and a pointer to the |
rosienej | 0:afc41b8e2360 | 15 | // returned RGB colorspace converted vector. It should |
rosienej | 0:afc41b8e2360 | 16 | // be initialized with: |
rosienej | 0:afc41b8e2360 | 17 | // |
rosienej | 0:afc41b8e2360 | 18 | // int rgb[3]; |
rosienej | 0:afc41b8e2360 | 19 | // |
rosienej | 0:afc41b8e2360 | 20 | // in the calling function. After calling hsi2rgb |
rosienej | 0:afc41b8e2360 | 21 | // the vector rgb will contain red, green, and blue |
rosienej | 0:afc41b8e2360 | 22 | // calculated values. |
rosienej | 0:afc41b8e2360 | 23 | // |
rosienej | 0:afc41b8e2360 | 24 | |
rosienej | 0:afc41b8e2360 | 25 | void hsi2rgb(float H, float S, float I, int* rgb) { |
rosienej | 0:afc41b8e2360 | 26 | |
rosienej | 0:afc41b8e2360 | 27 | int r, g, b; |
rosienej | 0:afc41b8e2360 | 28 | H = fmod(H,360); // cycle H around to 0-360 degrees |
rosienej | 0:afc41b8e2360 | 29 | H = 3.14159*H/(float)180; // Convert to radians. |
rosienej | 0:afc41b8e2360 | 30 | S = S>0?(S<1?S:1):0; // clamp S and I to interval [0,1] |
rosienej | 0:afc41b8e2360 | 31 | I = I>0?(I<1?I:1):0; |
rosienej | 0:afc41b8e2360 | 32 | |
rosienej | 0:afc41b8e2360 | 33 | // Math! Thanks in part to Kyle Miller. |
rosienej | 0:afc41b8e2360 | 34 | if(H < 2.09439) { |
rosienej | 0:afc41b8e2360 | 35 | r = 255*I/3*(1+S*cos(H)/cos(1.047196667-H)); |
rosienej | 0:afc41b8e2360 | 36 | g = 255*I/3*(1+S*(1-cos(H)/cos(1.047196667-H))); |
rosienej | 0:afc41b8e2360 | 37 | b = 255*I/3*(1-S); |
rosienej | 0:afc41b8e2360 | 38 | } else if(H < 4.188787) { |
rosienej | 0:afc41b8e2360 | 39 | H = H - 2.09439; |
rosienej | 0:afc41b8e2360 | 40 | g = 255*I/3*(1+S*cos(H)/cos(1.047196667-H)); |
rosienej | 0:afc41b8e2360 | 41 | b = 255*I/3*(1+S*(1-cos(H)/cos(1.047196667-H))); |
rosienej | 0:afc41b8e2360 | 42 | r = 255*I/3*(1-S); |
rosienej | 0:afc41b8e2360 | 43 | } else { |
rosienej | 0:afc41b8e2360 | 44 | H = H - 4.188787; |
rosienej | 0:afc41b8e2360 | 45 | b = 255*I/3*(1+S*cos(H)/cos(1.047196667-H)); |
rosienej | 0:afc41b8e2360 | 46 | r = 255*I/3*(1+S*(1-cos(H)/cos(1.047196667-H))); |
rosienej | 0:afc41b8e2360 | 47 | g = 255*I/3*(1-S); |
rosienej | 0:afc41b8e2360 | 48 | } |
rosienej | 0:afc41b8e2360 | 49 | rgb[0]=r; |
rosienej | 0:afc41b8e2360 | 50 | rgb[1]=g; |
rosienej | 0:afc41b8e2360 | 51 | rgb[2]=b; |
rosienej | 0:afc41b8e2360 | 52 | } |
rosienej | 0:afc41b8e2360 | 53 | |
rosienej | 0:afc41b8e2360 | 54 | |
rosienej | 0:afc41b8e2360 | 55 | int main() |
rosienej | 0:afc41b8e2360 | 56 | { |
rosienej | 0:afc41b8e2360 | 57 | // Quick example to drive an APA-102 LED Strip from a FRDM-KL46z |
rosienej | 0:afc41b8e2360 | 58 | |
rosienej | 0:afc41b8e2360 | 59 | // http://www.insomnialighting.com/catalog/index.php?main_page=product_info&products_id=61 |
rosienej | 0:afc41b8e2360 | 60 | // Wire the unit up to SPI, common ground and give it 5 volt power. |
rosienej | 0:afc41b8e2360 | 61 | |
rosienej | 0:afc41b8e2360 | 62 | // Shift through the spectrum, slowly rotate. |
rosienej | 0:afc41b8e2360 | 63 | |
rosienej | 0:afc41b8e2360 | 64 | // Setup the spi for 8 bit data, high steady state clock, |
rosienej | 0:afc41b8e2360 | 65 | // second edge capture, with a 1MHz clock rate |
rosienej | 1:2d02f55d47c5 | 66 | |
rosienej | 0:afc41b8e2360 | 67 | int rgb[3]; |
rosienej | 1:2d02f55d47c5 | 68 | unsigned char r,g,b; |
rosienej | 1:2d02f55d47c5 | 69 | const int N=67; // Number of APA-102 Elements +1 |
rosienej | 1:2d02f55d47c5 | 70 | int range; |
rosienej | 1:2d02f55d47c5 | 71 | unsigned int Pixel; |
rosienej | 1:2d02f55d47c5 | 72 | unsigned int Pixels[N]; |
rosienej | 0:afc41b8e2360 | 73 | |
rosienej | 0:afc41b8e2360 | 74 | int colors=0x000000; |
rosienej | 1:2d02f55d47c5 | 75 | LEDs.SetBuffer(Pixels,1,N, N,0, false,false); |
rosienej | 1:2d02f55d47c5 | 76 | |
rosienej | 0:afc41b8e2360 | 77 | while (true) { |
rosienej | 1:2d02f55d47c5 | 78 | ping.Send(); |
rosienej | 1:2d02f55d47c5 | 79 | wait_ms(50); // update rate. |
rosienej | 1:2d02f55d47c5 | 80 | range = ping.Read_cm(); |
rosienej | 0:afc41b8e2360 | 81 | |
rosienej | 0:afc41b8e2360 | 82 | |
rosienej | 0:afc41b8e2360 | 83 | for(int i=0;i<N;i++) |
rosienej | 1:2d02f55d47c5 | 84 | { |
rosienej | 0:afc41b8e2360 | 85 | hsi2rgb(1.0*(i+colors), 0.8, 0.8,rgb); |
rosienej | 1:2d02f55d47c5 | 86 | r = rgb[0]; |
rosienej | 1:2d02f55d47c5 | 87 | g = rgb[1]; |
rosienej | 1:2d02f55d47c5 | 88 | b = rgb[2]; |
rosienej | 0:afc41b8e2360 | 89 | |
rosienej | 1:2d02f55d47c5 | 90 | Pixel=LEDs.IRGB(7,r,g,b); |
rosienej | 1:2d02f55d47c5 | 91 | Pixels[i]=Pixel; |
rosienej | 1:2d02f55d47c5 | 92 | |
rosienej | 0:afc41b8e2360 | 93 | } |
rosienej | 0:afc41b8e2360 | 94 | |
rosienej | 1:2d02f55d47c5 | 95 | LEDs.Repaint(); |
rosienej | 1:2d02f55d47c5 | 96 | colors+=range/10; |
rosienej | 0:afc41b8e2360 | 97 | } |
rosienej | 0:afc41b8e2360 | 98 | } |