ATtiny85 spectrum analyzer for music to RGB LED with FFT
Excited with the new discovery of FHT library. Yours truly definitely want to give it a try on an ATtiny85. After hours massaging the code to make it to work, sadly, none come to functionality (yet). According to this site http://forum.dev.arduino.cc/index.php?topic=261759.0, ATtiny has as small footprint ""ATtiny85 on-board, 8K of flash, 512 byte of SRAM, 512 bytes of EEPROM"" hence can't work with FHT. However, yours truly beg to differ. He noticed that some code in the FHT.cpp can't compile due to reduced instruction sets on ATtiny85. More about that after some workaround can be found.
Nonetheless, yours truly really want to have some fun with sound to light on Arduino's poor cousin, the ATtiny85. Life is so boring without some LEDs' goodness. Just come to recall that, years ago yours truly have done a DIY spectrum analyzer using a modified FFT that use 8bits only, runs off an arduino and LOL shield http://shin-ajaran.blogspot.sg/2011/07/diy-arduino-vu-spectrum-analyzer.html. This modified 8 bit FFT came for a forum discussion http://forum.arduino.cc/index.php?topic=38153.0 . Reusing the same library but has to be modified to for Arduino IDE v1.06 and later; reusing the electret amplifier mentioned in an earlier post http://shin-ajaran.blogspot.sg/2014/11/arduino-spectrum-analyzer-for-music-to.html; reusing the MitG PCB which is a breakout board for ATtiny85 made earlier http://shin-ajaran.blogspot.sg/2014/01/setting-up-hardware-for-using-arduino.html to make the contraption in the following diagram.
youtube video here, the light changes according to the tone of the phone.
edit: after some code massaging, the colours appear somewhat according to what yours truly have in mind.
first try: Sadly, the colour changes are too subtle to be captured by a cheapo phone camera
Arduino spectrum analyzer for music to colourful lighting using FHT and RGB LED
years back yours truly have made a contraption to convey the concept of fourier transform http://shin-ajaran.blogspot.sg/2011/07/diy-arduino-vu-spectrum-analyzer.html using Arduino, LOL shield and the FFT library. The piece of code is still hanging on the Internet, but the hardware has been re-purposed for the better of humanity.
Not long ago, yours truly come across the FHT (Fast Hartley Transform) by Open Music Lab http://wiki.openmusiclabs.com/wiki/ArduinoFHT while browsing the Internet for inspirations to continue with the current working life. This algorithm claims to be more efficient in terms of CPU cycles and memory footprint; well, true to speak because the premise is: FHT works on the "real" portion of the data whereas FFT works on both the "real" and "complex" portion of the data. Really excited by this discovery of the code library, yours truly can't wait to get his hand dirty on making a contraption that uses the above FHT. Following the instructions in the FHT wiki for installing the library and sample data output using processing is a breeze. This wiki also comes complete with a 128 channel spectrum visualizer written using processing; Scroll down until you hit "FHT_128_channel_analyser.zip" http://wiki.openmusiclabs.com/wiki/ArduinoFHT?action=AttachFile&do=view&target=FHT_128_channel_analyser.zip . A visualizer is very handy when it comes to deciding the "strategy" for the music to light algorithm.
Check out the video below for a demo of this make
This make assumes the following parts come in handy
1. 1x Arduino
2. 1x RGB LED (common anode)
3. 1x 3D printed LED diffuser
4. 1x electret microphone & LM386 audio amplifier.
Prelude: making the amplifier for electret microphone.
An electret microphone http://en.wikipedia.org/wiki/Electret_microphone is a cheapo microphone that reads in analog signal generated by sound frequency. This analog signal has to be amplified, and then passed into a microprocessor based system (e.g Arduino) for ADC (Analog to Digital Conversion). Once data is digitized, humans can manipulate the signal with code, hence the terminology : digital signal processing.
This make assumes an LM386 as the audio amplifier http://www.ti.com/lit/ds/symlink/lm386.pdf for the electret microphone is available.
There are many manufacturers of LM386, one of the is TI. Refer to the link above for spec sheet and then scroll down to the diagram "amplifier with minimum parts". If you need help on making a LM386 based audio amplifier, this instructable http://www.instructables.com/id/Know-Your-IC-LM386/ is helpful on getting started.
Prelude2: For those that are still clueless what is happening, check out this very thoroughly written article on sound analysis https://bochovj.wordpress.com/2013/06/23/sound-analysis-in-arduino/.
Step1: The wiring
Connect output from electret & LM386 audio amplifier to A0 of arduino, and VCC and GND to arduino's VCC and GND. Connect common anode RGB LED to pin 3,4,5,6 of Arduino;with pin4 dedicated as the common anode, pin3,5,6 dedicated as PWM pin. It is good to add some 220ohm resistors across the pin3,5,6 for current limiting. Yours truly has none available, hence the omission in the picture below. These 4pins can be used as the input to a transistor switched 12V load to control LED light strips. The following picture describes the wiring, and LED diffuser with Fibre Optic cable
Step2: the code and the strategy of choosing which frequency is for what colour
There are several ways to map the frequency spectrum to the RGB colour spectrum. Using AnalogWrite() on R, G,B; each PWM pin is capable of a value from 0-255 to drive the individual LED in the RGB LED. Thus, the total combination of colours possible (in code) are 256*256*256 = 16777216; thats a whopping 16M worth of variations.
For the visually inclined, the RGB chart below is a good guide for giving an idea what is the final colour blend at the RGB LED output corresponding to the R, G, B value written by AnalogWrite().
Processing has a useful article on colour https://processing.org/tutorials/color/ which yours truly think it helps with visualizing colour using code.
Drawing inspiration from yours truly secondary school physics: human voice ranges from 85Hz to 255Hz; male voice is at lower frequency bands 85Hz-180Hz whereas female voice is at higher frequency bands 165Hz to 255Hz. As for human hearing, it is from 20Hz to 20K Hz. Futhermore, each musical instruments has it's own frequency range, and as we know, music composes of a variety of frequency stemming for human voice and/or musical instruments. Hence, the choice of strategy will be reflected in the colour observed while a piece of music is played.
Strategy: mapping audio frequency to colour spectrum
1. Mapping of human hearing e.g 20Hz to 20K Hz to 16777216 of possible RGB colours
1a. Mapping of whole audio frequency bands to 6777216 of possible RGB colours.
2. Choosing 3 channels deliberately; one each from the low, mid, and high frequency bands as observed using the spectrum visualizer mentioned earlier. The 3 channels of low, mid, and high corresponds to Blue, Green, and Red; with the intensity of the colour corresponds to the amplitude of that chosen channel. The output of RGB LED will then be "blended".
3. Similar to 2, but instead of choosing the channels deliberately, this algo is to group frequency bands into larger low, mid, and high frequency bands; within each of this group of larger frequency bands , the amplitude that is used to turn on the corresponding LED is the result of averaging all the amplitude from the frequency bands.
4. Similar to 2,3, but first apply a Low Pass Filter at the frequency bands.
5. LED activated by predefined threshold on frequency band
It seems to yours truly, finding an ideal mapping of music genre to colour is going to be an never ending story.
Cut the chase, let's go to the code.
No matter what are the music played during experimentation, it seems that the genre of the music maps to the corresponding biased group of frequency bands. Assuming the frequency bands are colour mapped eg blue for low, green for mid, red for high, definitely techno is going to appear more blue than red, and the counterexample eg opera is going to appear more red than blue. So the big Q: Which recipe for mapping of frequency to colour is "the best"? For this, yours truly don't have an answer, yet. It seems appreciating changing colour visually may differ from human to human.
Nonetheless, FHT is a really responsive algorithm implemented on Arduino. Check out the demo video below reacting to human voice.
Yours truly is no stranger to controlling AC (Alternate Current, not Air Condition) with the use of microcontroller based system. In the previous posts, there were several iterations of arduino sous vide; controlling a SSR (Solid State Relay) or mech Relay to on/off AC connected to the heating element via a digital output from the microcontroller.
Fancy using an smart phone app to control the AC electrical appliances e.g lighting over the Internet? No matter what are your motivation to control AC with a microcontroller based system, then the setup below to control on AC appliance may satisfy.
The AC controlling circuit from the previous iterations are not elegant. The leads from AC are exposed, one way or the other. A wire exposed for termination posed a risk to the untrained. The following picture describes the exposed AC leads connecting to a microcontroller based system, even with the use of a terminal block.
The hazards are real: assuming a user touches the exposed end (circle in red in the picture above), or the wiring connection is loose, or worst,a stupid attempt at a cheap stunt.
Ever since the first inception of the microcontroller based AC control circuit, the search is on for the "perfect", fully enclosed, risk free implementation. On a casual saturday strolling along the street, yours truly chance upon a small tuck shop and a transparent multi plug with enough space to hold the SSR PCB https://www.sparkfun.com/products/10684 . The rest is history.
This implementation requires a multi plug, and a SSR PCB.
Warning: Potential hazard to human. Do not attempt this hack while multiplug is on a live connection. Do not attempt to touch the exposed ends when live. Ensure human is properly insulated from ground with rubber sole shoes.
1. Dismantle the multiplug, and make space for the SSR PCB
2. some electrical tape is used to insulate the exposed end from coming into contact with the SSR PCB
3. Drill a hole (circle in red) on the multi plug to accommodate 3 wires (VCC, GND, SIG) to the SSR PCB. Remove some of the brass contact (square in red) on the live wire connection. The remove ends will be soldered with wires to be connected to the SSR PCB. Use electrical tape as necessary to insulate the exposed ends.
4. Solder electrical wire to the exposed ends of the live connection, circled red in the picture below
5. Secure 3 signal wires (GND, VCC, SIG) to the SSR PCB through the hole made earlier.
side view of the multi plug
6. Examine, label, test. In the following picture, circled in red is where the live connection is broken, and then the exposed ends soldered with electrical wires. These wires are then secured on the LOAD side of the SSR PCB. Test this modification of the multi plug only on a live system that is equipped with a functional ELCB http://en.wikipedia.org/wiki/Earth_leakage_circuit_breaker
user view of the modified multi plug with SSR
This is not the most elegant solution yet. The electrical wires (multicore) suffer from wire fatigue; due to the constant wiggling, twisting, and securing to the connector in a very compact space within the multi plug. Nonetheless, there are no AC exposed ends that might posed a risk to the end user. Plug the VCC, GND, SIG wires to a microcontroller, load some IoT inspired code and now you are ready to control AC electrical appliance over the Internet.
Yours truly is no stranger to DIY sous vide setup, having dabble in various microncontroller based home made sous vide setup. The PID controlled arduino sous vide setup by yours truly can be found here http://shin-ajaran.blogspot.sg/2012/12/coming-to-end-of-2012.html. This PID controlled arduino sous vide has been instrumental in setting up for the perfect dinner dates with the missus. I have cooked fabulous steaks, short ribs, lamb racks, and the epitome of my DIY sous vide home cooking: the effortless Beef Rendang. Details of the beef rendang can be found here http://shin-ajaran.blogspot.sg/2013/08/beef-rendang-sous-vide-70degc-24-hours.html
After rubbing shoulders with humans at several maker faire, or maker inspired activities across the continents spanning many miles apart https://www.flickr.com/photos/uclengineering/11119871993/
humans often remarked: "it looks so complicated/dangerous/scary!", "I want to have one but I can't write the program/wire the electrical/solder the electronics", " i want to buy a commercial one/the parts/components, but it is out of my reach", etc.
After seeing a fellow foodie and sous vide enthusiast trying to justify to own a sous vide setup; considerations include the cost, the complexity of setting up, the safety. Perhaps there might be something I can help to bridge this money/time/technological gap. Note: sous vide campaigns on kickstarter is tempting, but the waiting time for delivery is causing him anxiety.
On the aliexpress product page, nothing was written about the control theory used to ensure the settling time, the rise time w.r.t to the target temperature. This module also sports a relay that is capable of 10A to be used to control a heating apparatus. The other nice thing is, it fits in a regular name card holder. Nonetheless, the entry price is low enough to tempt me to click "BUY". There is a caveat, the manual that comes in the package is in chinese.
1. U$5.97 temperature controller module from "middle kingdom"
2. a modified single face plate AC socket & plug (UK standard socket and plug)
3. a heating vessel
1. digital thermometer
2. Fluke wireless thermometer is optional
prep the U$5.97 temperature controller. The exposed AC end that is very close to the LHS push button has to be insulated. I have used some hot glue, and also a casing to isolate from human touching the PCB connectors accidentally. Thus module comes with screw terminals as connector for the DC supply and AC load. Solder a DC connector to the supply side. For the AC load side, I have used 2 wires, one end is cript with a fork cable lug, the other end is tinned, and to be connected to a screw down terminal block.
modified AC socket & plug (UK standard socket and plug). This step can be potentially hazardous if safety procedures are not observed. Do NOT work on an electrical AC socket while it is plug into a live source. Make sure the exposed leads are properly insulated. Wear proper foot wear that comes with rubber sole. Check the working environment has an ELCB tested to be functional. Do NOT use thin wires for AC load. Use the wire from a standard 3 core power cable.
Wire a standard single face plate AC socket & plug as if it is going to be used as an extension. Now, instead of the live wire (brown colour, UK standard) going directly to the socket pin where it is supposed to be; make an "open circuit" on the live wire and connect the exposed ends to the screw down terminal block. This terminal block will act as a "switch" to be controlled by the relay on the temperature controller module.
Please note this might not be the best way of doing it with the wires exposed. If you have a better way of connecting a relay to an AC live wire, give me a shoutout.
prep a heating vessel. I have used a cheapo 1.3L mini heater jug cum cooker as my heating vessel. It comes with an adjustable knob for the heat setting and is rated as 1100w (max) on the box.
connect all the components together. before turning it on, perform a final check for correct wiring, proper insulation, AC safety standard, etc.
perform intial heating/temperature test. make sure the temperature register by the sensor of the temperature controller module is approximately to the digital thermometer.