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

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


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

    Спасибо за прочтение!
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 22
      +8
      Танец космос.
        0
        Смотрел без звука, вспомнил упячку почему-то)
        +1
        ***КЛИКНИ ТУТ***
        очень напомнило:
        СКАЧАТЬ СЕЙЧАС, БЕЗ SMS БЕСПЛАТНО!
        (именно так, капсом) =)
          0
          Так на то и расчет, чтоб сначала непроизвольно скачиваешь, а потом задумываешься что скачал)))
          0
          Что-то мало похоже на цветомузыку. Скорее всего нужно было три раздельные ленты, каждый цвет под свой диапазон частот, например красную под низкие частоты, зеленую под средние и синюю под высокие.
            0
            А каков смысл в разделении? Вы просто про частотное разделение по цветам говорите, а тут немного отличается принцип.
            0
            По моему очень сильно преобладает синий цвет?
              +2
              Помойму не хватает качественной хореографии… а за девайс спасибо!!! :)
                0
                Да, нужно еще поработать над кодом ибо на данный момент все под одну гребенку: и метал и бит и баллады всякие. Динамика одна.
                  0
                  Да я про танцы в конце клипа!!! ))
                    0
                    Ага, отличное замечание! Если вернусь к этому проекту, то обязательно это исправлю. Нужно будет с тэгами песни поработать, либо как-то в реальном времени отслеживать, что играет… более простой идеи реализации не вижу!
                    0
                    Это музыка такая, что не располагает под качественную хореографию)))
                    Или плохому танцору...=)
                    0
                    Огромное спасибо! Давно хотел сделать то же самое, уже спаянная схема валяется, но не было софта. Теперь есть работа на выходные =)
                      +2
                      Поющие гардины! По крайней мере, создается такое впечатление =) Выглядит красиво, но инерционно как-то, динамики бы побольше.
                        +1
                        Странная цветомузыка. Никакой динамики, цветовая картинка не поспевает за звуком, явно видна задержка порядка секунды. Если не применять костыли типа Ардуино, то можно сделать цветомузыку на RGB-ленте с использованием ATmega на порядок круче.
                        0
                        Попытался воспроизвести и возник вопрос.
                        Куда на схеме 12в подключать?
                          0
                          Вот, седня написал. Не то, что хотелось, зато на удивление работает.
                          3 — желтый (чаще всего моргает)
                          6-зеленый (сильная доля в основном)
                          10-синий (что-то среднее)

                          int i=0;

                          int pin = A0;
                          int level = 0;
                          int led = 6;
                          int t,newt;
                          int t1;

                          void setup() {
                          // declare the ledPin as an OUTPUT:
                          pinMode(6, OUTPUT);
                          pinMode(10, OUTPUT);
                          pinMode(3, OUTPUT);

                          }

                          void loop(){
                          newt=millis();

                          level = analogRead(pin);
                          if (level > 5){
                          analogWrite(3,100+level);
                          }
                          if (level > 9){
                          analogWrite(10,100+level);
                          }
                          if (level > 12){
                          analogWrite(6,100+level);
                          }

                          if (level<2){
                          if(newt-t1>80){
                          analogWrite(6,0);
                          t1=newt;
                          }
                          analogWrite(10,0);
                          if(newt-t>5){
                          analogWrite(3,0);
                          t=newt;
                          }
                          }
                          }
                            0
                            Моё подобие цветомузыки основано на входящем уровне. Но я добавил задержки, и сделал цвета разными. Подо всякий infected mushroom неплохо моргает, правдоподобно. Как будто с разделением частот
                              0
                              Ах да, зато не надо библиотек, серийного порта, usb, программы -сервера. Аналоговый вход с наушников подается на A0

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое