×

Arduino合成器V3设计案例

消耗积分:2 | 格式:zip | 大小:0.01 MB | 2022-08-11

张强

分享资料个

威廉希尔官方网站 板图如下:
pYYBAGL0Wa6AIWinAACkBXbvqxE604.jpg
pYYBAGL0WbGAdEXrAACiaOApkfE439.jpg
poYBAGL0WbOAcYYoAACcBiX6S14529.jpg
pYYBAGL0WbaAbXSeAAB-i5dMM1w708.png

描述

Arduino 合成器 V3

 

嘿伙计们怎么了!

所以这是我的 Arduino Synth V3,它是由 Arduino Nano 驱动的 DIY 合成器。

 

 

poYBAGL0WbyANFL6ABA8YKe43l4712.jpg

 

它有 12 个按钮开关和两个用于改变模式的 ON/OFF 开关和两个用于改变音高和速度的电位器。

通过更改 Pitch Potentiometer,我们可以通过按任意 12 个按钮来更改输出波形,从而产生酷炫的科幻声音。它的工作原理与普通键盘合成器非常相似。

我制作合成器已经有一段时间了,制作了两个与这个工作相同的合成器,但它们都使用 Mozi 库来运行,但这个使用简单的代码,通过按钮和开关的状态调制输出。

 

这篇文章是关于这个合成器的整个构建过程,所以让我们开始吧。

 

所需材料

以下是我在此构建中使用的东西-

  • 定制PCB
  • Arduino纳米
  • 电位器
  • 开/关
  • 按按钮
  • 扬声器 4 欧姆
  • 排针母头

 

原理图

 

pYYBAGL0Wb-AMaFcAAGOzMnqexU345.jpg

 

该板的原理图很简单,Arduino Nano 连接了 12 个按钮。每个 Push Button 都连接一个 IO 端口,当我们按下任何按钮时,它会将 IO 端口拉低至 GND。

两个 ON-OFF 开关也是如此,但是当我们按下它们时,它们会使 IO 引脚拉下更长的时间。然后两个 Pot 用 A4 和 A5 连接。

PAM8403 模块与输出引脚 A2 相连,它放大信号并使其响亮。

 

PCB设计

 

poYBAGL0WcKAKXyBAAMuKMstifg584.png

 

完成原理图后,我导出了网表并开始进行 PCB 设计。

至于外形,我取材于通用键盘的美学和整体外观,Arduino Nano 放置在右上角,扬声器放置在 TOP 左侧。

我还在设计中添加了一些假钥匙,我在这些假钥匙上放置了按钮。也许未来的版本会有真正的电容式触摸键。

此外,我已经从假钥匙上移除了阻焊层,因此铜区域将未被填充,这将提供超酷的银色外观,因为威廉希尔官方网站 板将被 HASL 覆盖。

 

从 PCBWAY 获取 PCB

 

 

poYBAGL0WcWAcR4YAAL1EMIQM-A547.png

 

poYBAGL0WciAA3P_AACdQd76v6Y526.jpg

 

pYYBAGL0WcqAed9oAACqS9LcTes124.jpg

 

pYYBAGL0WcyAcluQAACR6ppBeMw997.jpg

 

完成 PCB 后,我将 Gerber 数据发送到 PCBWAY 以获取样品。

我选择带有黑色丝印的白色阻焊层,因为如果我们添加黑色丝印图案,白色 PCB 通常看起来很酷。

我很快就收到了 PCB。至于PCB质量,它是一流的。

使用他们的服务已经有一段时间了,我不得不说,这对于入门来说是相当不错的。

 

看看我的复杂设计,我在 PCB 上放置了许多不寻常的图案,例如不规则的轮廓和阻焊层形状,这很难制作,但他们在制作 PCB 方面做得非常出色,没有任何问题。

 

威廉希尔官方网站 板组装

poYBAGL0Wc6AfCD0AADcKm_3oNo171.jpg

 

在开始 PCB 组装之前,我们需要收集我们将在这个项目中使用的所有组件。

 

添加接头引脚、开关和电位器

poYBAGL0WdGAUSrtAACydDqLd8s778.jpg

 

poYBAGL0WdSAXta4AAC25xCVlW4644.jpg

 

我们首先为 Arduino Nano、开关和电位器添加 Header Pins。

 

