PPP · Piano Playing Project
88 键钢琴机器人
从一堆零件,到弹出第一个音
不用先懂电路。跟着下面的 3D 图一步一步来:先搭架子、装推杆,再把每一根线接到该去的地方。哪个零件不认识,直接点它。
点方框看说明。点下面的颜色,只看那一种线。走到哪一步,那一步要接的线就会变清楚。
3D 图没加载出来
可能是网络没连上,或者这台设备不支持 3D 显示。先看方框接线图,右边的步骤说明照样能用。
一路电路,搞懂就全懂了
整台机器有 88 路,每一路长得一模一样。把下面这张图看明白,剩下 87 路就是照着再焊一遍。
MOS 管
一个电子开关。G 脚给 3.3V 就通,给 0V 就断。它不给推杆供电,推杆的电全部来自 24V 电源,它只管“放不放行”。就像水塔 → 水车 → 出水口的阀门,阀门装在最后面,照样管得住整条水管。
二极管
线圈有个脾气:电流不肯一下子停。开关一断,它会把电压顶得老高。二极管给这股电流留了一条回家的路,让它转几圈自己消掉。
10kΩ 电阻
刚开机、ESP32 重启、舵机线松了的时候,G 脚没人管,会乱飘。这个电阻把它轻轻拉到 0V,保证“没人说话就是关”。
| G 脚(黄线) | MOS 管 | D 点电压 | 推杆两端 | 推杆 |
|---|---|---|---|---|
| 3.3 V | 导通 | ≈ 0 V | 24 V | 通电,往下戳 |
| 0 V | 断开 | ≈ 24 V | 0 V | 弹簧把它弹回去 |
力度是怎么控制的
MOS 管只会“全开”和“全关”,不会开一半。想让推杆轻一点,就让它开一下、关一下,飞快地来回切(比如每秒 1000 次)。开的时间占 30%,效果大约等于给推杆 7V。
为什么要先猛后轻
把琴键打下去需要大力气,但按住不动只要一点点力。一直用 100% 按着,推杆很快就烫手。所以打下去之后马上降到 30%~40%。
推杆收到的不是 7V
它收到的是一串 24V 的脉冲。只是线圈反应慢,把脉冲“抹平”成了平均值。万用表量出来可能是个奇怪的数,这是正常的。
采购清单
淘宝都能买到。买一样勾一样,勾选会记在这台电脑的浏览器里。搜的时候直接搜型号,别只搜“MOS 管”“电源”这种大词。
设计文档里的零件
这种装法还要用到的小件
文档里没列工具
文档里没列PCA9685 地址表
6 块板挂在同一条 I²C 线上,靠“地址”区分谁是谁。地址是用焊锡把板子右上角的小焊盘连起来设定的:连上算 1,不连算 0。
| 板子 | 要焊的焊盘 | A0 A1 A2 A3 A4 A5 | 地址 | 管哪些键 | 用哪几个输出 |
|---|---|---|---|---|---|
| 1 号 | 都不焊 | 0x40 | 1 – 16 | 0 – 15 | |
| 2 号 | A0 | 0x41 | 17 – 32 | 0 – 15 | |
| 3 号 | A1 | 0x42 | 33 – 48 | 0 – 15 | |
| 4 号 | A0 + A1 | 0x43 | 49 – 64 | 0 – 15 | |
| 5 号 | A2 | 0x44 | 65 – 80 | 0 – 15 | |
| 6 号 | A0 + A2 | 0x45 | 81 – 88 | 0 – 7(后 8 个空着) |
第 N 个键在哪块板、哪个输出
板号 = (N − 1) ÷ 16 取整,再加 1。输出号 = (N − 1) ÷ 16 的余数。比如第 40 键(中央 C):39 ÷ 16 = 2 余 7,所以在 3 号板的第 7 个输出。
哪台电源管哪些键
1、2、3 号驱动板(1~48 键)接电源 A,4、5、6 号驱动板(49~88 键)接电源 B。文档原来写的是 1–44 / 45–88,这里用的是文档备注里那个更省事的分法:每块驱动板只接一条母线。
焊盘位置看板上印的字
不同厂家的板子,A0~A5 的位置可能不一样。找到印着 A0、A1、A2 的小焊盘,每个是两个挨着的小方块,用焊锡把这两个小方块连起来就算“焊上了”。
焊完一定要扫描
接好 I²C 后烧一个“I²C 扫描”程序。应该扫到 0x40 到 0x45 六个地址。另外多出来一个 0x70 是正常的,那是 PCA9685 的公共地址。
上电前检查
插电之前一条一条过。前面几条接错了会直接冒烟,值得多看两遍。
通电前,逐条确认
第一次通电的顺序
一级一级来- 只开电源,板子都不管量红、黑母线之间是不是 24V。不是就拧电源上的 V-ADJ 小旋钮。
- 调降压模块ESP32 先不接。量降压模块输出,拧到 5.0V。然后断电。
- 接上 ESP32,扫描 I²C应该看到 0x40 到 0x45 六个地址(外加一个 0x70)。
- 只测 1 个键程序开头先把所有输出清零。然后让 1 个键动:100% 打 20~50 毫秒,再降到 30%~40% 按住,最后归零。
- 摸一摸这一路的 MOS 管和推杆不烫,再测下一路。
- 一块板 16 路都过了,再测下一块出了问题好找,知道是哪块板。
- 最后才上 MIDI 弹曲子手一直放在急停旁边。闻到焦味、看到冒烟,先拍急停再找原因。
出问题了怎么办
按“最常见的原因排最前面”写的。动手查之前先断电。
某个推杆完全不动
- 量这一路端子的 24V+ 孔对地有没有 24V。没有就往回查:驱动板进电线、母线、保险丝。
- 有 24V:让程序一直输出 100%,量 MOS 管 G 脚对地。应该有 3.3V 左右。没有就查舵机线有没有插反、插紧,通道号、地址对不对。
- G 脚有电压但还是不动:多半是 MOS 管三个脚焊错了位置,或者买到的不是逻辑电平的管子。
- 最后查推杆本身:断电,量它两根线之间的电阻,应该有几十欧(大约 30~60Ω)。
一通电,推杆就自己吸住不放
- 拔掉这一路的舵机线。还是吸着:MOS 管已经被打穿了(D 和 S 之间短路),换一个,顺便检查二极管装了没有、方向对不对。
- 拔掉就松开了:程序开头没有把输出清零,或者 PCA9685 还没初始化。
- 时吸时不吸:10kΩ 电阻没焊好,G 脚在飘。
MOS 管烫手
- 看型号。IRLZ44N 和 IRFZ44N 只差一个字母,后者 3.3V 打不开,只会半开着发热。IRF540 也一样不行。
- 保持阶段的占空比太高。降到 30%~40%。
- 正常情况下,这个电流 MOS 管应该是几乎不热的。
保险丝一通电就烧
- 最常见:有二极管接反了。接反的二极管会让 24V 经过 MOS 管直接短路。
- 其次:电容接反,或者哪里的 24V+ 和地碰到了一起。
- 查法:把 6 块驱动板的进电线全拔掉,换上新保险丝,一块一块接回去,接到哪块烧就是哪块的问题。
不要换个大一号的保险丝硬顶。
电容鼓包、发烫
极性接反了。马上断电,换新的。长脚接 24V+,外壳有白条的那一边接地。耐压要 35V,25V 的太悬。
推杆本身很烫
- 一直 100% 通电。这种推杆只能短时间满功率工作。
- 保持占空比再调低一点,能按住琴键就够。
- 在程序里给每个音加个“最长按住时间”,防止某个音卡住一直通电。
ESP32 动不动就重启
- 多个推杆同时动的一瞬间,24V 被拉低,5V 跟着掉。检查 2200µF 和 100µF 电容装了没有。
- 有的路漏装了二极管,断电尖峰在干扰它。
- 地线没接好。两台电源的 V−、降压模块、ESP32、PCA9685 的地必须全部连在一起。
I²C 扫描,一个地址都扫不到
- SDA 和 SCL 接反了。GPIO21 接 SDA,GPIO22 接 SCL。
- VCC 没接 3.3V,或者 GND 没接。
- 杜邦线松了。这种线很容易接触不良,换一根试试。
- 先只接 1 块 PCA9685,扫到了再一块一块往后加。
扫到的地址少了几个
- 有两块板焊成了同一个地址。
- 焊盘虚焊,看着连上了其实没连上。
- 链条在中间断了。从扫不到的那块往前查它左侧的 4 根线。
有的键声音小,有的键按不到底
- 推杆高度没调好。琴键到底的时候,推杆应该也快吸到底。
- 推杆头没对准琴键中间,蹭到了旁边的键。
- 每个推杆、每个键本来就有差别。这正是后面“自动校准”要解决的事。
弹的时候哒哒响,很吵
- 推杆头没贴毛毡或硅胶垫。
- 推杆弹回去的时候撞到自己的外壳。在回弹的位置也垫一小片软垫。
- 架子和钢琴硬碰硬。脚底垫橡胶。
弹和弦的时候架子会跳
推杆往下戳,架子就被往上顶。同时按的键多了,这个力会超过架子自己的重量。用夹子或绑带把架子固定在琴上(垫软布,别伤琴),或者加配重。
小词典
这页里出现过的术语,用大白话再说一遍。
- PWM脉宽调制
- 飞快地开、关、开、关。开的时间占得越多,平均力气越大。
- 占空比
- 一个来回里,“开”的时间占百分之几。100% 就是一直开,0% 就是一直关。
- I²C
- 只用两根信号线(SDA、SCL)就能连很多设备的通信方式。每个设备有自己的地址。它不是 USB。
- MOS 管MOSFET
- 电子开关。三个脚:G 是控制脚,D 和 S 是开关的两头。
- 逻辑电平 MOS 管
- 3.3V 就能完全打开的 MOS 管,比如 IRLZ44N、AO3400。普通的要 10V 才能开。
- 低边开关
- 把开关装在负载(推杆)和地之间。好处是 3.3V 能直接控制;代价是推杆正极一直带电。
- 续流二极管
- 并在线圈两端的二极管。专门接住断电瞬间的那股电流,保护 MOS 管。
- 下拉电阻
- 把一个脚轻轻拉到 0V 的电阻。没人驱动这个脚的时候,它就老老实实是 0V。
- 母线
- 两排接线端子。电源一根粗线进来,分出很多根线到各块板。红的是 24V+,黑的是地。
- 共地
- 所有负极连在一起:两台电源的 V−、降压模块、ESP32、PCA9685、所有 MOS 管的 S 脚、所有电容负极。
- 驱动板
- 自己焊的洞洞板。一块 16 路,每路是 MOS 管 + 二极管 + 10kΩ 电阻。
- 电解电容
- 就近的“小水池”。瞬间要大电流时先由它顶上。有正负极,接反会炸。
- 降压模块
- 把 24V 变成 5V 的小板子,给 ESP32 供电。输出电压要自己拧螺丝调。
- 舵机延长线
- 三根线并在一起、两头带插头的现成线。这里用它把 PCA9685 的输出接到驱动板。
- 冷压端子
- 压在线头上的小金属套。拧进螺丝端子更牢靠,铜丝不会散开。
- 急停
- 红色蘑菇头按钮。一拍下去整台机器断电。
- 保险丝
- 电流太大时自己烧断的一小段细丝。它断了,电源和电线就保住了。
- 通断档
- 万用表上带小喇叭符号的那一档。两根表笔之间是通的,它就响。
装完以后
线接完只是一半。下面这几件事在你的设计文档里都列了,这里只写个大概。
写程序
驱动库用 Adafruit PWM Servo Driver,I²C 速度设 100kHz。
- 第一步:I²C 扫描,确认 6 个地址
- 第二步:单键测试
- 第三步:蓝牙 BLE-MIDI,手机或电脑直接发音符过来
- 也可以加 TF 卡模块,直接放 .mid 文件
力度能到多响
按文档的估算,24V 下大概能稳定弹到“强”(f),最响的“很强”(ff)有点勉强,相当于 MIDI 力度 90~110。
- 这只是估算,要实测
- 测法:一个推杆满压打琴键,用手机分贝计量,和你自己用力弹同一个键比
自动校准
每个键的推杆、高度、琴键轻重都不一样。校准就是挨个试:不同的占空比和击键时长,打出来多响、慢了多少,记成每个键自己的一张表。
- 你提到过有一张算法设想图,做这一步时需要它
踏板
踏板不建议用这种推杆:要的力气大,要长时间踩住,还要能踩一半。
- 右踏板(延音):步进电机 + 丝杆 + TMC2209,安静,踩住不耗电
- 左踏板(柔音):大扭矩舵机或大电磁铁
- 中间踏板:先不做