Как стать автором
Обновить

Светомузыка Processing + Arduino + RGB

Время на прочтение 3 мин
Количество просмотров 71K

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


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

Спасибо за прочтение!
Теги:
Хабы:
+19
Комментарии 22
Комментарии Комментарии 22

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн