×

LEGO EV3神话生物DNA扫描仪开源

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

张磊

分享资料个

描述

从为今年的科学项目制作原创作品的意愿开始,我们齐心协力,对现有的LEGO Mindostorms 机器人 MR.B3AM进行了审查设计与该设计不同,尽管我们的 LEGO EV3 DNA 扫描仪所做的不仅仅是“咀嚼”一块单色砖来说明它的长度,我们的扫描一系列 8 2×2 砖,可以是红色、绿色、蓝色和黄色,将这个序列与如果序列与神话生物的序列匹配,则返回内部数据库并报告。一个项目怎么样!

我们试图解决什么

基本思想非常简单。DNA有四种组合:

  • 助教
  • CG
  • GC

LEGO EV3 Mindstorms 套装中的颜色传感器可以检测 8 种颜色,其中包括蓝色、绿色、黄色和红色。我们为每个组合分配了一种颜色:

  • AT - 蓝色
  • 助教 - 绿色
  • CG - 黄色
  • GC - 红色

由于我们无法构建太长的序列,我们决定将自己限制在 8 个 2x2 的砖块上,这为我们的生物提供了大量的组合。

poYBAGOYqZqAY42LAAD1nHfPnBo368.jpg
我们的基因
 

我儿子认为它们都是神话生物,他想出了 10 个序列:

Alicorn
Chupacabra
Dragon
Gargoyle
Minotaur
Nessie (Loch Ness monster)
Pegasus
Phoenix
Unicorn
Yeti

每种颜色都与一个数字相关联,当需要将信息存储在变量中时,该数字非常方便。当时的序列是:

Alicorn 43255542
Chupacabra 44355232
Dragon 33345422
Gargoyle 43542532
Minotaur 55432224
Nessie (Loch Ness monster) 33225243
Pegasus 35242255
Phoenix 22244535
Unicorn 44352432
Yeti 43255235

构建机器人

现在我们有了我们的样品,我们必须构建机器人并在此过程中对其进行修改,以接受比 MR.B3AM 更大的棒。不得不说,一个人可以用 1x1 和 1xN 底板制造棒,但这些和平很少发生,我们不想等待 Bricklink 运送我们需要的所有东西,更不用说花时间寻找它们了.

poYBAGOYqaGANVpsAAKlvnaE9ag964.jpg
开口更宽更高
 

正如您可以从下面的照片中看到的那样,与最初的 Mr.B3AM 设计相比,我们的设计略高,4 个齿轮间距更宽。

poYBAGOYqbeADFu0AAg5oMJWxsI154.jpg
侧面显示了一些调整
 

其余部分没有太大变化,实际上电机和 EV3 积木已按照原始说明安装

pYYBAGOYqdSAe6ncAAg1d5tuo2I044.jpg
大部分设计保持不变
 

不幸的是,我们没有记录构建过程中所需的更改,但其他人应该不太难弄清楚。

编码

在机械、电子和软件之间保持适当的平衡总是很困难。在某些平台上比其他平台更多。遗憾的是,对于 LEGO EV3,电子方面不可用,因为该平台并没有真正提供任何方法来轻松扩展定制电路,我认为这是一种耻辱,尤其是在 Arduino、ESP 和 Raspberry Pi 的时代。在我们的例子中,由于构建是 MR.B3AM 的模型,因此重点肯定是代码。

我们没有从中获得灵感的是 MR.B3AM 的代码,因为我们最初认为我们知道得更好:) 我们没有:(

pYYBAGOYqfGADG8DAAlcNmVPckk515.jpg
程序终于在我们的 EV3 砖上
 

视觉平台非常直观,这是我儿子大部分时间都在做的事情。

在第一部分,他的任务是开发主程序,负责将 DNA 棒移动到颜色传感器前,依次检索 2x2 砖块的颜色,说出颜色并显示,存储每种颜色在数字数组名称样本上,重复该过程 8 次并弹出棒。

pYYBAGOaaw-AMib9AACL9PRjNxU254.png
主程序第 1 部分
 

第二部分要复杂得多,至少对我来说是这样 :) 使用从第一部分收集的样本,他应该使用我的自定义块Find_Sample_DB返回野兽的名称或未找到以防序列是未知的。然后,他将输出输入到一个开关块中,该开关块播放动物的噪音并显示它的名字。未找到任何内容时,播放错误并显示未知

poYBAGOaaxGARCBKAABC-1E-YTg398.png
主程序第 2 部分
 

