admin管理员组文章数量:1581614
前几天在知乎上看到一个音乐节奏灯得帖子,觉得很有意思。就上淘宝买了材料,跟着淘主得视频做了个LED音乐节奏灯。(我可能是吃饱撑着没事做)。在此记录一下制作过程。
本程序代码由Scott Lawson编写,并发布在Github,这个代码最后一次更新在2年前。由于兼容性问题,由知乎用户:(英语老师摸我腿)修改,其还有制作教程。感谢各位大佬支持。
工具
1.Arduino
2.Anaconda(Python)
3.PVC管
4.ESP8266开发板
5.LED灯带(60颗/1米)
6.5V的灯座
7.灯罩
8.杜邦线
9.MicroUSB数据线
实现步骤:
1.
下载并安装Arduino和Anaconda
2.
在Anaconda中创建Python环境,并命名为MusicLed
3.
在Anaconda的MusicLed环境下Open Terminal安装一些库:
conda install numpy scipy pyqtgraph
pip insatll pyaudio
4.
注:最好先连上VPN,不然安装很容易失败。
安装完Arduino,打开安装一些库。
首先点击(文件)-(首选项)-(附加开发板管理器网址)-(http://arduino.esp8266/stable/package_esp8266com_index.json)。
然后点击(工具)-(开发板)-(开发板管理器)-(等它加载完成在搜索框输入:ESP8266。只有一个结果直接点击安装)。
接着点击(项目)-(加载库)-(管理库)-(搜索框输入websock,安装的版本为2.1.1)。
5.
注:电脑小白最好安装Notepad++
修改代码:注意以下注释就好了。只要修改ws2812_controller.ion和config.py两处的部分注释代码。
源代码在:https://github/ZhangCats/MusicLed
6.
修改完两个代码后,就要把arduino代码上传到ESP8266上。
首先把板子插在电脑的USB端口上。
然后查看设备管理器中板子在哪个口,例如:CH340(COM3)。
接着点击ws2812_controller.ino进入Arduino,点击(工具)-(开发板)-(SparkFun ESP8266 Thing Eev)-修改端口为(COM3)-(上传代码即可)。
最后点击Strat.bat,看到以下界面说明代码基本无误:
7.
接下来就是组装节奏灯就好啦。
注:这里注意灯带上的箭头,不要接反了。
如果看不懂上图可以看这个(灵魂画手):
这里将用将两根杜邦线分别接上5v的红线与GND,然后用PVC电气胶布缠绕上即可。
记得用一根杜邦线将ESP8266的RX口和灯带的DI口连接起来,否则灯带不会亮。
然后将灯带缠绕到PVC管上。
最后通电就可以啦。注:灯座的插头电压可能不够导致灯带亮的时候,ESP板子不通电(分压)。这时候把充电头换成手机的快充头即可给两个部件同时通电。
节奏灯,程序打开了,灯不亮。PING一下你给ESP8266设置的IP地址,如果通,那说明ESP8266运行正常,请检查线是否接好,并保证两个文件设置正确。关闭PC程序,重新打开试试。
8.
大家电脑可能没有混音功能。所以先下载Viocemeeter,点击A1选择如下图所示:
然后在(声音)-(播放)将其设置为默认设备即可,(录制)也是如此。
9.
最后(给灯座通上点)-(点击Start.bat)-(打开Voicemeeter)-(打开音乐播放器播放音乐即可,当然你直接对着电脑讲话也有同样效果只要是有声音输入都行)。
完!
Arduino代码
ws2812_controller.ino
/*
* 注意,一定要看到文件隔壁还有很多后缀名为".h"的文件,如果没有的话,那说明当前文件夹下没有这个文件。编译会出错。
* 参考资料:https://github/scottlawsonbc/audio-reactive-led-strip
* 源码2年未更新,稍作修改。
* 你只需要修改代码后面后中文注释的地方!
*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WebSocketsServer.h>
#include <Hash.h>
#include <WiFiUdp.h>
#include "ws2812_i2s.h"
#define NUM_LEDS 120 //LED灯数量
#define BUFFER_LEN 1024
#define PRINT_FPS 1
const char* ssid = "zzzzzzzccccccc"; //你家WIFI名字
const char* password = "zcp5313.."; //你家WIFI密码
unsigned int localPort = 7777;
char packetBuffer[BUFFER_LEN];
static WS2812 ledstrip;
static Pixel_t pixels[NUM_LEDS];
WiFiUDP port;
//你可以使用Windows+R键输入cmd,然后输入命令ipconfig 查看自己网络情况。
IPAddress ip(192, 168, 1, 150); //你给ESP8266设置的IP地址,注意,这个IP不可以跟其他设备(手机电脑灯)重复。
IPAddress gateway(192, 168, 1, 1); //你家网络的网关,这个跟你电脑的网关一样
IPAddress subnet(255, 255, 255, 0); //子网掩码,跟你电脑的一样,一般不需要修改。
void setup() {
Serial.begin(115200);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
Serial.println("");
// Connect to wifi and print the IP address over serial
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
port.begin(localPort);
ledstrip.init(NUM_LEDS);
}
uint8_t N = 0;
#if PRINT_FPS
uint16_t fpsCounter = 0;
uint32_t secondTimer = 0;
#endif
void loop() {
// Read data over socket
int packetSize = port.parsePacket();
// If packets have been received, interpret the command
if (packetSize) {
int len = port.read(packetBuffer, BUFFER_LEN);
for(int i = 0; i < len; i+=4) {
packetBuffer[len] = 0;
N = packetBuffer[i];
pixels[N].R = (uint8_t)packetBuffer[i+1];
pixels[N].G = (uint8_t)packetBuffer[i+2];
pixels[N].B = (uint8_t)packetBuffer[i+3];
}
ledstrip.show(pixels);
#if PRINT_FPS
fpsCounter++;
#endif
}
#if PRINT_FPS
if (millis() - secondTimer >= 1000U) {
secondTimer = millis();
Serial.printf("FPS: %d\n", fpsCounter);
fpsCounter = 0;
}
#endif
}
Python代码
config.py
# 你只需要修改有注释的地方
# 其他未备注的地方,看得懂代码的人,请自行修改,需要需要了解numpy,pyaudio
#conding = utf8
from __future__ import print_function
from __future__ import division
import os
DEVICE = 'esp8266'
if DEVICE == 'esp8266':
# 下面是你刚才在Arduino中为ESP8266设置的IP地址,不要填错了。
UDP_IP = '192.168.1.150'
UDP_PORT = 7777
SOFTWARE_GAMMA_CORRECTION = False
if DEVICE == 'pi':
LED_PIN = 18
LED_FREQ_HZ = 800000
LED_DMA = 5
BRIGHTNESS = 255
LED_INVERT = True
SOFTWARE_GAMMA_CORRECTION = True
if DEVICE == 'blinkstick':
SOFTWARE_GAMMA_CORRECTION = True
USE_GUI = True
DISPLAY_FPS = True
# 下面是你LED灯的数量,这个也不能搞错,错了,程序就运行出错!
N_PIXELS = 120
GAMMA_TABLE_PATH = os.path.join(os.path.dirname(__file__), 'gamma_table.npy')
MIC_RATE = 44100
FPS = 60
_max_led_FPS = int(((N_PIXELS * 30e-6) + 50e-6)**-1.0)
assert FPS <= _max_led_FPS, 'FPS must be <= {}'.format(_max_led_FPS)
MIN_FREQUENCY = 200
MAX_FREQUENCY = 12000
N_FFT_BINS = 24
N_ROLLING_HISTORY = 2
MIN_VOLUME_THRESHOLD = 1e-7
版权声明:本文标题:不务正业之音乐节奏灯 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727880048a1135487.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论