注)当記事で取り上げる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ボードに給電するようにした。
NRF24L01 | Arduino | ラズパイ |
---|---|---|
GND(1) | GND | GND |
VCC(2) | 3.3V LDO出力 | 3V3 |
CE(3) | digIO 7 | rpi-gpio22 (15) |
CSN(4) | digIO 8 | rpi-gpio8 (24) |
SCK(5) | digIO 13 | rpi-sckl (23) |
MOSI(6) | digIO 11 | rpi-mosi (19) |
MISO(7) | digIO 12 | rpi-miso (21) |
IRQ(8) | – | – |
ひととおり配線した写真。nRF24ボードは電源が不安定だと通信に失敗するため、VCC端子とGND端子に電解コンデンサをはんだ付けしてある。
ソフトウエアの準備
Arduinoの設定
- ツールバーからTools -> Manage Libralies…を選択してライブラリマネージャを開く
- ライブラリマネージャの検索ボックスに”RF24Ethernet”を入力しインストール(依存関係の他のライブラリも自動インストールされる)
- ツールバーから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通信が出来るようだ。次はそれを試したい。
コメント