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.

Committer:
Ned Konz
Date:
Fri Jun 10 08:56:46 2016 -0700
Revision:
40:d5c8ce80b6c4
Added audio

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ned Konz 40:d5c8ce80b6c4 1 #include "mbed.h"
Ned Konz 40:d5c8ce80b6c4 2 #include "audio.h"
Ned Konz 40:d5c8ce80b6c4 3
Ned Konz 40:d5c8ce80b6c4 4 namespace NKAudio
Ned Konz 40:d5c8ce80b6c4 5 {
Ned Konz 40:d5c8ce80b6c4 6
Ned Konz 40:d5c8ce80b6c4 7 AnalogOut speaker(AUDIO_DAC_PIN);
Ned Konz 40:d5c8ce80b6c4 8 Ticker sampleTicker;
Ned Konz 40:d5c8ce80b6c4 9
Ned Konz 40:d5c8ce80b6c4 10 // audio samples
Ned Konz 40:d5c8ce80b6c4 11 // class static
Ned Konz 40:d5c8ce80b6c4 12 int8_t const * volatile AudioPlayer::nextSample;
Ned Konz 40:d5c8ce80b6c4 13
Ned Konz 40:d5c8ce80b6c4 14 // class static
Ned Konz 40:d5c8ce80b6c4 15 uint16_t volatile AudioPlayer::samplesRemaining;
Ned Konz 40:d5c8ce80b6c4 16
Ned Konz 40:d5c8ce80b6c4 17 // interrupt handler
Ned Konz 40:d5c8ce80b6c4 18 // class static
Ned Konz 40:d5c8ce80b6c4 19 void AudioPlayer::playAudioSample()
Ned Konz 40:d5c8ce80b6c4 20 {
Ned Konz 40:d5c8ce80b6c4 21 static uint16_t dcBias = DC_BIAS;
Ned Konz 40:d5c8ce80b6c4 22 if (samplesRemaining)
Ned Konz 40:d5c8ce80b6c4 23 {
Ned Konz 40:d5c8ce80b6c4 24 int8_t val = *nextSample++;
Ned Konz 40:d5c8ce80b6c4 25 uint16_t val16 = dcBias + (val * 256);
Ned Konz 40:d5c8ce80b6c4 26 speaker.write_u16(val16);
Ned Konz 40:d5c8ce80b6c4 27 samplesRemaining--;
Ned Konz 40:d5c8ce80b6c4 28 }
Ned Konz 40:d5c8ce80b6c4 29 else
Ned Konz 40:d5c8ce80b6c4 30 {
Ned Konz 40:d5c8ce80b6c4 31 sampleTicker.detach();
Ned Konz 40:d5c8ce80b6c4 32 speaker.write_u16(dcBias);
Ned Konz 40:d5c8ce80b6c4 33 }
Ned Konz 40:d5c8ce80b6c4 34 }
Ned Konz 40:d5c8ce80b6c4 35
Ned Konz 40:d5c8ce80b6c4 36 bool AudioPlayer::playAudio(int8_t const *start, uint16_t nsamples, AudioCallback cb)
Ned Konz 40:d5c8ce80b6c4 37 {
Ned Konz 40:d5c8ce80b6c4 38 if (!audioDone())
Ned Konz 40:d5c8ce80b6c4 39 {
Ned Konz 40:d5c8ce80b6c4 40 return false;
Ned Konz 40:d5c8ce80b6c4 41 }
Ned Konz 40:d5c8ce80b6c4 42 nextSample = start;
Ned Konz 40:d5c8ce80b6c4 43 samplesRemaining = nsamples;
Ned Konz 40:d5c8ce80b6c4 44 sampleTicker.attach_us(&playAudioSample, SAMPLE_PERIOD_US);
Ned Konz 40:d5c8ce80b6c4 45 while (samplesRemaining)
Ned Konz 40:d5c8ce80b6c4 46 {
Ned Konz 40:d5c8ce80b6c4 47 if (cb != NULL)
Ned Konz 40:d5c8ce80b6c4 48 {
Ned Konz 40:d5c8ce80b6c4 49 cb();
Ned Konz 40:d5c8ce80b6c4 50 }
Ned Konz 40:d5c8ce80b6c4 51 wait_us(AUDIO_WAIT_DURATION_US);
Ned Konz 40:d5c8ce80b6c4 52 }
Ned Konz 40:d5c8ce80b6c4 53 return true;
Ned Konz 40:d5c8ce80b6c4 54 }
Ned Konz 40:d5c8ce80b6c4 55
Ned Konz 40:d5c8ce80b6c4 56 } // namespace NKAudio