登月小車大升級!結合 HuskyLens 實現 AI 影像辨識功能教學 (下篇)

一、介紹

上一篇「登月小車大升級!結合 HuskyLens 實現 AI 影像辨識功能 (上篇)」我們已經完成組裝與軟體安裝,接下來本篇我們將帶大家一步步操作,從設定HuskyLens到觀看影像,再從讀取參數到控制登月小車,最後結合RFID與Wi-Fi實現資料上傳Google試算表

二、HuskyLens設定

(一)設定通訊模式

1. 首先打開登月小車的電源開關,此時HuskyLens會一起被啟動。

2. HuskyLens上有兩個按鈕,一個是「功能按鈕」,隨著使用的模式不同,功能也會不同。可單按與長按,各有不同效果。

另一個是「選擇與確認按鈕」,用於瀏覽選單與下壓確認。

3. 下壓「選擇與確認按鈕」會跑出選單,請向右邊撥動,直到出現如下圖所示的設定選項「General Settings」到畫面正下方。請下壓「選擇與確認按鈕」進到選單內。

4. 進入選單後,請向右邊撥動「選擇與確認按鈕」,直到如下圖所示的設定選項「Protocol Type」到畫面正下方。請下壓「選擇與確認按鈕」會於原選單上方跳出新的選單。

5. 請依照剛剛的選擇與確認步驟,選取「Serial 9600」並按下確認按鈕。

6. 請依照剛剛的選擇與確認步驟,選取「Save & Return」並按下確認按鈕。

一定要做這個步驟才能儲存設定的參數。

7. 執行「Save & Return」之後會跳出確認選單,請選擇「Yes」並按下確認按鈕。

(二)開啟線路跟隨模式

1. 使用「選擇與確認按鈕」選取如下圖所示的「Line Tracking」選項。

2. 此時將HuskyLens的攝影機照至有線路的位置,若是有找到直線,可以看到畫面上會出現箭頭,箭頭會以直線的方式標示,箭頭會由下而上、由起點至終點/目標來指向。

3. 若在畫面有出現箭頭的情況下,按下功能按鈕,則可以記錄該直線。記錄後的直線顏色會從白色轉變為藍色。

4. 試著移動攝影機,查看是否有正確的找到記錄的直線。

若攝影機感測到直線,除了於畫面上顯示,HuskyLens也會回傳起點的(X, Y)座標與終點/目標的(X, Y)座標給連接的設備。

有關詳細的設定可以參考HuskyLens原廠。

三、線道跟隨程式撰寫

(一)用LinkIt 7697讀取資料

1. 在寫程式前,為了讓LinkIt 7697可以透過序列埠與HuskyLens通訊,我們要先知道連接的腳位是哪幾個。因為登月小車原先是依照micro:bitWeb:bit腳位設計的, LinkIt 7697 是透過轉接板(7697:bit breakout),才得以與登月小車相連,原本的腳位配置並不相同,我們可以透過對照圖來瞭解對應的關係。

依照上圖我們可以知道,當我們在組裝過程中,將HuskyLens的TX、RX連接至登月小車上的P3、P6,對應到LinkIt 7697其實是P2、P3,所以在撰寫程式的過程當中,切記於連接選項要選擇P2、P3才正確。

2. 知道連接腳位編號後,請打開軟體「BlocklyDuino」,並點選側邊程式清單中的「HuskyLens」選項,右邊會跑出可用的程式列表。

如上圖藍框所示,我們在「線路跟隨的模式」下會用到的有四個:

  • HuskyLens序列埠: 9600連線RX[2]TX[0-UART]初始化直到成功。
  • HuskyLens設定模式:[人臉辨識]。
  • 從HuskyLens獲得一組數據。
  • 取得箭頭數據[起點X座標]。

3. 首先拖拉出「HuskyLens序列埠: 9600連線RX[2]TX[0-UART]初始化直到成功」,並放到「初始化區塊」內。

請於這行程式後方,如下圖設定RX為2TX為3

4. 第二步是拖拉出「HuskyLens設定模式:[人臉辨識]」,放到「初始化區塊」內,並於這行程式後面的下拉式選單選取「線道跟隨」。

5. 以上步驟就完成了讀取數據的前置作業,接著就可以開始讀取數據,請拖拉出「從HuskyLens獲得一組數據」,放到「重複執行區塊」內,這行程式碼會讀取從HuskyLens傳送回來的所有資料,依照模式的不同,傳送回來的資料會不同。

6. 透過上一行程式,我們可以得到HuskyLens目前辨識的所有資料,但並不是所有資料都是我們需要的,以「線道跟隨」模式為例我們會得到:

  • 起點X座標
  • 起點Y座標
  • 目標X座標
  • 目標Y座標
  • ID 編號

我們可以透過「取得箭頭數據[起點X座標]」這一行程式來取得單一數據,透過下拉式選單可以選取要取得的數據。

在此我們選擇「起點X座標」,並將它放到一個變數內,以利後續取用。

