一。问题描述

      microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

        用一块microbit作为主控板,板载陀螺仪(重力感应器),可以用来前后旋转,左右滚动,得到不同水平方向(X轴,Y轴)的数据。两块主板之间通过2.4G方式通信,另一块板将X轴,Y轴数据接收后,控制小车左右轮的前进,后退,转弯等动作。

        1.先看发送端重力感应器数据的获取与发送

            microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

            将microbit水平放置:

            从左到右为X轴,角度为0。

            从上到下为Y轴,角度为0.

                X轴的偏转角度量,即沿Y轴旋转,为横滚。如下图:

                 

               microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

           沿Y轴逆时针旋转(向左)为负值。实际值在-90—-0之间。

         microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

          沿Y轴顺时针旋转(向右)为正值。实际值在0—-90之间。

         即沿着轴向箭头方向的数值为正,反方向为负。同理实测,Y轴前翻为负值,后翻为正值。

         发送端代码如下:

         microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

        无线设置组,即无线的通信频道,值在0-255。

        用无线循环的方式,将重力加速度的水平方向上的X轴与Y轴数据不停的发送出去。距离10米,最远50米。

        2。接收端代码与问题如下:

             <1>在无线接程序块中,接收只能使用一次。即全局的接收一直在进行,但程序块只能调用一次。     

           microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

                 

          <2>那如何在一次的代码中同时接收x和y两个数据呢?

         microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

          在发送端,可以看到,发送数据类型为纯数字,名称=值,字符串。没有其它复杂数据类型,比如json数据,数组之类的。

         microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

           接收端的方式所以也很简单,对应的接收纯数字,名称=值,字符串。

         如果只接收X轴或者只接收Y轴,失去了用X轴和Y轴偏移角度共同遥控小车转弯的目地。只能前进,后退,转弯。而不是在前进的过程中,根据X轴的角度,适当向左或向右偏转。

        这就是问题重现的重点:

        两块microbit之间如何无线传输复杂数据????

二,解决思路与方案:

       1 ,数位拼接与拆分

           举例:

          microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

        用数位的多少来表示。比如x=12,y=56,表示出来就是012  056,计算方式为合成数M=X*1000+Y.

        拆解方案为M/1000求余数,余数就是Y的值。X的值用合成数去掉Y的值,X=M-Y即可得到。

       现在的问题是,用多少数位来表示每个坐标轴上的值呢?2位,还是4位??

       这要看发送端的x,y分别占用几位。测试方法很简单,用microbit主板自带的led阵列显示一下,看看用了几位数。

     . microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

       经实际测试,角度占位为整数,值在-90-90之间。

      现在可以用2位数方法10x+y方式拼接了吗??不可以!

      还要考虑负值对值的影响。

     解决方法很简单,分别加上90,让X,Y轴的值都大于0,值变成0-180之简。很明显,我们最少需要用3位数来表示一个值。

     发送端代码如下:

    microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

   对于接收端,需要做两件事:

     一是把合成数值正确拆分,二是将拆分后的值正确驱动左右两个电机工作。

     先看合成数值拆分: 

     microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

     合成数值除以1000,求得余数,再减掉90,才是Y轴的正确偏转角度值。

     合成数值去掉y的值,除以1000,再减掉90,才是X轴的正确偏转角度值。

     xy的值接收成功并正确拆分后,电机工作部分可根据需求制作。

     我的设计思路如下:

             1。左右转弯时,X轴的左右旋转需要一个间隙,比如10度的量。不能稍微一倾斜小车就左右动,类似汽车方向盘的转动间隙。代码如下:

             microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

             Y轴的偏转角度,为负值是前进,取绝对值作为电机速度。

             正值时倒退。

           2.  前进过程中左转与右转

                microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

            看着密密麻麻,其实思路很简单。

           小车在直行前进过程中,如果水平左转了30度,左转角度在90度直角内所占角度比例为30除以90,左轮以当前前进速度为基准,降低速度,实出左转。所降速度为30/90.也就是说,

           microbit板左旋几度,左轮就降低多少速度,降低的速度与当前速度为基准,与左旋角度成正比。

          3.  后退过程中左转与右转

             microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

     经过实测,遥控成功。

    接收端项目分享地址为: https://makecode.microbit.org/_APFVtycpr7jL

   2。字符串拼接与拆分

         发送端将数字拼成字符串发送,

        

        microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

   接收端拆解字符串,并转换成数字

       microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

        从目前的编程代码看,还不具备比较强大的字符解析能力。如果字符串里的值是-60是三位数,50是位数。

      接收端取值很显然是失败的。不能在2位数与3位数之间正确取值。

      这就要求发送端统一数据位数。方法很简单,在 x,y数据中加入一下量,让它们的值都变成三位数,且为正。减少干扰。

       x+90+100,y+90+100.

      加90,所有值都为正,再加100,不会存在2位数了。接收端以3位字符串依次分解,减掉附加上去的常量,就得到了正确值。

三。总结

       microbit教程  两块microbit之间的无线传输复杂数据—重力感应器遥控小车-冯金伟博客园

      1 积木式编程,在复杂的问题解决中,依然是数学问题。数学逻辑真接体现了解决问题的能力。

      2 microbit作为入门级编程,不是简单的玩具。从某些扩展功能看,提供了更高级,更深奥的拓展能力。