Tello with Micro:bit+Joystick

Tello with Micro:bit+Joystick

在 利用 MICRO:BIT 控制 TELLO 空拍機 這篇文章中,我們了解了如何利用 Micro:bit 的三軸加速器功能來控制 Tello 空拍機的前進、後退以及左右飄移。雖然感覺很酷,但是就如我在該篇文章中所提到的,因為 Micro:bit 內建的輸入方式不夠多,所以影響到了能夠對應的控制動作。不得以甚至用到了 P0、P2 的碰觸來作為上升、下降的控制方式,而其實雙手拿著 Micro:bit 時要正確作出碰觸 P0 或是 P2 的動作可是超高難度啊。因此在這篇文章中,我將改用 Micro:bit 的控制手把讓 Tello 再次飛上天。

為了簡化說明的步驟,此範例盡量沿用 利用 MICRO:BIT 控制 TELLO 空拍機 此一篇文章內的作法。對於已經試過的朋友來說,可以大幅減少需要操作的步驟。

微雪 Joystick for Micro:bit

目前市面上有幾款設計給 Micro:bit 使用的控制手把,而我這次範例使用的是由微雪 (Waveshare) 這家公司所出版的 Joystick for Micro:bit。主要原因是因為這個手把提供了較多的輸入方式,共有 A~F 六個按鈕,再加上 X-Y 軸的可按式搖桿,足以用來控制 Tello 的各項基本動作。

從下圖中,我們可以看到此控制手把正中間包含一個 Micro:bit 的插槽,直接將 Micro:bit 插入即可使用。Micro:bit 插槽下方則有一個電池盒,購買時其實是包含電池的。但是因為透過淘寶購買時無法寄送電池,所以變成了無電池可用的狀況。不過此手把可以透過 Micro:bit 供電,也支援 USB 供電,所以即使沒有電池還是可以正常使用,只是不能任意趴趴走就是了。此手把使用的電池是 14500,而不是一般的 AAA 電池,使用上要稍加注意。

微雪 Joystick for Micro:bit - 前方

微雪 Joystick for Micro:bit – 前方

接下來我們看看手把的後方 (如下圖),手把後面重複標示了 C~F 四顆按鈕的位置,對於我們設計動作時頗為方便,不需要將手把前後翻來翻去。而正下方則列出了每一個控制所使用的腳位,同樣是很貼心的設計。唯一比較可惜的是,焊接點所留下的零件引腳有點過長,需要上務必多加小心以免受傷。

微雪 Joystick for Micro:bit - 後方

微雪 Joystick for Micro:bit – 後方

此手把在程式搭配上相當簡單,A ~ F 六個按鈕再加上 P 都是數位輸入,而其中 A、B 對應到 Micro:bit 本身的 A、B 鈕,至於 P 則是對應到按下搖桿的動作。

而 X、Y 為類比輸入,範圍是 0~1023。當搖桿置中時,兩個數值約為 512。搖桿往右方 X 數值變大,左方則 X 數值變小。搖桿往上方 Y 數值變大,下方則 Y 數值變小 (可參考下圖)。

Sharewave Joystick XY 軸

Sharewave Joystick XY 軸

系統架構

請參考 利用 Micro:bit 控制 Tello 空拍機 – 系統架構二

控制方式

在這個範例中,手把輸入方式與 Tello 控制動作對應如下:

手把動作Tello 動作GPIO 編號
A 鈕起飛
B 鈕降落
A+B 鈕前翻
C 鈕下降15
D 鈕右移14
E 鈕上升13
F 鈕左移12
搖桿前進/後退/右轉/左轉1 (X 軸) / 2 (Y 軸)

與之前的例子相比,因為控制按鈕數量較多,所以我將起飛跟降落分開使用不同的按鈕。此外,因為有老師建議左右轉比左右飄移更常使用,所以我將搖桿的左右動作保留給左右轉,如此只要使用搖桿就可以控制 Tello 在同一個水平面的主要動作。

安裝 Micro:bit 序列埠驅動程式

請參考 利用 Micro:bit 控制 Tello 空拍機 – 安裝 Micro:bit 序列埠驅動程式

Micro:bit 程式

Micro:bit 程式部份我同樣選擇使用 Block Editor,可以分為幾個部分 (完整程式可以在這裡下載):

Micro:bit 程式第一部分 – 初始化

Micro:bit+Joystick Tello 控制程式第一部分 – 初始化