7. 我們可以透過「序列埠監控的功能」查看數據,依照下圖加入相關程式並燒錄至LinkIt 7697

透過BlocklyDuino內建的「PuTTY」可以查看到數據。

(二)控制登月小車

1. 可以取得辨識的數據之後,我們就能依照數據控制登月小車,透過「線道跟隨」模式,我們能獲取到的座標數據範圍分別是:X(0~320)、Y(0~240)。為了能讓登月小車沿著線段走,我們會比較著重在X座標的數據(與線段之間的偏移量)。

從影像辨識到控制馬達之間會有一段時間差,為了能即早反應,選擇「目標X座標」會優於選擇「起點X座標」

現在請將變數內的取得箭頭數據更改為「目標X座標」,並且因為X座標的範圍是0~320,透過將數值減去160,可以將X座標的範圍轉變為-160 ~ 160,會做這樣的數值轉換是為了方便計算偏移量,當線段在中央時數值會接近0,往左偏會是負數、右偏則為正數。

2. 接下來會有點複雜,我們一小塊一小塊來分析,請新增兩個變數,分別代表左右馬達的轉速,依照偏移的程度,左右馬達的轉速會不同。

3. 透過數學程式中的映射,將偏移量(-160~160)轉換為馬達的轉速(-255~255),這樣線段偏移多少,就會直接反映在轉速上。

4. 接著對應偏移的關係(線段偏左為負數,偏右為正數),我們將馬達最大前進轉速255「加上」剛剛的映射程式,並透過限制數字為(0~255)作為「左邊馬達的最終轉速」。

將馬達最大前進轉速255「減去」剛剛的映射程式,並透過限制數字為(0~255)作為「右邊馬達的最終轉速」。

5. 請點選程式列表中的「登月小車」,並拖拉出可分別控制左右馬達的程式「登月小車左輪速度[0]登月小車右輪速度[0] (-255~255)」至程式最後。

6. 最後將儲存各馬達最終轉速的變數填入對應的欄位內。

將程式燒錄至LinkIt 7697試著跑跑看,看看登月小車有沒有乖乖沿著線走呢?

完整線道跟隨程式

四、加入RFID感應與Wi-Fi資料上傳

(一)連接Wi-Fi

於程式列表中點選「Wi-Fi」,接著拖拉出「連線到Wi-Fi AP」,將這行程式放到「初始化區塊」內,並輸入欲連線的Wi-Fi AP名稱與密碼。

(二)讀取RFID感應器

1. 首先於程式列表中點選「感測模組擴充」,並拖拉出「M5 Mini RFID 讀取識別碼(I2C)」,這行程式會讀取感應到的卡片編碼,若沒有感應到會回傳空值。

2. 我們將感測值存入變數當中,並用「如果比較式」來比較是否有感測到卡片,若沒有感測到卡片會讀取到空值。

如下圖所示,程式邏輯設計為當不是空值時執行我們要執行的程式。

(三)設定上傳Google試算表

1. 接著我們希望透過Wi-Fi將讀取到的數值,上傳至Google試算表。請於自己的雲端硬碟新增一個試算表,並將權限設為「知道連結的使用者為編輯者」

2. 請記下連結網址中 「d/ 後方到 /edit 前方」的那串碼並複製下來,此碼為該試算表的ID,以及記下當前試算表的「工作表名稱」。

3. 上傳 Google試算表程式的部份,我們需要用到「劉正吉老師」的程式積木,相關程式可於程式列表中的「吉哥積木」底下找到。

4. 從「吉哥積木」>「物聯網」>「Google試算表」內拖拉出兩行程式放入「初始化區塊」內,分別是「Google試算表 設定 試算表ID[ ]」與「Google試算表 設定 工作表名稱[ ]」。並將自己的Google試算表ID與工作表名稱填入對應的欄位。

5. 回到剛剛讀取RFID的程式碼,從「吉哥積木」>「物聯網」>「Google試算表」內拖拉出「Google試算表包含時間戳記[Yes]傳送資料到Google」,放到讀取到卡片編碼的如果比較式內。

等待上傳的過程中會有延遲,此時車子會不受控的亂跑,我們在傳送的程式上方加入將馬達速度調為0的程式,讓上傳資料前先停止登月小車。並且為了不重複讀取,於上傳完畢後強制讓車子向前移動一段距離,避免重複感應到卡片。

這樣就撰寫完成囉,將程式燒錄至LinkIt 7697試著跑跑看,並擺放RFID卡片,查看登月小車經過卡片後,Google試算表有沒有出現數據。

完整線道跟隨程式

五、總結

本篇教學我們完成了線道跟隨的功能,並加入RFID感應,以及透過Wi-Fi上傳到自己的Google試算表。本篇教學的示範其實只有使用到HuskyLens的一小部份,還有很多功能可以相互結合,例如:顏色跟隨、檢測條碼、人臉辨識……等。對於這些功能有興趣的夥伴們,可以參考官方說明文件,並自行搭配製作更多不同的專案喔!