LED Strip Lighting with Music

gemma
neopixel
audio
arduino

#1

Sandra asks:

My daughter is wanting to program some LED strip lighting using arduino so it lights up in time to music (to go with their performance for robocup).
The robotics teacher at school has already purchased an arduino and 1m of the strip lighting from your company.
In looking at the set up, however, she will need the parts to connect the lights to the arduino and to run the system on battery power. What exactly will she need? Can we purchase these items from you?

Thanks for the question Sandra!

Background

Our most popular line of LED strip lighting is the Neopixels line. Neopixels are our supplier Adafruit’s term for addressable RGB LEDs.

Parts

For this build you’re going to need an Arduino (we’ll use the Arduino Gemma), a Microphone, a Slide switch, a Lithium Polymer Battery and a NeoPixel Strip.

Arduino Gemma

Adafruit GEMMA v2 - Miniature wearable electronic platform

MicroUSB Cable (for programming the Gemma)

Micro USB Cable

Microphone

Electret Microphone Amplifier - MAX4466 with Adjustable Gain

Slide Switch

SPDT Slide Switch

Lithium Ion Battery

Polymer Lithium Ion Battery - 400mAh

NeoPixel Strip

Adafruit NeoPixel Digital RGB LED Strip - Black 30 LED - 1m [BLACK]

Circuit Diagram

The Build

  • Connect the NeoPixel’s strips “digital input” to the D0 pin on the Gemma.
  • The negative wire from the strip connects to the ground pin
    on the Gemma.
  • The positive wire from the strip connects to the VBat
    pin of the Gemma (be careful not to connect it to the 3.3V pin).
  • The “out” pin on the Mic Amp connects to the A1/D2 pin on the Gemma (this
    is also the Gemma’s analog input pin).
  • The positive pin on the Mic Amp will connect to the 3.3v on the Gemma.
  • The negative pin on the Mic Amp shares the same ground connection as the Gemma (along with the
    Neopixel strip).

Code

/* LED "Color Organ" for Adafruit Trinket and NeoPixel LEDs.
 
Hardware requirements:
 - Adafruit Trinket or Gemma mini microcontroller (ATTiny85).
 - Adafruit Electret Microphone Amplifier (ID: 1063)
 - Several Neopixels, you can mix and match
   o Adafruit Flora RGB Smart Pixels (ID: 1260)
   o Adafruit NeoPixel Digital LED strip (ID: 1138)
   o Adafruit Neopixel Ring (ID: 1463)
 
Software requirements:
 - Adafruit NeoPixel library
 
Connections:
 - 5 V to mic amp +
 - GND to mic amp -
 - Analog pinto microphone output (configurable below)
 - Digital pin to LED data input (configurable below)
 
Written by Adafruit Industries.  Distributed under the BSD license.
This paragraph must be included in any redistribution.
*/
#include <Adafruit_NeoPixel.h>
 
#define N_PIXELS  60  // Number of pixels you are using
#define MIC_PIN    1  // Microphone is attached to Trinket GPIO #2/Gemma D2 (A1)
#define LED_PIN    0  // NeoPixel LED strand is connected to GPIO #0 / D0
#define DC_OFFSET  0  // DC offset in mic signal - if unusure, leave 0
#define NOISE     100  // Noise/hum/interference in mic signal
#define SAMPLES   60  // Length of buffer for dynamic level adjustment
#define TOP       (N_PIXELS +1) // Allow dot to go slightly off scale
// Comment out the next line if you do not want brightness control or have a Gemma
#define POT_PIN    3  // if defined, a potentiometer is on GPIO #3 (A3, Trinket only) 
 
byte
  peak      = 0,      // Used for falling dot
  dotCount  = 0,      // Frame counter for delaying dot-falling speed
  volCount  = 0;      // Frame counter for storing past volume data
  
int
  vol[SAMPLES],       // Collection of prior volume samples
  lvl       = 10,     // Current "dampened" audio level
  minLvlAvg = 0,      // For dynamic adjustment of graph low & high
  maxLvlAvg = 512;
 
Adafruit_NeoPixel  strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
 
