1193浏览
查看: 1193|回复: 23

[项目] 【花雕动手做】看见声音,基于Arduino系列音乐可视器(11)

[复制链接]
偶然心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争取成型一些实用好玩的音乐可视器项目。

【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩灯带

01.jpg

0.jpg

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 16:05:26

  【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  实验程序三:Adafruit_NeoPixel音乐反应式LED灯带

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  3.   实验程序三:Adafruit_NeoPixel音乐反应式LED灯带
  4. */
  5. #include <Adafruit_NeoPixel.h>
  6. #define MIC A0 // 麦克风与A0相连接
  7. #define LED_PIN 6 // LED are connected to D6
  8. #define N_PIXELS 24 // Number of LED
  9. #define N 100 //样本数
  10. #define fadeDelay 10 // 淡出量
  11. #define noiseLevel 80 // 降噪下限
  12. Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
  13. int samples[N]; // 存储样本
  14. int periodFactor = 0; // 用于周期计算
  15. int t1 = -1;
  16. int T;
  17. int slope;
  18. byte periodChanged = 0;
  19. void setup() {
  20.   // Serial.begin(9600);
  21.   strip.begin();
  22.   ledsOff();
  23.   delay(500);
  24.   displayColor(Wheel(100));
  25.   strip.show();
  26.   delay(500);
  27. }
  28. void loop() {
  29.   Samples();
  30. }
  31. void Samples() {
  32.   for (int i = 0; i < N; i++) {
  33.     samples[i] = analogRead(0);
  34.     if (i > 0) {
  35.       slope = samples[i] - samples[i - 1];
  36.     }
  37.     else {
  38.       slope = samples[i] - samples[N - 1];
  39.     }
  40.     if (abs(slope) > noiseLevel) {
  41.       if (slope < 0) {
  42.         calculatePeriod(i);
  43.         if (periodChanged == 1) {
  44.           displayColor(getColor(T));
  45.         }
  46.       }
  47.     }
  48.     else {
  49.       ledsOff();
  50.     }
  51.     periodFactor += 1;
  52.     delay(1);
  53.   }
  54. }
  55. void calculatePeriod(int i) {
  56.   if (t1 == -1) {
  57.     t1 = i;
  58.   }
  59.   else {
  60.     int period = periodFactor * (i - t1);
  61.     periodChanged = T == period ? 0 : 1;
  62.     T = period;
  63.     // Serial.println(T);
  64.     t1 = i;
  65.     periodFactor = 0;
  66.   }
  67. }
  68. uint32_t getColor(int period) {
  69.   if (period == -1)
  70.     return Wheel(0);
  71.   else if (period > 400)
  72.     return Wheel(5);
  73.   else
  74.     return Wheel(map(-1 * period, -400, -1, 50, 255));
  75. }
  76. void fadeOut()
  77. {
  78.   for (int i = 0; i < 5; i++) {
  79.     strip.setBrightness(110 - i * 20);
  80.     strip.show(); // Update strip
  81.     delay(fadeDelay);
  82.     periodFactor += fadeDelay;
  83.   }
  84. }
  85. void fadeIn() {
  86.   strip.setBrightness(100);
  87.   strip.show();
  88.   for (int i = 0; i < 5; i++) {
  89.     //strip.setBrightness(20*i + 30);
  90.     //strip.show();
  91.     delay(fadeDelay);
  92.     periodFactor += fadeDelay;
  93.   }
  94. }
  95. void ledsOff() {
  96.   fadeOut();
  97.   for (int i = 0; i < N_PIXELS; i++) {
  98.     strip.setPixelColor(i, 0, 0, 0);
  99.   }
  100. }
  101. void displayColor(uint32_t color) {
  102.   for (int i = 0; i < N_PIXELS; i++) {
  103.     strip.setPixelColor(i, color);
  104.   }
  105.   fadeIn();
  106. }
  107. uint32_t Wheel(byte WheelPos) {
  108.   // Serial.println(WheelPos);
  109.   if (WheelPos < 85) {
  110.     return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  111.   }
  112.   else if (WheelPos < 170) {
  113.     WheelPos -= 85;
  114.     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  115.   }
  116.   else {
  117.     WheelPos -= 170;
  118.     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  119.   }
  120. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-20 14:42:02

  【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  实验程序四:MegunoLink音乐反应式24颗LED灯带

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  3.   实验程序四:MegunoLink音乐反应式24颗LED灯带
  4. */
  5. #include<FastLED.h>
  6. #include<MegunoLink.h>
  7. #include<Filter.h>
  8. // define necessary parameters
  9. #define N_PIXELS  24
  10. #define MIC_PIN   A0
  11. #define LED_PIN   D6 // labeled "D6" on the board
  12. // the following parameters can be tweaked according to your audio levels
  13. #define NOISE 50
  14. #define TOP   (N_PIXELS+2) // allow the max level to be slightly off scale
  15. #define LED_TYPE  WS2811
  16. #define BRIGHTNESS  18     // a little dim for recording purposes
  17. #define COLOR_ORDER GRB
  18. // declare the LED array
  19. CRGB leds[N_PIXELS];
  20. // define the variables needed for the audio levels
  21. int lvl = 0, minLvl = 0, maxLvl = 600; // tweak the min and max as needed
  22. // instantiate the filter class for smoothing the raw audio signal
  23. ExponentialFilter<long> ADCFilter(5,0);
  24. void setup() {
  25.   // put your setup code here, to run once:
  26.   Serial.begin(115200);
  27.   // initialize the LED object
  28.   FastLED.addLeds<LED_TYPE,LED_PIN,COLOR_ORDER>(leds,N_PIXELS).setCorrection(TypicalLEDStrip);
  29.   FastLED.setBrightness(BRIGHTNESS);
  30. }
  31. void loop() {
  32.   // put your main code here, to run repeatedly:
  33.   // read the audio signal and filter it
  34.   int n, height;
  35.   n = analogRead(MIC_PIN);
  36.   // remove the MX9614 bias of 1.25VDC
  37.   n = abs(1023 - n);
  38.   // hard limit noise/hum
  39.   n = (n <= NOISE) ? 0 : abs(n - NOISE);
  40.   // apply the exponential filter to smooth the raw signal
  41.   ADCFilter.Filter(n);
  42.   lvl = ADCFilter.Current();
  43. //  // plot the raw versus filtered signals
  44. //  Serial.print(n);
  45. //  Serial.print(" ");
  46. //  Serial.println(lvl);
  47.   // calculate the number of pixels as a percentage of the range
  48.   // TO-DO: can be done dynamically by using a running average of min/max audio levels
  49.   height = TOP * (lvl - minLvl) / (long)(maxLvl - minLvl);
  50.   if(height < 0L) height = 0;
  51.   else if(height > TOP) height = TOP;
  52.   // turn the LEDs corresponding to the level on/off
  53.   for(uint8_t i = 0; i < N_PIXELS; i++) {
  54.     // turn off LEDs above the current level
  55.     if(i >= height) leds[i] = CRGB(0,0,0);
  56.     // otherwise, turn them on!
  57.     else leds[i] = Wheel( map( i, 0, N_PIXELS-1, 30, 150 ) );
  58.   }
  59.   FastLED.show();
  60. }
  61. CRGB Wheel(byte WheelPos) {
  62.   // return a color value based on an input value between 0 and 255
  63.   if(WheelPos < 85)
  64.     return CRGB(WheelPos * 3, 255 - WheelPos * 3, 0);
  65.   else if(WheelPos < 170) {
  66.     WheelPos -= 85;
  67.     return CRGB(255 - WheelPos * 3, 0, WheelPos * 3);
  68.   } else {
  69.     WheelPos -= 170;
  70.     return CRGB(0, WheelPos * 3, 255 - WheelPos * 3);
  71.   }
  72. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 09:31:31

  【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  实验程序一:简易测量声级
  模块接线:
  MAX9814  Arduino
  VCC        5V
  GND        GND
  OUT         A0

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  3.   实验程序一:简易测量声级
  4.   模块接线:
  5.   MAX9814  Arduino
  6.   VCC        5V
  7.   GND        GND
  8.   OUT         A0
  9. */
  10. const int sampleWindow = 50; // 以mS为单位的采样窗口宽度(50 mS = 20Hz)
  11. unsigned int sample;
  12. void setup() {
  13.   Serial.begin(9600);
  14.   pinMode(A0, INPUT);
  15. }
  16. void loop() {
  17.   unsigned long startMillis = millis(); // 样本窗口的开始
  18.   unsigned int peakToPeak = 0;   // 峰峰值
  19.   unsigned int signalMax = 100;
  20.   unsigned int signalMin = 1024;
  21.   // collect data for 50 mS
  22.   while (millis() - startMillis < sampleWindow)
  23.   {
  24.     sample = analogRead(A0);
  25.     if (sample < 1024)  // 抛出错误的读数
  26.     {
  27.       if (sample > signalMax)
  28.       {
  29.         signalMax = sample;  // 只保存最大级别
  30.       }
  31.       else if (sample < signalMin)
  32.       {
  33.         signalMin = sample;  // 仅保存最低级别
  34.       }
  35.     }
  36.   }
  37.   peakToPeak = signalMax - signalMin;  // max-min =峰峰值幅度
  38.   double volts = (peakToPeak * 5.0) / 256;  // 转换为伏特
  39.   Serial.println(volts);
  40. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 07:01:22

本帖最后由 驴友花雕 于 2022-7-15 07:12 编辑

WS2812B
是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。
02--.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 07:12:32

主要特点
1、智能反接保护,电源反接不会损坏IC。
2、IC控制电路与LED点光源公用一个电源。
3、控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。
4、内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
5、内置上电复位和掉电复位电路。
6、每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。
7、串行级联接口,能通过一根信号线完成数据的接收与解码。
8、任意两点传传输距离在不超过5米时无需增加任何电路。
9、当刷新速率30帧/秒时,级联数不小于1024点。
10、数据发送速度可达800Kbps。
11、光的颜色高度一致,性价比高。

应用领域
具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电路集成于LED上面,电路变得更加简单,体积小,安装更加简便。主要应用领域,LED全彩发光字灯串,LED全彩模组, LED全彩软灯条硬灯条,LED护栏管。LED点光源,LED像素屏,LED异形屏,各种电子产品,电器设备跑马灯等。


0-0.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 07:23:53

02.jpg

04.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 07:28:37

WS2812B灯带电原理图


07.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 07:32:22

06.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 07:34:45

05.jpg

07--.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 08:25:38

WS2812B是集控制电路和发光电路于一体的LED光源元件,其控制IC为WS2812B,发光元件是5050RGBLED,电压为5V,每个单位的峰值电流为60ma,灯带为三线制,VCC GND DIN分别为电源+、电源-、信号,当使用外部电源时,外部电源-需要与单片机的GND相连。

07-0.jpg

07-.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 08:36:36

MAX9814是一款低成本,高质量的麦克风放大器,具有自动增益控制(AGC)和低噪声麦克风偏置。该器件具有一个低噪声前置放大器,可变增益放大器(VGA),输出放大器,麦克风偏置电压发生器和AGC控制电路。

低噪声前置放大器具有固定的12dB增益,而VGA增益则根据输出电压和AGC阈值自动从20dB调整至0dB。输出放大器提供8dB,18dB和28dB的可选增益。在没有压缩的情况下,放大器的级联会导致总增益为40dB,50dB或60dB。三级数字输入对输出放大器的增益进行编程。外部电阻分压器控制AGC阈值,单个电容器设定启动/释放时间。三级数字输入可设定起效时间与释放时间的比率。AGC的保持时间固定为30ms。低噪声麦克风偏置电压发生器可以使大多数驻极体麦克风偏置。

MAX9814采用节省空间的14引脚TDFN封装。该器件的额定温度范围为-40°C至+ 85°C。


01.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 08:46:20

02.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 08:49:18

000.jpg

MAX9814麦克风放大器模块
MAX9814是一款低成本高性能麦克风放大器,具有自动增益控制(AGC)和低噪声麦克风偏置。器件具有低噪声前端放大器、可变增益放大(VGA)、输出放大器、麦克风偏置电压发生器和AGC控制电路。
●自动增益控制(AGC)  
●3种增益设置(40dB、50dB、60dB)  
●可编程动作时间  
●可编程动作和释放时间比  
●电源电压范围2.7V~5.5V   
●低THD:0.04% (典型值)  
●低功耗关断模式  
●内置2V低噪声麦克风偏置
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 09:53:28

打开Arduino IDE——工具——串口绘图器,查看实验波形

10-.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 09:58:47

实际测量环境噪音与手敲桌面的声音波形


11.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 10:02:10

播放歌曲的实测波形

动画22.gif

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 11:13:22

  【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  实验程序二:阙值触发的节奏灯

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化项目(11)---WS2812幻彩LED灯带
  3.   实验程序二:阙值触发的节奏灯
  4. */
  5. #include<FastLED.h>
  6. #define LED_PIN 6
  7. #define NUM_LEDS 24
  8. CRGB leds[NUM_LEDS];
  9. uint8_t hue = 0;
  10. int soundsensor = 7;
  11. void setup() {
  12.   delay(2000);
  13.   Serial.begin(9600);
  14.   FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  15.   FastLED.setBrightness(50);
  16.   pinMode(soundsensor, INPUT);
  17. }
  18. void loop() {
  19.   int sensval = digitalRead(soundsensor);
  20.   if (sensval == 1) {
  21.     Serial.println("ON");
  22.     leds[0] = CRGB :: Red;
  23.     fill_solid(leds, NUM_LEDS, CRGB :: Blue);
  24.     rainbow_moving();
  25.     FastLED.show();
  26.     delay(10);
  27.   }
  28.   else {
  29.     leds[0] = CRGB :: Black;
  30.     fill_solid(leds, NUM_LEDS, CRGB :: Black);
  31.     FastLED.show();
  32.     delay(10);
  33.   }
  34. }
  35. void rainbow_moving() {
  36.   for (int i = 0; i < NUM_LEDS; i++) {
  37.     leds[i] = CHSV(hue + (i * 10), 255, 255);
  38.   }
  39.   EVERY_N_MILLISECONDS(10) {
  40.     hue++;
  41.   }
  42. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 11:24:07

实验场景图  动态图  

动画23.gif

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 11:30:13

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 16:14:35

实验场景图  动态图

动画24.gif

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-7-15 16:22:15

实验的视频记录(《西部世界》主题曲2分7秒)

https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1



回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail