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 Jan 02 02:31:24 2014 +0000
Parent:
21:4541da183397
Child:
23:33df42ff2541
Commit message:
Changed to 60 LEDs maximum. Reduced brightness.

Changed in this revision

WS2811.h 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.h	Thu Jan 02 00:50:09 2014 +0000
+++ b/WS2811.h	Thu Jan 02 02:31:24 2014 +0000
@@ -1,58 +1,58 @@
-// Mbed library to control WS2801-based RGB LED Strips
-// some portions (c) 2011 Jelmer Tiete
-// This library is ported from the Arduino implementation of Adafruit Industries
-// found at: http://github.com/adafruit/LPD8806
-// and their strips: http://www.adafruit.com/products/306
-// Released under the MIT License: http://mbed.org/license/mit
-//
-/*****************************************************************************/
-
-// Heavily modified by Jas Strong, 2012-10-04
-// Changed to use a virtual base class and to use software SPI.
-//
-// Modified by Ned Konz, December 2013.
-// Using three-phase DMA ala Paul Stoffegren's version.
-
-#ifndef MBED_WS2811_H
-#define MBED_WS2811_H
-
-#include "mbed.h"
-#include "LedStrip.h"
-
-#define MAX_LEDS_PER_STRIP 40
-
-class WS2811 : public LedStrip
-{
-public:
-    WS2811(unsigned n, unsigned pinNumber);
-
-    virtual void begin();
-    virtual void show();
-    virtual void blank();
-
-private:
-    Timer guardtime;
-    uint32_t pinMask;
-
-    void writePixel(unsigned n, uint8_t *p);
-
-    // Class Static:
-
-    static bool initialized;
-    static uint32_t enabledPins;
-
-    static void writeByte(uint8_t byte, uint32_t mask, uint32_t *dest);
-    static void startDMA();
-
-    static bool is_dma_done();
-
-    static void hw_init();
-        static void io_init();
-        static void clock_init();
-        static void dma_init();
-        static void tpm_init();
-        static void dma_data_init();
-};
-
-#endif
+// Mbed library to control WS2801-based RGB LED Strips
+// some portions (c) 2011 Jelmer Tiete
+// This library is ported from the Arduino implementation of Adafruit Industries
+// found at: http://github.com/adafruit/LPD8806
+// and their strips: http://www.adafruit.com/products/306
+// Released under the MIT License: http://mbed.org/license/mit
+//
+/*****************************************************************************/
+
+// Heavily modified by Jas Strong, 2012-10-04
+// Changed to use a virtual base class and to use software SPI.
+//
+// Modified by Ned Konz, December 2013.
+// Using three-phase DMA ala Paul Stoffegren's version.
+
+#ifndef MBED_WS2811_H
+#define MBED_WS2811_H
+
+#include "mbed.h"
+#include "LedStrip.h"
+
+#define MAX_LEDS_PER_STRIP 60
+
+class WS2811 : public LedStrip
+{
+public:
+    WS2811(unsigned n, unsigned pinNumber);
 
+    virtual void begin();
+    virtual void show();
+    virtual void blank();
+
+private:
+    Timer guardtime;
+    uint32_t pinMask;
+
+    void writePixel(unsigned n, uint8_t *p);
+
+    // Class Static:
+
+    static bool initialized;
+    static uint32_t enabledPins;
+
+    static void writeByte(uint8_t byte, uint32_t mask, uint32_t *dest);
+    static void startDMA();
+
+    static bool is_dma_done();
+
+    static void hw_init();
+        static void io_init();
+        static void clock_init();
+        static void dma_init();
+        static void tpm_init();
+        static void dma_data_init();
+};
+
+#endif
+
--- a/main.cpp	Thu Jan 02 00:50:09 2014 +0000
+++ b/main.cpp	Thu Jan 02 02:31:24 2014 +0000
@@ -1,74 +1,74 @@
-#include "mbed.h"
-#include "WS2811.h"
-#include "Colors.h"
-
-// per LED: 3x 20 mA = 60mA
-// 4x full brightness = 0.33A at 5V.
-unsigned const nLEDs = 40;
-
-// I/O pin usage
-// PTD0 TPM0 CH0 monitor
-// PTD1 TPM0 CH1 monitor
-// PTD2 data output
-// PTD3 debug output
-
-unsigned const DATA_OUT_PIN = 2; // PTD2
-
-Serial pc(USBTX, USBRX);
-
-// @brief sets different colors in each of the LEDs of a strip
-// @param strip the light strip
-// @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
-void showRainbow(WS2811 &strip, float sat, float brite, float hueShift)
-{
-    unsigned nLEDs = strip.numPixels();
-    for (unsigned i = 0; i < nLEDs; i++) {
-        uint8_t r, g, b;
-        float hue = ((float)i / (float)nLEDs) + hueShift;
-        HSBtoRGB(hue, sat, brite, &r, &g, &b);
-        strip.setPixelColor(i, LedStrip::Color(r, g, b));
-    }
-    strip.show();
-}
-
-void showTestPattern(WS2811 &strip)
-{
-    unsigned nLEDs = strip.numPixels();
-    for (unsigned i = 0; i < nLEDs; i++)
-    {
-        strip.setPixelColor(i, LedStrip::Color(0xff,0,0xAA));
-    }
-    strip.show();
-}
-
-int main(void)
-{
-    pc.baud(115200);
-    pc.printf("\r\nLEDs: %d\r\n", nLEDs);
-
-    WS2811 lightStrip(nLEDs, DATA_OUT_PIN);
-    Timer advance;
-    advance.start();
-
-    lightStrip.begin();
-
-    // time per LED is about 44 usec, with 310 usec gap between.
-    float sat = 1.0;
-    float brite = 0.25;
-    float hueShift = 0.0;
-    float hueShiftIncrement = 1.0 / (360.0 / nLEDs);
-
-    for (;;) {
-        advance.reset();
-
-        // showTestPattern(lightStrip);
-        showRainbow(lightStrip, sat, brite, hueShift);
-        hueShift += hueShiftIncrement;
-
-        while (advance.read_ms() < 100)
-            __NOP();
-   }
-}
+#include "mbed.h"
+#include "WS2811.h"
+#include "Colors.h"
+
+// per LED: 3x 20 mA = 60mA
+// 4x full brightness = 0.33A at 5V.
+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
+
+unsigned const DATA_OUT_PIN = 2; // PTD2
+
+Serial pc(USBTX, USBRX);
+
+// @brief sets different colors in each of the LEDs of a strip
+// @param strip the light strip
+// @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)
+{
+    unsigned nLEDs = strip.numPixels();
+    for (unsigned i = 0; i < nLEDs; i++) {
+        uint8_t r, g, b;
+        float hue = ((float)i / (float)nLEDs) + hueShift;
+        HSBtoRGB(hue, sat, brite, &r, &g, &b);
+        strip.setPixelColor(i, LedStrip::Color(r, g, b));
+    }
+    strip.show();
+}
 
+static void showTestPattern(WS2811 &strip)
+{
+    unsigned nLEDs = strip.numPixels();
+    for (unsigned i = 0; i < nLEDs; i++)
+    {
+        strip.setPixelColor(i, LedStrip::Color(0xff,0,0xAA));
+    }
+    strip.show();
+}
+
+int main(void)
+{
+    pc.baud(115200);
+    pc.printf("\r\nLEDs: %d\r\n", nLEDs);
+
+    WS2811 lightStrip(nLEDs, DATA_OUT_PIN);
+
+    lightStrip.begin();
+
+    float sat = 1.0;    // color saturation, 0.0 to 1.0
+    float brite = 0.1;  // 1.0 is full brightness, which is VERY bright!
+    float hueShift = 0.0;
+    float hueShiftIncrement = 1.0 / (360.0 / nLEDs);
+
+    Timer advance;
+    advance.start();
+
+    for (;;) {
+        advance.reset();
+
+        // showTestPattern(lightStrip);
+        showRainbow(lightStrip, sat, brite, hueShift);
+        hueShift += hueShiftIncrement;
+
+        while (advance.read_ms() < 100)
+            __NOP();
+   }
+}
+