顯示具有 無線電 標籤的文章。 顯示所有文章
顯示具有 無線電 標籤的文章。 顯示所有文章

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

 

2015年1月7日 星期三

[Arduino] 以 nRF24L01+ 和 RF24 library 製作無線電端點

由於想要延長Locationfree的使用壽命, 所以除了用 Arduino 做IR轉換器以外,  還想做IR轉無線電的方式來遙控有線電視機上盒, 希望可以在房間用遙控器遙控在客廳的機上盒, 並且透過Locationfree看電視.

其實透過Locationfree軟體加上之前做的 IR code 轉換器就可以遙控任何遠端機上盒. 但是不能用遙控器而遷就鍵盤滑鼠就是一個不爽. 希望作出遠端發送 IR 訊號或遙控指令的東西. 似乎有兩個選擇: WiFi 和 Radio 通訊. WiFi 價格貴, 就算用有線Ethernet模組仍舊不便宜. 所以先選了 Radio 模組, 用無線電試試看.

首先上網收集資訊, 發現常用來和Arduino搭配的radio模組有兩種, 我選了 nRF24L01+, 因為露拍上買得到, 而且價格便宜, 我買到40元. 搭配 70 元的 Arduino pro mini 和其他哩哩摳摳的零件, 應該可以搞出150 元以下的東西, 這個價格還可以接受. 另外就是 Arduino playground 裡面有 nRF24L01 的專頁看來蠻多人用這個廉價的無線電模組來做應用.

露拍買了nRF24L01+後, 再來就是找一些和 Arduino pro mini 的資訊, 發現有趣的網站叫MySensors, 裡面有非常値得參考的資訊, 關於如何將 Arduino pro mini 和 nRF24L01+ 連接. 這個 MySensors 畫的接腳圖對於本魯這個初學者來說非常好用.  我由於沒有取得 MySensors 團隊的同意, 就不方便貼了, 請有興趣的同好上他們的網站參考.

其實MySensors 是四位工程師弄起來的, 他們正在製作一套 framework 和 API 且支援開放的協定讓大家可以把自己架設的 sensor 資料傳遞上雲端. 初步可以在家用 Raspberry Pi 架設 controller 將 sensor 資訊, 例如: 溫溼度, 壓力...等等的資訊在網頁儀表板上顯示出來, 他們支援了多種 controller. 更進一步他們正在開發雲端服務, 未來可以讓我們把 sensor 資料直接上傳雲端. 而且也正在開發邏輯引擎, 類似 workflow engine, 可以讓使用者或開發者自訂不同情境下的物聯網狀態. 例如: 回家時那些燈要開, 那些電器會自己啟動. 出門後哪些燈自動要關. MySensors 其實很有趣, 有空可以來做做看, 用用他們的 Framework 和 API.

MySensors 利用的就是 nRF24L01+ 來作為 sensor 節點和中繼點, 佈建星狀網路. 不過由於我還沒打算用他們的 framework 和 API. 就只有先參考他們對 Arduino pro mini 和 nRF24L01+的連接建議. 網頁中提到兩個重點:

+ nRF24L01+是吃 3.3v, 所以如果用 5v版本的 Arduino pro mini 需要把5v供電降壓為 3.3v, 很明顯這裡需要一個降壓IC.

+ 為了無線電傳輸穩定, 可以在 nRF24L01+ 的供電pin和接地pin 中間添加一個 4.7uF 的電容.

對於新手的我來說, 兩個建議都很重要, 當然是照做. 所以以下是重要零件的盤點:



+ Arduino mini pro: 70 元
+ nRF24L01+: 40 元
+ LD1117AL 降壓IC: 20 元
+ 4.7 uF 電容
含之前用剩的洞洞板大約 150 元上下.

便宜好用的 Arduino pro mini 就不用多介紹了, 這個價格 DIY 是可以接受的, 但是量產就太貴. 我用的是5v版本, 所以需要降壓:

本篇的主角 nRF24L01+ 無線電模組, 可以看到石英振盪器和印刷天線:

背面的pin腳, 這些pin腳定義非常重要, 接錯不但動不了, 如果5V電進去還會燒掉, 接腳定義可以參考這篇, 或者一定記得跟露拍賣家要 datasheet:

1 GND
2 VCC
3 CE
4 CSN
5 SCK
6 MOSI
7 MISO
8 IRQ
相對位置請參考下圖或者MySensors的網頁:

