开发板电子钢琴程序_我用Arduino修好了一架电子琴

大家好,我是大家的老朋友xukejing。其实呢,我在芯吧客还有另一个昵称,叫做MC老徐,就是业余时间喜欢玩点freestyle,比如瞎弹或者瞎唱个调调。

e514c4f9fdf42b2ae8c6ce3942770ca4.png

最近机缘巧合下做了一个开源项目,叫ArduPiano,用大家喜闻乐见Arduino UNO开发板实现了电子琴琴键按键阵列读取和midi信号输出的功能。

1、背景

故事要从去年疫情还没爆发前说起,当时放了寒假,于是回了宁波。一天,带着爸妈和老婆去鼓楼逛街,中午饿了去地下步行街吃个饭。路过地铁站,那里有一架“公共钢琴”。我们远远就听到有位志愿者正在为大家表演,演奏的都是舒缓浪漫风格的耳熟能详的老歌。老爸和老妈都喜欢这种风格的曲子,驻足聆听了许久。

这里一定要感谢一下莫奶奶。宁波的“公共钢琴”,都是她捐的。当然,也要感谢其他志愿者们的保护和演奏。一支蜡烛不会因为点燃别的蜡烛而熄灭,只会使世界更加光明。一家人驻足许久,就提议让我也要向志愿者学习,为大家表演,彰显城市文化。

于是呢,我这个“老宝宝”就上去做“才艺表演”了。。。。。。其实我也不知道为什么,我的表演总是那么有感染力。路人们都端起手机拍我,也引得老爸老妈端起了手机。是因为我弹琴姿势潇洒帅气吗?只见老婆含情脉脉地看着我,笑得如同一朵桃花。

然后,爸妈朋友圈里就有了“我儿子为大家新年献礼”的录像。后来才知道大家拍我是因为我弹琴时仿佛是在靠留海的甩动来发力。。。。。。。当然,我弹得也确实蛮好听的。

0b69bec66d613ad8e2a7afa52a497c2a.gif

然后,我家族群里收到了一些修琴调音的请求。哈哈哈哈,谁说会弹琴就等于会修琴了?不过,我得承认,我确实是那种即会弹琴又会修琴的奇葩。

其中有一把电子琴,好几个按键按下去没有声音了。

电子产品出了故障,其实并不是那么好修的。抱着死马当活马医的态度,我把电子琴打开了。经过一顿操作猛如虎的检查,大致定位到问题是出在主控板模块上,而琴键模块部分是好的。于是就有了个思路,把原主控卸掉,diy个主控装上。

2、硬件架构设计

我们要给电子琴设计一个新的主控硬件。它需要实现这样的功能:读取键盘模块的输入信号,然后转换为音频信号给喇叭。

经过观察键盘的PCB电路,可以发现其中的键盘模块是由导电硅胶开关网络组成的矩阵键盘,其中开关网络中的一系列二极管起到防止按键冲突的作用。

152051905c443118a230e546d8c44e2d.png

正好我家里还有一块Arduino UNO,于是我就有了一个这样的灵感。用Arduino驱动电子琴的矩阵键盘电路,读取按键信号,然后输出对应的midi信号给电脑,电脑根据midi信号再输出钢琴音色信号给喇叭。硬件框图如下所示。

ab4de57351325e27d589e9427f2af500.png

3、键盘PCB逆向

这里稍微有个小小的问题,矩阵键盘上引出了两组排线,分别是8线接口和9线接口。我们目前还不知道怎么用Arduino去驱动这个键盘。

这里,我要教大家一个通过PCB逆向原理图的技巧。用手电筒照PCB反面,把铜线映出来,以此确定铜线的走向。

我们可以把左边的8个焊盘节点标记为红色的1~8号,把右边的9个焊盘节点标记为黄色的1~9号。

然后,见证奇迹吧。逆向得到原理图就是下面这样的。我很快画出了原理图的草图,右侧的1~9号节点只画出了第1号节点的连接方式。右侧的第2号节点其实与右侧的第1号是一样的,也是通过开关和二极管依次连接到左边的1~8节点。

dabff64de96d6d42c3df2d6d16ebfb1d.png

如果把右边的1~9号焊盘节点都展开,原理图是下图这样的

0ec5c4b54dfd94c4e3277436ec9ce16e.png

4、 Arduino程序编写

接下来,我们来设计一下Arduino的GPIO怎么驱动这个矩阵键盘。左边的1~8号节点正好可以分别连接到Arduino的2到9引脚。

右边的1~4号节点分别连接到Arduino的10到13引脚。5~9号节点连接到A0到A4引脚。

引脚对应关系如下图设计。

c749ec8bd5d0d2fca50f4185e46349af.png

把arduino引脚与键盘模块的焊盘节点进行焊接。上电没什么故障就可以进入下一步写代码的流程的。

b3093fecd7d413334221e00de651bc6d.png

根据前面逆向得到的键盘原理图与我们设计的键盘与arduino引脚的连接关系,可以写出键盘触发midi信号发送的代码如下。其中代码使用了Arduino的keypad库和midi库。完整代码是从keypad库的MultiKey例子基础上修改并添加功能得到的,我们保留了MultiKey例子头部的注释以表示对keypad库作者的致敬。

51a567d39b39b362c26d91deaa2fae81.png

因为arduino板子比电子琴原主控板小很多,固定时候只能用热熔胶了。热熔胶细节如下图所示:

b89fa4d719687b561c11462a28e28a8e.png

5、电子琴与电脑连接

本项目的arduino程序代码已开源到github,地址https://github.com/xukejing/ArduPiano

程序调试完毕后,把琴合上。此时因为原主控被卸下,电子琴只有琴键还能用,面板上的灯已经不会亮了,切换音色的按钮也无效了,这是正常的。实际上,我们也不再需要面板上的按钮来切换音色了。音色选择和切换由电脑上的软音源来实现,功能更强大了。

022aab9be079937df6126d7e70f7edf0.png

arduino通过串口把midi信号发送给电脑。电脑是不能直接把串口的数据接到音频midi接口的,这里需要用到3个软件。

1、loopmidi。建立虚拟midi设备。2、hairless-midiseria。把串口的midi信号接入loopmidi创建的虚拟midi设备。3、宿主软件+软音源程序。接入虚拟midi设备,把midi信号变成音频信号输出给喇叭。

loopmidi与hairless-midiseria都是开源软件,已上传到github,直接依次打开就能用。其中hairless-midiseria的串口波特率要设置成与arduino代码一致,即115200.

宿主软件和软音源软件众多,但都是闭源软件。我们举个例子,用Cubas作为宿主软件。新建一个音频工程,插入一个音轨,设置音轨的midi输入设备为前面新建的虚拟midi设备,即loopMIDI Port。

7fbc77850a1e246462976ed42b4758b7.png

音源软件也有很多,比如钢琴音色,比较著名的有true piano和addicitive keys。我使用的是addictive keys音源,所以输出设备选addictive keys。

5c3619a4772ac257af71ad0653a495bf.png

好了,所有软件设置完毕。现在用手去弹琴,电脑喇叭就会实时发出对应的钢琴声音了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值