void setup() {
  memset(vol, 0, sizeof(vol));
  strip.begin();
}
void loop() {
  uint8_t  i;
  uint16_t minLvl, maxLvl;
  int      n, height;
  n   = analogRead(MIC_PIN);                 // Raw reading from mic 
  n   = abs(n - 512 - DC_OFFSET);            // Center on zero
  n   = (n <= NOISE) ? 0 : (n - NOISE);      // Remove noise/hum
  lvl = ((lvl * 7) + n) >> 3;    // "Dampened" reading (else looks twitchy)
  
  // Calculate bar height based on dynamic min/max levels (fixed point):
  height = TOP * (lvl - minLvlAvg) / (long)(maxLvlAvg - minLvlAvg);
 
  if(height < 0L)       height = 0;      // Clip output
  else if(height > TOP) height = TOP;
  if(height > peak)     peak   = height; // Keep 'peak' dot at top
 
// if POT_PIN is defined, we have a potentiometer on GPIO #3 on a Trinket 
//    (Gemma doesn't have this pin)
  uint8_t bright = 255;   
#ifdef POT_PIN            
   bright = analogRead(POT_PIN);  // Read pin (0-255) (adjust potentiometer 
                                  //   to give 0 to Vcc volts
#endif
  strip.setBrightness(bright);    // Set LED brightness (if POT_PIN at top
                                  //  define commented out, will be full)
  // Color pixels based on rainbow gradient
  for(i=0; i<N_PIXELS; i++) {  
    if(i >= height)               
       strip.setPixelColor(i,   0,   0, 0);
    else 
       strip.setPixelColor(i,Wheel(map(i,0,strip.numPixels()-1,30,150)));
    } 
 
   strip.show(); // Update strip
 
  vol[volCount] = n;                      // Save sample for dynamic leveling
  if(++volCount >= SAMPLES) volCount = 0; // Advance/rollover sample counter
 
  // Get volume range of prior frames
  minLvl = maxLvl = vol[0];
  for(i=1; i<SAMPLES; i++) {
    if(vol[i] < minLvl)      minLvl = vol[i];
    else if(vol[i] > maxLvl) maxLvl = vol[i];
  }
  // minLvl and maxLvl indicate the volume range over prior frames, used
  // for vertically scaling the output graph (so it looks interesting
  // regardless of volume level).  If they're too close together though
  // (e.g. at very low volume levels) the graph becomes super coarse
  // and 'jumpy'...so keep some minimum distance between them (this
  // also lets the graph go to zero when no sound is playing):
  if((maxLvl - minLvl) < TOP) maxLvl = minLvl + TOP;
  minLvlAvg = (minLvlAvg * 63 + minLvl) >> 6; // Dampen min/max levels
  maxLvlAvg = (maxLvlAvg * 63 + maxLvl) >> 6; // (fake rolling average)
}
 
// Input a value 0 to 255 to get a color value.
// The colors are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

#2

I think you might have misunderstood our needs. She won’t need a microphone. Music is played through another source as not only the lights but also two Lego mindstorm robots have to move in time to music. It is played through a system at the competition. If you look at the picture of the LED strip lighting you yourselves have above this is the set up she was wanting. She has an Arduino Uno and 1m of strip lighting. She found a battery holder and connector on your site that seem to match the Adafruit setup shown BUT she’s unsure what wires she needs to join the lights to the connector and the arduino (as can be seen in the photo). What are they? Can she purchase them from you?


#3

i.e the black and red wires going from lights to connector; the black and blue wires leading from strip with some sort of a switch in the middle then becoming black and white wires leading to the arduino.


#4

And what is the connector going into the arduino? How does it work in the circuit?


#5

Hi Sandra,

Thanks for your comment:

what is the connector going into the arduino?

The connectors seen in the above graphic are Male to Female Jumper Wires.

<img src=’/uploads/littlebirdelectronics/original/1X/2ed403f4bf762ab61b6c56bbf5ed86a58609d16d.jpeg’ alt=“Premium Jumper Wire 50-Piece Rainbow Assortment M-F 3"”>

How does it work in the circuit?

In the above diagram photo, power and grounds lines are going to the DC Barrel Jack Adaptor, and a signal and ground line is going to the D6 and Ground pins on the Arduino.


#6

One of my favourite Imp / NeoPixel projects used this exact technique.


#7

WOw, Have learnt about it.