1. 程式人生 > >microbit教程 兩塊microbit之間的無線傳輸複雜資料---重力感應器遙控小車

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作為入門級程式設計,不是簡單的玩具。從某些擴充套件功能看,提供了更高階,更深奧的拓展能力。