180 likes | 454 Views
LEGO 講義 2. 1. 光感 sensor 範例 2. 聲感 sensor 範例 3. 觸碰 sensor 範例 4. 超音波 sensor 範例 5. Multithreading 與 #define 範例. 1. 光感 SENSOR 範例. 光感 sensor 範例. 直接以內建程式測試: 開機後選擇 View > Reflected light ,將光感 sensor 接到對應的 port(1~4) ,選擇後會亮紅光。 將 sensor 靠近欲判斷之處,螢幕上會顯示讀數,可做為寫程式時所需數值的參考依據。
E N D
LEGO 講義2 1. 光感sensor範例 2. 聲感sensor範例 3. 觸碰sensor範例 4. 超音波sensor範例 5. Multithreading 與 #define範例
光感sensor範例 • 直接以內建程式測試: • 開機後選擇View > Reflected light,將光感sensor接到對應的port(1~4),選擇後會亮紅光。 • 將sensor靠近欲判斷之處,螢幕上會顯示讀數,可做為寫程式時所需數值的參考依據。 • 程式讀取到的單位為百分比,不需加%。
光感sensor範例 #include "NXCDefs.h" #define THRESHOLD 40 // 定義常數 task main() { SetSensorLight(IN_1);// 先宣告光感在第一個port while (true) { if (Sensor(IN_1) > THRESHOLD) // 若光感讀值大於40% OnFwd(OUT_A, 30); // 以30% power正轉 else Off(OUT_A); // 關閉接在port A 的馬達。 Wait(20); } } 範例程式:
聲感sensor範例 • 直接以內建程式測試: • 開機後選擇View > Sound dB,將聲感sensor接到對應的port(1~4) 。 • 將sensor靠近欲判斷之聲源,螢幕上會顯示讀數,可做為寫程式時所需數值的參考依據。 • 程式讀取到的單位為百分比,不需加%。
聲感sensor範例 #include "NXCDefs.h" #define THRESHOLD 80 // 定義常數 task main() { SetSensorSound(IN_1);// 先宣告聲感在第一個port while (true) { if (Sensor(IN_1) > THRESHOLD) // 若聲感讀值大於80% OnFwd(OUT_A, 30); // 以30% power正轉 else Off(OUT_A); // 關閉接在port A 的馬達。 Wait(20); } } 範例程式:
觸碰sensor範例 • 直接以內建程式測試: • 開機後選擇View> Touch,將觸碰感測器接到對應的port(1~4) 。 • 用手試著按壓,螢幕上會顯示讀數,1表示按住,0表示放開。可做為寫程式時所需數值的參考依據。 • 注意,實作中有時可能因為由側面按壓,沒按到底而無法成功感應觸碰。
觸碰sensor範例 #include "NXCDefs.h" task main() { SetSensor(IN_1,SENSOR_TOUCH);// 先宣告觸碰感測器在第一個port while (true) { if (Sensor(IN_1) == 1) // 若按下觸碰感測器 OnFwd(OUT_A, 30); // 以30% power正轉 else Off(OUT_A); // 關閉接在port A 的馬達。 Wait(20); } } 範例程式:
超音波sensor範例 • 直接以內建程式測試: • 開機後選擇View> Ultrasonic cm,將超音波sensor接到對應的port(1~4) 。 • 螢幕上會顯示超音波讀數,sensor藉由超音波反射測量距離。單位可選擇公分或英吋,範圍約0~255 cm,精準度不高。 • 超音波會受反射方向與介面特性影響,因此可能會讀入非預期之數值。超音波在各物體間的多次反射也有可能造成誤判。
超音波sensor範例 #include "NXCDefs.h" #define NEAR 20 // 預設為 cm task main() { SetSensorLowspeed(IN_1);// 先宣告超音波在第一個port while (true) { if (SensorUS(IN_1) > NEAR) // 若距離大於20 cm OnFwd(OUT_A, 30); // 以30% power正轉 else Off(OUT_A); // 關閉接在port A 的馬達。 Wait(20); } } 範例程式:
Multithreading & #define 範例 • 利用#define定義函數的方法,是在每一行後面加上「\」,最後面的大括號「}」後面不用加「\」。 • 利用函數Precedes(task1_name, task2_name, …, taskN_name); 可以達到的類似平行處理的效果。 • 下面範例程式的功能為A、B兩顆馬達朝不同方向轉動。
Multithreading & #define 範例 #include "NXCDefs.h" #define OnFwdNew(int port, int power) {\ while(true) { \ if (Sensor(IN_1) == 1) {\ OnFwd(port, power); \ Wait(4000); \ break; \ } \ } \ } task A() { OnFwdNew(OUT_A, 30); } task B() { OnFwdNew(OUT_B, -30); } task main() { SetSensor(IN_1,SENSOR_TOUCH); Precedes(A,B); } 範例程式:
實驗練習 請同學以事先組好的輪型機器人,加上光感sensor,做出可沿著桌面黑線移動的機器人。 Bonus:另外加上聲音sensor,以拍掌聲控制機器人開始運作、暫停的功能。例如機器人一開始是靜止,拍一下手掌便開始沿著黑線走,再拍一下暫停動作,再拍一下又繼續行走這樣。