切换到宽版
  • 5287阅读
  • 42回复

[C51]跟我一起制作:触摸式电钢琴 [复制链接]

上一主题 下一主题
离线歌月十夜
 

发帖
24
M币
3936
专家
8
粉丝
12
— 本帖被 青柠 设置为精华,作者+3000M币+5专家(2018-08-07) —
这个世界上有很多让人上瘾的事情,除了抽烟,喝酒这些坏毛病外,其实往数码之家论坛发稿也是会上瘾的。这不,我又急着来向大家展示我的作品~~话入正题,单片机制作无非声、光、动、传感,这次就来做点跟声音有关的吧。这次带来的是一款触摸式电钢琴,细心的网友可能会注意到,我用的是电钢琴而不是电子琴,这两者有区别么?我的回答是肯定的,因为这正是本作品的亮点所在。单片机演奏音乐大家肯定都不会陌生,用单片机内部的定时器,送入不同的频率,每一个频率对应着一个音调,然后按照事先编排好的顺序驱动蜂鸣器发声,就可以演奏出音乐了。至于电子琴只需要把不同的频率映射到对应按键上即可。之所以说是电子琴,是因为这种方法只能演奏出单调的方波音频。想不想让声音不再单调,而是发出动听的钢琴音色呢?如果想的话,请拿出你的热情并且打开你的烙铁的开关,跟我一起往下制作吧!

名称              说明数量
STC12C5A60S2    单片机主控     1片
40脚芯片座    与单片机配套使用   1片
LM386L 功放芯片     1片
220uf电解电容  功放芯片配套使用      1个
10uf电解电容   功放芯片配套使用     1个
万用电路板      大一点的     1张
LED      任何你喜欢的颜色   1个
耳机插座3.5毫米   1个
蜂鸣器      功放喇叭 1个
排针    4PIN 1个
长条贴纸    打印好琴键的图案     1张
钉书针     作为触摸点使用     72个
免刮漆包线     飞线连接 1卷
拨动开关    耳机/功放输出切换     1个
0.1uf瓷片电容    电源滤波1个

制作所需的元器件如上表所示,本着精简制作的原则,用到的都是很普通的元器件,数量也很少,所以硬件制作的难度不是很大。连接部分则是过锡走线加飞线,烙铁温度在350度左右即可。电路图如下所示,值得说明的一点是,图中的矩阵触摸按键这里只画出了一组,其实有三组,共起来的一端分别与  P0.0、   P2.2、P2.1连接。剩下部分的电路都很明了,有创造力的朋友看电路图自行发挥就好,新手可以参考下我的布局。


先把打印好的琴键图片裁好,用双面胶贴在洞洞板上。(如图1、2、3 )






  

怎么样,是不是很有电钢琴的样子?什么?你说触摸按键在哪里?别着急,让我请出下面这位特别来宾——钉书针。为了整个制作的美观跟手感,触摸点的选取费了我很大的心思,试了很多种导体都无法达到满意的效果,直到有一天无意中把钉书针掉在了洞洞板上,发现它那细长又导电的身体,长度刚刚好可以插进洞洞板,才有了这个有趣的设计。如图4、5所示,按照琴键的位置插好钉书针并在背面压紧。





以此类推,完成36个键不会想你想象的那么枯燥,美妙的琴声在等着你。之后用双面胶把扬声器粘在板子正面,并完成扬声器导线、单片机、下载口、拨动开关、耳机插座、LED、功放芯片以及电解电容的焊接。焊接好的样子如图6所示。



接下来是触摸按键矩阵后与单片机的连接了,我的方法是过锡加飞线。先把单片机正下方的一组矩阵按键与两边矩阵共起来的部分过锡连接到I/O口上(如图7),


然后用免刮漆包线把两侧矩阵要与I/O连接的地方向中间过锡部分连接(如图8)


