树莓派电子琴-MPR121触摸板
开始前,照例聊一聊为什么要做这个项目,是因为我实在想安利一个快乐的频道给大家:TwoSetViolin双琴侠(b站,yutube可以看到他们的视频,微博和ins有社交账号)事情是这样的:我以前对音乐一直比较无动于衷,从去年开始关注到这个频道之后,就开始感受到音乐的乐趣啦,其实更感兴趣那些有趣的人,所以后来每天到点追更新,实在幸福。他们有一个栏目叫LINGLING40HOURS,很多有才的lingling(粉丝称号/天才称号)都凭借各种音乐才华还有乐手梗成功吸引他们的注意,可是不会乐器的我确实很难想到新梗,难道要加入三角铁帮?救命,肯定不可。思考一阵子,得,DIY一个漏洞百出的小玩具琴吧,说不定能投稿上LINGLING40HOURS搏大家一笑,还能给DIY选手们安利一下我的快乐源泉(如果评论区有零学家,请同好一定举起双手让我看到)。
先看一下成品图,那我们就开始啦!GOGO!
一、硬件准备
(一)材料准备
[*]树莓派4BX1 (DFR0619)
[*]树莓派IO扩展板X1(DFR0566)
[*]电容触摸套件 X1 (DFR0129)
[*]带功放喇叭模块X1(FIT0449)
[*]21块木片(3*7)
[*]一些双面胶
[*]少量双导铜箔胶带
[*]一些导电线
[*]硬纸板(尽量选择稍大一点的快递箱子,确保21个琴键能排列到一面)
[*]电源线(type c)X1 (搭配适配器插插座上和用充电宝都行,看你心情)
[*]网线X1 (wifi也行,只要能用PC远程连接到树莓派就可以了)
(二)琴键连接
1.首先准备触摸板部分焊接前,我们需要梳理一下逻辑:mpr121可以输出12个信号,可是我们需要3*7=21个信号,所以我们将12个信号分为x(0-4),y(5-11)两组,这样我们就得到了35个信号组合。
如图,将触摸板上焊接导电线,共21个,示意图和焊接图如下,我焊接了黄色和绿色部分。
2.准备琴板部分
将快递箱子裁剪折叠后得到如下一块三层板子,同时准备一些小纸板条以固定琴键。
然后将触摸板安装到琴板上
稍微加工修整一下
3.准备琴键部分
将彩色木条下端缠上一圈铜箔胶带。
然后粘在纸板条上。效果如图:
二、软件准备
我使用的远程连接软件是MobaXterm。
三、具体操作
(一)、硬件连接
如图所示:喇叭模块接在22口,触摸板接IIC口。
当然,你也可以选择别的引脚,但是请务必保证是接在GPIO口上,具体引脚可以查看下图
最后,网线和电源线找准位置接好即可。
(二)、代码准备
[*]下载库文件相关,这次我全都放进了一个压缩包中,点击链接即可下载到本地pc。
解压后如图所示:
根据动图操作,将文件夹从本地拖拽到mobaxterm。(请选择Desktop文件夹下)
在本地新建一个python格式的空文件,我这里命名为36.py。下一步梳理代码。
2.梳理代码
1)电子琴的逻辑为:只需要当我们按下相应的按键,喇叭能发出对应的音符即可。mpr121的库文件中已有触摸即可输出0-11信号的功能,于是在这个基础上,我们将12个信号引申至更多信号,于是,我将0-4认为是x,5-11认为是y。组合起来就有35种可能性。在这里我只设置了低音、中音和高音三个部分,所以只需要用到x=1,2,3的情况。在代码中,如果输出了5,那么我会让它输出y=0,依次类推,这样就可以用y做下标去选择频率值了。于是我设定,当x=1时,低音部,此时根据y值决定音符频率;当x=2时,中音部,此时根据y值决定音符频率;当x=3时,高音部,此时根据y值决定音符频率。
2)代码如下:
可以直接复制粘贴。
import sys
sys.path.append('../')
import time
import Adafruit_MPR121.MPR121 as MPR121
import RPi.GPIO as GPIO
Buzzer = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(Buzzer,GPIO.OUT)
Buzz = GPIO.PWM(Buzzer,440)
Buzz.start(0)
print('Adafruit MPR121 Capacitive Touch Sensor Test')
# Create MPR121 instance.
cap = MPR121.MPR121()
CL =
CM =
CH =
if not cap.begin():
print('Error initializing MPR121.Check your wiring!')
sys.exit(1)
print('Press Ctrl-C to quit.')
last_touched = cap.touched()
print(last_touched)
x = 0
y = 0
while True:
global Buzz
touch = []
current_touched = cap.touched()
n=current_touched
print(n)
#y=current_touched
for i in range(12):
if n&1:
touch.append(i)
n = n >> 1
if len(touch) == 2:
x=touch
y=touch-5
print(x)
print(y)
if x==1:
Buzz.start(50)
Buzz.ChangeFrequency(CL)
elif x==2:
Buzz.start(50)
Buzz.ChangeFrequency(CM)
elif x==3:
Buzz.start(50)
Buzz.ChangeFrequency(CH)
else:
Buzz.stop()
x = 0
y = 0
#last_touched = current_touched
time.sleep(0.5)
#GPIO.cleanup()
3)然后将36.py拖进mobaxterm中examples文件夹下,如图:四、展示效果1.运行代码首先进入36.py的位置,如动图:然后输入python 36.py即可运行。ctrl+c即可退出运行。2.展示效果如图,此时我按下的是低音部第6个音符。视频展示:https://www.bilibili.com/video/BV17y4y167zd?from=search 666{:5_116:} 视频看不到啊 好多焊点牛牛{:6_215:} DFHkhQxFRtP 发表于 2020-11-15 18:19
666
{:7_219:}继续加油 gray6666 发表于 2020-11-15 22:05
好多焊点牛牛
然后焊点太丑哈哈(是时候去学真正的技术了{:7_220:} 安卓机器人 发表于 2020-11-15 20:25
视频看不到啊
朋友现在看得到吗,我又更新了一下视频(如果还是不可以,或许可以换个浏览器?google好像有时候看不了{:6_214:} 咕叽大虾 发表于 2020-11-16 11:09
朋友现在看得到吗,我又更新了一下视频(如果还是不可以,或许可以换个浏览器?google好像有时候看不了{: ...
视频可以正常显示 gray6666 发表于 2020-11-16 16:12
视频可以正常显示
好的!谢谢反馈啊! 很有创意,很好玩! lumeizhu20 发表于 2020-11-23 15:17
很有创意,很好玩!
哈哈,之后还要尝试更多好玩的东西{:6_202:} lumeizhu20 发表于 2020-11-23 15:17
很有创意,很好玩!
哈哈 一起玩起来{:5_131:} 太有创意了,你就是Lingling BRiver 发表于 2021-5-16 12:05
太有创意了,你就是Lingling
{:5_190:}哇 可太开心了
页:
[1]