Test program for my Multi_WS2811 library that started out as a fork of heroic/WS2811. My library uses hardware DMA on the FRDM-KL25Z to drive up to 16 strings of WS2811 or WS2812 LEDs in parallel.

Dependencies:   Multi_WS2811 mbed MMA8451Q

Fork of WS2811 by Heroic Robotics

NOTE: I have accidentally pushed changes for another fork of this program that I used in the recent Georgetown Carnival Power Tool Races. When I get some time, I will restore the test program to its original glory.

You can see my power tool racer (Nevermore's Revenge) here

/media/uploads/bikeNomad/img_0482.jpg

This tests my FRDM-KL25Z multi-string WS2811/WS2812 library. It uses the accelerometer to change the rainbow phase on two strings of LEDs as well as the touch sense to change brightness.

A video of this program in operation is here.

Here is the library that I developed to run the LEDs:

Import libraryMulti_WS2811

Library allowing up to 16 strings of 60 WS2811 or WS2812 LEDs to be driven from a single FRDM-KL25Z board. Uses hardware DMA to do a full 800 KHz rate without much CPU burden.

Files at this revision

API Documentation at this revision

Comitter:
bikeNomad
Date:
Thu Jun 11 15:24:57 2015 +0000
Parent:
31:c9eee3a33826
Child:
33:43b504e417e3
Commit message:
changed to use template class

Changed in this revision

Multi_WS2811.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/Multi_WS2811.lib	Sat Jan 04 00:45:20 2014 +0000
+++ b/Multi_WS2811.lib	Thu Jun 11 15:24:57 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/bikeNomad/code/Multi_WS2811/#a8535703f23b
+http://mbed.org/users/bikeNomad/code/Multi_WS2811/#86a910560879
--- a/main.cpp	Sat Jan 04 00:45:20 2014 +0000
+++ b/main.cpp	Thu Jun 11 15:24:57 2015 +0000
@@ -1,24 +1,36 @@
 #include "mbed.h"
-#include "WS2811.h"
 #include "Colors.h"
 #include "TSISensor.h"
 #include "MMA8451Q.h"
 
 #define MMA8451_I2C_ADDRESS (0x1d<<1)
 
+#define INSTANTIATE_TEMPLATES 1
+#include "WS2811.h"
+
+// I/O pin usage
+// PTD0 TPM0 CH0 monitor
+// PTD1 TPM0 CH1 monitor
+// PTD2 data output for strip# 1
+// PTD3 data output for strip# 2
+// PTD4 blinking eyes output (HI = ON)
+
+unsigned const DATA_OUT_PIN1 = 2; // PTD2
+unsigned const DATA_OUT_PIN2 = 3; // PTD3
+
+const unsigned MAX_LEDS_PER_STRIP = 32;
+
 // per LED: 3 * 20 mA = 60mA max
 // 60 LEDs: 60 * 60mA = 3600 mA max
 // 120 LEDs: 7200 mA max
 unsigned const nLEDs = MAX_LEDS_PER_STRIP;
 
-// I/O pin usage
-// PTD0 TPM0 CH0 monitor
-// PTD1 TPM0 CH1 monitor
-// PTD2 data output
-// PTD3 debug output
+template class WS2811<MAX_LEDS_PER_STRIP>;
 
-unsigned const DATA_OUT_PIN1 = 2; // PTD2
-unsigned const DATA_OUT_PIN2 = 3; // PTD3
+typedef WS2811<MAX_LEDS_PER_STRIP> MyWS2811;
+
+MyWS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
+MyWS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
 
 Serial pc(USBTX, USBRX);
 Timer timeRunning;
@@ -48,7 +60,7 @@
 // @param sat saturation, 0.0 - 1.0
 // @param brite brightness, 0.0 - 1.0
 // @param hueShift shift, 0.0 - 1.0 is equivalent to 0 - 360 degrees
-static void showRainbow(WS2811 &strip, float sat, float brite, float hueShift)
+static void showRainbow(MyWS2811 &strip, float sat, float brite, float hueShift)
 {
     unsigned nLEDs = strip.numPixels();
     for (unsigned i = 0; i < nLEDs; i++) {
@@ -60,7 +72,7 @@
     strip.show();
 }
 
-static void showSolidColor(WS2811 &strip, uint8_t r, uint8_t g, uint8_t b)
+static void showSolidColor(MyWS2811 &strip, uint8_t r, uint8_t g, uint8_t b)
 {
     unsigned nLEDs = strip.numPixels();
     for (unsigned i = 0; i < nLEDs; i++) {
@@ -72,8 +84,7 @@
 int main(void)
 {
     pc.baud(115200);
-    WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
-    WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
+
 
     lightStrip1.begin();
     lightStrip2.begin();
@@ -102,7 +113,7 @@
 
         showSolidColor(lightStrip1, r, g, b);
         showSolidColor(lightStrip2, r, g, b);
-        WS2811::startDMA();
+        MyWS2811::startDMA();
 
         frames++;
     }
@@ -121,7 +132,7 @@
         readTouchSensor();
         showRainbow(lightStrip1, sat, brite, abs(xyz[0]));
         showRainbow(lightStrip2, sat, brite, abs(xyz[1]));
-        WS2811::startDMA();
+        MyWS2811::startDMA();
 
         frames ++;
     }
--- a/mbed.bld	Sat Jan 04 00:45:20 2014 +0000
+++ b/mbed.bld	Thu Jun 11 15:24:57 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/dc225afb6914
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/7cff1c4259d7
\ No newline at end of file