然後另一個很重要的零件是把 Arduino pro mini 的 5v 輸出轉 3.3v 的降壓IC, 我買到的是LD1117AL, 千萬要記得跟店家拿datasheet:


乾脆把腳位定義照下來:

我用放大鏡看到降壓IC上打的字串是: 33A01RHT1, 從第一頁的封裝圖確認我買到的是 TO-220
的封裝, 所以 33 是 3.3v, A 看來就是 PIN CODE, 確認是 PIN 1: GND, PIN 2 OUT (3.3v), PIN 3 IN (5v), 這個降壓IC和 nRF24L01+, 接錯就gg了.

最後是 4.7 uF 的電容, 依照 MySensors 的建議, 正極接 nRF24L01+ 的 VCC, 負極接 GND, 可以讓收訊更順暢:

由於要做出兩個端點進行無線電訊號傳遞, 所以要做出兩組出來. 先施做一號機. 首先開始佈局降壓功能區塊, 我把降壓IC先放上去, 注意IC的三支腳, 尤其 input, output 不能接錯, 否則送電進 nRF24L01+ 就燒了:

另一個角度, 由於是第一次做, 沒有經驗. 所以一號機的設計構想是將 Arduino pro mini 放在一個洞洞板上, 而 nRF24L01+ 和降壓IC放在另一塊板上, 先把 nRF24L01+ 板做好後, 直接用杜邦線和尚未焊接的 Arduino pro mini 的相對應 pin 腳接起來, 這樣就可以先把軟體 upload 測過.

下圖可以看到, 中間一個 8 pin 的母座, nRF24L01+ 可以插上去, 然後右邊焊了一個 6 pin 的 pin 腳 input 是 CE, CSN, SCK, MOSI, MISO, IRQ, 另外左邊是 2 pin 腳 input 是 VCC and GND. 這個佈局滿爛的, 單純是因為想說把 VCC/GND 和其他 data pin 腳分開, 可以防呆. 事實上做了之後才發現有點沒必要:

開始在背面焊上電路:

把降壓電路焊好之後, 拿出十色杜邦線, 要將 nRF24L01+ 電路板和 Arduino pro mini 連接起來:

首先測試VCC和GND, 確定降壓電路能輸出3.3v給 nRF24L01+, 至於接腳要注意 Arduino 的 5v 輸出pin 要接到降壓IC的input, 而 GND 當然就是接到 Arduino GND. MySensors 網站上用的是另一顆降壓IC, 所以注意自己完全照抄MySensors:

另一個角度:

當然要出動三用電表量一下, 確定 3.3v 上下:

確定VCC電接好之後, 把其他六條pin都焊上去, 因為線滿多的, 所以我都是用飛線來做,  而不是直接焊接在背面. 布局布得不好:

焊好之後的背面, 已經滿擠的:

另一個角度:

接下來參考MySensors的圖將所有的腳接好, 把 Arduino mini pro 和 nRF24L01+的降壓電路接起來:

另一個角度:

背面, 其實照片不算很好參考, MySensors的圖仍是比較好用, 我有空的時候再自己畫一張:

接好之後可以將程式upload上去測試了. 這裡有個要注意的地方, 我一開始是用maniacbug blog 的RF24 git, 但是更後來的兩個節點的雙向單工收發測試發現 maniacbug 把 GettingStarted code 給改壞了. 所以建議用 Arduino Playground 上建議的 TMRh20/RF24 git. 除了用 git clone 以外, 也可以在 git 網頁直接 download zip, 解壓縮之後放在你的 Arduino workspace 的 libraries folder 中, 重開 Arduino IDE 就可以看到 RF24-master 的項目, 選用 GettingStarted 程式:

正常的話應該是不用改code, upload 程式到 Arduino 之後, 打開 serial monitor, 記得將右下角 baud 調到 57600, 否則只會看到亂碼:

OK, 初次執行GettingStarted 可以看到下面的輸出, 這樣就算是這個node有成功接通 Arduino 和 nRF24L01+ 了. 根據 maniacbug 的說法, 如果你調整完 baud 但是只見到一堆 0000 輸出, 則代表有pin腳接錯了.

這是 maniacbug 的 RF24 git, 照出來是代表: 請不要用, 否則要自己改code (更正: 本篇仍是使用 manicabug的git修改後的程式來做通訊. 請參考下一篇):

一號機用杜邦線先接通測試的樣子:

