Raspberry PiとArduino 間 nRF24L01+ 通信実験

一月の末に RS Compornets社に注文予約して待つこと8ヶ月、やっと Raspberry Piが先日我が家に届きました。私はケースも一緒に頼んだので送料込みで合計金額が$49.49 USD 、日本円で¥4,082でした。

早速 Debian派生のLinux、Raspbianをインストールしてみました。イントールにあたってはJunさんのホームページがとても参考になります。raspbianのバージョンですが、私は2012-09-18-wheezy-raspbianをインストールしました。蛇足になりますが、「ラズビアン」っては、日本語では少々危ない響きですね。わたしは滑舌(かつぜつ)が良くないのでとても心配です。

GUIで操作することもできて、ネットワークにも繋がる。それでいてこの価格は、すごいの一言ですね。色々と応用ができそうです。

その後、Raspbery Piの GPIO で nRF24L01 を動かす記事を発見しました。

Raspberry Pi View topic – NRF24L01 RF Transceiver

Beaglebone 用に書かれたnRF24L01 Libraryを Raspberry Pi で動かせるように書き直したと書かれています。( Thanks Mr. Purinda Gunasekara & Mr./Ms. direk! ) この記事を参考に、Raspbery Pi と Arduinoとの通信実験を行いました。

※ 2.4GHz帯 ISMバンドを使用する小電力機器でも日本国内で使用する為には、電波法により技術基準に適合していることを、特定の認証機関で証明してもらう必要があります。違反しますと、1年以下の懲役または100万円以下の罰金という刑事罰の対象になり得ますので、くれぐれもご注意ください。

こちらより nrf.tar.gz をダウンロードします。(Click here to start download from sendspace をクリックするとダウンロードできます)

以下、私はRaspberry PiにSSHで接続して作業を行いました。

$ tar -xzvf nrf.tar.gz
$ cd nrf3

解凍してできた nrf3ディレクトリにある main.cpp がRaspberry Pi側のサンプルコードです。pingを打ってArduino側から戻ってくるreplayを待ちます。ArduinoのRF24ライブラリのサンプルプログラムを元に作られているようですね。roleピンの機能は省かれているみたいです。

また、pingpair_dyn_arduino_pongbackディレクトリにあるコードはArduino側のものになります。Raspberry Pi からのping を待ち、受け取ったら応答を返す動作をします。ちなみにArduinoにはRF24ライブラリが必要です。

$ make

コンパイルすると dist/Debug/GNU_Arm-Linux-x86/ ディレクトリに rf24bb が作成されます。これが実行するプログラムになります。

次に上記プログラムを実行するために、Raspberry PiでSPIを使えるようにします。「竹本 浩氏のページ」を参考にさせていただきました。

/etc/modules に spidev の1行を追加して、/etc/modprobe.d/raspi-blacklist.confのblacklist spi-bcm2708を#でコメントアウトします。

</etc/modules>

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
spidev

</etc/modprobe.d/raspi-blacklist.conf>

# blacklist spi and i2c by default (many users don't need them)

#blacklist spi-bcm2708
blacklist i2c-bcm2708

リブート後、

# ls -l /dev/spidev* を実行して /dev/spidev0.0 and 0.1 が表示されることを確認します。これでソフトウエアの準備は完了です。


ハードウエアの結線ですが、raspberry pi 側のmain.cppの中に RF24 radio(8, 25); の記述があるのでnRF24L01のCEをGPIO 8,CSNをGPIO 25に繋ぎます。

同様に Arduino側 pingpair_dyn_arduino_pongback.ino 中に RF24 radio(4,3); の記述があるのでnRF24L01のCEをdigital 4,CSNをdigital 3に結線しました。必要であれば数値を変更してピン・アサインを変えることができます。

$ sudo ./nrf3/dist/Debug/GNU_Arm-Linux-x86/rf24bb

全てをセットした後に、Raspberry Pi 側ではルート権限で rf24bbを走らせます。同じくArduino側もスタートさせておきます。

Raspberry Pi のターミナルに以下のように表示され、Raspberry Pi と Arduino 間の通信を確認することができました。

STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x78
RF_SETUP = 0x25
CONFIG = 0x0f
DYNPD/FEATURE = 0x3f 0x04
Data Rate = Model = CRC Length = PA Power = Now sending length 4...Got response size=4 value=ABCD
Now sending length 6...Got response size=6 value=ABCDEF
Now sending length 8...Got response size=8 value=ABCDEFGH
Now sending length 10...Got response size=10 value=ABCDEFGHIJ
Now sending length 12...Got response size=12 value=ABCDEFGHIJKL
Now sending length 14...Got response size=14 value=ABCDEFGHIJKLMN

・・・

