×

可编程音乐盒的构建

消耗积分:2 | 格式:zip | 大小:0.45 MB | 2023-06-28

分享资料个

描述

动机

我一直很喜欢玩八音盒,实际上在家里也有收藏。能够按下一个按钮,或者转动几圈曲柄,然后突然在你的手中播放音乐,这真是太新奇了!这个可编程音乐盒是仿照一个更“传统”的音乐盒(以这个为例当您购买传统的可编程音乐盒时,您会得到一个基于曲柄的音乐盒、特殊纸张和用于在该纸张上打孔的特殊打孔器。你在纸上打孔的地方“抓住”每根弦,因为它穿过音乐盒,这就是你发出声音的方式。

但是,问题在于这些可能有点贵。而且,除此之外,你还需要特殊的纸,一旦你用完了那张纸,你就得买更多。我想做一些你可以在家里用便宜的零件建造的东西,而且你不需要特殊的纸!

概述

如上所述,这个音乐盒的运作机制与上面的音乐盒类似;您可以通过在纸上打孔然后将其送入盒子来选择播放的音符。但是,有几个主要区别:

1.这里不是使用手动曲柄送纸,而是通过连续旋转伺服来完成,可以通过按下按钮来打开和关闭!这种变化主要是因为我真的想在这个项目中使用伺服。

2.每个孔的检测方式如下。首先,将 2 根电线焊接到铜板的每一端,以便将其接地。然后,将7根线放在铜板的顶部;这些线连接到 PocketBeagle 上它们自己的模拟输入引脚(每个音符一个:A、B、C、D、E、F、G)。打孔纸穿过铜板的顶部,以及这些电线的下方;当铜板和这些导线之间有纸时,模拟输入引脚读取的值会随机上下浮动。当有孔时,电线将暂时与接地铜板接触,因此模拟输入引脚将读取 0(或接近该值的某个位置)。

因此,您所要做的就是将纸放在铜板上,按下按钮开始,然后观看音乐开始播放!

初步图表和规划

在开始把这个项目放在一起之前,我首先列出了我希望音乐盒具有哪些功能:

1.多个扬声器一次播放多个声音

2.一个开/关按钮

3.伺服驱动纸张

4. LCD 显示八音盒状态

这些都在下面的框图中进行了可视化:

poYBAGN2_mKAKnH_AAFXs9ulxOU343.png
系统框图
 
pYYBAGN2_mWAGujpAAJyB83Olo8514.png
电源框图
 

请注意,只有 6 根线连接到模拟输入引脚,而之前提到了 7 个引脚(AG 之间的每个音符一个)。不幸的是,由于 PocketBeagle 只有 6 个 AIN 1.8V 引脚,因此必须省略其中一个注释。

所有这些组件的实际接线可以在下面的 Fritzing 示意图中看到:

poYBAGN2_mmAKOv1AAWavd16KWc996.png
音乐盒的 Fritzing 示意图
 

构建说明:硬件组件

扬声器

音乐盒包括 3 个扬声器,这意味着音乐盒最多可以同时播放 3 个音符。如下图所示:

poYBAGN2_m6AVYZsAAg0XBtLh6w124.jpg
扬声器设置
 

每个扬声器的一端接地,而另一端连接到 PWM 输出。特别是,我使用了 PocketBeagle 上的 PWM0-A、PWM1-A 和 PWM2-B 引脚。这很好,除了一个小问题:由于某种原因,我的 PocketBeagle 上的 PWM0-A 引脚无法以 400 Hz 以外的频率输出信号。上网查了一下,这似乎是一个非常罕见的问题,没有明确的解决方案。鉴于此,我决定离开第三位演讲者,希望尝试这个项目的任何其他人都不太可能遇到同样的问题。

另请注意,我们只有 3 个扬声器,这意味着一次只能播放 3 个音符。如果八音盒读取的音符超过 3 个(即连续打孔过多),代码设置为随机选择 3。

4位7段显示器

4 位 7 段显示器的目的是让用户可以知道设备是打开还是关闭。音乐盒关闭时显示屏将显示“off”,如果音乐盒打开则显示“go”(选择“go”而不是“on”,因为 7 段显示屏无法显示“n”)。在我的设置中,该显示器连接到 PocketBeagle 上的 I2C1 引脚,并为 SDA 和 SCL 线路配备了适当的上拉电阻,并根据需要连接了电源和接地:

pYYBAGN2_nSAFbLIAAmo0r1WQ3c503.jpg
HT16K33 设置
 

按钮

如上所述,使用了一个按钮来允许用户打开和关闭音乐盒:

pYYBAGN2_nuAE56gAA5g1r3Z7t4744.jpg
按钮设置
 

按钮的一个端子连接到上拉电阻以及 PocketBeagle 上的 GPIO 59,在下面的代码中已将其配置为 GPIO_IN 引脚。另一端接地。因此,未按下按钮时,GPIO 引脚将读取“1”,按下按钮时将读取“0”。因此,代码可以简单地检测“0”以查看按钮是否被按下。

连续旋转伺服

如上所述,连续旋转伺服用作移动纸张通过页面的“曲柄”。这是典型的接线方式,伺服系统的“信号”引脚连接到 PocketBeagle 上的 PWM0-B 引脚。旋转速率固定为 400Hz,占空比为 25。

除了硬件组件之外,伺服系统还用橡皮筋包裹着,以确保它可以在旋转时真正“抓住”并移动纸张。这显示在下面:

pYYBAGN2_oKAKmhpAArz83PgGEk218.jpg
连续旋转伺服设置
 

标头引脚

整个设置中最重要的部分是检测音符的实际电线!这些线中的每一条都连接到不同的模拟输入引脚;特别是,使用的引脚为 P1_19、P1_21、P1_23、P1_25、P1_27、P2_36。这些电线连接到插头引脚,以便它们可以轻松固定到位。如下图所示:

pYYBAGN2_oiANKJdAAz2-Y3AkzY910.jpg
接头引脚设置
 

(请注意,图片中有 7 根电线,而实际上只有 6 根连接到 PocketBeagle —— 第 7 根额外的电线主要是为了保持间距而留下的)。

如前所述,由于这些电线大部分时间都没有连接到任何东西,所以只是浮动。但是,当它们与接地铜板接触时,它们所连接的 Analog-in 将显示为 0!

铜版

最后的组件只是一个接地的铜板。使用的铜板与您可能会发现用于 PCB 轧机的铜板相同。我将一根电线焊接到铜板的每一侧,然后将每根电线插入 PocketBeagle 上的接地:

pYYBAGN2_pCAQm-wAAzI7HIU0cM175.jpg
焊线到铜板
 

八音盒的物理组装

连接所有电气元件后,就可以将所有东西组装到实际的音乐盒中了!

首先,取铜板,用强力胶粘两块硬纸板,形成音乐盒的侧面,足够近,以便插头销可以牢固地楔入:

poYBAGN2_peAGJAKAA247HQJC4U143.jpg
 

然后,将连续旋转伺服系统强力胶粘到音乐盒的一侧,高度准确,使伺服“臂”几乎不接触铜板:

pYYBAGN2_p6AW6MqAA_EVuUi2ts056.jpg
 

就是这样,我们完成了!

代码设置

1. 使用来自 BeagleBoard.org 的最新 PocketBeagle 映像

2. 从这个 repo下载这个 project_01 文件夹,解压,然后移动到你自己的 PocketBeagle 上的 Cloud9 IDE

3. 确保您在本地安装了 Python 以及 Python AdaFruit_BBIO 包。如果没有,执行的步骤是:

sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus-y
sudo apt-get install python-pip
sudo apt-get install python3-pip
sudo pip install Adafruit_BBIO

4.导航到project_01文件夹,并更改运行脚本的权限

chmod 755 run

5. 使用 Chron 以便程序在以下步骤中自动启动时运行

  • 导航到您的本地 cloud9 文件夹
  • 键入“mkdir 日志”
  • 输入“sudo crontab -e”
  • 添加到文件末尾:
@reboot sleep 30 && sh 'run' script> > /var/lib/cloud9/logs/cronlog2>&1

6.重启PocketBeagle,等待30秒后代码会自动运行!

操作说明

1.打孔纸获得想要的歌曲

pYYBAGN2_qOAPklaAAgx97H1gjE572.jpg
(很明显我没有打孔器)
 

2. 将纸张送入八音盒,足够远,使其部分位于连续旋转伺服下方

poYBAGN2_q6AM84qABFo5eyhIC4453.jpg
 

3.打开PocketBeagle,等待30秒让程序自动启动

4.按下按钮开机,享受音乐!

pYYBAGN2_rSARt7EAAs5v2LtWKY580.jpg
 

 

 

  • 有时,大头针在孔上停留的时间过长,这会记录为多个音符
  • 当多个音符注册在一起太快时,这会在积压中为扬声器创建一个缓冲区,这会在音乐盒和正在播放的实际声音之间产生延迟

这些将是该项目需要的两个主要修复。我想为这个项目做的其他改变,继续前进,是:

  • 为设备创建更坚固的外壳(使用激光切割机或 3D 打印机)
  • 减少音乐盒检测到孔的时间和扬声器播放时间之间的延迟
  • 找到一种合并更多音符的方法(即包括带有临时记号的音符)
  • 添加音量控制
  • 添加一种控制连续旋转伺服速度的方法

致谢

最后,特别感谢 Erik Welsh 教授 ( https://www.hackster.io/welsh ) 为使这个项目成为可能提供的所有帮助!


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

评论(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.lene-v.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:'可编程音乐盒的构建',//标题 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.lene-v.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);