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