分享

Micro:bit编程小车系列(三)

 长沙7喜 2019-07-03
上次我们编写了一个遥控程序,让贝克一号开动起来。 现在我们开始让它聪明起来。 先别急,凡事一步一步来,我们这就出发。 首先我们和以前一样打开编程页面,并且加载好需要的插件。 
然后,我们新建一个函数。其实这个地方的函数如果当作程序语言来理解可能更难一些。简单点,大家可以把这个函数当作是一个预置的动作组合。我们将这个函数命名为前进。 

我们将这个函数命名为前进。

我们将从插件中找到电机运转的程序积木块,放到函数“前进”中,这个函数就做好了。这里要注意一下,贝克一号的电机是M1A和M1B,左边的是M1A,右边的是M1B。

这样,放在这里,就可以直接简单的调用这个函数(预置动作组合)了。比如我们写了一个最简单的当开机的时候调用前进函数。

3


为了方便看是否刷机成功,我们再加一个显示图案。

果然,是运转起来了。还显示的心形。不过履带转动有点快,所以我将速度调低了一些。 
什么,如何刷机?再翻翻前面的教程哦。

这样,我们边试验边摸索,就把前进、后退、左转、右转都预置出来了。

通过这个下拉菜单可以方便的切换,这样检验更方便,不用再重新编写程序。 接下来,我们要开始让它自己动起来了。首先我想弄一个简单的可以自动避开障碍物的程序。慢慢来,先来个简单的。  

首先,我们可以整理一个基本的逻辑思路。也可以用铅笔画画草图。 我们的逻辑就是,开机,往前走,遇到障碍物,就一直左转,如果前方检测不到障碍物了,就继续前进,如此循环。

于是,我们将这几个组成部分的要素找出来。积木块可以在设备、逻辑、引脚、基础这些菜单找到。 这里应该好明白,不过那个引脚的积木我要解释一下,这个引脚就是用来读取红外距离传感器所探测到的距离数值的。这个数值不是直接代表的距离,而是一种0-1023之间变化的数值,经过运算是可以转化为真实环境的距离的,不过现在我们还不用做这个转化。  

小窍门,可以将这个嵌套进小框里。很多块都可以嵌套到各种小框里,大家多试试。

按照上面的逻辑组合,我们利用了条件语句,如果传感器的数值过700,则显示X并且左转,否则(数值小于700),显示箭头并且前进。 这里不知道大家注意到没,上面的“当开机时”换成了“无限循环”。 因为“当开机时”代表的是开机运行一次,如果用那个语句,就会变成,开机检测数值,然后执行下面的左转或者前进,而后会一直保持那个状态不变,就变成了一直左转或者一直前进了。所以这里换成了无线循环,也就是说开机后,会不断反复执行这个程序,不断的判断数值大小从而决定是前进还是左转。 
不信? 

---“实践是检验真理的唯一标准”--- 

好,我们把他们嵌套起来,色彩变鲜艳了。可以刷机试试看。(当色彩是淡色的状态代表这个语句没有起作用)
玩了一下,动起来了,好像是这个意思。 不过,好像有点笨。
没关系,我们会慢慢让他更聪明! 这次就到这里吧,下次再见! 其实,我没走。 刚才好像听到有同学在说为什么那个数值是“700”,这个700代表什么。 说实话,我也不知道代表什么,只是他会变。 如何变?还是编个程序自己感受下吧。

..............

..............

其实,我没走。 刚才好像听到有同学在说为什么那个数值是“700”,这个700代表什么。 说实话,我也不知道代表什么,只是他会变。 如何变?还是编个程序自己感受下吧。看起来特别简单。

反复显示这个距离传感器返回的数值,引脚 “P2” 别选错了哟。

这个数值是滚动显示的。会根据障碍物距离发生变化。 所以这个700,其实是可以根据大家的喜好换成别的数值的。具体多少最好,大家自己体会吧。 好玩的话,可以自己做个探测器玩。根据我的经验障碍物距离越近时数值会越大。 

另外就是,不知道大家有没感觉,每次一刷机,贝克一号就会自己马上动起来。其实是有点不方便的。 能不能利用机身上的按钮,按一下再运转程序,按另一个就停止。 我们试试。这里我们将变量中的item拖出来,然后新命名一个,叫做”开关“。这个开关其实是一个变量,可以为0或者1. 我们理解当其为1的时候就是打开了这个虚拟开关,当其为0的时候就是关闭了这个开关。 于是我们可以编写这个程序,如图

当按下A键的时候,”开关“为”1“,当按下B键的时候,'关'为”0“,主程序中”如果开关为1,则进行下面的运转,如果开关不为1,就不启动下面的程序“,怎么样,是不是很棒!

 
还不赶紧试试。 
试过了吗? 
真的吗? 
发现问题了吗? 
哈哈,这个程序是错的。 
哪里错了?能想到吗? 
给一点提示。 

采用了这个程序的贝克一号会有什么表现呢?是不是开机的时候没有动,按B键无效,按A键启动了。到这里逻辑都是没有问题的。 
但是,一旦启动了,就一直动了,再按B键也不会停止了。 

想一想怎么改? 
好吧,我还是公布一下正确的吧。 

没错,就是前面的条件语句用错了。那个语句是一旦达成条件就会一直运行,而如果,则,否则的语句是用来判断条件的两端的。 也就是说这两个语句的区别是前者”如果满足就如何“,后者”如果满足就如何,不满足就如何“,很明显就是缺了后面一部分,所以就表现为一旦启动了,就再按B键也没用了,因为压根没想过后面要如何。 
好了,赶紧试试吧。 现在是不是听话多了,按A就走,按B就停。 

最后,细心的同学可能会发现,前面我的前进,M1A和M1B都是相同数值,而现在变了,变得不对称了。 
因为,不管是公差,阻力,组装,或者是个体差异,都会造成电机的最终实际传动效率不同。所以理论上相同的数值,但实际出来的效果不同,这就要大家细心的调试了。我的贝克一号在调试后,数值就变成了这样,大概是右侧的动力没有左侧的好,也可能是阻力太大了。所以我通过修改了程序里的参数来修正了这个误差,不然车子跑的时候会慢慢往右边偏离,修正后就可以走直线了。转弯也是如此。 

-End-

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多