在幕后,一系列非平凡的定制块让我有时后悔开始这个项目。例如,数组是一种以不寻常的方式处理的东西,我不得不花一些时间来了解如何使用它们。一旦我完成了阵列比较块,就可以知道我们收集的样本实际上是否与我们的神话生物之一相同。这里的困难是将我在“普通”书面语言中学到的东西分块呈现出来。

pYYBAGOaaxSAZnf6AADYFBisoEo761.png
数组比较
 

在我看来,块失败的地方是,在某些时候你可以很容易地失去情节,特别是如果 GUI 决定重新路由各种电线 OMG!这是一个更复杂的自定义块的情况,我从“DB”文件中读取已知样本并进入临时数组。

DB 只是一个长文本文件,我在其中一个接一个地写下每只野兽的编号。在 8 的倍数中,我可以从一个到另一个,这就是我所做的,因为读取文件块在每次读取后将索引移动到下一个元素。

4
4
3
5
2
4
3
2
3
5

前八个 (0..7) 是独角兽,然后是飞马座 (8, 9),依此类推。

因此,您打开文件并在关闭它之前,尽管最终您必须关闭它,但要对文件中的第 6 个数字说您调用读取文件块 6 次。

这就是File To Array所做的,因此它不会错过第一个序列 我创建了一个特殊的开关,如果指定的偏移量为 0,它什么也不做

该块实际上期望输入数据库文件的名称,一个数字 N 指示从哪里开始寻找 DNA 序列和我们收集的样本。它返回一个数组,代表我们文件中第 N 个野兽的 DNA。

poYBAGOaaxaANABzAADTb-kTEwI185.png
文件到数组
 

使用这两个自定义块,我可以创建最后三分之一,它需要作为输入文件的名称和收集的样本返回一个字符串,该字符串是找到的野兽的名称。

如果文件已被读取超过其末尾,则File To Array块将返回 0,这意味着寻找神话野兽的任务最终没有找到。两个红色块和相邻的开关处理这种情况,如果不是我们到达文件末尾的情况,开关告诉我们我们仍然可以并且正在搜索。

第一次进入这个块时,我们从头开始读取数据库文件,我们得到第一个已知序列,恰好是独角兽,然后我们将它与我们收集的样本进行比较。

pYYBAGOaaxmANKbNAAD8IjNxWr0147.png
查找示例第 1 部分
 

如果它们是匹配的,那么我们找到了!如果不是,我们将File_Offset变量增加 8 并通过在循环开始处返回来移动到下一个已知序列。

pYYBAGOaaxuATZXiAADITSfgoHc409.png
查找示例第 2 部分
 

当我们找到样本时,或者如果我们在没有匹配的情况下遍历整个 DB 文件,我们会中断Sample_in_DB循环。退出循环后,我们以数字方式计算匹配的序列并使用开关返回正确的 DNA 序列。例如,如果我们的变量File_Offset是 24,那么我们知道第 3 个生物是匹配的,我们返回一个字符串为 Dragon。返回一个刺痛而不是一个数值让我儿子的事情变得更容易,所以虽然不是最好的方法,但它对我们的需求是有效的。

最后的想法

这是一段很棒的旅程,我和我的儿子在这个平台上学到了很多东西,这个平台既强大又有趣。看看 EV3 如何与MicroPythonScratch一起工作将会很有趣,以便能够对比和比较每个平台的优缺点,这些平台显然具有不同的年龄目标,但仍然可以提供一些重叠的范围。

我希望传感器和配件不要那么贵,我们喜欢乐高,但这个平台的成本并不能帮助休闲爱好者或不那么富有的人负担得起。在我们的案例中,我认为我们不会轻易冒险购买陀螺仪、超声波传感器或电池组。

平台不开放以方便扩展的事实有点打击,我的意思是乐高毕竟是一块砖上的砖,我知道有保护品牌的愿望和需要,但我我不是封闭系统的忠实拥护者,我认为它们是有限的,而且主要是有限的。

总而言之,这很有趣,如果你碰巧有一辆 EV3,你当然应该花时间探索它的可能性。这个平台已经存在了很长一段时间,也许一个新的平台很快就会出现,事实上我看到其中有很多在 eBay 上出售,所以也许现在是投资的好时机一。


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

评论(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.jibsdb.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:'LEGO EV3神话生物DNA扫描仪开源',//标题 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:"https://www.elecfans.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);