打印

【零知小项目】Firmata与Processing 实现音乐LED炫酷灯光效果

[复制链接]
570|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
roc2two|  楼主 | 2019-9-25 15:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在这里使用零知标准板和Processing通过Firmata通信,实现了音乐LED炫酷的效果。
1、硬件
  • 零知标准板
  • RGB彩色LED 3个
  • 电阻-220Ω-9个


硬件连接


2、软件
软件方面需要零知-标准板程序和Processing程序,它们之间通过Firmata通信;
(1)零知-标准板
安装Firmata的库后,打开示例StandardFirmata程序,如下操作:
1、安装Firmata库(请到零知官网查看原帖)

或者复制如下代码:
详细代码:请至零知官网查看同名原帖
然后验证程序并上传到零知-标准板。

(2)Processing程序
Processing程序主要使用Firmata库和Minim库,然后把音乐通过FFT计算并转换为PWM值,这个值再通过Firmata Arduino设置对应LED的引脚PWM值,就能显示各种颜色。
import ddf.minim.*;  
import ddf.minim.analysis.*;
import processing.serial.*;
import cc.arduino.*;

Arduino arduino;
   
Minim minim;  
AudioPlayer song;
FFT fft;

int redPin1 = 0;
int greenPin1 = 1;
int bluePin1 = 2;

int redPin2 = 3;
int greenPin2 = 5;
int bluePin2 = 6;

int redPin3 = 9;
int greenPin3 = 11;
int bluePin3 = 12;

int LED_PINS[] = {redPin1,greenPin1,bluePin1,redPin2,greenPin2,bluePin2,redPin3,greenPin3,bluePin3};

int color_id = 0;

int common_cathode = 0;

void setup() {
    size(800, 600);
     
    arduino = new Arduino(this, "COM7", 57600);
    for (int i = 0; i <= 8; i++) arduino.pinMode(LED_PINS[i], Arduino.PWM);
    for (int i = 0; i <= 8; i++) arduino.analogWrite(LED_PINS[i],255);

    minim = new Minim(this);  
    song = minim.loadFile("badapple.mp3");
    song.play();
    fft = new FFT(song.bufferSize(), song.sampleRate());   
}
  
void draw() {   
    background(#151515);

    fft.forward(song.mix);

    strokeWeight(1.3);
    stroke(#FFF700);

    // frequency
    pushMatrix();
      translate(250, 0);   
      for(int i = 0; i < 0+fft.specSize(); i++) {
        line(i, height*4/5, i, height*4/5 - fft.getBand(i)*4);
        if(i%100==0) text(fft.getBand(i), i, height*4/5+20);
        if(i==200) {
          if(fft.getBand(i)>2) {
            setColor1(255,255,0);
            setColor3(255,255,0);
          }
          else if(fft.getBand(i)>1) {
            setColor1(255,0,255);
            setColor3(255,0,255);
          } else {
            setColor1(255,255,255);
            setColor3(255,255,255);
          }
        }
        if(i==50) {
          if(fft.getBand(i)>5) {
            color_id = (color_id+1)%4;
          } else if(fft.getBand(i)>3) {
            if(color_id==0) setColor2(0,255,0);
            else if(color_id==1) setColor2(0,255,255);
            else if(color_id==2) setColor2(0,0,255);
            else setColor2(255,0,0);
          }
          else {
            setColor2(255,255,255);
          }
        }
      }  
    popMatrix();
     
    stroke(#FF0000);
   
    //waveform
    for(int i = 250; i < song.left.size() - 1; i++) {
      line(i, 50 + song.left.get(i)*50, i+1, 50 + song.left.get(i+1)*50);
      line(i, 150 + song.right.get(i)*50, i+1, 150 + song.right.get(i+1)*50);
      line(i, 250 + song.mix.get(i)*50, i+1, 250 + song.mix.get(i+1)*50);
    }
   
    noStroke();
    fill(#111111);
    rect(0, 0, 250, height);
   
    textSize(24);
    fill(#046700);
    text("left amplitude", 10, 50);
    text("right amplitude", 10, 150);
    text("mixed amplitude", 10, 250);
    text("frequency", 10, height*4/5);
}

void stop()
{
    for (int i = 0; i <= 13; i++) arduino.digitalWrite(i,arduino.HIGH);
    song.close();  
    minim.stop();
    super.stop();
}
void setColor1(int red, int green, int blue)
{
  if(common_cathode==1) {
    red = 255-red;
    green = 255-green;
    blue = 255-blue;
  }
  arduino.analogWrite(redPin1, red);
  arduino.analogWrite(greenPin1, green);
  arduino.analogWrite(bluePin1, blue);  
}
void setColor2(int red, int green, int blue)
{
  if(common_cathode==1) {
    red = 255-red;
    green = 255-green;
    blue = 255-blue;
  }
  arduino.analogWrite(redPin2, red);
  arduino.analogWrite(greenPin2, green);
  arduino.analogWrite(bluePin2, blue);  
}
void setColor3(int red, int green, int blue)
{
  if(common_cathode==1) {
    red = 255-red;
    green = 255-green;
    blue = 255-blue;
  }
  arduino.analogWrite(redPin3, red);
  arduino.analogWrite(greenPin3, green);
  arduino.analogWrite(bluePin3, blue);  
}



这里需要注意的是,需要在Processing程序里面更改你的板子对应COM口,和你需要播放的音乐名(和sketch同一级目录)。
完整程序如下:(请至零知官网查看同名原帖)


3、测试验证
在我们连接好零知板与LED等的连线并上传好程序后,我们再打开Processing程序并运行,就可以看到播放音乐的时候炫酷的LED灯光效果了。


查看完整效果视频: http://www.lingzhilab.com/forum.php?mod=redirect&goto=findpost&ptid=1074&pid=5052&fromuid=3010

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

85

帖子

1

粉丝