學習目標
- ✓理解光束遮蔽造成數位狀態改變。
- ✓使用主動電位設定讀取遮光事件。
- ✓以事件計數推估物體通過次數或轉速。
SENSOR / PHOTOINTERRUPTER
光中斷模組由紅外線發射端與接收端形成一條光路;物體通過並遮住光束時,數位輸出會切換。它適合做輪盤計數、門片通過偵測與簡單轉速實驗。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
模組把接收到的紅外線轉成數位高低電位;實際遮光時是 HIGH 或 LOW,取決於模組電路與 ACTIVE_LEVEL 設定。
發射端持續送出 940 nm 紅外線,接收端收到光。
輪盤缺口、紙片或手指遮住光路。
Blockly 依設定的主動電位回傳是否被遮住。
若在整段遮光期間重複加一,會得到大量重複計數;教學時應加入邊緣判斷或解除遮光等待。
本篇以數位輸出示範;如果使用不同模組,請先用序列埠確認遮光時的 HIGH/LOW,再調整 ACTIVE_LEVEL。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VCC | 5V | 電源 | 依模組標示供電。 |
| GND | GND | 地線 | 建立共同參考電位。 |
| OUT | D2 | 數位輸出 | 接到光中斷積木的 PIN。 |
已將 3 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
playrobot_ir_breakbeam讀取遮光後的布林狀態
位置:感測器 → 距離感測器 → 紅外線光中斷controls_if把遮光狀態轉成計數事件
位置:控制math_change每次事件將計數器加一
位置:數學/變數serial_println觀察遮光狀態與計數結果
位置:輸出讓紙盤上的缺口每通過一次光路,計數器只增加一次。
arduino_delaysensor_blockarduino_delayarduino_serial_printarduino_delayarduino_delaysensor_blockarduino_delayarduino_serial_printarduino_delay手動遮住光路並查看序列埠。
為什麼:避免把 HIGH/LOW 方向設定反。事件計數後等待 OUT 回到非有效狀態。
為什麼:同一個物體停在光路中時不會被重複計數。在固定時間內統計通過次數,再換算 RPM。
為什麼:計數資料可以延伸成簡單的速度測量。playrobot_ir_breakbeam:讀取遮光後的布林狀態
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 光路暢通 | 狀態保持未遮光 | 接收端持續收到紅外線。 |
| 紙片通過光路 | 狀態切換並觸發一次計數 | 遮光邊緣代表一個通過事件。 |
這段程式把「紅外線光中斷感測器(940 nm)」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
const int BREAKBEAM_PIN = 2;
unsigned long count = 0;
void setup() {
pinMode(BREAKBEAM_PIN, INPUT);
Serial.begin(115200);
}
void loop() {
if (digitalRead(BREAKBEAM_PIN) == LOW) {
count++;
Serial.println(count);
while (digitalRead(BREAKBEAM_PIN) == LOW) delay(2);
}
}// 紅外線光中斷感測器(940 nm) library函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 playrobot_ir_breakbeam 就算接線正確也無法使用。
const int BREAKBEAM_PIN = 2;本頁接線是 VCC → 5V、GND → GND、OUT → D2。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
void loop() {重複執行區先讓感測器更新,再讀取 紅外線光中斷:是否遮光?。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (digitalRead(BREAKBEAM_PIN) == LOW) {先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認發射端與接收端是否對準,以及 ACTIVE_LEVEL。
處理方式:調整模組間距與角度,並在積木中切換 HIGH/LOW。
先檢查:檢查程式是否等待解除遮光。
處理方式:加入解除遮光等待或以邊緣偵測取代電位偵測。
先檢查:在室內燈光與陽光下比較狀態。
處理方式:固定遮光罩與模組位置,避免接收端直接面向強光。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:每遮光一次讓 LED 閃爍一次,並列印累計次數。
這題要延伸「紅外線光中斷:是否遮光?」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:使用 10 秒視窗統計次數,顯示每分鐘轉數。
這題要延伸「紅外線光中斷:是否遮光?」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:加入第二組錯開的光中斷,利用先後順序判斷旋轉方向。
這題要延伸「紅外線光中斷:是否遮光?」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
確認 940 nm、數位輸出、5 mm 間隙與計數/轉速應用。
對照 playrobot_ir_breakbeam 的 PIN 與 ACTIVE_LEVEL 欄位。