2015年7月1日 星期三

讓 EV3 自動找遙控器(Remote Control/Beacon)

今天的學習目標還是紅外線(IR)的應用 , 要讓 EV3 可以自動找到 "遙控器"(Remote Control/Beacon) . 以下是尋找 "遙控器" 的主程式 :




Search_Beacon 主程式只有一個 [Flow Control] 的 [Loop] block , 結束的條件是 [Infrared Sensor] -> [Compare] -> [Beacon Heading] = [0] , 也就是說直到紅外線 (IR) 偵測到 "遙控器"(Remote Control/Beacon) 在 EV3 的正前方時 , 這個主程式才會結束 .

在 [Loop] block 中依序是 : [Flow Control] 的 [Wait] block 及 [Detect_Barrier] , [Beacon_Angle] , [Beacon_Proximity] 三個 [My Blocks] 中的 block (自己寫的) , 我的設計原理 :
1. [Wait] - 主程式執行後先等待 , 直到偵測到 "遙控器"(Remote Control/Beacon) 開啟後才開始尋找 , 可偵測距離約 1 公尺 (我沒試過更遠是否仍可偵測到) , 角度範圍約 EV3 前方 220 度 .
2. [Detect_Barrier] - 開始尋找之前先確定前方沒有障礙物 , 如果發現障礙物則避開 .
3. [Beacon_Angle] - 調整 EV3 跟 "遙控器"(Remote Control/Beacon) 之間的角度 , 讓 EV3 可以正對 "遙控器"(Remote Control/Beacon) .
4. [Beacon_Proximity] - 讓 EV3 跟 "遙控器"(Remote Control/Beacon) 之間的最後距離在 30 公分左右 .

[Wait] block 的設定 : [Infrared Sensor] -> [Compare] -> [Beacon Proximity] < [99] , [99] 是一個相對性的值 , 它不是公分 , [0] 代表距離 EV3 很近 , [100] 代表很遠 , 所以當 EV3 偵測到跟  "遙控器" 的距離相對值小於 [99] 時就代表  "遙控器" 已經開啟而且是在 EV3 可偵測到的距離內 .

[Detect_Barrier] 程式如下 :
這個程式也是由一個 [Flow Control] 的 [Loop] block 所組成 , 結束的條件是 [Infrared Sensor] -> [Compare] -> [Proximity] > [40] , 也就是說 EV3 跟前方障礙物必須距離超過相對值 [40] (約 30 公分左右) 以上 , 才確定前方沒有障礙物 .
在 [Loop] block 中包含四個巢狀的 [Switch] block , 第一個 [Switch] block 的判斷設定值 :  [Infrared Sensor] -> [Compare] -> [Proximity] < [40] ,  如果偵測到 EV3 跟前方障礙物距離小於相對值 [40] (約 30 公分左右) , 則向左轉 , 否則就結束這個程式 .
因為地面摩擦程度不同 , 在我這邊用了兩個 [Action] 中的 [Move Steering] block 才能左轉到 90 度 , [Steering] 的值分別是 [-100] 及 [-25] . 左轉之後執行第二個  [Switch] block , 判斷設定值一樣 :  [Infrared Sensor] -> [Compare] -> [Proximity] < [40] , 也就是說 EV3 左轉 90 度後要再次判斷前方是否有障礙物距離小於 30 公分左右 , 如果沒有則使用 [Action] 中的 [Move Tank] block , 向前走一步 , 希望可以避開剛才右邊的障礙物 . 如果左轉之後還是偵測到前方有障礙物距離小於 30 公分左右 , 則再次進行左轉 , 然後執行第三個  [Switch] block .
第三個  [Switch] block 的設定跟運作原理都跟第二個  [Switch] block 一樣 .
如果在第三個  [Switch] block 時還是偵測到前方有障礙物距離小於 30 公分左右 , 則最後一次進行左轉 , 設定跟運作原理也都跟第二個  [Switch] block 一樣 , 但是最後一次左轉後 , 如果還是偵測到前方有障礙物距離小於 30 公分左右 , 那就表示 EV3 目前被困在一個方形障礙物中間 , EV3 就會進入等待狀態 , 直到前方的障礙物不見才會繼續動 , 使用 [Flow Control] 的 [Wait] block , 設定值 : [Infrared Sensor] -> [Compare] -> [Proximity] > [40] .

[Beacon_Angle] 程式如下 :
這個程式比較簡單是由 [Flow Control] 中的 [Wait] 及 [Switch] block 所組成 , 首先判斷 "遙控器" 是否還開著 , 如果 "遙控器" 已經偵測不到了 , 則不做動作繼續等待 , 如果 "遙控器" 還開著 , 則進行角度調整 , [Wait] block 的設定 :  [Infrared Sensor] -> [Compare] -> [Beacon Proximity] < [99] .
角度調整的判斷由 [Switch] block 來做 , 設定值 : [Infrared Sensor] -> [Compare] -> [Beacon Heading] < [0] , 等於 [0] 代表 "遙控器"  在正前方 , 小於 [0] 代表  "遙控器"  在左邊 , 所以要向左轉 , 大於 [0] 代表  "遙控器"  在右邊 , 所以要向右轉 , 左右轉用 [Action] 中的 [Move Steering] block 來做 , [Steering] 值 = [-25] 代表向左微轉 , [Steering] 值 = [25] 代表向右微轉 .

[Beacon_Proximity] 程式如下 :

這個程式也是由 [Flow Control] 中的 [Wait] 及 [Switch] block 所組成 , 一樣先判斷 "遙控器" 是否還開著 , 如果 "遙控器" 已經偵測不到了 , 則不做動作繼續等待 , 如果 "遙控器" 還開著 , 則進行距離調整 , [Wait] block 的設定 :  [Infrared Sensor] -> [Compare] -> [Beacon Proximity] < [99] .
距離調整的判斷是由兩個巢狀 [Switch] block 來做的 , 第一個 [Switch] block 的設定值 : [Infrared Sensor] -> [Compare] -> [Beacon Proximity] > [35] , 如果 EV3 跟 "遙控器" 的相對距離大於 [35] , 則 EV3 必須向前進一步 , 用 [Action] 中的 [Move Tank] 來做 , 如果 EV3 跟 "遙控器" 的相對距離小於 [35] , 則再用第二個 [Switch] block 進行一次判斷 , 第二個 [Switch] block 設定值 : [Infrared Sensor] -> [Compare] -> [Beacon Proximity] < [25]  , 如果 EV3 跟 "遙控器" 的相對距離小於 [25] , 則 EV3 必須後退一步 , 否則就保持不動 .

沒有留言:

張貼留言