Single‧9 |
Beaglebone Black – 透過 NodeJS 使用 RF24 Library Posted: 08 Jan 2016 10:16 AM PST RF24 是一個相當完整的 nRF24L01 程式庫(library),它目前支援許多平台,例如 Arduino、樹莓派等等,先前有草草的介紹過。 最近因為在使用 Beaglebone Black (BBB) 這個單板電腦在做些實驗,需要用到 nRF24L01,本來是想直接用已寫好並放在 NPM 中的套件,結果發現無法使用,於是就想起了 RF24 有支援到 BBB,但遇到了些麻煩。 因為我只想用 NodeJS 去做大部分的控制,並不想要用 RF24 那種全 C/C++ 的方式來做,所以我就寫了一個簡單的程式來讓 NodeJS 與 RF24 能夠傳遞訊息並且操作 nRF24L01 模組。
這個程式目前還沒有被 merge 到原始的 git repository 中,但你可以在我 Fork 出來的版本中看到。 安裝這個程式庫不管是在樹莓派還是 BBB 上都必須要經過一個安裝的程序才能正常的被 GCC 編譯器所使用,讓我們開始動工吧! Clone首先我們要把整個程式庫的原始檔案弄到 BBB 中,建議透過 http://192.168.7.2:3000 的 Cloud9 中的終端機(Terminal)來操作。 git clone https://github.com/single9/RF24-1 RF24 等待執行完成後,進入 RF24 資料夾 cd RF24 然後準備開始編譯與安裝 編譯這步驟很簡單只需要下這個指令便會自動編譯並且將程式庫放到他開去的位置 make 然後進入 examples_BBB 編譯程式 cd examples_BBB make 如果都沒有出現錯誤訊息,表示安裝程序已經完成,接下來我們要讓 BBB 啟動與 nRF24L01 通訊的 SPI 功能。 啟用 SPI在預設情況下,BBB 的核心並沒有啟用 SPI 功能,但因為 nRF24L01 模組的通訊界面為 SPI ,因此我們必須要透過新增驅動的方式來將這個功能啟用。這邊要注意的是,BBB 的 SPI1 I/O 腳位被用於 HDMI 輸出,若要使用的話必須關閉 HDMI 輸出,而為了省去不必要的麻煩,我們在這裡只啟用 SPI0。 首先,建立一個名為 BB-SPI0-01-00A0.dts 的檔案,然後將以下的內容複製進去。 /dts-v1/; /plugin/; / { compatible = "ti,beaglebone", "ti,beaglebone-black"; /* identification */ part-number = "spi0pinmux"; fragment@0 { target = <&am33xx_pinmux>; __overlay__ { spi0_pins_s0: spi0_pins_s0 { pinctrl-single,pins = < 0x150 0x30 /* spi0_sclk, INPUT_PULLUP | MODE0 */ 0x154 0x30 /* spi0_d0, INPUT_PULLUP | MODE0 */ 0x158 0x10 /* spi0_d1, OUTPUT_PULLUP | MODE0 */ 0x15c 0x10 /* spi0_cs0, OUTPUT_PULLUP | MODE0 */ >; }; }; }; fragment@1 { target = <&spi0>; __overlay__ { #address-cells = <1>; #size-cells = <0>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi0_pins_s0>; spidev@0 { spi-max-frequency = <24000000>; reg = <0>; compatible = "linux,spidev"; }; }; }; }; 編譯這個驅動韌體程式 dtc -O dtb -o BB-SPI0-01-00A0.dtbo -b 0 -@ BB-SPI0-01-00A0.dts 再將這個驅動韌體放入指定的位置 cp BB-SPI0-01-00A0.dtbo /lib/firmware/ 啟用 SPI0 echo BB-SPI0-01 > /sys/devices/bone_capemgr.*/slots 列出 SPI 驗證是否啟用成功 ls -lh /dev/spi* 啟用成功的話會顯示類似這樣的訊息 crw-rw---T 1 root spi 153, 0 Apr 24 04:20 /dev/spidev1.0 此部分參考 BeagleBone Black Enable SPIDEV 設定。 硬體接線照圖上 SPI0 的提示位置接就行,注意 CE 在 P9_16 上,別忘記接了,還有電壓是 3.3V 。 使用方式Usage: rf24_bbb [-w 目標位址] [[-c 頻道] -r 讀取位址] ... -D 顯示模組資訊 -h 顯示這個說明訊息 -w 目標位址 設定目標位址 -r 讀取位址 設定讀取位址 -c 頻道 設定讀取頻道 (預設為 1) -R[逾時時間] 讀取資料 -S 字串 發送字串 範例測試Sendvar exec = require('child_process').exec; // rf24_bbb 編譯後檔案的位址 var _nrflib = __dirname + "/rf24_bbb"; // 設定 RF24 目標位址為 2NODE 讀取位址為 1NODE. var nrf = exec(_nrflib + " " + "-w 2Node -r 1Node -D"); // 每秒發送 "Hello" 字串 setInterval(function(){ var x = exec(_nrflib + " " + "-S Hello"); x.stdout.on('data', function (data) { console.log(data); }); }, 1000); nrf.stdout.on('data', function (data) { console.log(data); }); nrf.stderr.on('data', function (data) { console.log(data); }); Receivevar exec = require('child_process').exec; // rf24_bbb 編譯後檔案的位址 var _nrflib = __dirname + "/rf24_bbb"; // 設定 RF24 目標位址為 1NODE 讀取位址為 2NODE. var nrf = exec(_nrflib + " " + "-w 1Node -r 2Node -D"); // 開始監聽,逾時時間設為 1000 毫秒 (預設: 200 毫秒) var x = exec(_nrflib + " " + "-R1000"); x.stdout.on('data', function (data) { var d = JSON.parse(data); console.log(d); }); nrf.stdout.on('data', function (data) { console.log(data); }); nrf.stderr.on('data', function (data) { console.log(data); }); OK,如果沒有遭遇到什麼大問題,那就算是大功告成了! |
You are subscribed to email updates from Single.9. To stop receiving these emails, you may unsubscribe now. |
Email delivery powered by Google |
Google Inc., 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States |