RaspberryとArduinoの無線通信(nRF24L01 その2)

前回、nRF24L01モジュールを使ってRaspberryとArduinoの 1対1の無線通信を紹介しましたが、
今回は複数のArduinoとの通信を紹介します。
以下のようなイメージになります。



【Raspberry側】

Raspberry側のコード(RecvMulti.cpp)は以下の通りです。
赤字の部分だけ、前回と変えています。
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <RF24/RF24.h>


using namespace std;
//
// Hardware configuration
//

// CE Pin, CSN Pin, SPI Speed

// Setup for GPIO 22 CE and CE1 CSN with SPI Speed @ 4Mhz
//RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS1, BCM2835_SPI_SPEED_4MHZ);

// Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz
RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);

// Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 8Mhz
//RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_8MHZ);



// Radio pipe addresses for the 2 nodes to communicate.
//const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

const uint64_t pipes[7] =
                            { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL,
                              0xF0F0F0F0D3LL, 0xF0F0F0F0D4LL,
                              0xF0F0F0F0D5LL, 0xF0F0F0F0D6LL, 
                              0xF0F0F0F0D7LL };

int main(int argc, char** argv){

  uint8_t len;
  uint8_t pipe;
  uint8_t data[32];

  radio.begin();                           // Setup and configure rf radio
  radio.openReadingPipe(0,pipes[1]);
  radio.openReadingPipe(1,pipes[2]);
  radio.openReadingPipe(2,pipes[3]);
  radio.openReadingPipe(3,pipes[4]);
  radio.openReadingPipe(4,pipes[5]);
  radio.openReadingPipe(5,pipes[6]);
 
radio.startListening();
  radio.printDetails();

  // forever loop
  while (1) {
    if(radio.available(&pipe)){
      len = radio.getDynamicPayloadSize();
      radio.read(&data,len);
      printf("pipe=%d data=%d\n",pipe,data[0]);
    }
  } // end while
}


次にexamplesディレクトリにあるMakefileを修正します。
PROGRAMS = RecvSimple
の行を以下の様に変更します。
PROGRAMS = RecvSimple RecvMulti

# define all programs
#PROGRAMS = scanner pingtest gettingstarted
#PROGRAMS = gettingstarted gettingstarted_call_response transfer pingpair_dyn
PROGRAMS = RecvSimple RecvMulti

nRF24L01とRaspberryの結線は前回と同じです。
モジュールを接続して実行すると以下の表示となります。
$ make
$ sudo ./RecvMulti



【Arduino側】

今回、2台のArduinoを使用します。
1台目のArduinoのスケッチは前回と同じです。
2台目のArduinoのスケッチは赤字の部分だけ変更します。

/*
 * nRF24L01 Sample Program
 *
 * VCC  3.3V
 * MISO 12
 * MOSI 11
 * SCK  13
 * CE   8
 * CSN  7
 */
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

// Set up nRF24L01 radio on SPI bus plus pins 8 & 7
RF24 radio(8,7);

// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D3LL };

{以下省略}


2台のArduinoで同時にスケッチを実行するとRaspberry側の表示が以下のようになります。



pipe番号がArduinoの番号です。
pipe=0とpipe=1の2台のArduinoから交互にデータを受信しています。
1台目のArduinoはProMini、2台目のArduinoはNanoを使いました。
3台目のArduinoを追加する場合は以下のスケッチとなります。
/*
 * nRF24L01 Sample Program
 *
 * VCC  3.3V
 * MISO 12
 * MOSI 11
 * SCK  13
 * CE   8
 * CSN  7
 */
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

// Set up nRF24L01 radio on SPI bus plus pins 8 & 7
RF24 radio(8,7);

// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D4LL };

{以下省略}


3台目のArduino(UNOを使いました)と通信すると、pipe=2が追加されてこんな感じになります。




1台のRaspberryで最大6台のArduinoと同時に通信することができます。
このように1台の受信機で、同時に複数の送信機と通信できるのが、このモジュールの最大の特徴です。

続く...