一月の末に 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
・・・