添加按钮

pYYBAGL0WdeAYDbiAAC2z7pXrEs103.jpg

 

poYBAGL0WdmAKLAfAAC4-kiq1Ug548.jpg

 

接下来,我们将 12 个 Push Buttons 一个一个地添加到它们的位置。

 

焊接组件

pYYBAGL0WdyAbr0hAADD30A0uH4285.jpg

 

将所有开关和插头引脚放置到位后,我们使用普通烙铁和焊锡线将它们的端子焊接到 PCB。

 

添加 PAM8403 模块

poYBAGL0WeCABV4DAADZZApQEcA005.jpg

 

pYYBAGL0WeKAFOQ8AAC3M5PwGAs368.jpg

 

poYBAGL0WeWAbbgKAADEJ2bHpAs577.jpg

 

poYBAGL0WeeAfZn8AAC0TQChcgc454.jpg

 

pYYBAGL0WeqATPQkAACcmurGWLE024.jpg

 

接下来,我们通过使用一些公头引脚添加 PAM8403 模块,我们在 PCB 上添加公头引脚,然后在头引脚上添加 PAM8403。

最后,我们焊接引脚并将模块永久固定到位。

 

添加扬声器

pYYBAGL0WeyALoiLAAC1X1AdHTQ014.jpg

 

pYYBAGL0We-AdzEcAACxaMHIguI618.jpg

 

poYBAGL0WfGAWWw3AAC8tLOXkXA956.jpg

 

最后,我们在其位置添加一个扬声器。

我在 PCB 上添加了一个孔,这里的目标是通过这个孔从背面添加一个扬声器。扬声器粘在 PCB 上,然后我们通过两条跳线将扬声器的端子与 PAM8403 CON2 端口连接。

完成后,PCB就完成了。

 

PCB组装结果

pYYBAGL0WfWAch1eAAC5x5OI2_g953.jpg

 

pYYBAGL0WfeAStlyAAC5y9MQogk768.jpg

 

这是到目前为止的结果,所有组件都焊接好了,威廉希尔官方网站 板就完成了。它看起来很像 Arduino Nano Sheild 或插件板。

下一步是将 Arduino Nano 添加到此板上并将主草图刷入 MCU。

 

主要代码

 

这是我使用的主要草图。

C =  ;
CS =  ;
D =  ;
DS =  ;
E =  ;
F =  ;
FS =  ;
G =  ;
GS =  ;
A =  ;
AS =  ;
B =  ;
八八度 =  ;
八达利巴 =  ;
 tiempo = 模拟读取(A4);
 pitch_bend = 模拟读取(A5);


