microbit教程 两块microbit之间的无线传输复杂数据---重力感应器遥控小车
一。问题描述
用一块microbit作为主控板,板载陀螺仪(重力感应器),可以用来前后旋转,左右滚动,得到不同水平方向(X轴,Y轴)的数据。两块主板之间通过2.4G方式通信,另一块板将X轴,Y轴数据接收后,控制小车左右轮的前进,后退,转弯等动作。
1.先看发送端重力感应器数据的获取与发送
将microbit水平放置:
从左到右为X轴,角度为0。
从上到下为Y轴,角度为0.
X轴的偏转角度量,即沿Y轴旋转,为横滚。如下图:
沿Y轴逆时针旋转(向左)为负值。实际值在-90----0之间。
沿Y轴顺时针旋转(向右)为正值。实际值在0----90之间。
即沿着轴向箭头方向的数值为正,反方向为负。同理实测,Y轴前翻为负值,后翻为正值。
发送端代码如下:
无线设置组,即无线的通信频道,值在0-255。
用无线循环的方式,将重力加速度的水平方向上的X轴与Y轴数据不停的发送出去。距离10米,最远50米。
2。接收端代码与问题如下:
<1>在无线接程序块中,接收只能使用一次。即全局的接收一直在进行,但程序块只能调用一次。
<2>那如何在一次的代码中同时接收x和y两个数据呢?
在发送端,可以看到,发送数据类型为纯数字,名称=值,字符串。没有其它复杂数据类型,比如json数据,数组之类的。
接收端的方式所以也很简单,对应的接收纯数字,名称=值,字符串。
如果只接收X轴或者只接收Y轴,失去了用X轴和Y轴偏移角度共同遥控小车转弯的目地。只能前进,后退,转弯。而不是在前进的过程中,根据X轴的角度,适当向左或向右偏转。
这就是问题重现的重点:
两块microbit之间如何无线传输复杂数据????
二,解决思路与方案:
1 ,数位拼接与拆分
举例:
用数位的多少来表示。比如x=12,y=56,表示出来就是012 056,计算方式为合成数M=X*1000+Y.
拆解方案为M/1000求余数,余数就是Y的值。X的值用合成数去掉Y的值,X=M-Y即可得到。
现在的问题是,用多少数位来表示每个坐标轴上的值呢?2位,还是4位??
这要看发送端的x,y分别占用几位。测试方法很简单,用microbit主板自带的led阵列显示一下,看看用了几位数。
.
经实际测试,角度占位为整数,值在-90-90之间。
现在可以用2位数方法10x+y方式拼接了吗??不可以!
还要考虑负值对值的影响。
解决方法很简单,分别加上90,让X,Y轴的值都大于0,值变成0-180之简。很明显,我们最少需要用3位数来表示一个值。
发送端代码如下:
对于接收端,需要做两件事:
一是把合成数值正确拆分,二是将拆分后的值正确驱动左右两个电机工作。
先看合成数值拆分:
合成数值除以1000,求得余数,再减掉90,才是Y轴的正确偏转角度值。
合成数值去掉y的值,除以1000,再减掉90,才是X轴的正确偏转角度值。
xy的值接收成功并正确拆分后,电机工作部分可根据需求制作。
我的设计思路如下:
1。左右转弯时,X轴的左右旋转需要一个间隙,比如10度的量。不能稍微一倾斜小车就左右动,类似汽车方向盘的转动间隙。代码如下:
Y轴的偏转角度,为负值是前进,取绝对值作为电机速度。
正值时倒退。
2. 前进过程中左转与右转
看着密密麻麻,其实思路很简单。
小车在直行前进过程中,如果水平左转了30度,左转角度在90度直角内所占角度比例为30除以90,左轮以当前前进速度为基准,降低速度,实出左转。所降速度为30/90.也就是说,
microbit板左旋几度,左轮就降低多少速度,降低的速度与当前速度为基准,与左旋角度成正比。
3. 后退过程中左转与右转
经过实测,遥控成功。
接收端项目分享地址为: https://makecode.microbit.org/_APFVtycpr7jL
2。字符串拼接与拆分
发送端将数字拼成字符串发送,
接收端拆解字符串,并转换成数字
从目前的编程代码看,还不具备比较强大的字符解析能力。如果字符串里的值是-60是三位数,50是位数。
接收端取值很显然是失败的。不能在2位数与3位数之间正确取值。
这就要求发送端统一数据位数。方法很简单,在 x,y数据中加入一下量,让它们的值都变成三位数,且为正。减少干扰。
x+90+100,y+90+100.
加90,所有值都为正,再加100,不会存在2位数了。接收端以3位字符串依次分解,减掉附加上去的常量,就得到了正确值。
三。总结
1 积木式编程,在复杂的问题解决中,依然是数学问题。数学逻辑真接体现了解决问题的能力。
2 microbit作为入门级编程,不是简单的玩具。从某些扩展功能看,提供了更高级,更深奥的拓展能力。