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