一。問題描述
用一塊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作為入門級編程,不是簡單的玩具。從某些擴展功能看,提供了更高級,更深奧的拓展能力。