2015年2月16日 星期一

[Arduino] 紅外線電視遙控器轉無線電遙控

 上一篇 [Arduino] 以 nRF24L01+ 和 RF24 library 製作無線電端點 只是小前導專案. 事實上我想實現將紅外線電視遙控器轉為無線電發送. 這樣可以搭配 Locationfree 在房間看電視並且用遙控器選台.

沒錯, 你可以說我是 Locationfree 偏執狂, 我就是一股不爽, 一臺原價近萬元的東西在 Sony 的封閉思想下沒幾年就 game over, 我只是想讓當時的投資繼續使用下去, 這樣的想法很奢侈嗎? 還有, 我不懂這些做遠端電視盒的公司為什麼不把 IR over RF 或 IR over IP 做進去. 一臺機器貴森森, 有無線網路元件都已經在裡面了, 做個 IR over IP 上去不為過吧. 甚至搭個 RF 做 IR over RF 也增加不了多少成本.

總之, 已經被原廠放棄成了孤兒的東西, 沒有就是自己想辦法弄弄看, 看看是否能夠延續機器的生命. 抱怨完畢!

上次做了RF一號機和二號機, 其實硬體基礎上已經都差不多了, 接下來這篇文章幾乎就都是軟體活. 唯二要做的硬體活就是將 IR LED 和 IR Receiver 串到一二號機上面:

首先處理線路規劃比較好的二號機, 選兩個 pin 作為 IR LED 或 IR Receiver 的 data pin:

我選了3號pin 和 7號pin, 其中 7 號 pin 那組接出了三個腳, 包含 data, GND, Vcc, 很顯然可以作為 IR Receiver 接進來的pin:

另一個方向的照片, 紅色是 5V Vcc, 黑色是 GND

另一台布局比較差的一號機, 連pin腳都找不太到地方焊出來, 勉強找到兩孔位置將 pin 焊接起來:

近照, 可以看到空間很侷促, 所以二號機只能接 IR LED, 作為 RF receiver 端:

IR LED 用杜邦接頭接到一號機上, 一腳 GND, 一腳 Vcc:

IR receiver 則是 GND, Vcc, Data, 三隻腳的定義需參考自己買到的型號的datasheet:

將 IR receiver 接到二號機:

近照:

IR LED 則是接到一號機, 作為無線電接收端以及 IR code 發射端:

一號機另一個角度:


一二號機兩端點的錄影, 可以比較清楚看到長相:


兩個端點做起來所有零件成本大約 350 元台幣. 硬體工作都結束了, 接下來都是軟體活了.

發送端(一號機)程式:

接收端(二號機)程式:

首先要說明的是, 我使用的是 maniacbug blog 的RF24 git, 而不是上一篇文章建議使用的 TMRh20/RF24 git, 這相當不好意思. 因為我寫軟體時發現 maniacbug 的 example 雖然被改到錯掉, 但是修一修之後還能用. 也就是兩個端點能通, 反而是 code 比較新的 TMRh20 我沒有辦法跑起來兩邊透過RF連接. 所以還是厚着臉皮回去用 maniacbug 的 library. 照理說 TMRh20 是可以用的, 有空再來研究.

所以我的 printf.h 也是從 maniacbug 的 code copy 出來的. 如果不想用 printf, 殺掉換成一般的 serial port output code 就可以了. 請參考我之前的文章.

這兩支程式都是從 RF24 library 的 GettingStarted 改出來的. 只是加上 IR receive 和 IR send 的部分. 要注意RF接收端 IRTatungRadioReceive (也就是發射 IR code 去控制 kbro box那端), serial port 我使用 9600 baud. 我試過如果用原本 GettingStarted 設定的 57600 baud, 則 IR code 發送會異常, 這個問題讓我卡關卡了一陣子, 詳細我沒有去 trace IR library.

由於我用的是大同液晶電視的遙控器, 所以 IR 接收端(也就是 RF 發射端)的code是大同的 IR. 但是 IR發射端(就是 RF 接收端)要控制的是 kbro 的機上盒. 所以有做一個 IR translater 的查表轉換. 請參考之前的文章.

以下影片是完成後的成果, 還有些按鈕不太敏感 還需要想辦法微調. 由於 Locationfree 會有大約 4至5秒的 delay 作為影片的 buffer, 所以遙控器按鈕不會像照正常電視那樣即時的反應出來, 需要適應一下. 另外就是可以在接收端製作 buffer, 讓按鈕的無線電接收後不會在 IR code 發射階段丟棄, 而是排隊執行, 可能可以增加操作的互動性:

還有一個問題就是上一篇文章已經發現的, nRF24L01+ 的穿透力不強, 大約兩個水泥牆就擋住了. 上面影片中測試的房間和客廳電視櫃的 kbro box 就是隔了兩個水泥牆.  好消息是電磁波應該是不強, 壞消息是無線電遙控的距離受限. 比較裡面的房間就沒辦法了.  解決的 Idea 是做另一個跳板出來轉發. 但是想到要做三號機就有點懶, 隔陣子有空放假再做.
 
 

2015-03-22 補充:
今天製作了另一套泛用版本的 IR-RF send/receive 程式, 主要就是將 IR code type 和 decode_results結構內相關的資訊都用 RF 傳遞出去. 接收端再依據不同的 IR type 透過 IR LED 發射 IR 訊號. 這個版本無法支援 kbro 的 IR code, 但是對於我一個很老舊的電視盒有用, 它用 NEC 的 IR code.

這套泛用版程式目前不支援 raw code, 而我也只寫了 NEC, SONY, PANASONIC 三種 IR 發射邏輯. 但是可以不用改 code 就支援多種遙控器, 只要 Arduino 的 IR library 認得出來的 code 都能支援. 後續有時間我會想辦法把 raw code 的支援也寫進去, 可以支援更廣泛的紅外線遙控器.

一號, 二號機兩端硬體完全沒變, 以下是程式:

發送端程式:
https://github.com/smallbeetw/arduinosketch/blob/master/IRgenericRadio/IRgenericRadioSend/IRgenericRadioSend.ino

接收端程式:
https://github.com/smallbeetw/arduinosketch/blob/master/IRgenericRadio/IRgenericRadioReceive/IRgenericRadioReceive.ino