c =  ;
cs =  ;
d =  ;
ds =  ;
e =  ;
f =  ;
fs =  ;
g =  ;
gs =  ;
a =  ;
 =  ;
 b =  ;

  {

pinMode(C,INPUT_PULLUP);
pinMode(CS,INPUT_PULLUP);
pinMode(D,INPUT_PULLUP);
pinMode(DS,INPUT_PULLUP);
pinMode(E,INPUT_PULLUP);
pinMode(F,INPUT_PULLUP);
pinMode(FS,INPUT_PULLUP);
pinMode(G,INPUT_PULLUP);
pinMode(GS,INPUT_PULLUP);
pinMode(A,INPUT_PULLUP);
pinMode(AS,INPUT_PULLUP);
pinMode(B,INPUT_PULLUP);
pinMode(octabajo, INPUT_PULLUP);
pinMode(octarriba, INPUT_PULLUP);
pinMode(A4,INPUT_PULLUP);

pinMode(A2,输出);

Serial.begin(  );
}



  {
 
 
digitalRead(  );
数字读取();
 
Serial.println(analogRead(A4));

(!digitalRead(C)){
音调(A2, c+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字读取(C);
}
 (!digitalRead(C)&&!digitalRead(octabajo)) {
音调(A2, c/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(C);
}
 (!digitalRead(C)&&!digitalRead(octarriba)) {
音调(A2, c*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(C);
}


数字阅读(CS);
(!digitalRead(CS)){
音调(A2, cs+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字阅读(CS);
}
(!digitalRead(CS)&&!digitalRead(octabajo)) {
音调(A2, cs/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(CS);
}
(!digitalRead(CS)&&!digitalRead(octarriba)) {
音调(A2, cs*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(CS);
}

数字读取(D);
(!digitalRead(D)){
音调(A2, d+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字读取(D);
}
 (!digitalRead(D)&&!digitalRead(octabajo)) {
音调(A2, d/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(D);
}
 (!digitalRead(D)&&!digitalRead(octarriba)) {
音调(A2, d*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(D);
}

数字读取(DS);
(!digitalRead(DS)){
音调(A2, ds+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字读取(DS);
}
(!digitalRead(DS)&&!digitalRead(octabajo)) {
音调(A2, ds/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(DS);
}
(!digitalRead(DS)&&!digitalRead(octarriba)) {
音调(A2, ds*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(DS);
}

数字阅读(E);
(!digitalRead(E)){
音调(A2, e+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字阅读(E);
}
 (!digitalRead(E)&&!digitalRead(octabajo)) {
音调(A2, e/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(E);
}
 (!digitalRead(E)&&!digitalRead(octarriba)) {
音调(A2, e*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(E);
}

数字读取(F);
(!digitalRead(F)){
音调(A2, f+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字读取(F);
}  (!digitalRead(F)&&!digitalRead(octabajo)) {
音调(A2, f/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(F);
}
 (!digitalRead(F)&&!digitalRead(octarriba)) {
音调(A2, f*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(F);
}

数字读取(FS);
(!digitalRead(FS)){
音调(A2, fs+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字读取(FS);
}
 (!digitalRead(FS)&&!digitalRead(octabajo)) {
音调(A2, fs/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(FS);
}
(!digitalRead(FS)&&!digitalRead(octarriba)) {
音调(A2, fs*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(FS);
}

数字阅读(G);
(!digitalRead(G)){
音调(A2, g+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字阅读(G);
}
(!digitalRead(G)&&!digitalRead(octabajo)) {
音调(A2, g/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(G);
}
(!digitalRead(G)&&!digitalRead(octarriba)) {
音调(A2, g*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(G);
}

数字阅读(GS);
(!digitalRead(GS)){
音调(A2, gs+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字阅读(GS);
}
 (!digitalRead(GS)&&!digitalRead(octabajo)) {
音调(A2, gs/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(GS);
}
 (!digitalRead(GS)&&!digitalRead(octarriba)) {
音调(A2, gs*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(GS);
}

数字阅读(一);
(!digitalRead(A)){
音调(A2, a+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字阅读(一);
}
 (!digitalRead(A)&&!digitalRead(octabajo)) {
音调(A2, a/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(一);
}
 (!digitalRead(A)&&!digitalRead(octarriba)) {
音调(A2, a*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(一);
}

数字阅读(AS);
(!digitalRead(AS)){
音调(A2,  +(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字阅读(AS);
}
 (!digitalRead(AS)&&!digitalRead(octabajo)) {
音调(A2,  /  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(AS);
}
 (!digitalRead(AS)&&!digitalRead(octarriba)) {
音调(A2,  *  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字阅读(AS);
}

数字读取(B);
(!digitalRead(B)){
音调(A2, b+(analogRead(A5)/  ));
延迟(模拟读取(A4));
数字读取(B);
}
 (!digitalRead(B)&&!digitalRead(octabajo)) {
音调(A2, b/  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(B);
}
 (!digitalRead(B)&&!digitalRead(octarriba)) {
音调(A2, b*  +((analogRead(A5)/  )));
延迟(模拟读取(A4));
数字读取(B);
}

无音(A2);


}

poYBAGL0WfqAEDQnAADbux5v0FY331.jpg

 

poYBAGL0WfyAPYIqAAC9S4PZPTw181.jpg

 

我们首先在其位置添加 Arduino Nano,然后使用代码对其进行闪烁,结果将是一个正常工作的合成器播放随机嗡嗡声,我们可以通过按下按钮或调制电位器或 ON/OFF 开关来改变声音。

 

结果

 

这是总体结果,请观看演示视频。

 

 

这就是今天的内容,请继续关注,我很快就会带着一个新项目回来。

特别感谢 PCBWAY 对这个项目的支持,看看他们以更低的成本获得优质的 PCB 服务。

和平

 

 

 

代码


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Arduino合成器V3设计案例',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);