Вводная часть


Новогодние праздники давно миновали, уже пора готовиться к наступающему 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 весит много и туда не влезла, её качать и устанавливать самостоятельно.

Спасибо за прочтение!