如何使NU40 DK的四个内置LED灯随节拍闪烁
引言
嗨!我是来自韩国Nucode团队的Emily,我们开发的是NU40 DK电路板。
我想要让电路板上的4个LED灯随着音乐律动,仅需一块电路板和一根USB线即可实现。
我的第一次尝试是将音乐的音量直接映射到LED亮度,结果LED们一直保持中等亮度,几乎不动。原来现代音乐的音量已经经过压缩处理,低音总是响亮,高音却总是微弱,而人眼看到的亮度是基于对数刻度的。
于是我决定让电脑将声音分割成四个频率段(从低到高),并大幅增强对比度,再由电路板将接收到的数值转换为肉眼可见的亮度。
完成后,LED1到LED4会随着歌曲的低音、中音和高音部分同步闪烁。当音乐停止时,LED们会缓慢地“呼吸”般地亮起与熄灭。
•难度:中级(需要掌握几个终端命令)
•时间:30–45分钟
•操作系统:固件支持 Windows · macOS · Linux;音乐播放器脚本仅支持 macOS
•所需设备:NU40 DK电路板、USB-C数据线、一台Mac电脑,以及你自己的音乐文件(m4a、mp3或wav格式)
它是如何工作的
•USB串行是计算机和电路板通过USB线缆相互传输数字的通道。
•每秒60次,Mac会发送一个简短的7字节消息(即一帧):0xAA 0x55(起始标记)+ 4个LED的亮度值(每个范围为0–255)+ 1个校验和字节(用于检测损坏的帧)。
•电路板会将每个亮度值经过伽马表处理,使其看起来自然,然后使用12位(4096级)PWM驱动LED。PWM通过快速开关LED来调节亮度。
•如果帧停止0.4秒,LED便会逐渐变暗;4秒后,LED则切换为呼吸动画效果。
1. 上传固件
•在 GitHub 仓库中,点击绿色的“代码”按钮 → 下载 ZIP 文件,然后解压它。(如果你使用 Git,可以使用第2步中的命令进行克隆。)
•在 Arduino IDE 中,通过“文件”→“打开”来打开 nu40dk_music_led/nu40dk_music_led.ino。
•确认“工具”→“板子”已设置为 NU40DK nRF52840,并且在“工具”→“端口”下选择了你的开发板。
•点击“上传”(→)。
以下是固件的关键部分(完整文件位于 GitHub 上):
代码的功能说明
setup():将 LED 引脚设置为输出,按钮引脚设置为上拉输入,并预计算 256 项的伽马表。
loop():逐个读取 USB 接收的数据字节,寻找以 0xAA 0x55 开头的帧。如果校验和匹配,则更新 4 个 LED。
四个按钮在按下时会依次发送一行数据(B1 到 B4),而电脑上的程序决定每个按钮的具体功能。
✅ 检查点:上传约 4 秒后,4 个 LED 将依次亮起并逐渐变暗。
打开“工具”→“串行监视器”(波特率 115200),按任意按钮,你将看到 B1、B2 等信息。检查完毕后关闭串行监视器标签页。下一个程序需要相同的端口配置。
2. 在您的 Mac 上安装音乐脚本
•打开终端(按 Cmd+Space 并搜索“Terminal”),然后逐行运行以下命令。
•虚拟环境(venv)是为当前项目专门设置的 Python 包私有空间,因此不会与您 Mac 上其他内容发生冲突。
•如果 macOS 显示 python3 需要命令行开发工具,请点击“安装”,等待完成后再重新运行命令。
在 Windows 或 Linux 系统上,固件可以正常工作,但此脚本无法使用:它依赖于 macOS 专用的工具 afconvert(用于解码音频)和 afplay(用于播放),并且仅能自动检测 Mac 风格的端口。您可以通过编辑 host/music_led.py 中的 decode_wav() 和 play() 函数来移植该脚本。
3. 运行它
# 首先,在终端中以条形图预览(无需使用电路板)。/.venv/bin/python music_led.py ~/Music/my_song.m4a --preview
在电路板上播放(声音 + 灯光)。/.venv/bin/python music_led.py ~/Music/my_song.m4a
请将 ~/Music/my_song.m4a 替换为你的音乐文件路径。提示:将文件拖拽到终端窗口,系统会自动为你输入路径。
脚本首先显示分析结果(帧数、每个LED的平均亮度),然后开始播放。按 Ctrl+C 停止播放。
检查点:歌曲通过扬声器播放,每个LED会根据节拍的不同部分闪烁,从LED1(最右端,低音)到LED4(最左端,高音)。
可选功能:网页界面和电路板按钮
该仓库还提供基于浏览器的播放器。在此模式下,电路板上的按钮变为远程控制:
按钮 1:播放 / 暂停
按钮 2:下一首(快速双击 = 上一首)
按钮 3 / 按钮 4:音量增大 / 减小
网页界面支持YouTube链接,并使用yt-dlp下载音频。设置详情见仓库README。请仅使用你拥有版权的音频文件。
4. 自定义设置
对比度(在命令后添加以下内容):
•太平淡?按以下顺序调整:--gate 0.20,然后 --expand 2.0,再 --decay 0.12。若想增强鼓点的冲击力,可加入 --punch 0.6。
•太炫目?尝试使用 --gate 0.05 --expand 1.2 --decay 0.25。
•流动模式:添加 --mode wave,低音将在LED上形成波浪状起伏。
•频率带宽:在 host/music_led.py 文件中搜索 BANDS = [,并修改Hz数值。例如,若想更贴近人声,将 MID 修改为 ("MID ", 300, 3000)。
•音乐停止时:在固件中,将 elapsed > 4000(呼吸开始前4秒)和 elapsed > 400(淡出开始前0.4秒)进行修改,然后重新上传。
本文编译自hackster.io





