紅外線遙控器是利用紅外線光(波長在 700 nm 到 1 mm 之間的電磁波)來傳輸數據的控制設備,常用於電視、空調等家電的遠端控制。
當你按下遙控器上的按鍵時,遙控器會將該按鍵對應的數據轉換為二進制數據(0 和 1 的組合)。
二進制數據接著會被編碼,常見的編碼方式有:
脈衝位置調製(PPM):透過改變脈衝之間的時間間隔來傳遞數據。
脈衝寬度調製(PWM):透過改變脈衝的寬度來表示二進制數據。
曼徹斯特編碼:透過脈衝的上升和下降邊緣來表示二進制數據。
編碼後的二進制數據會調製在一個特定的載波頻率上,最常見的是 38kHz。
HW-477 是市面上常見的紅外線接收模組,一個大約台幣30元左右。
我們可以用底下的接線方式與 WiFiBoy 玩學機相連。
你是否有遇過這樣的情況?抽屜裡一堆遙控器,不知道是否可以用?有時可能連當初搭配的機器都丟了,遙控器還在。這些閒置的遙控器是否能拿來再利用?
在過去,我們可能需要買這樣的多功能三用電表來解紅外線的編碼。
不過現在有了 WiFiBoy 玩學機,您只要額外買一個 HW-477 模組,就能做到同樣的功能。
我們會利用 MicroPython 社群理這個功能強大的函式庫。
我們只要使用接收的驅動程式即可,就能解讀大部份遙控器的控制訊號。一般來說很多遙控器都是使用 NEC 編碼。您只要下載專案,將 ir_rx/nec.py 上傳到玩學機的 *lib 目錄下即可,就能跟著我們來是別遙控器上每個按鍵的編碼。
from ir_rx.nec import NEC_16
from machine import Timer
from machine import Pin
def callBack(data, addr, ctrl):
global _data, _addr
_data = ir_key[data]
_addr = addr
if data > 0:
print("data: {:02x} addr: {:04x}".format(data, addr))
print(_data)
ir = NEC_16(Pin(2, Pin.IN), callBack)
取得每個按鍵的編碼值後,您就可以建一個對照表,透過對照表的關鍵字,像是 Power、Mute 等,再去對照玩學機中可以執行的函數或程式,這樣就可以變成一個很實用的工具。
from ir_rx.nec import NEC_16
from machine import Pin
import time
def callBack(data, addr, ctrl):
global _data, _addr
_data = ir_key.get(data, "Unknown")
_addr = addr
if data > 0:
print("data: {:02x} addr: {:04x}".format(data, addr))
print(_data)
ir_key = {
0x12 : 'Power',
0x1a : 'Mute',
0x1e : 'Favorite',
0x01 : '1',
0x02 : '2',
0x03 : '3',
0x04 : '4',
0x05 : '5',
0x06 : '6',
0x07 : '7',
0x08 : '8',
0x09 : '9',
0x1b : '0',
0x0a : 'Vol_up',
0x0c : 'Vol_down',
0x1f : 'CH_up',
0x0e : 'CH_down',
0x0d : 'Full Screen'
}
_data = None
ir = NEC_16(Pin(2, Pin.IN), callBack)
while True:
if _data == 'Power':
print("Action 1 Triggered")
wb.cls()
elif _data == '2':
print("Action 2 Triggered")
wb.str('Press 2!', 20, 30, 4)
time.sleep(0.1)
ir = NEC_16(Pin(2, Pin.IN), callBack)
創建了一個 NEC_16 類的實例 ir,並且將 GPIO 2 設定為紅外線接收引腳。
每當接收到信號時,會調用之前定義的 callBack 函數來處理信號。