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

[复制链接]
706|0
 楼主| roc2two 发表于 2019-9-25 15:23 | 显示全部楼层 |阅读模式
在这里使用零知标准板和Processing通过Firmata通信,实现了音乐LED炫酷的效果。
1、硬件
  • 零知标准板
  • RGB彩色LED 3个
  • 电阻-220Ω-9个


硬件连接


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

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

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

  5. Arduino arduino;
  6.    
  7. Minim minim;  
  8. AudioPlayer song;
  9. FFT fft;

  10. int redPin1 = 0;
  11. int greenPin1 = 1;
  12. int bluePin1 = 2;

  13. int redPin2 = 3;
  14. int greenPin2 = 5;
  15. int bluePin2 = 6;

  16. int redPin3 = 9;
  17. int greenPin3 = 11;
  18. int bluePin3 = 12;

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

  20. int color_id = 0;

  21. int common_cathode = 0;

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

  28.     minim = new Minim(this);  
  29.     song = minim.loadFile("badapple.mp3");
  30.     song.play();
  31.     fft = new FFT(song.bufferSize(), song.sampleRate());   
  32. }
  33.   
  34. void draw() {   
  35.     background(#151515);

  36.     fft.forward(song.mix);

  37.     strokeWeight(1.3);
  38.     stroke(#FFF700);

  39.     // frequency
  40.     pushMatrix();
  41.       translate(250, 0);   
  42.       for(int i = 0; i < 0+fft.specSize(); i++) {
  43.         line(i, height*4/5, i, height*4/5 - fft.getBand(i)*4);
  44.         if(i%100==0) text(fft.getBand(i), i, height*4/5+20);
  45.         if(i==200) {
  46.           if(fft.getBand(i)>2) {
  47.             setColor1(255,255,0);
  48.             setColor3(255,255,0);
  49.           }
  50.           else if(fft.getBand(i)>1) {
  51.             setColor1(255,0,255);
  52.             setColor3(255,0,255);
  53.           } else {
  54.             setColor1(255,255,255);
  55.             setColor3(255,255,255);
  56.           }
  57.         }
  58.         if(i==50) {
  59.           if(fft.getBand(i)>5) {
  60.             color_id = (color_id+1)%4;
  61.           } else if(fft.getBand(i)>3) {
  62.             if(color_id==0) setColor2(0,255,0);
  63.             else if(color_id==1) setColor2(0,255,255);
  64.             else if(color_id==2) setColor2(0,0,255);
  65.             else setColor2(255,0,0);
  66.           }
  67.           else {
  68.             setColor2(255,255,255);
  69.           }
  70.         }
  71.       }  
  72.     popMatrix();
  73.      
  74.     stroke(#FF0000);
  75.    
  76.     //waveform
  77.     for(int i = 250; i < song.left.size() - 1; i++) {
  78.       line(i, 50 + song.left.get(i)*50, i+1, 50 + song.left.get(i+1)*50);
  79.       line(i, 150 + song.right.get(i)*50, i+1, 150 + song.right.get(i+1)*50);
  80.       line(i, 250 + song.mix.get(i)*50, i+1, 250 + song.mix.get(i+1)*50);
  81.     }
  82.    
  83.     noStroke();
  84.     fill(#111111);
  85.     rect(0, 0, 250, height);
  86.    
  87.     textSize(24);
  88.     fill(#046700);
  89.     text("left amplitude", 10, 50);
  90.     text("right amplitude", 10, 150);
  91.     text("mixed amplitude", 10, 250);
  92.     text("frequency", 10, height*4/5);
  93. }

  94. void stop()
  95. {
  96.     for (int i = 0; i <= 13; i++) arduino.digitalWrite(i,arduino.HIGH);
  97.     song.close();  
  98.     minim.stop();
  99.     super.stop();
  100. }
  101. void setColor1(int red, int green, int blue)
  102. {
  103.   if(common_cathode==1) {
  104.     red = 255-red;
  105.     green = 255-green;
  106.     blue = 255-blue;
  107.   }
  108.   arduino.analogWrite(redPin1, red);
  109.   arduino.analogWrite(greenPin1, green);
  110.   arduino.analogWrite(bluePin1, blue);  
  111. }
  112. void setColor2(int red, int green, int blue)
  113. {
  114.   if(common_cathode==1) {
  115.     red = 255-red;
  116.     green = 255-green;
  117.     blue = 255-blue;
  118.   }
  119.   arduino.analogWrite(redPin2, red);
  120.   arduino.analogWrite(greenPin2, green);
  121.   arduino.analogWrite(bluePin2, blue);  
  122. }
  123. void setColor3(int red, int green, int blue)
  124. {
  125.   if(common_cathode==1) {
  126.     red = 255-red;
  127.     green = 255-green;
  128.     blue = 255-blue;
  129.   }
  130.   arduino.analogWrite(redPin3, red);
  131.   arduino.analogWrite(greenPin3, green);
  132.   arduino.analogWrite(bluePin3, blue);  
  133. }



这里需要注意的是,需要在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

粉丝
快速回复 在线客服 返回列表 返回顶部