A simple example to drive an APA-102 LED strip.

Dependencies:   mbed APA102b Ping SLCD

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?

UserRevisionLine numberNew 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 }