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] 紅外線電視遙控器轉無線電遙控