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

前回ようやくArduino→(受信)Raspberry(応 答)→Arduinoに成功しました。
そこで、複数台のArduinoとの同時通信を試してみます。

【Raspberry側】

Raspberry側のコード(RecvMultiAck.cpp)は以下の通りです。
赤字の部分だけ、その2と 変えています。
#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];

  static uint32_t message_count = 0;

  radio.begin();                           // Setup and configure rf radio

  radio.setAutoAck(true);
  radio.enableAckPayload();

  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)){

      radio.writeAckPayload( pipe, &message_count, sizeof(message_count) );
      printf("writeAckPayload=%d ",message_count);
      ++message_count;

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


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

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

nRF24L01とRaspberryの結線は前回と同じです。

【Arduino側】

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


{前略}


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

{後略}


2台のArduinoで実行するとArduino側の表示が以下のようになります。

1台目(RaspberryからのAckデータが奇数)


2台目(RaspberryからのAckデータが偶数)


RaspberryからのAckデータがそれぞれのArduinoで受け取れています。

続く....