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:
Fri Jan 03 19:17:24 2014 +0000
Parent:
28:dbe551a3dd64
Child:
30:52e9205a8059
Commit message:
fixed bit timing to eliminate flickering.

Changed in this revision

WS2811.cpp 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
--- a/WS2811.cpp	Fri Jan 03 16:12:56 2014 +0000
+++ b/WS2811.cpp	Fri Jan 03 19:17:24 2014 +0000
@@ -51,8 +51,8 @@
 #define NSEC_TO_TICKS(nsec) ((nsec)*48/1000)
 static const uint32_t CLK_NSEC = 1250;
 static const uint32_t tpm_period    = NSEC_TO_TICKS(CLK_NSEC);
-static const uint32_t tpm_p0_period = NSEC_TO_TICKS(350);
-static const uint32_t tpm_p1_period = NSEC_TO_TICKS(700);
+static const uint32_t tpm_p0_period = NSEC_TO_TICKS(250);
+static const uint32_t tpm_p1_period = NSEC_TO_TICKS(650);
 
 enum DMA_MUX_SRC {
     DMA_MUX_SRC_TPM0_CH_0     = 24,
--- a/main.cpp	Fri Jan 03 16:12:56 2014 +0000
+++ b/main.cpp	Fri Jan 03 19:17:24 2014 +0000
@@ -25,8 +25,9 @@
 
 TSISensor touchSensor;
 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
+PwmOut rled(LED_RED);
+PwmOut gled(LED_GREEN);
 
-Ticker touchTicker;
 float touchPercentage;
 unsigned frames;
 
@@ -73,14 +74,14 @@
     WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
     WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
 
-    touchTicker.attach(&readTouchSensor, 0.1);
     lightStrip1.begin();
     lightStrip2.begin();
+    rled = 1.0;
+    gled = 1.0;
 
     float sat = 1.0;
 
     timeRunning.start();
-    bool printed = false;
 
     uint8_t r =0;
     uint8_t g =0;
@@ -109,17 +110,17 @@
     timeRunning.reset();
     frames = 0;
 
+    float xyz[3];
+    acc.getAccAllAxis(xyz);
+    pc.printf("x: %f y: %f z: %f\r\n", xyz[0], xyz[1], xyz[2]);
+
     for (;;) {
-        unsigned running = timeRunning.read_us();
-        // float hueShift = running / rainbowPeriod;
-        if (!printed && running >= 10000000U) {
-            pc.printf("%u frames in %u usec = %u frames / sec\r\n", frames, running, frames * 1000000 / running);
-            printed = true;
-        }
-        float xyz[3];
         acc.getAccAllAxis(xyz);
-        showRainbow(lightStrip1, sat, brite, xyz[0]);
-        showRainbow(lightStrip2, sat, brite, xyz[1]);
+        rled = 1.0 - abs(xyz[0]);
+        gled = 1.0 - abs(xyz[1]);
+        readTouchSensor();
+        showRainbow(lightStrip1, sat, brite, abs(xyz[0]));
+        showRainbow(lightStrip2, sat, brite, abs(xyz[1]));
         WS2811::startDMA();
 
         frames ++;