按道理制作到这里硬件的部分就大功告成了,但是在后期测试的过程中,总会有上电时乱响的问题。仔细思考后发现问题所在:因为触摸按键是基于增强型51单片机的I/O口高阻状态(下文会详细介绍),这种状态对电流的波动很敏感,会受到电源杂波的干扰。所以在正极跟地之间加了一个104电容,效果有很大好转。顺便一提,使用电池供电效果最好。到此就剩下载程序了,在最下方可以下载到源程序跟编译好的HEX文件,然后用STC-ISP软件下载到单片机里。注意,如果单片机是新的或者上一次使用连接了晶振的话,要先连接好晶振才能下载进程序。软件设置如图9。


到此,制作的部分全部完成了。


如果我现在结尾,肯定有人说我不地道,因为大家最想听的软件原理我还没有说明。别急,听我娓娓道来。先说触摸吧,前面提到I/O口的高阻状态,说到了在这种状态下I/O口对电流很敏感,那是不是只要接触I/O口,就能用人体的生物电完成触摸了?哎,好事多磨,虽然它很敏感,但是生物电的强度还是不能稳定的被感应。怎么办呢?冷静下来想一想,只要再叫一个强推状态的I/O口来帮忙就好办了,所谓强推状态,就是比普通准双向I/O口上拉能力强很多的一种状态。这样,在我们同时触碰这两个I/O时,强推I/O口的电流就通过皮肤流入高阻状态的I/O口,从而读到电平变化,从而实现触摸操作。这么好用的功能怎么设置呢,请看我从STC数据手册里截下来的设置方法。


如图所示,当我们用C语言设置I/O状态时,只需向P*M1 P*M0赋值(0x开头的十六进制格式)即可,如图10


接下来到了发音部分,说到这里要感谢@杜洋老师,因为这里的原理跟程序参考了他的SPEAKER32语音盒子。两者同样都是用电脑把要播放的音频先在电脑上用专业的音频软件转换成ASCII Test数据,稍加改造变成数组后放入单片机60K的ROM里,配合PWM解码程序,一个在你进门时甜美的说出“你好,欢迎光临”,一个则是在你触摸琴键后发出钢琴的音色。专业的音频软件有很多,我用的是一款名为“Adobe Audition 3.0”的软件,简洁的界面,强大的功能,都是我选择它的原因。接下来是使用方法,准备好从网上下载到的音频,你可以用鼠标拖入音轨中,也可以对着一条空音轨点击“右键→插入→音频”来把你的音频放入音轨中。这时音轨可能没有紧贴前端,这样会制造出一段空白音频,这部分不但影响正常工作还很占空间,用右键点住它向前拖动,直到与前端紧贴。如图11


之后双击音频,进入编辑模式。在这个模式下我们要做的是删除空白跟扩大音量。向上滚动滑轮让时间间隔变小,前端的空白就会变得明显,去除它的原因跟上面一样。我们用左键框选出空白部分,然后点击“右键→剪切”来删除空白。如图12


随后按Ctrl+A全选波形,点击左边效果栏里的放大,调整好合适的放大倍数后点击确认以完成放大操作。如图13


然后点击左上角的“文件→另存为”,这时会弹出一个选择格式跟保存路径的窗口,下方的保存类型我们选择“ACW波形(*.wav)”,然后点击下方的选项,滤波器处改为“PCM”,属性处改为“8.000kHz,8位,单声道”,然后“确定→保存”如果弹出窗口点击确定即可。如图14


这样就把音频转成了8位单声道,为后面的音频表做好准备。接下来软件会自动载入刚刚保存的音频,再点击左上角的“文件→另存为”在弹出的窗口里选择“ASCII 文本数据(*.txt)”然后点击下方的选项,把两个勾选框的对钩都点掉,再点击“确定→保存”就完成了ASCII Test数据的转换。如图15


