2023-03-31

pico解譯各種紅外線訊號

利用Raspberry Pi Pico + Adafruit 的 IR remote library 來做個泛用型紅外線接收器,插到電腦的USB就可以用來遙控任何電腦。

https://github.com/adafruit/Adafruit_CircuitPython_IRRemote

只需要 copy adafruit_irremote.py 放到 pico 的lib/ 目錄下面即可

這裡所謂泛用是說,因為同樣是按數字「2」,但不同遙控器發射出來的訊號卻不一樣。任何市面上有的紅外線遙控器,像是控制電視、播放機、機上盒、DVD機、選台器,甚至市售萬用型紅外線遙控器也是,都可以拿來做為遙控pico用。

IR receiver 有三支腳,接到pico的GPIO腳,一支接3V3 一支接GND 一支接任何GPIO, 然後把GPIO腳的GPXX 代入 pulsein 裡,這裡以GP18為例。

import board, pulseio, adafruit_irremote
pulsein = pulseio.PulseIn(board.GP18, maxlen=128, idle_state=True)

def draw():
  decoder = adafruit_irremote.GenericDecode()
  while True:
    try:
      pulses = decoder.read_pulses(pulsein)
      code = decoder.decode_bits(pulses)
      pulses.clear()
      print(code)
    except Exception as ex:
      print(str(ex))

然後從電腦用 pyserial-miniterm /dev/ttyACM0 115200 --raw 指令就可以連上pico, 來看你用的紅外線遙控器發射什麼訊號碼?

大部份解出來的都有四組數字,以我手上的幾支發射器,解出來像是
(255, 0, 183, 72)
(255, 0, 191, 64)
(255, 0, 199, 56)
或是
(49, 107, 69, 186)
(49, 107, 203, 52)
(49, 107, 163, 92)
或是
(158, 41, 15, 240)
(158, 41, 159, 96)
(158, 41, 191, 64)
或是
(191, 191, 167, 88)
(191, 191, 143, 112)
(191, 191, 39, 216)
但也有只發射兩組數字的,像是
(29, 191)
(29, 79)
(29, 207)
(這種是市售的一種包含USB接收器的遙控組,一組一百多台幣)
以四組碼的來說,前兩碼是固定,可以用第三碼來辨識發射的是哪個鍵
而兩組訊號碼的,第一碼是固定,可以用第二碼來辨識發射的是哪個鍵

知道這些訊號碼之後,就可以搭配像是Adafruit HID linbrary 來模擬鍵盤或老鼠來控制電腦,或單純從serial port送按鍵碼給電腦來做操控。

https://github.com/adafruit/Adafruit_CircuitPython_HID

較早的版本有分給circuitpython 7 或 8 版用,現在都用 8 所以只有一個目錄
adafruit_hid
把整個目錄copy到pico lib/ 下面即可使用。
例如:

elif code[2] == 63:
    kbd.send(Keycode.CONTROL, Keycode.W)
    如果第三碼是 63 就按下 Ctrl 跟 w 關閉分頁
 

elif code[2] == 123:
    kbd.send(Keycode.CONTROL, Keycode.SHIFT, Keycode.EQUALS)
    如果第三碼是123就按下Ctrl 跟 + 放大(zoom in)

沒有留言: