Вводная часть
Новогодние праздники давно миновали, уже пора готовиться к наступающему 2015 НГ.
Именно поэтому спешу поделиться идеей и реализацией светомузыки (гирлянды) на Ардуине и обрезке RGB ленты.
Идея, как всегда, пришла вовремя за 8 часов до НГ. Я украшая квартиру, понял, что остатками перегоревших гирлянд мне свою комнату не украсить!
Да и ритуальная перепайка дедовско-отцовских и китайских гирлянд уже достала. Хотелось чего-то нового!
Цель
Подключить к Ардуино RGB-ленту, и заставить её плясать под свою музыку с компьютера.
Результат
Что нужно?
- Блок питания 12В (мощностью пропорционально длине вашей ленты, у меня P=7.2Вт/м*1.2м);
- Кусочек RGB LED ленты и провода 4 жилы;
- Arduino UNO;
- ULN2003A (или другие подходящие транзисторные сборки);
Задачи
1. Так как лента 12В, то подключаем её к пинам Ардуины (5В) посредством транзисторной сборки Дарлингтона ULN2003A (Что было, то было!).
2. Клеем ленту на видное место и декорируем её. Обычная бумага делает чудеса со светом! Я уже не говорю про различные виды пластика и стекла.
3. Заливаем в Ардуину скетч (см.ниже) по обработке SerialPort
4. Выводим светомузыку на SerialPort, в моём случае я пользовался библиотекой Minim Processsing. Можно было бы и над Winamp/AIMP посидеть, но время поджимало!
5. Настраиваем музыку так, чтобы никого не стошнило. Либо наобо��от стошнило, если музыка соответствующая!
6. Пляшем, медитируем, встречаем НГ!
Ход выполнения
1. Схема предельно простая, но мало ли.

2. Скотч и бумага сделали своё дело! Свет стал ровным и приятным, дизайн простым и незамысловатым, даже криво наклеенные листы А4 смотрятся в работе отлично!

3. Программная часть (тут целый космос для фантазии)
Скетчи Ардуины и тестовые скетчи можно скачать внизу.
Processing with «minim» library:
import ddf.minim.*;
import ddf.minim.analysis.*;
import processing.serial.*;
Serial port;
Minim minim;
AudioPlayer song;
BeatDetect beat;
BeatListener bl;
float kickSize, snareSize, hatSize;
class BeatListener implements AudioListener
{
private BeatDetect beat;
private AudioPlayer source;
BeatListener(BeatDetect beat, AudioPlayer source)
{
this.source = source;
this.source.addListener(this);
this.beat = beat;
}
void samples(float[] samps)
{
beat.detect(source.mix);
}
void samples(float[] sampsL, float[] sampsR)
{
beat.detect(source.mix);
}
}
void setup()
{
size(512, 200, P3D);
minim = new Minim(this);
println("Available serial ports:");
println(Serial.list());
// check on the output monitor wich port is available on your machine
port = new Serial(this, Serial.list()[0], 9600);
song = minim.loadFile("1.mp3", 2048); //Имя файла, который лежит рядом со скетчем! Также тут можно вставлять потоковые интернет радиостанции в формате *.mp3
song.play();
// a beat detection object that is FREQ_ENERGY mode that
// expects buffers the length of song's buffer size
// and samples captured at songs's sample rate
beat = new BeatDetect(song.bufferSize(), song.sampleRate());
// set the sensitivity to 300 milliseconds
// After a beat has been detected, the algorithm will wait for 300 milliseconds
// before allowing another beat to be reported. You can use this to dampen the
// algorithm if it is giving too many false-positives. The default value is 10,
// which is essentially no damping. If you try to set the sensitivity to a negative value,
// an error will be reported and it will be set to 10 instead.
beat.setSensitivity(300);
kickSize = snareSize = hatSize = 0;
// make a new beat listener, so that we won't miss any buffers for the analysis
bl = new BeatListener(beat, song);
textFont(createFont("Helvetica", 16));
textAlign(CENTER);
}
boolean k1,k2,k3;
void draw()
{ float s=10;
background(0);
fill(255);
if ( beat.isKick()) k1 = true;
if ( beat.isSnare()) k2 = true;
if ( beat.isHat()) k3 = true;
// textSize(kickSize/8);
// text("KICK", width/4, height/2);
// textSize(snareSize/8);
// text("SNARE", width/2, height/2);
// textSize(hatSize/8);
// text("HAT", 3*width/4, height/2);
port.write('R');
port.write((int)kickSize);
port.write('G');
port.write((int)snareSize);
port.write('B');
port.write((int)hatSize);
if (k1) kickSize = constrain(kickSize+5, 20, 255);
else kickSize = constrain(kickSize -5, 20, 255);
if (kickSize==255) k1=false;
if (k2) snareSize = constrain(snareSize+15, 40, 255);
else snareSize = constrain(snareSize-15, 40, 255);
if (snareSize==255) k2=false;
if (k3) hatSize = constrain(hatSize+s, 20, 255);
else hatSize = constrain(hatSize-s, 20, 255);
if (hatSize==255) k3=false;
}
Заключение
Вот так вот нехитро делаем атмосферу праздника и веселья. У меня это получилось из подручных материалов! Для целевой покупки на это всё ушло бы долларов 50$
Скачать файлы:
***КЛИКНИ ТУТ*** В архиве скетч для Ардуины, тестовый скетч для RGB, и сама программа. Библиотека minim весит много и туда не влезла, её качать и устанавливать самостоятельно.Спасибо за прочтение!
