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

前回、複数台のArduinoから1台のRaspberryへの無線通信を 紹介しました。




今度は逆に、1台のArduinoから複数台のRaspberryへの無線通信を紹介します。





【Raspberry側】

1台目のRaspberry側のコード(RecvSimple.cpp)はその1で 紹介したコードのままです。
一応再掲しておきます。
#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 };

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

  uint8_t len;
  uint8_t data[32];

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


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

2台目のRaspberry側のコード(RecvSimple.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, 0xF0F0F0F0D3LL };

{以下省略}

つまり1台目のRaspberryは「0xF0F0F0F0D2LL」のパイプからデータを受け取り、
2台目のRaspberryは「0xF0F0F0F0D3LL」のパイプからデータを受け取ります。

【Arduino側】

Arduinoのスケッチは以下の通りです。

/*
 * nRF24L01 Sample Program (Send to 2 Node)
 *
 * 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 9 & 10
//RF24 radio(9,10);
RF24 radio(8,7);

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


void setup(void)
{
  Serial.begin(9600);
  Serial.println("nTF24L01 Send Demo");
  printf_begin();
 
  //
  // Setup and configure rf radio
  //
  radio.begin();
//  radio.openWritingPipe(pipes[1]);
//  radio.openReadingPipe(1,pipes[0]);
  radio.printDetails();
}

void loop(void)
{
  static int value = 0;
  uint8_t data[32];

  if ((value % 2) == 0) {
    radio.openWritingPipe(pipes[1]);
    radio.openReadingPipe(1,pipes[0]);
  } else {
    radio.openWritingPipe(pipes[2]);
    radio.openReadingPipe(1,pipes[0]);
  }
  // Take the time, and send it.  This will block until complete
  data[0]=value;
  value++;
  Serial.print("Now sending ...");

  bool ok = false;
  while(!ok) {
    ok = radio.write( data, sizeof(data) );
    if (ok)
      Serial.println("ok...");
    else
      Serial.println("failed.");
  }

  delay(1000);

}

Arduinoでスケッチを実行すると1台目のRaspberry側の表示は以下のように、奇数のデータだけを受け取ります。



2台目のRaspberry側の表示は以下のように、偶数のデータだけを受け取ります。
受信側を自由に選べるのも、このモジュールの特徴です。



今までに成功したのはArduino→Raspberryの一方向だけの通信です。
Examplesフォルダーにある他のサンプルを見るとArduino→(受信)Raspberry(応答)→Arduinoの通信もできそうで すが
成功していません。→やっと成功しました。

続く...