PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
核心组件清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino 101 / Uno | 1 | 建议Uno成本更低 |
| 74HC595移位寄存器 | 11 | 每个控制8路输出,共88路 |
| IRFZ44N N沟道MOSFET | 88 | 驱动电磁阀 |
| 12V铅酸电池(汽车电瓶) | 2 | 供电磁阀高电流 |
| 100µF电解电容 | 11 | 每块控制板去耦 |
| 导线、面包板/万用板、IC座、电阻、二极管等 | 若干 | 见详细BOM |
项目背景
作者幼时见自动钢琴演奏深受启发,决定自制低成本钢琴机器人。商用自动钢琴昂贵,本项目采用单Arduino + 11级移位寄存器级联方案,以极低成本实现88键独立控制。
硬件设计
驱动电路
- 每个74HC595串行输入、并行输出8位,级联11片覆盖88键
- 移位寄存器输出驱动MOSFET栅极,MOSFET低侧开关12V电磁阀线圈
- 电磁阀直连电池正极,源极接MOSFET漏极,栅极接595输出
- 未使用下拉电阻与续流二极管(实测5V开启/4V关断可靠),但建议量产时添加
机械结构
- 电磁阀热熔胶固定于塑料板,后因过热改用耐高温双面胶
- 电磁阀推杆对准琴键后部(力臂最长处),需24V驱动12V阀才能产生足够击键力
- 整体安装于钢琴前方,可拆卸不破坏乐器
软件流程
- 获取MIDI文件
- 转文本:用
https://flashmusicgames.com/midi/mid2txt.php导出文本格式(含时间戳、音高、力度、通道) - Python预处理:解析文本,按时间片聚合同一时刻的按键事件,生成11组8位数据(对应11个595)+ 时间间隔,输出
translated.txt - Processing发送:读取文本,按时间间隔经串口发送给Arduino,发送顺序为右向左(物理琴键从高音到低音)
- Arduino接收:串口解析11字节数据,依次移入595链,锁存输出驱动MOSFET
关键代码片段
Python转换核心逻辑
def set_bit(On, note):
# 将音高映射到对应595的bit位
if 21 <= note <= 28 and On: return f"{2**(note-21)},0,0,0,0,0,0,0,0,0,0"
# ... 其余8组类似
else: return "0,0,0,0,0,0,0,0,0,0,0"
Processing发送循环
void run() {
int lastTime = 0;
for (String line : inputLines) {
int t = Integer.parseInt(line.substring(0, line.indexOf(',')));
delay((t - lastTime) * 5); // tempo倍率
lastTime = t;
send(line.substring(line.indexOf(',')+1));
}
}
void send(String data) {
// 反转11字节顺序后逐个发送,帧头888f、帧尾999f
}
Arduino接收与移位
void loop() {
if (Serial.available()) {
char c = Serial.read();
if (c == 'f') { /* 解析一个字节并移位 */ }
}
}
常见问题与改进
- 电磁阀过热熔胶:改用耐150℃双面胶
- 电源纹波:大电流切换时建议加大电容、分离逻辑/功率地
- 时序抖动:Processing延时非实时,可移植至Teensy/ESP32硬件定时器
- 力度控制:当前仅开/关,可引入PWM调节击键力度
资源链接
- 完整代码(Python/Processing/Arduino):项目附件
- 原理图:基于Arduino ShiftOut教程改装MOSFET部分
制造工艺
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- Arduino与树莓派构建互联网控制视频流机器人完整指南
- 用 Python 构建 Wi-Fi 控制的树莓派机器人:分步指南
- 通过树莓派用 Alexa 控制 LED - 简单分步指南
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
- Arduino RGB 颜色混合器 – 分步制作教程