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

Dependencies:   mbed APA102b Ping SLCD

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?

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