機器人設計與應用專題 國立豐原高中 郭再興
學習目標 了解機器人設計的基本原理 能瞭解流程圖概念,以及如何應用於解決問題。 藉由圖控式程式發展環境,以及控制機器人解決循跡問題,了解演算法流程控制的基本輸入、處理步驟、輸出等基本概念
學習目標 學習迴圈結構以及控制燈泡物件 學習選擇結構以及按鈕感應器物件 學習邏輯判斷物件(AND、OR、NOT、XOR) 練習分析問題,包括輸入、輸出、資料處理方式。
學習目標 學習如何使用光感應器製作循跡機器人 學習使用超音波感應器製作巡邏機器人 以解決機器人克服難關問題為例,介紹如何解決各種機器人挑戰關卡,並從中應用解題概念,做為問題解決的基本核心策略。
電腦解題教學工具 Game Maker (http://www.yoyogames.com/make) Scratch (http://scratch.mit.edu/) Alice (http://www.alice.org) 可程式化機器人系統 益智遊戲
可程式化機器人
LEGO Mindstorms NXT
樂高機器人 NXT 9797 電機控制元件 控制器 伺服馬達 感測器 圖控式程式發展環境 積木元件
電機控制元件 包含NXT 控制器、伺服馬達、感應器组成 NXT控制器就像人的大腦,伺服馬達好比人的肌肉,提供動力,感應器就像人的五官,偵測外界環境並轉換成數位資料,再傳送回NXT控制器,驅動伺服馬達做出反應 基本運算模式 輸入->處理->輸出 圖控式程式發展環境
選擇結構: 若按下按鈕責執行上半側的指令,反之則走下半側 迴圈結構 開始 物件屬性
程式虛擬碼 while(true) { if (touch_sensor_is_pressed) { beep(); show_picture_on_screen() } 感測器若被壓下,則由喇叭播放音效,螢幕也會顯示笑臉畫面,學生在此可學到基本程式撰寫方法,以及三種基本流程
閃黃燈程式 挑戰題目--製作閃黃燈程式 展示事先錄製的閃黃燈影片 依照建構圖,將零件組合完畢
範例程式說明
紅綠燈程式 挑戰題目--製作紅綠燈程式 展示事先錄製的紅綠燈影片 依照建構圖,將零件組合完畢
程式說明 程式執行原理,與之前的閃黃燈程式相同,依序是: 點亮連接PortA的綠燈->等3秒鐘->熄滅PortA綠燈 點亮連接PortB的黃燈->等1秒鐘->熄滅PortB的黃燈 點亮連接PortC的紅燈->等4秒鐘->熄滅PortC的紅燈
閃黃燈變換紅綠燈 使用感測器控制閃黃燈切換紅綠燈 展示事先錄製的影片 依照建構圖,將零件組合完畢
選擇結構 說明選擇結構概念 設定各種感測器條件 討論並實作
程式說明 選擇結構(switch)最簡單的用法,就是判斷感測器輸入的資料是否符合預期,例如上圖中就是判斷接在Port1的按鈕感測器是否被壓下,若條件成立則程式走上半部,反之則走下半部。
其他感測器設定 下圖為光感應器偵測到光線亮度大於50%時,條件為真 下圖為超音波感應器偵測到物體距離小於15cm時,條件為真
下圖為光感應器偵測到光線亮度大於50%時,條件為真
延伸討論 程式編輯的技巧(copy-paste、捲動程式) 將程式改成超音波感測,這樣有路人站立在路口時,不用按鈕也能自動感應,控制燈號進入紅綠燈狀態 將條件設定改成聲控的話,那麼路人站在路口時,就可以用聲音的方式啟動控制 也請同學們想想看還有哪些變化,可以擴充控制的方式
電子搶答機 引起動機--益智類型電視節目搶答 問題說明--電子搶答機 依照建構圖,將零件組合完畢 說明使用邏輯物件控制迴圈 下圖程式若按下Port1或Port2所接的按鍵(也就是按下任何一個按鍵),無窮迴圈就會被中斷
使用邏輯物件控制迴圈 迴圈物件,可以設定為無窮迴圈(forever),下圖是設定成當邏輯輸入為true時迴圈中止 迴圈內的前兩個物件,負責偵測Port1按鈕、Port2按鈕是否被按下
若按鈕被按下,|則綠色的線會送出true的訊號,由迴圈內的第三個物件(邏輯物件)匯整後作出判斷(本例為OR)
常用的邏輯判斷 AND運算: 只有兩個輸入值都為“真”時結果才為“真”;其他情況輸出結果都為“假” OR運算: 兩個輸入值至少一個為“真",輸出結果則為“真";否則輸出結果為“假" XOR運算: 兩個輸入值相同則輸出為”假”,兩個輸入值相異則輸出為”真”,可以用簡單口訣幫助記憶”同性相斥、異性相吸” NOT運算:取相反值 若輸入“真",則輸出”假”, 若輸入“假",則輸出” 真”
程式解說 先暫停程式2秒鐘,點亮PortB燈 接著進入迴圈,若Port1按鈕或 Port2按鈕被按下,則迴圈中止 緊接著立刻判斷是哪一個按鈕被按下 若是Port1按鈕被按下,則點亮PortA燈 若是Port1按鈕未被按下,接著再判斷若Port2按鈕被按下,則點亮PortC燈
延伸討論 問題1: 先判斷Port1按鈕,接著才判斷Port2按鈕,是否不公平? 問題2: 是否會出現誤判? 是否有別的程式寫法 ?
三輪自走車
自走車 組合基本車身 前進後退 控制馬達後退一小段距離 控制馬達前近一小段距離 無窮迴圈
單光感循跡 挑戰問題:如何讓機器人使用一個光感應器, 控制兩個馬達,依循地上黑線前進 ?
單光感循跡演算法 演算法說明 step 1 光感應偵測地面亮度 step 2 若偵測到亮-左馬達出力 step 3 若偵測到暗-右馬達出力 不斷重複上面步驟,即可循跡前進
參考程式 右馬達停止 左馬達運轉 光感測到亮,則走上半側路徑控制馬達左轉;反之則走下半側控制馬達右轉 無窮迴圈
虛擬碼 討論單光感循跡演算法的特性,優缺點分析 演算法的特性--有限性、明確性 while(true) { if (LightSensor_detect_white) { motorB_stop ( ); motorC_run( ); } else { motorC_stop ( ); motorB_run( ); } 討論單光感循跡演算法的特性,優缺點分析 演算法的特性--有限性、明確性 準備難度較高的圖形再試試看,並且討論失敗的原因,歸納出演算法的缺點
進階挑戰地圖
雙光感循跡 控制機器人以雙光感測器循跡前進,且行經到底線時能自動停止 請同學思考如何利用二個光感應器來循跡,同時還能判斷是否到達底線
範例程式 無窮迴圈 左光感遇亮控制左馬達前進遇暗則停止 右光感遇亮控制右馬達前進遇暗則停止
虛擬碼 自走車大致讓黑線在兩個光感中間車身前進 若不小心靠左偏離路線,在右光感感應到黑線時,就會造成右馬達停止,讓車子偏右修正回正常路線 while(true) { if (left_LightSensor_detect_white) motorC_run( ); else motorC_stop ( ); if (right_LightSensor_detect_white) motorB_run( ); motorB_stop ( ) } 自走車大致讓黑線在兩個光感中間車身前進 若不小心靠左偏離路線,在右光感感應到黑線時,就會造成右馬達停止,讓車子偏右修正回正常路線 若是車子不小心靠右偏離路線,也能修正回來 兩個光感都感應到黑線時,兩個馬達就會靜止,達到停車的效果
機器人學習套件 Basic Stamp BoeBot (http://www.parallax.com) Basic Commander (http://innovati.com.tw) 科學魔法車 (http://www.me.tnu.edu.tw/~me017/welcome) Lego Mindstorms (http://mindstorms.lego.com) Arduino (http://www.arduino.cc) Microsoft Robotics Developer Studio (MSRDS) RobotBasic (http://www.robotbasic.org)