zoukankan      html  css  js  c++  java
  • 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作为入门级编程,不是简单的玩具。从某些扩展功能看,提供了更高级,更深奥的拓展能力。   

          

  • 相关阅读:
    Quartz.net官方开发指南 第十一课: 高级(企业级)属性
    .NET开源项目:Tomboy
    开源的作业调度框架 Quartz.NET
    DinnerNow.net: 微软最新技术集成示例
    将Quartz.NET集成到 Castle中
    评论:微软的SOA战略
    行为驱动开发Behaviour Driven Development
    Mono 1.2.5 发布,提供对IronPython和DLR的支持
    Quartz.net官方开发指南 第二课:Jobs And Triggers
    数据库厂商提供的 Providers for ASP.NET
  • 原文地址:https://www.cnblogs.com/fangziffff123/p/10094312.html
Copyright © 2011-2022 走看看