LEGO 講義 2
-
Upload
connor-finch -
Category
Documents
-
view
69 -
download
0
description
Transcript of LEGO 講義 2
![Page 1: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/1.jpg)
LEGO 講義 21. 光感 sensor 範例2. 聲感 sensor 範例3. 觸碰 sensor 範例4. 超音波 sensor 範例5. Multithreading 與 #define 範例
1
![Page 2: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/2.jpg)
1. 光感 SENSOR 範例
2
![Page 3: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/3.jpg)
光感 sensor 範例
• 直接以內建程式測試:
– 開機後選擇 View > Reflected light ,將光感 sensor 接到對應的 port(1~4) ,選擇後會亮紅光。
– 將 sensor 靠近欲判斷之處,螢幕上會顯示讀數,可做為寫程式時所需數值的參考依據。
– 程式讀取到的單位為百分比,不需加 % 。
3
![Page 4: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/4.jpg)
光感 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); }}
4
![Page 5: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/5.jpg)
2. 聲感 SENSOR 範例
5
![Page 6: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/6.jpg)
聲感 sensor 範例
• 直接以內建程式測試:
– 開機後選擇 View > Sound dB ,將聲感 sensor 接到對應的 port(1~4) 。
– 將 sensor 靠近欲判斷之聲源,螢幕上會顯示讀數,可做為寫程式時所需數值的參考依據。
– 程式讀取到的單位為百分比,不需加 % 。
6
![Page 7: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/7.jpg)
聲感 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); }}
7
![Page 8: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/8.jpg)
3. 觸碰 SENSOR 範例
8
![Page 9: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/9.jpg)
觸碰 sensor 範例• 直接以內建程式測試:
– 開機後選擇 View > Touch ,將觸碰感測器接到對應的 port(1~4) 。
– 用手試著按壓,螢幕上會顯示讀數, 1 表示按住, 0表示放開。可做為寫程式時所需數值的參考依據。
– 注意,實作中有時可能因為由側面按壓,沒按到底而無法成功感應觸碰。
9
![Page 10: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/10.jpg)
觸碰 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); }}
10
![Page 11: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/11.jpg)
4. 超音波 SENSOR 範例
11
![Page 12: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/12.jpg)
超音波 sensor 範例• 直接以內建程式測試:
– 開機後選擇 View > Ultrasonic cm ,將超音波sensor 接到對應的 port(1~4) 。
– 螢幕上會顯示超音波讀數, sensor 藉由超音波反射測量距離。單位可選擇公分或英吋,範圍約 0~255 cm ,精準度不高。
– 超音波會受反射方向與介面特性影響,因此可能會讀入非預期之數值。超音波在各物體間的多次反射也有可能造成誤判。
12
![Page 13: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/13.jpg)
超音波 sensor 範例
• 範例程式:#include "NXCDefs.h"#define NEAR 20 // 預設為 cmtask 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); }}
13
![Page 14: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/14.jpg)
5. MULTITHREADING 與 #DEFINE 範例
14
![Page 15: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/15.jpg)
Multithreading & #define 範例
• 利用 #define 定義函數的方法,是在每一行後面加上「 \ 」,最後面的大括號「}」後面不用加「 \ 」。
• 利用函數 Precedes(task1_name, task2_name, …, taskN_name); 可以達到的類似平行處理的效果。
• 下面範例程式的功能為 A 、 B 兩顆馬達朝不同方向轉動。
15
![Page 16: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/16.jpg)
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);}
16
![Page 17: LEGO 講義 2](https://reader036.fdocument.pub/reader036/viewer/2022062321/56813689550346895d9e130a/html5/thumbnails/17.jpg)
實驗練習
• 請同學以事先組好的輪型機器人,加上光感sensor ,做出可沿著桌面黑線移動的機器人。
• Bonus :另外加上聲音 sensor ,以拍掌聲控制機器人開始運作、暫停的功能。例如機器人一開始是靜止,拍一下手掌便開始沿著黑線走,再拍一下暫停動作,再拍一下又繼續行走這樣。
17