单片机实例分享,触摸式电钢琴
我这次带来的是一款触摸式电钢琴,细心的读者可能会注意到,我用的词是“电钢琴”而不是“电子琴”,这两者有区别吗?我的回答是肯定的,因为这正是本作品的亮点所在。用单片机演奏音乐大家肯定都不会陌生,用单片机内部的定时器,送入不同的频率,每一个频率对应着一个音调,然后按照事先编排好的顺序驱动蜂鸣器发声,就可以演奏出音乐了。至于电子琴,只需要把不同的频率映射到对应按键上即可。之所以说是电子琴,是因为这种方法只能演奏出单调的方波音频。想不想让声音不再单调,而是发出动听的钢琴音色呢?如果想的话,请拿出你的热情,打开你的电烙铁开关,跟我一起往下制作吧!
制作所需的元器件如表9.1所示。本着精简制作的原则,笔者用到的都是很普通的元器件,数量也很少,所以硬件制作的难度不是很大。连接部分则是过锡走线加飞线的方法,烙铁温度在350℃左右即可。电路图如图9.1所示,值得说明的一点是,图中的矩阵触摸按键这里只画出了1组,其实有3组,公共端分别与P0.0、P2.2、P2.1连接。剩下部分的电路都很明了,有创造力的朋友看电路图自行发挥就好,新手可以参考一下我的布局。
表9.1 制作所需的元器件
图9.1 电路原理图
先把打印好的琴键图片裁好,用双面胶贴在洞洞板上,如图9.2所示。
图9.2 在洞洞板上贴琴键图片
怎么样,是不是很有电钢琴的样子?你说触摸按键在哪里?别着急,让我请出下面这位特别来宾——钉书针。为了整个制作的美观和手感,触摸点的选取费了我很大的心思,试了很多种导体都无法达到满意的效果,直到有一天无意中把钉书针掉在了洞洞板上,我发现它那细长又导电的身体,长度刚刚好可以插进洞洞板,才有了这个有趣的设计。如图9.3所示,按照琴键的位置插好钉书针,并在背面压紧。
以此类推,完成36个键不会像你想象的那么枯燥,美妙的琴声在等着你。之后用双面胶把扬声器粘在板子正面,并完成扬声器导线、单片机、下载口、拨动开关、耳机插座、LED、功放芯片以及电解电容的焊接。焊接好的样子如图9.4所示。
图9.3 插入钉书钉
图9.4 焊接好的琴键
接下来是触摸按键矩阵与单片机的连接,我的方法是过锡加飞线。先把单片机正下方的一组矩阵按键与两边矩阵的公共端过锡连接到I/O口上(见图9.5),然后用免刮漆包线把两侧矩阵要与I/O连接的地方同中间过锡部分连接起来(见图9.6)。
图9.5 洞洞板焊接面的过锡
图9.6 用免刮漆包线进行飞线连接
到这里,原本硬件制作部分就应该完成了,但是在后期测试的过程中,总会有上电时乱响的情况。仔细思考后,发现了问题所在:因为触摸按键是基于增强型51单片机的I/O口高阻状态(下文会详细介绍),这种状态对电流的波动很敏感,会受到电源杂波的干扰。所以在正极和地之间加了一个0.1μF电容,效果有很大好转。顺便一提,使用电池供电效果最好。
到此就剩下载程序了,可以到qq群657864614下载相关程序,然后用STC-ISP软件下载到单片机里。注意,如果单片机是新的或者上一次使用连接了晶体振荡器的话,要先连接好晶体振荡器才能下载程序。软件设置如图9.7所示。
图9.7 软件设置
如果我现在结尾,肯定有人说我不地道,因为大家最想听的软件原理我还没有说明。别急,听我娓娓道来。
先说触摸吧,前面提到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开头的16进制格式)即可,如图9.8所示。
图9.8 用C语言设置功能
接下来到了发音部分。把要播放的音频先在电脑上用专业的音频软件转换成 ASCII Test 数据,稍加改造变成数组后放入单片机 60KB 的 ROM 里,配合 PWM 解码程序,一个在你进门时甜美地说出“你好,欢迎光临”,一个则是在你触摸琴键后发出钢琴的音色。
专业的音频软件有很多,我用的是一款名为“Adobe Audition 3.0”的软件。简洁的界面、强大的功能,都是我选择它的原因。接下来要讲的是使用方法,准备好从网上下载到的音频,你可以用鼠标拖入音轨中,也可以对着一条空音轨单击“右键→插入→音频”来把你的音频放入音轨中。这时音轨可能没有紧贴前端,这样会制造出一段空白音频,这部分不但影响正常工作,还很占空间,用右键点住它向前拖动,直到与前端紧贴,如图9.9所示。
之后双击“音频”,进入编辑模式。在这个模式下,我们要做的是删除空白和扩大音量。向上滚动滑轮,让时间间隔变小,前端的空白就会变得明显,去除它的原因跟上面一样。我们用左键框选出空白部分,然后单击“右键→剪切”来删除空白,如图9.10所示。
图9.9 Adobe Audition3.0界面
图9.10 删除空白音频
随后按“Ctrl+A”快捷键全选波形,单击左边效果栏里的“放大”,调整好合适的放大倍数后,单击“确认”,以完成放大操作,见图9.11。
图9.11 扩大音量
单击左上角的“文件→另存为”,这时会弹出一个选择格式和保存路径的窗口,下方的保存类型我们选择“ACW波形(*.wav)”,单击下方的选项,滤波器处改为“PCM”,属性处改为“8.000kHz,8位,单声道”,然后“确定→保存”,如果弹出窗口点击确定即可,见图9.12。这样就把音频转成了8位单声道,为后面的数据表文件做好了准备。
图9.12 保存音频文件
接下来软件会自动载入刚刚保存的音频,再单击左上角的“文件→另存为”,在弹出的窗口里选择“ASCII 文本数据(*.txt)”,然后单击下方的选项,把两个勾选框的对勾都点掉,再单击“确定→保存”,就完成了ASCII Test数据的转换,如图9.13所示。
图9.13 ASCII Test数据转换
这样重复36次之后,我们就得到了36个音调的8位音频数据了。打开电钢琴的工程文件,在程序的C语言文件下方有36个用音调名命名的数据表文件。只要把刚刚生成的数据复制到对应数据表中就大功告成了。
不过要注意开始处数组的定义和每个数据后的逗号,编译器可不会被你的急切所打动。我这里只是抛砖引玉,感兴趣的话可以在网上找到更多乐器的音色,让它变得更好玩、更强大。在茶余饭后悄悄拿出它,为家人弹奏一曲。简单的儿歌,或者经典的旋律,不管你音乐水平的高低,总能在家人欢乐的笑声中感受到电子制作带给你的幸福!
小米车载无线充电器 苹果安卓全兼容手机无线快充通用 导航支架-淘宝网
usb迷你电风扇 学生宿舍床上静音小夹扇 办公桌面无声风扇-淘宝网
动漫鼠标垫胸部 3D硅胶护腕手腕垫 二次元美女鼠标垫 宅男必备-淘宝网
2013款雷蛇鼠标炼狱蝰蛇精英版 绿光幻彩有线 绝地求生专用-淘宝网
得力激光ppt翻页笔无线 教师用遥控笔 30米遥控距离 正品保障-淘宝网
全自动弹钢琴装置
1.项目起源
一次逛B站的时候我偶然看到有人做了音乐游戏《别踩白块》的物理外挂【图1】,在屏幕上贴几个光敏电阻,通过光敏电阻判断是否是黑块,黑块走到电阻下边,它的阻值发生会变化,利用这点做逻辑判断,再触发对应位置的手机屏幕,代替了手指点击屏幕,能玩到非常高的分数,超出人类反应极限的那种速度。我一下想起来了我在地下室吃灰的电钢琴,如果我也用某个装置代替手指,再控制不同的手指在特定的时间按下,那岂不是就能全自动弹琴了,这想想就很有意思。
图1别踩白块物理外挂
2.材料准备
2.1电机
我的目的是把琴键按下,现在有很多电机都能用来按琴键:比如减速丝杆电机,舵机,步进电机等等,那我不可能把市面上所有的电机全买回来一个个测试,我的钱包不允许这个操作,这就需要明确一下对手指的具体要求。
1.力量大:(琴键的力量大约是100g,也就是1牛顿,得比这个有劲儿才能按的动)
2.速度快:(琴键是按得越猛,声音越大,按得越温柔,声音越小,但是慢到一定程度后它是不响的)
3.行程长:(琴键末端能按下去大约10mm,行程不能低于它,太短小的话即便再快也按不响)
4.体积小:(琴键宽22mm,手指要与琴键一对一排布,太宽了就对不齐了)
5.易控制:(这个项目是做着玩的,整的太复杂就没必要了)
最终选择了电磁铁【图2】作为手指,这个东西它外边是线圈,里边有个磁芯,给这个线圈通电后产生磁场,使磁芯向下移动,线圈断电后释放磁芯,靠弹簧的力量再让磁芯复位。
只要把它竖着用,就可以拿它来按琴键。最重我选择了1039B这款作为本项目的“手指”,它最小力量1.5N,吸合动作瞬间完成,行程12mm,宽度20mm,只需要通断电就能控制,完美符合手指的所有要求
图 2电磁铁
2.2继电器
电磁铁相对控制芯片电压高,电流大,芯片是不能直接驱动的,这就需要单独的电路驱动,再用通断电控制。
继电器就是专门用来控制电路通断的,常用的有机械继电器【图3】和固态继电器【图4】这两种。
图表 3机械继电器
图表 4固态继电器
他们的主要区别是工作原理的不同,
机械继电器是靠线圈通电,吸引衔铁到触点实现闭合,这一过程会有‘咔哒咔哒’的声音,且需要一定的时间,大约是几十毫秒,这对速度很快的曲子是有影响的,可能达不到那么高的按键频率。
而固态继电器是通过半导体控制通断,完全无声且响应速度极快,一般在1毫秒左右
毫无疑问的选择用固态继电器
2.3 IO扩展模块
现在有35个电磁铁和继电器,也就需要35路控制信号来指挥他们,未来还可能扩展更多的键。
一般的控制芯片没有这么多路信号,不能直接一对一的进行控制
所以需要对信号线路的数量进行扩展,以便用少量的线路控制大量的信号。
这里我选择了MCP23017 IO扩展板【图5】
有了它以后,只要两根线,最多可控制128路信号,钢琴一共才88键,足够用了
图表 5MCP23017 IO扩展板
2.4 主控板
这个项目对性能要求不高,所以一般常用的单片机都可以满足要求,选个自己喜欢的就好,这里我选择使用ESP32-S3核心板【图6】作为主控,它的网络资料相对丰富一些
图表 6 ESP32-S3
2.5 主体框架
因为用了很多电磁铁,铁疙瘩和铜线圈,他们会很重,所以使用了铝合金作为框架,这样比较结实一些。
其他材料
与电磁铁电压匹配的直流电源(这里我用的是24V的),
电烙铁,电线等一些电子常用工具
3.硬件设计
整个项目中唯一运动的机构就是电磁铁,所以只要把电磁铁与琴键对齐,其他的零件固定好就可以。
但最好在设计位置的时候使信号线路的走线尽可能的短。【如图7】
图表 7硬件设计
4. 组装
组装要按照从强(高电压)到弱(低电压)的顺序安装,并且每装好一步都要进行测试,确保没问题再继续。
否则装到最后发现第一步错了,要全都拆了重装,那就太酸爽了。
另一个要注意的点就是走线尽可能的短,简洁,赏心悦目的同时也方便之后的维修升级。
下面是安装完成的驱动电路【图8】和控制电路【图9】
图表 8 驱动电路
图表 9信号电路
5.代码
因为对性能要求不高,所以python就行,简单好用
首先需要设计一个数据结构保存乐谱,这里我用了字典中的键,表示琴谱的键值,也是do rai mi,数字表示时值,也就是这个键按下的时长,再将多个字典按顺序组成列表,这样就把旋律转化为了代码
按照这个逻辑,录入一段旋律代码。
# 上学歌:曲速
song_speed = 250
# 上学歌:旋律
school_melody = [{"M1": 1}, {"M2": 1}, {"M3": 1}, {"M1": 1},
{"M5": 4},
{"M6": 1}, {"M6": 1}, {"H1": 1}, {"M6": 1},
{"M5": 4},
{"M6": 1}, {"M6": 1}, {"H1": 2},
{"M5": 1}, {"M6": 1}, {"M3": 2},
{"M6": 1}, {"M5": 1}, {"M3": 1}, {"M5": 1},
{"M3": 1}, {"M1": 1}, {"M2": 1}, {"M3": 1},
{"M1": 4}]
# 上学歌:和弦
school_chord = [{"L1": 4}, {"L3": 4}, {"L4": 4}, {"L3": 4}, {"L4": 4},
{"L3": 4}, {"L2": 4}, {"L5": 4}, {"L3": 4}]
再写一个驱动,驱动的目的是把刚才的数据,转化为对应电磁铁的动作执行
代码写的对不对呢,实践出真知,执行代码测试一下
【驱动代码】
# 驱动函数
def key_val(key, val=1):
if key[:2] == "LL": # 倍低音
IO_L12[15 - int(key[-1])].output(val)
elif key[:2] == "HH": # 倍高音
IO_L5[7 - int(key[-1])].output(val)
elif key[:1] == "L": # 低音
IO_L12[7 - int(key[-1])].output(val)
elif key[:1] == "M": # 中音
IO_L34[15 - int(key[-1])].output(val)
elif key[:1] == "H": # 高音
IO_L34[7 - int(key[-1])].output(val)
else:
print("键值有误!")
# 将旋律和弦列表转为时间戳列表
def song_to_events(speed, *key_time_list):
events = []
for chord in key_time_list:
# 设置起始时间为0
start_event_time = 0
for event in chord:
events.append(dict(time=start_event_time, key=list(event.keys())[0], val=1))
events.append(dict(time=start_event_time + speed * list(event.values())[0] - up_time,
key=list(event.keys())[0], val=0))
start_event_time += speed * list(event.values())[0]
# 对事件列表按时间戳进行排序
events.sort(key=lambda x: x["time"])
return events
# 演奏时间戳列表
def play(events):
events_len = len(events)
index = 0
start_time = time.ticks_ms() # 记录当前时间
while True:
current_time = time.ticks_ms() # 获取当前时间
# 如果事件列表都跑完了,退出循环
if index >= events_len:
break
# 数据结构:{'time': 544, 'key': 'M2', 'val': 0}
if time.ticks_diff(current_time, start_time) >= events[index]["time"]:
key_val(events[index]["key"], events[index]["val"])
index += 1 # 切换到下一个旋律音符
6.测试与问题
测试后一切正常,旋律非常精准。上学歌能弹奏,那么无论多复杂的旋律就都可以弹奏了。
但现在有个小小的问题,那就是弹奏期间电磁铁的噪音太大了,多次测试以后我发现噪音主要来源与以下两点。
铁芯的螺纹和外壳之间的摩擦铁芯到底后与外壳间的撞击那我的解决方式也很简单粗暴,1把螺纹打磨平【图10】 2.在撞击的位置套一个减震的胶圈【图11】
图表 10 打磨螺纹
图表11 套减震胶圈
7. 最终展示
【展示视频】
「链接」
8. 未来改进
再次测试后噪音大大减弱了,但毕竟是机械运动,不可能完全静音,噪音方面目前已经达到了比较理想的状态了。
但是还有些其他的点可以在将来做改进升级:
增加黑键 – 缺了黑键很多曲子弹不了增加延音踏板 – 没有延音踏板的话,和弦之间不是很连贯增加屏幕显示和按键 – 用屏幕和按键做个控制系统,现在每次换曲子都要从电脑端控制,不方便升级电磁铁弹簧 – 如果同一个键连续按两次,就需要增加间隔时间,否则只能听到一个音。因为弹簧把铁芯弹起来需要一点时间,这个时间决定了音乐速度的天花板,目前像野蜂飞舞那种速度的曲子肯定是弹不了的。这就需要换一个力量更大的弹簧,来缩短这个时间,但力量太大,又会导致电磁铁按不下去,所以就需要测试多种不同力量的弹簧,找到那个平衡点,在能按下去的前提下,达到最短的间隔时间,从而达到机械上的速度极限修改代码,能直接读midi文件 – 现在每首曲子都手工录入太麻烦了,最好能直接把通用的乐曲文件,转换成我想要的数据格式相关问答
如何用 单片机 实现测 钢琴 琴键的频率?若端口富裕,可以直接使用ADC0805之类的并行模数芯片,接到单片机的IO口。由于钢琴琴键检测频率校准不需要很高的数据处理速度,选最速度最低的芯片即可。采样...
有没有自学 钢琴 和编程的成年人?很高兴能够回答你的问题。你的问题包含两个内容,一个是钢琴,一个是编程。编程我没有相关的经验。但是我想应该也是和钢琴是一个道理。那回到主题。我作为一...
麻烦哪位老表,求赐教 肥西县购买卡瓦依 钢琴 KS系列,卡瓦依...C不只是MCU,还集成了其他的东西,比MCU强大很多的。他的独特性在于:具有可编程和灵活性,即MCU+模拟+FPGA。总部:...他的独特性在于:具有可编程和灵...
各位盆友!有什么好的:如何购买 海伦钢琴 P1代理专卖店,海伦钢...[回答]好吧,不卖关子了,先说说我今天讲的内容吧,首先:如何用P1口(只有个引脚哟)实现个流水灯,然后:如何用P1口实现十个流水灯。怎么样,有没有一点小刺激。...
福建经贸学校有什么职业?一、信息科学与艺术系计算机网络基础、计算机应用、计算机维修维护常识、计算机电路及芯片维修、photoshop图像处理、网络布线与小型网络构建、网页制作、电...
谁清楚!值得推荐声乐表演培训,声乐表演服务体验如何??[回答]电钢琴、电子琴、电吉他、激光竖琴、电贝司。1、电钢琴电钢琴(Electronicalpiano),是一种电声乐器。它是二十世纪六七十年代兴起,八十年代至九十年...
什么是自助共享咖啡机?[回答]方麦科技共享经济精典案例:共享智能碾米机、共享玩具柜、共享筋腊qiang、公共救援平台系统、共享投蓝训练机、共享停车位、智能窗帘、共享烘干衣机...
智能共享早餐柜是怎么样的?[回答]方麦科技共享经济精典案例:共享智能碾米机、共享玩具柜、共享筋膜qiang、公共救援平台系统、共享投蓝训练机、共享停车位、智能窗帘、共享烘干衣机...
你们谁明白!!柳州好的琴钢丝,琴钢丝好用吗??[回答].........同意这个如果还很小的话,也够了.就是活动下么,反正也没什么坏处,总比拿个玩具键盘好吧.小孩子的话没必要买几千块的琴,尤其是钢琴.老琴的...
西安麟字半导体照明有限公司人事部电话是什么北大青岛APTECH(广州软测)授权培训中心软件测试师18人、市场专员2人、BTEST咨询师1人东莞市寮步职业技术学校创业指导老师、会计、汽车营销、幼...