Example for WS2812 Library
Dependencies: PixelArray WS2812 mbed
This is a demo for the WS2812 LED driver library.
The the timings of the bit banging operation are very sensitive. Depending on the platform, you will need to change the timing values in the WS2812 constructor. The default values in this demo are for the K64F. Here are a few other values for other platforms:
K64F, KL46Z: 0, 5, 5, 0
LPC1768: 5, 10, 10, 15
NUCLEO F411RE: 7, 15, 10, 15
UPDATE 11-29-2016
Thanks to the user Proff for the new measurements!
LPC1768: 3, 11, 10, 11
NUCLEO_F401RE: 3, 12, 9, 12
UPDATE 3-14-2017
Thanks to the user SashaK for the new measurements
NUCELO_F746ZG: 32, 105, 70, 123
If you are curious how to determine these values, see the WS2812 library page below.
Import libraryWS2812
Library for the WS2812 LED Driver. Uses bit banging and nops for precise timing. Number of nops executed are configurable at run time.
.
main.cpp@2:cb82a3dc4031, 2015-02-12 (annotated)
- Committer:
- bridadan
- Date:
- Thu Feb 12 21:55:24 2015 +0000
- Revision:
- 2:cb82a3dc4031
- Parent:
- 1:e04a0ecefa29
K64F timings in demo
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bridadan | 0:12cb6f0c2788 | 1 | #include "mbed.h" |
bridadan | 0:12cb6f0c2788 | 2 | #include "WS2812.h" |
bridadan | 0:12cb6f0c2788 | 3 | #include "PixelArray.h" |
bridadan | 0:12cb6f0c2788 | 4 | |
bridadan | 2:cb82a3dc4031 | 5 | #define WS2812_BUF 150 |
bridadan | 2:cb82a3dc4031 | 6 | #define NUM_COLORS 6 |
bridadan | 2:cb82a3dc4031 | 7 | #define NUM_LEDS_PER_COLOR 10 |
bridadan | 0:12cb6f0c2788 | 8 | |
bridadan | 0:12cb6f0c2788 | 9 | PixelArray px(WS2812_BUF); |
bridadan | 0:12cb6f0c2788 | 10 | |
bridadan | 2:cb82a3dc4031 | 11 | // See the program page for information on the timing numbers |
bridadan | 1:e04a0ecefa29 | 12 | // The given numbers are for the K64F |
bridadan | 2:cb82a3dc4031 | 13 | WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0); |
bridadan | 0:12cb6f0c2788 | 14 | |
bridadan | 0:12cb6f0c2788 | 15 | int main() |
bridadan | 0:12cb6f0c2788 | 16 | { |
bridadan | 0:12cb6f0c2788 | 17 | |
bridadan | 1:e04a0ecefa29 | 18 | ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling |
bridadan | 0:12cb6f0c2788 | 19 | |
bridadan | 0:12cb6f0c2788 | 20 | // set up the colours we want to draw with |
bridadan | 2:cb82a3dc4031 | 21 | int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f}; |
bridadan | 0:12cb6f0c2788 | 22 | |
bridadan | 0:12cb6f0c2788 | 23 | // for each of the colours (j) write out 10 of them |
bridadan | 0:12cb6f0c2788 | 24 | // the pixels are written at the colour*10, plus the colour position |
bridadan | 0:12cb6f0c2788 | 25 | // all modulus 60 so it wraps around |
bridadan | 2:cb82a3dc4031 | 26 | for (int i = 0; i < WS2812_BUF; i++) { |
bridadan | 2:cb82a3dc4031 | 27 | px.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]); |
bridadan | 0:12cb6f0c2788 | 28 | } |
bridadan | 0:12cb6f0c2788 | 29 | |
bridadan | 0:12cb6f0c2788 | 30 | // now all the colours are computed, add a fade effect using intensity scaling |
bridadan | 0:12cb6f0c2788 | 31 | // compute and write the II value for each pixel |
bridadan | 2:cb82a3dc4031 | 32 | for (int j=0; j<WS2812_BUF; j++) { |
bridadan | 0:12cb6f0c2788 | 33 | // px.SetI(pixel position, II value) |
bridadan | 2:cb82a3dc4031 | 34 | px.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR))); |
bridadan | 0:12cb6f0c2788 | 35 | } |
bridadan | 0:12cb6f0c2788 | 36 | |
bridadan | 0:12cb6f0c2788 | 37 | |
bridadan | 0:12cb6f0c2788 | 38 | // Now the buffer is written, rotate it |
bridadan | 0:12cb6f0c2788 | 39 | // by writing it out with an increasing offset |
bridadan | 0:12cb6f0c2788 | 40 | while (1) { |
bridadan | 2:cb82a3dc4031 | 41 | for (int z=WS2812_BUF; z >= 0 ; z--) { |
bridadan | 0:12cb6f0c2788 | 42 | ws.write_offsets(px.getBuf(),z,z,z); |
bridadan | 0:12cb6f0c2788 | 43 | wait(0.075); |
bridadan | 0:12cb6f0c2788 | 44 | } |
bridadan | 0:12cb6f0c2788 | 45 | } |
bridadan | 0:12cb6f0c2788 | 46 | |
bridadan | 0:12cb6f0c2788 | 47 | } |