×

远程控制Launchpad机器人

消耗积分:0 | 格式:zip | 大小:0.03 MB | 2022-12-23

分享资料个

描述

这个项目是在里斯本创客节的日期越来越近(实际上还有 2 周)时开始的,而我没有看到我正在参加足够的项目的机器人俱乐部。那为什么不再做一个呢?
它必须是交互式的,所以我开始浏览我们拥有的材料。我个人有满满一手的 TI 发射台,我记得俱乐部有一些 RF 收发器和一个操纵杆。还有一堆类似于我使用的机器人平台。所以决定使用遥控小车。
因为我从未使用过 nRF24L01,所以我使用了 Energia,这是一个用于 TI 启动板的类似于 Arduino 的 IDE。当我需要时,我仍然可以使用 TivaWare,所以没什么大不了的。它会快得多。

 

汽车:

在整个项目中,汽车没有太大变化。只是一个 Tiva 发射板、一个收发器、一个 5V 稳压器(发射板然后有 3.3V 稳压器)、一个 DRV8833 电机驱动器、2 个电机、2 个编码器、2 个轮子和 2 个脚轮,当然还有电池和底座。 
首先必须开发速度控制。我从来没有真正使用过enconders。幸运的是,Tiva 本身有一个 QEI,一个用于编码器的硬件接口。为此需要 Tivaware。设置它真的很容易,然后它会给我电机的速度、位置和方向。为此我只使用了速度和方向,然后我将速度加上车轮周长并获得以厘米/秒为单位的速度。通过测试,我发现在自由运行时电机可以达到 200cm/s,但我通常将其上限设置为 120,因为它是最大值。
然后我应用了一个真正简单的 PID,也就是一个 PI。需要进行一些调整,尤其是对于 I。
循环速度如此之快,以至于 I 的值会飙升。因此,我没有使用下面的 Ki,而是使用一个计数器来经常增加 I。这很好用。
然后我只需要让我们如何解释接收到的数据包。稍后会看到。

 

 

传输数据包

完成后,我只需要开发通过 RF 发送的数据包。我决定像一个特定的数字,一个命令号(如果将来我想添加更多),左电机方向,左电机速度,右电机方向和右电机速度。
所以基本上设置机器人以 50 的速度向前移动是 {15, 3, 1, 50,1,50}。

请注意,这些是数字,而不是数字的字符表示。所以如果我发送 speed 0 让它停止,它就不会工作。数字 0 代表字符串的空终止符,因此库不会在 0 之后发送任何内容 - 为了解决这个问题,255 将成为 0,255 意味着为该电机发送的速度为 0。

现在的方向,向后和向前。这是第 3 和第 5 个数字。1 向前。但是 -1 不是倒退 - 我出于某种原因改为使用 2,现在我只是顺其自然。

 

控制器

好吧,机器人很简单。它只需要接收电机速度并交付。
为此,我想使用新的 Educational Boosterpack MKII。它的组件和形状看起来很完美。 
为了控制一切,我首先使用 Tiva 进行测试,但对于像这样的电池供电设备来说,这会消耗太多电量。我想使用 MSP432 launchpad,但不幸的是,用于 LCD 的 Energia 库存在一些错误。所以下一个最好的东西 - MSP430F5529 启动板。

但是让我们再看看开发过程:
控制器是需要更多功能的地方。
所以首先我从操纵杆开始。

仅操纵杆控制

我尝试使用 Y 轴控制机器人的速度和移动方向(向前和向后),而 X 轴控制转动。  

Y很简单。设置中间值,应该在2047左右。做Y_Value-MiddleValue就行了。这将在前进时为您提供正值,在后退时为负值。将其转换为百分比:(Y_Value-MiddleValue)/2048,您可以乘以电机的最大速度,从而可以像这样控制当前速度。
如果百分比是负数,那么它就会倒退。
现在是 X。请注意,这个机器人像坦克一样转动,而不像汽车。它没有可以转动的轮子。您需要将一个轮子转得比另一个轮子转得快才能转弯,或者一个轮子朝一个方向转动,另一个轮子朝另一个方向转动。
因此,对于转弯,我采用了相同的方法来获得百分比。完全相同的。
现在取决于该值是负值还是正值,它会乘以其中一个电机的速度,从而降低它。
如果你把操纵杆向左推,那么左边的电机就会变慢,如果你把它向右推,那么右边的电机就会变慢。
我不太喜欢这种类型的控制。因为您对转弯和速度都没有太多控制权。如果你将操纵杆向前推得太多,那么你就不能将它向两侧推太多——这是一个圆圈,它不能那样工作。
后来我用总半径而不是 Y 轴控制速度进行了测试。但只有在测试了下一个模式之后,我才会提到——我也反对半径速度控制的原因。

 

为速度控制添加一个电位器

所以我决定加一个锅来控制速度。电位器是单圈线性的,比操纵杆提供更大的分辨率和控制。使用与 Y 轴相同的数学运算。
唯一不幸的是没有弹回中间位置。 
操纵杆 X 轴仍用于转动。

为了避免机器人失控,操纵杆按钮被用作紧急停止装置。片刻之后,您可以再次按下它以重新开始。 
但是很难知道速度是否设置为停止,所以它不会有太大帮助。LCD 用于向用户提供速度反馈。

倾斜模式 > 然后使用加速度计添加了 2 种模式。
首先,您将通过倾斜来控制整个事情。向前和向后倾斜是为了控制机器人移动的速度和方向(向前或向后)。向两侧倾斜会告诉它转动。

第二种倾斜模式将使用操纵杆向前或向后移动,倾斜只会控制转向。使用这种倾斜模式比以前更容易。

添加 LCD 以获取反馈>我打算将 TI boosterpack 与 LCD 一起使用,所以为什么不使用它来提供反馈。最有用的是通过电位器设置速度,但它也允许为所需的控制模式提供一个选择菜单。

您可以在最终产品中看到非常简单的菜单:

 
poYBAGOkGBSAW-t7AAfx_5o_u8o294.jpg
 

 


在获得 boosterpack 之前的所有这一切都生成了这个令人困惑的原型:

 
pYYBAGOkGHCAXS0gAA5q2VWGmDA204.jpg
 

将其全部集成到一个控制器中

好了,Boosterpack 到了,它很容易安装在发射台的顶部。但是 5V 和 3.3V 电源呢?收发器?锅呢?
必须制作一个小的助推器包:

 
pYYBAGOkGIuAQLzkAAWSiO4BqjA397.jpg
背面 boosterpack - 在此图片中,收发器未安装在母头上
 

之后是时候安装它了:

 
poYBAGOkGMiATgaiAAxkp1Gy0Q8507.jpg
顶视图
 
 
pYYBAGOkGQiAdMcHAAq9hCPxlxI856.jpg
侧面图
 

最后的结果:

 
poYBAGOkGUOABP_iAA-zOPaiUVY470.jpg
控制器与小车并排
 

 


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

评论(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:'远程控制Launchpad机器人',//标题 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);