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

Dependencies:   mbed APA102b Ping SLCD

Committer:
rosienej
Date:
Mon Apr 06 13:57:50 2015 +0000
Revision:
2:5a9388a7ac62
Parent:
1:2d02f55d47c5
Child:
3:2788a714b18e
Demo of a different LED display geometery

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 2:5a9388a7ac62 74 float hue,sat,ints;
rosienej 2:5a9388a7ac62 75
rosienej 2:5a9388a7ac62 76 const int NumberOfRays = 19;
rosienej 2:5a9388a7ac62 77
rosienej 2:5a9388a7ac62 78
rosienej 2:5a9388a7ac62 79 float RayHues[19] = // hues are 0 to 360, http://en.wikipedia.org/wiki/HSL_and_HSV
rosienej 2:5a9388a7ac62 80 {0.0,19.0,38.0,57.0,76.0,95.0,114.0,
rosienej 2:5a9388a7ac62 81 133.0,152.0,171.0,190.0,209.0,228.0,
rosienej 2:5a9388a7ac62 82 247.0,266.0,285.0,304.0,323.0,342.0};
rosienej 2:5a9388a7ac62 83
rosienej 2:5a9388a7ac62 84 float RaySats[19] = // hues are 0 to 360, http://en.wikipedia.org/wiki/HSL_and_HSV
rosienej 2:5a9388a7ac62 85 {0.8,0.8,0.8,0.8,0.8,0.8,0.8,
rosienej 2:5a9388a7ac62 86 0.8,0.8,0.8,0.8,0.8,0.8,0.8,
rosienej 2:5a9388a7ac62 87 0.8,0.8,0.8,0.8,0.8};
rosienej 2:5a9388a7ac62 88
rosienej 2:5a9388a7ac62 89 float RayInts[19] = // hues are 0 to 360, http://en.wikipedia.org/wiki/HSL_and_HSV
rosienej 2:5a9388a7ac62 90 {0.8,0.8,0.8,0.8,0.8,0.8,0.8,
rosienej 2:5a9388a7ac62 91 0.8,0.8,0.8,0.8,0.8,0.8,0.8,
rosienej 2:5a9388a7ac62 92 0.8,0.8,0.8,0.8,0.8};
rosienej 2:5a9388a7ac62 93
rosienej 2:5a9388a7ac62 94 int RayLengths[19] = {3, 4, 5, 4, 2, 5, 4, 2, 4,5,3,4,3,2,2,3,2,4,5};
rosienej 2:5a9388a7ac62 95
rosienej 2:5a9388a7ac62 96 int Rays[19][5] = {
rosienej 2:5a9388a7ac62 97 {1 ,20,39, 0, 0}, //3
rosienej 2:5a9388a7ac62 98 {2 ,21,40,53, 0}, //4
rosienej 2:5a9388a7ac62 99 {3 ,22,41,54,64}, //5
rosienej 2:5a9388a7ac62 100 {4 ,23,42,55, 0}, //4
rosienej 2:5a9388a7ac62 101 {5 ,24, 0, 0, 0}, //2
rosienej 2:5a9388a7ac62 102 {6 ,25,43,56,65}, //5
rosienej 2:5a9388a7ac62 103 {7 ,26,44,57, 0}, //4
rosienej 2:5a9388a7ac62 104 {8 ,27, 0, 0, 0}, //2
rosienej 2:5a9388a7ac62 105 {9 ,28,45,58, 0}, //4
rosienej 2:5a9388a7ac62 106 {10,29,46,59,66}, //5
rosienej 2:5a9388a7ac62 107 {11,30,47, 0, 0}, //3
rosienej 2:5a9388a7ac62 108 {12,31,48,60, 0}, //4
rosienej 2:5a9388a7ac62 109 {13,32,49, 0, 0}, //3
rosienej 2:5a9388a7ac62 110 {14,33, 0, 0, 0}, //2
rosienej 2:5a9388a7ac62 111 {15,34, 0, 0, 0}, //2
rosienej 2:5a9388a7ac62 112 {16,35,50, 0, 0}, //3
rosienej 2:5a9388a7ac62 113 {17,36, 0, 0, 0}, //2
rosienej 2:5a9388a7ac62 114 {18,37,51,61,0}, //4
rosienej 2:5a9388a7ac62 115 {19,38,52,62,63}}; //5
rosienej 2:5a9388a7ac62 116
rosienej 2:5a9388a7ac62 117
rosienej 0:afc41b8e2360 118 int colors=0x000000;
rosienej 1:2d02f55d47c5 119 LEDs.SetBuffer(Pixels,1,N, N,0, false,false);
rosienej 1:2d02f55d47c5 120
rosienej 0:afc41b8e2360 121 while (true) {
rosienej 1:2d02f55d47c5 122 ping.Send();
rosienej 1:2d02f55d47c5 123 wait_ms(50); // update rate.
rosienej 1:2d02f55d47c5 124 range = ping.Read_cm();
rosienej 0:afc41b8e2360 125
rosienej 0:afc41b8e2360 126
rosienej 2:5a9388a7ac62 127 for(int i=0;i<NumberOfRays;i++)
rosienej 1:2d02f55d47c5 128 {
rosienej 2:5a9388a7ac62 129 for(int j=0;j<RayLengths[i];j++)
rosienej 2:5a9388a7ac62 130 {
rosienej 2:5a9388a7ac62 131 for(int k=0;k<j;k++)
rosienej 2:5a9388a7ac62 132 {
rosienej 2:5a9388a7ac62 133 hue = RayHues[i];
rosienej 2:5a9388a7ac62 134 sat = RaySats[i];
rosienej 2:5a9388a7ac62 135 ints = RayInts[i];
rosienej 2:5a9388a7ac62 136 hsi2rgb(hue, sat, ints,rgb);
rosienej 2:5a9388a7ac62 137 r = rgb[0];
rosienej 2:5a9388a7ac62 138 g = rgb[1];
rosienej 2:5a9388a7ac62 139 b = rgb[2];
rosienej 2:5a9388a7ac62 140
rosienej 2:5a9388a7ac62 141 Pixel=LEDs.IRGB(7,r,g,b);
rosienej 2:5a9388a7ac62 142 Pixels[Rays[i][k]-1]=Pixel; // arrays in C++ start at zero. Need to subtract 1.
rosienej 2:5a9388a7ac62 143 }
rosienej 0:afc41b8e2360 144 }
rosienej 2:5a9388a7ac62 145 }
rosienej 1:2d02f55d47c5 146 LEDs.Repaint();
rosienej 1:2d02f55d47c5 147 colors+=range/10;
rosienej 0:afc41b8e2360 148 }
rosienej 0:afc41b8e2360 149 }