×

Tile Tapper:由TI MSP430控制的机器人

消耗积分:0 | 格式:zip | 大小:3.16 MB | 2023-07-07

卓侨汉

分享资料个

描述

介绍

Tile Tapper 是一款完全由 TI MSP430 控制的机器人,旨在播放 iPad 应用程序“Piano Tiles”。为此,使用光敏电阻来确定穿过屏幕的给定图块是黑色还是白色。然后,四个相应的电机使用此信息来敲击触控笔并在正确的时间敲击瓷砖。

守则_

定时器 A:发生在 MSP430 定时器 A 中,ADC10 DTC(模数转换器,数据传输控制)用于读取四个光敏电阻并将它们的值每 0.5 毫秒发送到一个全局四元素整数数组。在 ADC10 ISR(中断服务程序)中,这四个光敏电阻与特定电机相关联并为其读数指定阈值。这些阈值决定电机看到的是白色还是黑色,从而决定手写笔是否应该在屏幕上轻敲。

定时器 B:在定时器 B 中同时发生,“向上”或“向下”命令用于使用每个电机的数字 I/O 引脚设置手动 PWM 信号的占空比。时钟每 20 毫秒循环一次计数器,以创建 50 Hz 的 PWM 频率,这是伺服电机所要求的。

机械设计

最初的原型是使用卡板、扎带和胶水制成的,以便快速组装。这允许有效的概念验证,并最终确定最终设计的电机、光敏电阻和电线长度的位置。在图 2 和图 3 中,显示了光敏电阻支架和电机外壳的纸板原型。对于最终设计,3D 打印用于制造将电机固定到位的外壳。亚克力被切割并用于将光敏电阻固定在瓷砖列上方,以读取四行每一行中的瓷砖。最终原型如图 4 所示。

pYYBAGOSn66ASkT8AAqgOs-t36Y341.jpg
图 2:光敏电阻阈值测试
 
poYBAGOSn7GAWMV6AAH2wDE7KsQ540.jpg
图 3:初始纸板原型
 
pYYBAGOSn7aAK1Q_AALC8pd-9Lw946.jpg
图 4:最终原型
 

软件:

在该项目中要解决的最突出问题是 MSP430 上可用的定时器数量有限。知道定时器 A 最终将仅用于读取光敏电阻并使用 ADC10 DTC 全局存储它们,确定如何在一个定时器内使用 PWM 信号控制所有四个伺服电机成为一项挑战。这一挑战最终通过在正确的时间手动设置数字 I/O 引脚的高电平和低电平来为电机创建必要的 PWM 信号来解决。

下一个挑战是确定计时器的合适速度。最初,两个定时器都使用 0.1 毫秒的时钟周期,因此光敏电阻会快速更新,伺服电机几乎会立即响应。伺服电机需要频率为 50 Hz 或周期为 20 ms 的输入信号。使用 0.1 毫秒的时钟周期允许我们使用 200 个时钟周期来产生我们的 PWM 周期。可以使用 3% - 13% 或 6 - 26 个时钟周期高电平的 PWM 占空比控制整个范围的伺服电机,而其余时钟周期则为低电平。

0.1 毫秒的时钟周期最终成为问题,因为微处理器无法在 DTC 中进行采样和转换,也无法足够快地切换 I/O 引脚以产生 50 Hz 的频率,从而导致电机无法使用。

最终时钟周期为 0.5 毫秒,这是采样速度与 MSP430 产生 50 Hz PWM 的能力之间的平衡。该时钟周期对应于 40 个时钟周期的 PWM 周期。虽然这仍然是播放 Piano Tiles 的相对较慢的速度并且限制了 PWM 占空比的可用选项(2-5 个周期对应于仅 4 个触控笔角度),但它允许光敏电阻读数和占空比设置之间相对较快的响应时间。

硬件:

在为该项目编译和微调软件后,组件装配和约束出现了一些问题。首先要解决的问题之一是使用的备用伺服电机的电线长度以及连接光敏电阻的电线长度。连接到电机的三线带相当短,如果不从多个方向拉动威廉希尔官方网站 板,很难将所有电机定位在 iPad 周围。为了解决这个问题,将延长线与每根电线收缩管焊接在一起以避免短路。这些是我们功能性总装的关键组成部分。下面的图 5 显示了这些延长线之一的一端图像。进行了类似的焊接以延长连接到光敏电阻的电线。

pYYBAGOSn8SAUgmgAAZshO9P1bA888.jpg
图 5:伺服电机延长线
 

另一个痛点是 iPad 本身周围的电机和光敏电阻的限制。

 

结论

在开展此项目时,M&P430 团队探索了如何将 MSP430 应用于从业余电子产品到现实技术的广泛项目。该项目将处理器推向了极限,平衡了处理能力和速度,以实现其设计目标。


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

评论(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:'Tile Tapper:由TI MSP430控制的机器人',//标题 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);