这样重复36此之后,我们就得到了36个音调的8位音频数据了。打开电钢琴的工程文件,在程序的C语言文件下方有36个用音调名命名的数据表文件。这时只要把刚刚生成的数据复制到对应数据表中就大功告成了,不过要注意开始处数组的定义跟每个数据后的逗号,编译器可不会被你的急切所打动。我这里只是抛砖引玉,感兴趣的话可以在网上找到更多乐器的音色,让它变得更好玩,更强大。在茶余饭后悄悄的拿出它,为家人弹奏一曲。简单的儿歌,或者经典的旋律,不管你音乐水平的高低,总能在家人欢乐的笑声中感受到电子制作带给你的幸福!






小橙出品,必属精品。请大家多多支持宅晓橙!
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共17条打赏M币+187专家+2
壹切皆有可能 M币 +13 謝謝分享 08-12
snowrose2000 M币 +13 好吧,触摸的,似乎没什么手感。。。 08-10
桃源客 M币 +1 優秀文章,确实是利害了!下来也做一个。 08-09
xiaomage M币 +30 说是抛砖引玉,实为精品制作,谢谢分享! 08-09
girlstorm M币 +13 謝謝分享 08-08
dragonkyo M币 +8 謝謝分享 08-08
aacyxjz M币 +13 厉害,连锡都这么完美布局 08-08
ch104517745 M币 +20 謝謝分享 08-08
吴鹏930 M币 +3 謝謝分享 08-08
panleen 专家 +1 母牛生殖器了,,,利害 08-08
12
离线dl127

发帖
172
M币
501
专家
0
粉丝
2
只看该作者 1楼 发表于: 08-06
厉害,有时间我也试着学着做一个看看!
离线kygggg

发帖
7188
M币
6432
专家
9
粉丝
34
只看该作者 2楼 发表于: 08-06
*宝上几元钱买一片YM3812之类的FM合成芯片,用单片机控制,那才是真正的电钢!

发帖
1090
M币
867
专家
2
粉丝
18
只看该作者 3楼 发表于: 08-06
哇塞 飞线大法!
离线后海

发帖
490
M币
1762
专家
2
粉丝
16
只看该作者 4楼 发表于: 08-06
可以安,追求的就是一个玩的过程,来一曲天空之城大家听听。
在线sadate

发帖
192
M币
2117
专家
1
粉丝
32
只看该作者 5楼 发表于: 08-07
存下这么多的音符的波表,光靠单片机自带的那点flash根本不够用吧?显然要外扩flash

内容来自Android手机客户端

离线hjx5548

发帖
50
M币
744
专家
-1
粉丝
1
只看该作者 6楼 发表于: 08-07
能不能贴个图,学着做做。
离线歌月十夜

发帖
24
M币
3936
专家
8
粉丝
12
只看该作者 7楼 发表于: 08-07
回 sadate 的帖子
sadate:存下这么多的音符的波表,光靠单片机自带的那点flash根本不够用吧?显然要外扩flash
 (2018-08-07 07:31) 回 sadate 的帖子

用的是STC12C5A60S2,60K的ROM,音频都经过压缩,实际编译下来HEX文件57.9K,刚刚好放进去。
离线歌月十夜

发帖
24
M币
3936
专家
8
粉丝
12
只看该作者 8楼 发表于: 08-07
回 hjx5548 的帖子
hjx5548:能不能贴个图,学着做做。 (2018-08-07 09:23) 回 hjx5548 的帖子

仔细看帖,所有的图都有,跟着做应该无压力
离线歌月十夜

发帖
24
M币
3936
专家
8
粉丝
12
只看该作者 9楼 发表于: 08-07
回 kygggg 的帖子
kygggg:*宝上几元钱买一片YM3812之类的FM合成芯片,用单片机控制,那才是真正的电钢! (2018-08-06 17:58) 回 kygggg 的帖子

那还不如用单片机输出MIDI信号给电脑或者平板等设备,然后用软件音源发声这个作品主要是极限压榨STC12C5A60S2的资源,让它用pwm模拟解码
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个