nRF24L01を使ってラズパイ-Arduino間でTCP/IP通信する

注)当記事で取り上げるnRF24L01ボードは技適を取得していないデバイスです。記事を参考にされる場合はご注意ください。

nRF24L01ボードは電子工作界隈ではポピュラーなデバイスで、AliExpressなどで安価に売られている。これ自体は2.4GHz帯の電波を使ったシリアル通信デバイスだが、RF24Ethernetというライブラリを使うとラズパイとArduinoの間でTCP/IP通信が出来るようになるという。試してみた。

スポンサーリンク

ハードウエアの接続

使ったハードは、以下の通り。

  • Raspberry Pi Zero W
  • Arduino Pro Mini互換機(秋月電子製)
  • nRF24L01ボード×2

このページに掲載されている表の通りに配線する。Arduinoには3.3V出力が無いため、5V電源から3.3VのLDOを挟んでnRF24ボードに給電するようにした。

NRF24L01Arduinoラズパイ
GND(1)GNDGND
VCC(2)3.3V LDO出力3V3
CE(3)digIO 7rpi-gpio22 (15)
CSN(4)digIO 8rpi-gpio8 (24)
SCK(5)digIO 13rpi-sckl (23)
MOSI(6)digIO 11rpi-mosi (19)
MISO(7)digIO 12rpi-miso (21)
IRQ(8)

ひととおり配線した写真。nRF24ボードは電源が不安定だと通信に失敗するため、VCC端子とGND端子に電解コンデンサをはんだ付けしてある。

写真

ソフトウエアの準備

Arduinoの設定

  1. ツールバーからTools -> Manage Libralies…を選択してライブラリマネージャを開く
  2. ライブラリマネージャの検索ボックスに”RF24Ethernet”を入力しインストール(依存関係の他のライブラリも自動インストールされる)
  3. ツールバーからFile -> Examples -> RF24Ethernet -> InteractiveServer_Meshを選択し、InteractiveServer_Mesh.inoを開く

Raspberry Piの設定

まずはライブラリとサンプルプログラムをインストール。下記コマンドを実行し、インストーラを起動する。

wget http://tmrh20.github.io/RF24Installer/RPi/install.sh
chmod +x install.sh
./install.sh

対話型でインストール項目を聞かれる。ライブラリ類は基本全部インストールするよう指定。

Do you want to install GIT using APT (Used to download source code) [y/N]? 
Do you want to install the RF24 core library, [y/N]? y
Do you want to install the RF24Network library [y/N]? y
Do you want to install the RF24Mesh library [y/N]? y
Do you want to install the RF24Gateway library [y/N]? y
Install ncurses library, recommended for RF24Gateway [y/N]? 

SPIを叩く方法について聞かれる。デフォルトの”2.SPIDEV”を指定。

*** Install RF24 core using? ***
1.BCM2835 Driver(Performance) 2.SPIDEV(Compatibility, Default)
3.WiringPi(Its WiringPi!) 4.MRAA(Intel Devices) 5.LittleWire
2

RF24Gatewayのサンプルコードをビルドするかどうか聞かれるので、yと答える。

Do you want to build an RF24Gateway example [y/N]? y

ラズパイとArduino間でpingを通す

簡単なIP通信の確認として、ラズパイ側からArduinoに向けてpingを通す実験を行った。

Arduino側の操作

InteractiveServer_Mesh.inoをビルドしボードに転送。シリアルコンソールを開くと単に”start”と表示されるだけだが、これでOK。

サンプルプログラムをデフォルトのままで動かすと、Arduino側のIPアドレスは10.10.2.4となる。MeshIDはIPアドレスの最下位8bitが使われ、この場合MeshID=4となる。

ラズパイ側の操作

ラズパイでRF24Gateway_ncursesを実行する。

sudo rf24libs/RF24Gateway/examples/ncurses/RF24Gateway_ncurses

起動時にラズパイ側(Gateway)のIPアドレスを聞かれるので、以下のように指定する。

**Interface Not Configured:**
 Enter IP Address: 10.10.2.2
 Enter Subnet Mask: 255.255.255.0

初期状態の画面は以下のような感じで表示される。
画面

Arduino側のnRF24が検出されると、”MeshID=4″でMesh Infoの所に追加される。(Arduino側でIPアドレスを変更すれば、ここの表示も変わる)
画面

コンソール窓をもう一つ開き、ip aでネットワークインタフェースを確認する。tun_nrf24というデバイスがIPアドレス10.10.2.2に設定されている事が確認出来る。

$ ip a
:
3: tun_nrf24: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc mq state DOWN group default qlen 500
    link/none 
    inet 10.10.2.2/24 scope global tun_nrf24
       valid_lft forever preferred_lft forever
    inet6 fe80::e550:d5ff:7eeb:3ba0/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

さて、Arduino側のIPアドレスは10.10.2.4に設定されている筈。実際10.10.2.4に向けてpingを打つとちゃんと通る。

$ ping 10.10.2.4
PING 10.10.2.4 (10.10.2.4) 56(84) bytes of data.
64 bytes from 10.10.2.4: icmp_seq=1 ttl=64 time=10.2 ms
64 bytes from 10.10.2.4: icmp_seq=2 ttl=64 time=27.1 ms
64 bytes from 10.10.2.4: icmp_seq=3 ttl=64 time=17.2 ms
64 bytes from 10.10.2.4: icmp_seq=4 ttl=64 time=27.3 ms
64 bytes from 10.10.2.4: icmp_seq=5 ttl=64 time=18.5 ms
64 bytes from 10.10.2.4: icmp_seq=7 ttl=64 time=21.0 ms
64 bytes from 10.10.2.4: icmp_seq=8 ttl=64 time=12.1 ms

pingを打っている最中RF24Gateway_ncursesの画面を確認するとIF Statusの所のTX PacketsとRx Packetsが1つずつ増えて行き、nRF24を介して通信出来ていそうな事が確認出来る。
画面

まとめ

RF24のライブラリ付属のサンプルプログラムをデフォルト設定のまま動かし、nRF24L01ボードを使ったIP通信の簡易実験を行った。RF24ライブラリはラズパイとArduino以外には対応していないため、ラズパイ以外のSBCではSLIPを使うことでArduino経由でIP通信が出来るようだ。次はそれを試したい。

コメント