另一個角度, 沒錯, 線很多, 還好只是測試. 也有人討厭焊接, 直接像這樣用杜邦線接一接, 找個盒子裝起來就開始用了:

不想用杜邦線, 所以用切了另一塊的雙面洞洞板, 準備焊上 Arduino pro mini, 先比對一下能不能和 nRF24L01+ 板子做組合:

比對好之後前端切一下, 然後焊上 USB 公頭做為取 5v 電用:

一號機好不容易焊好之後指揮艇組合! 一樣先用 serial monitor 和 GettingStarted 程式再測試過:

另一個角度, 可以看到由於布局不佳, 造成VCC和GND仍需要使用杜邦線接上:

OK, 一號機完成, 接下來製作二號機. 既然一號機測過確定接線和 GettingStarted 可以用, 二號機就學聰明了, 用單層板做 layout 就可以了. 初始的想法是將降壓電路區塊放在上方, 像這樣三個區塊排好:

後面觀察pin腳接線以第一種layout事實上不方便, 改想第二種 layout, 將降壓電路放在後面, 像這樣:

可以發現我已經先把USB公頭焊好, 先插到 USB 變壓器試試看. USB公頭焊接好之後可以用熱縮套管把 USB頭和電路板封一起, 熱縮套管可以發揮緊箍的作用, 讓 USB 頭固定牢固. 這招是從對岸網站學來的:

二號機的施做程序當然也是先把肩負供電大任的降壓電路焊好, 還有 Arduino pro mini 也焊上去, 由 USB 公頭接電. 出動三用電表量一下是否供給 3.3v 電是一定要的:


這裡所幸把MySensosrs網頁照下來, 加上降壓IC的spec, 一邊參考一邊焊接二號機的線路:

MySensors的圖很漂亮, 還用顏色標明:

降壓IC的腳位, 其實已經焊好了, 拿出來參考一下:

二號機完成! 和一號機一樣用 serial monitor 和 GettingStarted 先測過:


二號機的 layout 比較有參考價值, 照下來, 可以看到仍無法避免兩隻飛線, 分別是 IRQ 和 CE 兩隻腳, 由於在對面本人功力不夠只能飛線:

正面的俯視圖, IRQ 和 CE 以外所有的線都用飛線在正面接好

另一個角度:

一樣, 二號機指揮艇組合! 將 Arduino pro mini 和 nRF24L01+ 插上母座:

背面另一個方向再來一張:

二號機再一張:

一號機兩個板子底部照一下, 這裡特別說一下一二號機只有layout不太一樣, 接線和功能都一模一樣:

一號機正面俯視:

一號機指揮艇組合:

開始一二號機無線電溝通測試, 媾和! (誤):

如果都要用serial monitor, 則請準備兩個 Arduino USB上載器:

二號機一樣接上 serial monitor:

進行訊號傳遞測試的時候, 一開始兩端都是 receive mode. 請選擇一端在 serial monitor 上打 T 然後 enter, 這樣就可以將那端設定為 transfer mode, 這樣就會把現在的時間秒傳到另一端, 另一端收到後會 show 出 response 而且傳回發送端. 發送端就會收到 response.


測試錄影實況:

當用 serial monitor 確定兩端點都可以運作了, 你可以將 receive 端的 USB 上載器拆掉, 直接用USB供電. 當 transfer 端打出訊號, receive 端一樣可以收到訊號然後打回  transfer 端 (背景音樂是為了蓋掉講話聲):


OK, 到此算是以 nRF24L01+ 製作無線電兩端通訊初步達成目標. 接下來後續就可以以此為基礎來開發其他的應用, 像是遠端遙控器等.

不過在距離測試後, 發現我買的 nRF24L01+ 的一般版本, 室內大約遇到兩面水泥牆就沒辦法了, 訊號會斷斷續續. 再更遠就完全收不到訊號. 雖然有賣外接大天線的版本, 但是價格就和 Ethernet module相差無幾, 而且如果要雙向還是得買兩隻, 不然response打不回去也沒用.  另一個方法, 用一般版本nRF24L01+可能要設法試試看是否能實作跳板, 那就必須三個模組相互溝通.


除了上文中提到的網路文章以外, 還有幾個和 nRF24L01+ 有關的可以參考:
+ arduino-info 的 nRF24L01 Examples using the RF24 Libraries
+ arduino-info 的 Mirf Library: nRF24L01 Test

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