Beaglebone Black – 透過 NodeJS 使用 RF24 Library

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 的提示位置接就行,注意 CEP9_16 上,別忘記接了,還有電壓是 3.3V 。

使用方式

Usage: rf24_bbb [-w 目標位址] [[-c 頻道] -r 讀取位址] ...
    -D  顯示模組資訊
    -h  顯示這個說明訊息
    -w  目標位址  設定目標位址
    -r  讀取位址  設定讀取位址
    -c  頻道 設定讀取頻道 (預設為 1)
    -R[逾時時間] 讀取資料
    -S  字串  發送字串

範例測試

Send

var 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);
});

Receive

var 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,如果沒有遭遇到什麼大問題,那就算是大功告成了!

獨夜:

看評論 (4)

  • 你好
    我在果菜市場上班
    所以我想研究 nrf24L01 與 手機 android 連接的可行性

    我有一些 資料,可是我幾乎看不懂

    无线 USB 数传模块使用通用的 USB 接口访问无线数传模块 nRF24L01+,
    提供方法动态查询和设置无线参数,以及实现数据的透明传输.使用方式主
    要有 USB 直接连接使用模式和在直接使用模式基础上增加的互联网使用模
    式.

    (站長已移除商品頁面)

    • 你好,您留的沒頭沒尾的,有點像是廣告留言,所以我把連結砍掉了,請見諒。

      如果您看不懂資料,然後資料只是貼了一個掏寶的商品頁面,我想你還是把研究給別人做如何?