Fixes for Raspberry Pi 3 and notmatt/audio-reactive-led-strip
Go to file
2017-01-05 11:26:26 -08:00
arduino/ws2812_controller Merge remote-tracking branch 'refs/remotes/origin/master' into raspberry-pi-support 2017-01-05 02:10:34 -08:00
images Updated GUI image to reflect recent changes 2017-01-05 11:26:26 -08:00
python Python 2.7 compatibility fix 2017-01-05 02:41:04 -08:00
.gitattributes 🎉 Added .gitattributes & .gitignore files 2016-10-12 14:44:03 -07:00
.gitignore Added new visualization module that uses a mel filterbank instead of onset detection 2016-11-07 17:45:52 -08:00
LICENSE.txt Released project under MIT license 2016-12-27 22:00:41 -07:00
README.md Removed reference to dependency that is not actually needed 2017-01-05 04:07:00 -08:00

audio-reactive-led-strip

Real-time LED strip music visualization using Python and the ESP8266 or Raspberry Pi.

block diagram

overview

Demo (click gif for video)

visualizer demo

Overview

The repository includes everything needed to build an LED strip music visualizer (excluding hardware):

What do I need to make one?

Computer + ESP8266

To build a visualizer using a computer and ESP8266, you will need:

  • Computer with Python 2.7 or 3.5 (Anaconda is recommended on Windows)
  • ESP8266 module with RX1 pin exposed. These modules can be purchased for as little as $5 USD. These modules are known to be compatible, but many others will work too:
    • NodeMCU v3
    • Adafruit HUZZAH
    • Adafruit Feather HUZZAH
  • WS2812B LED strip (such as Adafruit Neopixels). These can be purchased for as little as $5-15 USD per meter.

Limitations when using a computer + ESP8266:

  • The communication protocol between the computer and ESP8266 currently supports a maximum of 256 LEDs.

Standalone Raspberry Pi

You can also build a standalone visualizer using a Raspberry Pi. For this you will need:

  • Raspberry Pi (1, 2, or 3)
  • USB audio input device. This could be a USB microphone or a sound card. You just need to find some way of giving the Raspberry Pi audio input.
  • WS2812B LED strip (such as Adafruit Neopixels)

Limitations when using the Raspberry Pi:

  • Raspberry Pi is just fast enough the run the visualization, but it is too slow to run the GUI window as well. It is recommended that you disable the GUI when running the code on the Raspberry Pi.
  • The ESP8266 uses a technique called temporal dithering to improve the color depth of the LED strip. Unfortunately the Raspberry Pi lacks this capability.

Installation for Computer + ESP8266

Python Dependencies

Visualization code is compatible with Python 2.7 or 3.5. A few Python dependencies must also be installed:

  • Numpy
  • Scipy (for digital signal processing)
  • PyQtGraph (for GUI visualization)
  • PyAudio (for recording audio with microphone)

On Windows machines, the use of Anaconda is highly recommended. Anaconda simplifies the installation of Python dependencies, which is sometimes difficult on Windows.

Installing dependencies with Anaconda

Create a conda virtual environment (this step is optional but recommended)

conda create --name visualization-env python=3.5
activate visualization-env

Install dependencies using pip and the conda package manager

conda install numpy scipy pyqtgraph
pip install pyaudio

Installing dependencies without Anaconda

The pip package manager can also be used to install the python dependencies.

pip install numpy
pip install scipy
pip install pyqtgraph
pip install pyaudio

If pip is not found try using python -m pip install instead.

Arduino dependencies

ESP8266 firmare is uploaded using the Arduino IDE. See this tutorial to setup the Arduino IDE for ESP8266.

Hardware Connections

The ESP8266 has hardware support for I²S and this peripheral is used to control the ws2812b LED strip. This signficantly improves performance compared to bit-banging the IO pin. Unfortunately, this means that the LED strip must be connected to the RX1 pin, which is not accessible in some ESP8266 modules (such as the ESP-01).

The RX1 pin on the ESP8266 module should be connected to the data input pin of the ws2812b LED strip (often labelled DIN or D0).

For the NodeMCU v3 and Adafruit Feather HUZZAH, the location of the RX1 pin is shown in the images below. Many other modules also expose the RX1 pin.

nodemcu-pinout feather-huzzah-pinout

Setup and Configuration

  1. Install Python and Python dependencies
  2. Install Arduino IDE and ESP8266 addon
  3. Download and extract all of the files in this repository onto your computer
  4. Connect the RX1 pin of your ESP8266 module to the data input pin of the ws2812b LED strip. Ensure that your LED strip is properly connected to a 5V power supply and that the ESP8266 and LED strip share a common electrical ground connection.
  5. In ws2812_controller.ino:
  • Set const char* ssid to your router's SSID
  • Set const char* password to your router's password
  • Set IPAddress gateway to match your router's gateway
  • Set IPAddress ip to the IP address that you would like your ESP8266 to use (your choice)
  • Set #define NUM_LEDS to the number of LEDs in your LED strip
  1. Upload the ws2812_controller.ino firmware to the ESP8266. Ensure that you have selected the correct ESP8266 board from the boards menu. In the dropdown menu, set CPU Frequency to 160 MHz for optimal performance.
  2. In config.py:
  • Set N_PIXELS to the number of LEDs in your LED strip (must match NUM_LEDS in ws2812_controller.ino)
  • Set UDP_IP to the IP address of your ESP8266 (must match ip in ws2812_controller.ino)
  • If needed, set MIC_RATE to your microphone sampling rate in Hz. Most of the time you will not need to change this.

Installation for Raspberry Pi

Installing the Python dependencies

Install python dependencies using apt-get

sudo apt-get update
sudo apt-get install python-numpy python-scipy python-pyaudio

Install ws281x library

To install the ws281x library I recommend following this Adafruit tutorial.

sudo apt-get install build-essential python-dev git scons swig
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
scons
cd python
sudo python setup.py install

Audio device configuration

For the Raspberry Pi, a USB audio device needs to be configured as the default audio device.

Create/edit /etc/asound.conf

sudo nano /etc/asound.conf

Set the file to the following text

pcm.!default {
    type hw
    card 1
}
ctl.!default {
    type hw
    card 1
}

Next, set the USB device to as the default device by editing /usr/share/alsa/alsa.conf

sudo nano /usr/share/alsa/alsa.conf:

Change

defaults.ctl.card 0
defaults.pcm.card 0

To

defaults.ctl.card 1
defaults.pcm.card 1

Test the LED strip

  1. cd rpi_ws281x/python/examples
  2. sudo nano strandtest.py
  3. Configure the options at the top of the file. Enable logic inverting if you are using an inverting logic-level converter. Set the correct GPIO pin and number of pixels for the LED strip. You will likely need a logic-level converter to convert the Raspberry Pi's 3.3V logic to the 5V logic used by the ws2812b LED strip.
  4. Run example with 'sudo python strandtest.py'

Configure the visualization code

In config.py, set the device to 'pi' and configure the GPIO, LED and other hardware settings.

Running the Visualization

Once everything has been configured, run visualization.py to start the visualization. The visualization will automatically use your default recording device (microphone) as the audio input.

A PyQtGraph GUI will open to display the output of the visualization on the computer. There is a setting to enable/disable the GUI display in config.py

visualization-gui

If you encounter any issues or have questions about this project, feel free to open a new issue.

Limitations

The visualization code currently supports up to 256 LEDs. Support for additional LEDs will be added in the near future.

License

All code in this project is released under the MIT License.