×

万圣节机器人V2开源

消耗积分:0 | 格式:zip | 大小:16.75 MB | 2023-01-30

敷衍作笑谈

分享资料个

描述

历史

在我成长的过程中,街对面的少年(罗伯特)创造了一个“机器”来为万圣节分发糖果。Trick or Treaters 会进入他们的入口通道,并受到他的一位打扮成疯狂科学家的朋友的欢迎。机器被安置在楼梯上,上面挂着天鹅绒窗帘(当然,窗帘后面藏着一个朋友)。您可以从四种不同类型的糖果中进行选择,然后通过莫尔斯电码键输入正确的数字来做出选择,该电码键会发出足够大的哔哔声,让后面的人听到,然后将正确的选择发送到滑槽中。有时声音太大听不见,或者后面的人分心了,结果选错了。对于更高版本的机器,

最终,罗伯特上了大学,并将火炬传递给了我。我用一个纸板箱制作了我自己的机器版本,里面贴有插槽和斜坡,并与我的好友乔一起享受了多年运行机器的乐趣。当我最终上大学时,机器的传统被搁置了,我们回到了黑暗时代,在那里,不给糖就捣蛋的人被迫以老式的方式接受糖果。

终于,在 2013 年,光明再次开始闪耀。在过去的 25 年里发生了很多事情,包括 Arduino 和 Adafruit(以及我的孩子——机器的新继承人)的诞生。我们构建的V1终于实现了创建完全自主的糖果机器人的愿景。它工作得相当好,但确实卡住了(有时糖果棒无法转动 PVC 弯头的角)并且会定期冻结并且需要在糖燃料捣蛋机一次捣碎所有按钮时进行硬重置。我们用它运行了 5 年。然而,今年,我们最近获得了令人惊叹的Glowforge激光切割机和MarkForged碳纤维 3D 打印机,我们决定是时候让 V2 解决 V1 的一些问题了。

具体来说,我们想:

  • 使糖果分配器防弹。不再有卡纸或失火。
  • 改进处理器间通信(我们使用一个处理器运行按钮和步进电机,另一个运行灯光秀)。为了获得正确的时机,他们需要相互交谈并保持同步。
  • 当孩子在 10 毫秒内按下每个按钮时不会冻结。
  • 建造一个更坚固的外壳(V1 使用传统的啤酒盒作为外壳)。

糖果处理

我们继续使用步进电机,因为它们可以产生足够的扭矩并且可以转位。我们考虑过使用旋转木马或摩天轮来固定糖果,但为了简单起见,决定继续使用通道方法(糖果需要转弯的次数越少越好)。我们没有使用只有固定 ID 的 PVC 管,而是决定激光切割定制通道。最初,我们尝试将糖果棒从上到下堆叠,认为我们可以获得最高的包装密度。然而,在装载时,糖果往往会俯冲并堵塞,因为棒没有完全受限。为了解决这个问题,我们尝试了一个底部倾斜的版本,但这并没有可靠地解决问题。最终,我们回到了端到端的配置,因为糖果被完全约束并且只能朝一个方向(向下)移动。

下一个任务是计算尺寸,因为“有趣的尺寸”在尺寸条与条之间有一些变化,以及延伸到糖果主体之外的挤压端盖。经过五次左右的迭代后,我们找到了一个效果很好的通道尺寸。糖果从顶部装入并重力喂入。通过轮毂连接到步进电机的推杆在其被激活之前充当门,以防止意外放电。当步进器激活时,它的伙伴会旋转 180 度,将糖果踢出通道。事实证明,该系统非常可靠地工作。主要缺点是由于端到端堆叠导致糖果容量较低。推杆也需要间隙才能旋转,因此有必要确保它们不会在弧形中卡住线束。

住房

现在我们已经锁定了糖果分配器,我们在Onshape中对其进行了图案化,然后在其周围构建了外壳。因为我们使用的是 Glowforge 激光切割机(这很棒,因为床尺寸大且切割时间快),我们使用了凸耳和槽设计来连接各种组件。我们试图考虑零件的组装和自锁方式,以及模块化和可访问性。在少数情况下,零件太大,所以我们将它们分开并使用燕尾槽连接它们。关于如何通过垂直于糖果通道进行切割来保持结构完整性,我的女儿对后片提出了一些很好的建议。由于激光的切口,我们不需要为标签留出间隙。

电气

如前所述,我们坚持使用双处理器设计,选择 Adafruit Feather M0 Basic Proto - ATSAMD21 Cortex M0和步进屏蔽。事实证明,这些处理器非常容易交谈并且得到了很好的支持。双处理器设计增加了处理器相互通信以保持同步的复杂性,但为未来的配件(如弹射器)提供了额外的 I/O。处理器在提供八种状态的三条线上传输数据,然后在每个方向(总共 5 条线)使用中断触发器。对于灯光秀,我们使用了蜿蜒成矩阵的 Adafruit RGB Pixel Strand 。外部 74AHCT125 - 四路电平转换器(3V 至 5V)需要芯片将电压芯片从 Feather 出来的 3.3v 提高到进入 LED 灯串的 5V。

我们使用面包板测试接线,然后为两个处理器焊接带有插座的原型板(以防我们不小心炸毁处理器)。电压电平转换器藏在光处理器下面,因为我们的电路板空间不足。连接器使拆卸主机变得容易。

软件

为了提高对按钮按下的响应速度,并最大限度地减少同时按下多个按钮时卡住的可能性,我们决定采用硬件中断驱动方法。释放时,该按钮会触发一个硬件中断,该中断会激活一个软件标志,指示哪个按钮被按下。我们将中断函数保留在一行代码中以处理多次按下按钮的情况,并使用一个标志来激活一个单独的函数来分发糖果。主循环也保持较短,以提高响应能力。

对于灯光秀,我们将 LED 串从线性系列重新映射为矩阵(行/列),然后在机器人空闲时和按下按钮时创建多个动画。

观察

总的来说,V2 工作得很好,我很自豪我们实现了我们的目标。我们注意到 Fun Size 条的尺寸有所不同——今年它们似乎有点厚。虽然 V1 的设计没有那么稳健,但从 ID 的角度来看,我认为它更有趣一些,是疯狂科学家会建造的东西。它还很好地揭示了内部工作原理,这很有趣。对于孩子们来说,参与 Onshape 的机械设计、Glowforge 的激光切割以及Adafruit Feather的颜色编程非常棒。它使看似神秘的东西(那些机器如何工作)变得更容易理解和平易近人。

下一步是什么

  • 现在我们已经让基本机器运行良好,明年我们可以添加许多新功能,包括:
  • 可调整的糖果通道以处理 Fun 大小的未来变化。
  • 能够处理不同的糖果,例如棒棒糖和 Twizzlers。
  • 更多的灯。
  • 声音!
  • 用于收集糖果的弹射器,然后将其“Tom Brady”放入捣蛋鬼的包中。

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

评论(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:'万圣节机器人V2开源',//标题 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);