Arduino UNO 三声部复音播放《复仇者联盟》主题曲(Playtune 库)
硬件清单
| 元件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | |
| 3W 4Ω 小喇叭 | 1 | 无源蜂鸣器音量太小,建议用小音箱单元 |
| 220 Ω 电阻 | 3 | D10/D11/D12 各串联一只限流 |
| LED(可选,指示声道活动) | 3 | 并联在 220 Ω 电阻两端 |
| 面包板/跳线 | 若干 |
原理图与面包板实物图
三路 PWM 引脚 (D10, D11, D12) 各串 220 Ω 电阻后汇流接喇叭正极,喇叭负极接 GND。可选 LED 并联在电阻两端指示对应声道有信号输出。原理图/PCB 文件见附件 avengers_XPBiYYW5Xc.zip。
核心库:Playtune
- 作者:Len Shustek
- GitHub:arduino-playtune
- 能力:UNO 利用 3 个定时器中断实现 3 声部复音;Mega 可达 6 声部
- 数据格式:十六进制字节数组,含音高、时长、声道分配指令
音乐数据生成
MIDI → Playtune 字节数组转换工具见库自带脚本。本项目已内置完整《复仇者联盟》主题曲数组(约 2.5 KB Flash),存放在 PROGMEM 节省 RAM。
关键代码片段
#include <Playtune.h>
const byte PROGMEM avengers[] = { 0x90,0x3E,0x00,0x7A,0x80,0x00,0x02, ... }; // 完整数组见源码
Playtune p;
void setup() {
p.tune_initchan(10); // 声道 0 → D10
p.tune_initchan(11); // 声道 1 → D11
p.tune_initchan(12); // 声道 2 → D12
}
void loop() {
p.tune_playscore(avengers);
while (p.tune_playing); // 阻塞等待播放结束
p.tune_delay(3000); // 间隔 3 秒循环,勿用 delay()
}
进阶技巧
- 音量平衡:三声部电阻可微调(如 180/220/270 Ω)平衡音色
- 低音增强:喇叭装入小纸盒/塑料盒形成箱体共振,低频显著改善
- 扩展声部:换用 Mega 2560 并初始化 6 个定时器通道,可演奏更丰富编曲
- 自动播放列表:将多首曲子数组存入结构体数组,循环切换
效果展示
视频演示:三声部和弦清晰分离,主旋律/和声/低音线层次分明,音质远超单声道 tone()。无需外置功放,直接驱动 3W 喇叭音量适中、失真可控。
适用场景
- Arduino 音频合成入门:理解定时器中断、PWM 调制、复音调度
- Cosplay 道具/桌面装饰:内置电池+功放模块即可便携播放
- 教学演示:直观展示“单片机也能弹和弦”
制造工艺
- 智能缺水报警器 – DIY植物土壤湿度监测装置
- 意大利语单词时钟:Arduino Nano + NeoPixel 144 灯珠 + LCD + RTC 打造
- 仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值
- 基于Arduino MKR Fox 1200构建可靠Sigfox千瓦时电表
- 蓝牙温度监测仪:Arduino Nano + NTC 热敏电阻 + HC-06 无线传输
- DIY 自动量程电容表 (10 pF – 10 μF) – Arduino Nano 简易制作
- 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
- Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
- Arduino Micro/Leonardo USB MIDI 适配器套件 —— 完整元件清单与固件指南
- 为Arduino构建隔离模拟输入电路
- RGB 32 频段音频频谱可视化器:Arduino Nano 驱动 WS2812B 8×32 LED 矩阵
- Arduino UNO 精准视觉反应时间测试仪