7 thoughts on “Raspberry PiとArduino 間 nRF24L01+ 通信実験

  1. こんにちは、いつもあちこち見せてもらって、arduinoに引き続き、 Raspberry Piも購入しました。で、で、またまたちょっと教えてください。USBマウス、USBキーボード、HDMIディスプレイ無し状態で、2013-02-09-wheezy-raspbian.imgをddで書き込んだだけのSDカードで起動するとネットワークがリンクアップしませんでした。HDMIケーブルだけ差し込んだ状態では、無事に起動しリンクアップします。USBマウス、USBキーボード、HDMIディスプレイ接続状態で起動するとraspi-configになり普通に使用できます。先行きもMouse/KeyB/Dispなしで使用しようと思っていますが、HDMIだけは差し込んだ状態でないと使用できないのでしょうか?
    どうぞよろしくお願い致します。m(._.)m

  2. Ardunoさんこんにちは。わたしは2台の Raspberry Piを購入しましたが、双方ともHDMIの接続いかんにかかわらずネットワークは使えます。もちろんMouse/KeyB/Disp無しでも問題なく使えます。ArduinoさんのRaspberry Piの挙動原因は特定できませんが、ひょっとすると電源回りかもしれません。
    テスターをお持ちでしたらGPIO の5vとGND間の電圧を計測してみてください、私のところろでネットワークケーブルのみ接続して正常動作しているRPiを測ってみたところ4.89V でした。
    電源アダプタの容量は5V-700mAは必要だと公式ページに書かれています。さらに注意しなくてはいけないのが電源のケーブルです。私は過去にUSB-microUSBケーブル の粗悪品を買ってしまい Raspberry Piが動作不安定となってしまった経験があります。

  3. ご連絡ありがとうございます!!
    先ほど記述した直後に私も電源を疑いました。
    接続前に電圧はかって安心していましたが
    接続後(ラズベリーパイ動作中の電圧)も測ってみました。
    なんとなく微妙な電圧まで落ちていたので、別電源を用意し
    GPIOの5VとGND経由で電気供給してみたら絶好調になりました。
    せっかくmicroUSBケーブルわざわざ買ってきたのに最悪です。
    とまあ、原因特定できたので、(お手間を取らせては申し訳ないと
    思って)ご回答まえに解決した旨再度アップしようとおもったら
    すかさず的確なアドバイスがありました。さすが。。。
    でも、とても助かります!!
    ありがとうございます。

  4. 原因がわかってよかったですね。 Raspberry Pi は低価格なので色々な用途に使えそうですね。今後ともよろしくお願いします。

  5. こちらこそ、よろしくお願いします。
    Raspberry Piは、いじくり始めて2日目の超初心者です。
    実はこれにHD Pro Webcam C920とサーボモータかステッピング
    モーターを取り付けライブカメラを作ろうかとたくらんでいます。
    C920は注文したばかりです。2,3日後には届くと思います。
    このあたりでまた悩む予定です。どうしてもわからない場合
    またお力貸してください。どうぞよろしくお願い致します。

  6.  はじめまして、2年ほど前からRaspberry Piで温度、湿度、圧力センサを使って気象観測もどきをしております。
     遠隔観測を手軽にできないかといろいろ探しているうちに管理人さんのこのページでnRF24L01+、Ardiunoを使ってできそうだと分かり挑戦して実用になる程度までこぎつけました。 現在4台のArduinoの端末ボックス(電池駆動)の4対1で1年半くらい観測を続けています。
     ところが、最近RaspberryPiをアップグレード(Deb7.8 Linux 4.1.13+)したところrf24bbを起動すると「can’t send spi message: Invalid argument」と出て終了してしまうようになってしまいました。(現用はRPi TypeAでそちらはDeb7.6 Linux 3.12.28+のまま)
     デバイスが2015-01-31 リリースからDevice Tree方式に変わってその方j法に変えてあります。 ただロードされたドライバがspi_bcm2708ではなくspi_bcm2835となっており、spi_bcm2835でもOKという情報もありましたが、この時期にPI+、そしてPI2が出てきたため明確に分からないので、ソースを追いかけています。
     エラーメッセージはspi.cppのSPI::transferで出していることまで追えています。引き続きSPIのデバイスのアドレスを調べたり探ってゆきます。何か分かればここをお借りして紹介いたします。

     なにか解決の糸口でもありましたらお教えください。

    • yusai さんご訪問いただきありがとうございます。
      自分の記事が少しだけでもお役にたてたようでうれしいです。

      ソフトウエアーアップデートの時の互換性は悩みの種ですね。
      残念ながら今回の件は、正直言って私には解決が難しそうです。
      解決策が見つかりましたら、こちらこそどうぞご教示お願いいたします。

yusai にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください