學習目標
- ✓分辨數位狀態讀取與紅外線協定解碼。
- ✓使用桃園版 Blockly 的 IR Receiver 積木讀取資料。
- ✓知道讀取完成後要恢復接收,避免後續訊號被卡住。
SENSOR / INFRAREDRECEIVER
紅外線接收器可以接收電視遙控器等裝置的調變訊號。本篇先認識桃園版 Blockly 的設定、可用性、讀取與恢復積木,再延伸到遙控器按鍵控制。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
IR 接收模組會將紅外線載波解調成訊號封包;若要知道遙控器按了哪個鍵,必須使用接收器的解碼流程,而不是只讀取一個數位腳位。
設定接收腳位與紅外線接收器。
偵測到完整訊號後取得按鍵代碼。
處理完本次資料後呼叫 resume,等待下一個封包。
不同遙控器可能使用不同協定與代碼;教學時應先記錄實際遙控器的資料。
本篇使用桃園版 Blockly 的舊版 IR 解碼積木;taoyuan_ir_digital 只適合讀取一般數位 HIGH/LOW,不等同於遙控器協定解碼。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VCC | 5V | 電源 | 依模組規格供電。 |
| GND | GND | 地線 | 接收器與 Arduino 共地。 |
| OUT | D2 | 解碼輸入 | 對應 irrecv_setup 與後續 IR 積木的 DATAPIN。 |
已將 3 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
irrecv_setup設定接收器腳位並開始等待訊號
位置:感測器 → 環境感測器 → 紅外線接收irrecv_available判斷是否有封包可讀取
位置:感測器 → 環境感測器 → 紅外線接收irrecv_read取得本次遙控器訊號的數值
位置:感測器 → 環境感測器 → 紅外線接收irrecv_resume處理完資料後重新等待下一筆
位置:感測器 → 環境感測器 → 紅外線接收taoyuan_ir_digital讀取一般數位輸入,不進行遙控器協定解碼
位置:感測器 → 環境感測器 → 紅外線接收先列印收到的代碼,辨識指定按鍵,再控制 LED。
irrecv_setuparduino_delayirrecv_availablearduino_serial_printirrecv_resumeirrecv_setuparduino_delayirrecv_availablearduino_serial_printirrecv_resume把初始化積木放在啟動區,不要每次迴圈重複建立。
為什麼:接收器需要保留自己的接收狀態。按下遙控器按鍵並將讀值列印到序列埠。
為什麼:每支遙控器的按鍵代碼可能不同。讀完資料後放入 resume 積木。
為什麼:讓接收器可以接收下一次按鍵。irrecv_setup:設定接收器腳位並開始等待訊號
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 沒有按鍵 | available 為否 | 程式不會誤把空資料當成按鍵。 |
| 按下按鍵 | 讀到一筆代碼 | 代碼可再交給判斷積木控制輸出。 |
這段程式把「紅外線接收器(IR Receiver)」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
#include <IRremote.hpp>
const int IR_RECEIVE_PIN = 2;
void setup() {
Serial.begin(115200);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
}
void loop() {
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.resume();
}
}#include <IRremote.hpp>函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 irrecv_available 就算接線正確也無法使用。
const int IR_RECEIVE_PIN = 2;本頁接線是 VCC → 5V、GND → GND、OUT → D2。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
void loop() {重複執行區先讓感測器更新,再讀取 有新的紅外線資料?。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (IrReceiver.decode()) {先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認接收器方向、OUT 腳位與函式庫版本。
處理方式:對準遙控器按鍵,重新確認 DATAPIN 與接收器腳位排列。
先檢查:檢查是否在讀取後呼叫 resume。
處理方式:將恢復紅外線接收積木放在處理資料之後。
先檢查:確認是否把重複碼或不同協定混在一起。
處理方式:記錄同一按鍵多次結果,並為重複碼設計專用處理。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:記錄 3 個按鍵的代碼與功能。
這題要延伸「有新的紅外線資料?」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:用同一按鍵切換 LED 的亮與滅。
這題要延伸「有新的紅外線資料?」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:使用兩個按鍵讓伺服角度增加或減少。
這題要延伸「有新的紅外線資料?」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
對照 IrReceiver.decode() 與 resume() 的標準接收流程。
補充函式庫支援的遙控器接收與資料結構。
對照 irrecv_setup、available、read、resume 與 taoyuan_ir_digital 的用途。