Micro:bit+Joystick Tello 控制程式第一部分 – 初始化

  1. 程式開始時,將程式中會使用到的變數都予以初始化。
  2. pause 表示 Micro:bit 在送出每個指令後的暫停時間,單位為毫秒,也就是千分之一秒。雖然 Tello 可以連續接受多個指令並依序執行,但是因為實際完成各個動作需要一點時間,如果在還沒有執行完畢就送出後續的指令,很容易造成操作的失誤,所以強制 Micro:bit 在接受每個指令之間暫停一段時間。
  3. sensitvity 變數用來控制當搖桿偏移超過一定範圍後才對 Tello 送出左右轉或前進後退的控制指令。之前利用 Micro:bit 傾斜角度來控制 Tello 時,因為不易達到完全歸零 (也就是無傾斜的水平) 的狀態,所以我們利用這個變數來避免不必要的動作。而使用搖桿時並沒有無法歸零的問題,不過因為類比數值的讀取仍有一定的誤差,所以一樣可以利用此一參數避免不必要的動作。不過我們可以考慮縮小此數值,以增加操控的靈敏度。
  4. 變數 x,y 分別用來記錄搖桿在 X 軸與 Y 軸的偏移程度。

Micro:bit 程式第二部分 – 起飛

Micro:bit+Joystick Tello 控制程式第二部分 – 起飛

Micro:bit+Joystick Tello 控制程式第二部分 – 起飛

當 A 鈕被按下時送出起飛 (takeoff) 的指令。之後則在 Micro:bit 螢幕上顯示指令的對應圖示,並在暫停一段時間後清除螢幕並接受後續的指令。

Micro:bit 程式第三部分 – 降落

Micro:bit+Joystick Tello 控制程式第三部分 – 降落

Micro:bit+Joystick Tello 控制程式第三部分 – 降落

當 B 鈕被按下時送出降落 (land) 的指令。之後則在 Micro:bit 螢幕上顯示指令的對應圖示,並在暫停一段時間後清除螢幕並接受後續的指令。

Micro:bit 程式第四部分 – 翻滾

Micro:bit+Joystick Tello 控制程式第四部分 – 翻滾

Micro:bit+Joystick Tello 控制程式第四部分 – 翻滾

當 A+B 鈕被按下時送出翻滾 (flip) 的指令。之後則在 Micro:bit 螢幕上顯示指令的對應圖示,並在暫停一段時間後清除螢幕並接受後續的指令。

Micro:bit 程式第五部分 – 上升/下降/右飄/左飄

Micro:bit+Joystick Tello 控制程式第五部分 – 上升/下降/右飄/左飄

Micro:bit+Joystick Tello 控制程式第五部分 – 上升/下降/右飄/左飄

透過一個重複執行的迴圈,不斷地依序檢查 C、D、E、F 鈕是否被按下。其中 P15、P14、P13、P12 分別為 C、D、E、F 鈕所使用的腳位。而當按鈕按下時,對應腳位將從高電位變為低電位,此時程式送出相對的控制指令。之後則在 Micro:bit 螢幕上顯示指令的對應圖示,並在暫停一段時間後清除螢幕並接受後續的指令。

Micro:bit 程式第六部分 – 前進/後退/右轉/左轉

Micro:bit+Joystick Tello 控制程式第六部分 – 前進/後退/右轉/左轉

Micro:bit+Joystick Tello 控制程式第六部分 – 前進/後退/右轉/左轉

在這段程式中,我們根據搖桿在 X、Y 軸的偏移程度來決定 Tello 的左轉、右轉、前進及後退。這是整個 Micro:bit 控制程式中最為複雜的一段功能,但是實際上的概念並不複雜。首先,我們讀取 X 軸與 Y 軸的數值後減掉 512,並分別指定至 x, y 兩個變數中。因為搖桿置中時數值約為 512,所以我們必須先減掉 512 後再取絕對值才可以用來代表往四周偏移的程度。而由於 Tello 每次只能往一個方向移動,所以我們找出偏移度較大的方向,並據此送出此一方向的控制指令。不過因為 x, y 數值範圍包含正負數,所以比較時我們必須使用絕對值函數去除負數的影響,這樣才能找出最斜的那個方向。舉例來說,如果 x 為 -250,而 y 為 +180。雖然 +180 大於 -250,但是考慮到實際的偏移程度,-250 的偏移度絕對大於 +180。換句話說,-250 的那個 – 號只是用來表示偏移的方向 (左方),而跟偏移的程度無關,所以在比較時必須予以移除。因此在這個情況下,程式將會送出左轉 (rotate_ccw) 的指令。

Python 程式

請參考 利用 Micro:bit 控制 Tello 空拍機 – Python 程式

連結 Tello

請參考 利用 Micro:bit 控制 Tello 空拍機 – 連結 Tello

在這篇文章中,我們改用 Micro:bit 的專用手把來解決內建輸入方式較少的問題,提供了更加方便使用的控制端。不過由於還是使用序列埠來與轉介程式 (proxy.py) 進行溝通,所以依舊無法達到移動式的目的。有興趣挑戰的朋友,可以使用藍芽功能 (BLE) 來建立轉介程式,達到無拘無束的操控體驗。

Facebook 留言
Print Friendly, PDF & Email
Summary
使用 Micro:bit Joystick 控制 Tello 空拍機
Article Name
使用 Micro:bit Joystick 控制 Tello 空拍機
Description
在這篇文章中,我將介紹如何利用 Micro:bit 的控制手把來控制 Tello 空拍機。
Author
Publisher Name
Everlearn Studio
Publisher Logo