2023-02-26

Circuitpython IR receiver 的問題

朋友送我一台ARM SBC(ESPRESSObin) 上面雖然有GPIO腳,但是用 Armbian_22.11.1_Espressobin_jammy_current_5.15.80.img.xz (https://www.armbian.com/espressobin/), 它的kernel config的 Remote Controller 沒有enable GPIO IR remote control, 所以就算在GPIO 上面插了 IR receiver(三支腳, VCC, GND, Signal), 但是在
/sys/class/rc/
下面是沒有任何東西出現, 所以無法使用 ir-keytables 來讀取紅外線訊號,除非去下載kernel source重新compile一個kernel,不過這比較麻煩。

正好手邊有便宜好用的Paspberry Pi pico, 把IR receiver 插在pico 就可以接收紅外線訊號,通過serial port可以傳送給ESPRESSObin 就能用網樂通的遙控器來控制了。

原本在Pi pico上面用的是circuitpython (https://circuitpython.org/downloads ), circuitpython 比micropython 好用的是它不必藉由其他editor, 只要把寫好的 python script copy 到 pico 裡面(它對任何電腦來說就是一個USB storage 隨身碟一樣) 或是直接用任何editor 在 USB storage上面編寫/修改,就能執行程式(主程式名為code.py)了。

但是問題發生了!遙控器按了幾下,pico那邊才有反應,漏失率大約在20%到30%之間,這樣是很不好用的,所以進行debug, 從code.py 到adfruit_irremote.py(https://github.com/adafruit/Adafruit_CircuitPython_IRRemote) 改來改去,甚至換了硬體(三支腳的IR接收器、發射的搖控器),但是結果都一樣, 訊號漏失還是一樣高比率。

有一天看到reddit上面有人也是用pico 來接IR receiver, 他提到沒用過7.x.x版的,而是一開始就用8.x.x版的circuitpython, (我手上的pico已經很久了,一開始就是裝7.x.x 一直沒換),所以就試試看換一下版本。

沒想到換了8.x.x 版之後,漏訊號的問題消失了!網樂通遙控器發射的訊號差不多是100%都正確反應!

這個Raspberry Pi pico既然能透過serial 送紅外線訊號給ESPRESSObin, 那就可以送訊號給一般沒有GPIO設備的x86 電腦,如果只是要玩紅外線接收,也就是pico上面只焊一支IR receiver, 這樣pico 體積就覺得很大,後來找到同樣是用RP2040 MCU的Waveshare RP2040-zero, 體積不到pico 的一半,一樣有circuitpython的支援(https://circuitpython.org/board/waveshare_rp2040_zero/),在露天拍賣的價格也跟pico大約相同,在台幣160元左右(未焊針腳, 2023年2月的價格)。如果是只當IR receiver用,不要針腳的比較方便自行焊上IR元件。

不過RP2040-zero板上的LED 跟Pi pico不同,pico是用一粒傳統LED,RP2040-zero用的是Neopixel RGB LED, 這個要用adafruit的library才方便控制, 可以從這裡下載:
https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel
跟adafruit_irremote.py 一樣要放在 lib/ 下面。

開頭可以這樣寫:
import board, neopixel
led = neopixel.NeoPixel(board.NEOPIXEL, 1)
led[0] = (64,16,0) <--這是RGB的比率
led.brightness = 0.02

NeoPixel 可以接好幾十個,可以指定led[0], led[1], led[2]....用不同顏色
關於RGB的顏色,我拿到的兩支RP2040-zero 一支是 RGB, 另一支是 GRB, 要試一下看看,才好定義 led[N] = (R, G, B) 或 (G, R, B)的比率。

沒有留言: