Как передать данные с двух передатчиков NRF24L01 в приемник NRF24L01? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь синхронизировать два приемопередатчика NRF24L01, выступающих в качестве передатчиков, в NRF24L01, действующий в качестве приемника.

Оба передатчика будут связаны с отдельными датчиками, и данные этих датчиков - это то, что я пытаюсьпередавать в приемник, однако, коллективно и одновременно.Каковы результаты этого столкновения непонятных данных, поступающих с обоих передатчиков.

Sample of Serial Monitor

Мой код выглядит следующим образом.Как вы можете видеть в коде приемника ниже, я попытался отделить пакеты данных от передатчиков.

    #include <SPI.h>
    #include "RF24.h"

    RF24 myRadio (8, 9);
    byte addresses[6] = {"1Node"};


    int accelgyroscope[3];

    int ax, ay, az;
    int gx, gy, gz;

    int LED_GREEN = A3;
    int LED_RED = A2;


    struct Pack {
      int data1;
      int data2;
      int data3;
      int data4;
      int data5;
      int accx;
      int accy;
      int accz;
      int con1;
      int con2;
      int data11;
      int data22;
      int data33;
      int data44;
      int data55;
      int accxx;
      int accyy;
      int acczz;

    } packet;



    void setup() {
      Serial.begin(9600);

      myRadio.begin();
      myRadio.setChannel(108);
      myRadio.setPALevel(RF24_PA_MIN);
      myRadio.openReadingPipe(1, addresses[0]);
      myRadio.openReadingPipe(2, addresses[1]);
      myRadio.startListening();

      Serial.print("LABEL,F1,F2,F3,F4,F5,X,Y,Z,C1,C2");
      Serial.println();

      pinMode(LED_GREEN, OUTPUT);
      pinMode(LED_RED, OUTPUT);

    }

    void loop() {
      if ( myRadio.available())   {

        analogWrite(LED_GREEN, 1023);
        analogWrite(LED_RED, 0);

        myRadio.read( &packet, sizeof(packet) );

        Serial.print("TRANSMITTER 1:  ");
        Serial.print(", ");
        Serial.print(packet.data1);
        Serial.print(", ");
        Serial.print(packet.data2);
        Serial.print(", ");
        Serial.print(packet.data3);
        Serial.print(", ");
        Serial.print(packet.data4);
        Serial.print(", ");
        Serial.print(packet.data5);

        Serial.print(", ");
        Serial.print(packet.accx);
        Serial.print(", ");

        Serial.print(packet.accy);
        Serial.print(", ");
        Serial.print(packet.accz);
        Serial.print(", ");

        Serial.print(packet.con1);
        Serial.print(", ");
        Serial.print(packet.con2);

        Serial.print("  ");
        Serial.print("TRANSMITTER 2:  ");
        Serial.print(", ");
        Serial.print(packet.data11);
        Serial.print(", ");
        Serial.print(packet.data22);
        Serial.print(", ");
        Serial.print(packet.data33);
        Serial.print(", ");
        Serial.print(packet.data44);
        Serial.print(", ");
        Serial.print(packet.data55);

        Serial.print(", ");
        Serial.print(packet.accxx);
        Serial.print(", ");

        Serial.print(packet.accyy);
        Serial.print(", ");
        Serial.print(packet.acczz);
        Serial.print(", ");

        Serial.println();

      }
      else
      {
        analogWrite(LED_RED, 1023);
        analogWrite(LED_GREEN, 0);
      }



    }

Вот код моего первого передатчика.

#include <SPI.h> //libraries para sa nrf24l01
#include "RF24.h" //

#include <Wire.h> // MPU-6050 I2C LIBRARY
#include <I2Cdev.h> //
#include <MPU6050.h> //



#define flex_1 A0 //declaring ng variable tsaka pin assignment ng 5 flex sensors
#define flex_2 A1
#define flex_3 A2
#define flex_4 A3
#define flex_5 A6

MPU6050 accelgyro; // variable ng mpu6050

int16_t ax, ay, az; // variables para accelerometer and gyroscope
int16_t gx, gy, gz;

int pinx=2; // pin assignment ng contact sensors
int piny=3;

RF24 myRadio (8, 9); // CSN AT CE PIN ASSIGNMENT
byte addresses[6] = {"1Node"}; // address ng both transmitter and receiver

// structure para masend ng inorder
struct Pack {
  int data1;
  int data2;
  int data3;
  int data4;
  int data5;
  int accx;
  int accy;
  int accz;
  int con1;
  int con2;
} packet;


void setup() {

  Serial.begin(38400); // para magamit ang serial monitor 
  Serial.println(F("RF24/Simple Transmit data Test"));

  Wire.begin(); // 

  accelgyro.initialize(); // para maread ang pin ng mpu6050

  pinMode(pinx, INPUT);
digitalWrite(pinx, HIGH);
pinMode(piny, INPUT);
digitalWrite(piny, HIGH);
/*
    accelgyro.setXAccelOffset(2825);
    accelgyro.setYAccelOffset(457);
    accelgyro.setZAccelOffset(645);
*/
  myRadio.begin(); // nrf24l01
  myRadio.setChannel(108); 
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.openWritingPipe(addresses[0]);
}

void loop() {
  packet.data1 = analogRead(flex_1); 
  packet.data1=map(packet.data1, 450, 950, 3000, 4000); 
  packet.data2 = analogRead(flex_2);
  packet.data2=map(packet.data2, 450, 950, 3300, 4500);
  packet.data3 = analogRead(flex_3);
  packet.data3=map(packet.data3, 450, 950, 3000, 4000);
  packet.data4 = analogRead(flex_4);
  packet.data4=map(packet.data4, 450, 950, 3000, 4000);
  packet.data5 = analogRead(flex_5);
  packet.data5=map(packet.data5, 450, 950, 3000, 4000);
  packet.accx=ax;
  packet.accy=ay;
  packet.accz=az;
  packet.con1=digitalRead(pinx);
  packet.con2=digitalRead(piny);

  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);


  if (myRadio.write(&packet, sizeof(packet))) {
    Serial.print(F("flex1 = "));
    Serial.print(packet.data1);
    Serial.print(F(" flex2 = "));

    Serial.print(packet.data2);
    Serial.print(F(" flex3 = "));
    Serial.print(packet.data3);
    Serial.print(F(" flex4 = "));
    Serial.print(packet.data4);
    Serial.print(F(" flex5 = "));
    Serial.print(packet.data5);

    Serial.print(F(" accx = "));
    Serial.print(packet.accx);
    Serial.print(F(" accy = "));
    Serial.print(packet.accy);
    Serial.print(F(" accz = "));
    Serial.print(packet.accz);
    Serial.print(F(" con1 = "));
    Serial.print(packet.con1);
    Serial.print(F(" con2 = "));
    Serial.print(packet.con2);

    Serial.println();
  } 

  else {
    Serial.print(F("Send failed."));
  }

}

А вот другой передатчик:

#include <SPI.h> //libraries para sa nrf24l01
#include "RF24.h" //

#include <Wire.h> // MPU-6050 I2C LIBRARY
#include <I2Cdev.h> //
#include <MPU6050.h> //



#define flex_1 A0 //declaring ng variable tsaka pin assignment ng 5 flex sensors
#define flex_2 A1
#define flex_3 A2
#define flex_4 A3
#define flex_5 A6

MPU6050 accelgyro; // variable ng mpu6050

int16_t ax, ay, az; // variables para accelerometer and gyroscope
int16_t gx, gy, gz;

int pinx=2; // pin assignment ng contact sensors
int piny=3;

RF24 myRadio (8, 9); // CSN AT CE PIN ASSIGNMENT
byte addresses[6] = {"1Node"}; // address ng both transmitter and receiver

// structure para masend ng inorder
struct Pack {
  int data11;
  int data22;
  int data33;
  int data44;
  int data55;
  int accxx;
  int accyy;
  int acczz;

} packet1;


void setup() {

  Serial.begin(9600); // para magamit ang serial monitor 
  Serial.println(F("RF24/Simple Transmit data Test"));

  Wire.begin(); // 

  accelgyro.initialize(); // para maread ang pin ng mpu6050

  pinMode(pinx, INPUT);
digitalWrite(pinx, HIGH);
pinMode(piny, INPUT);
digitalWrite(piny, HIGH);
/*
    accelgyro.setXAccelOffset(2825);
    accelgyro.setYAccelOffset(457);
    accelgyro.setZAccelOffset(645);
*/
  myRadio.begin(); // nrf24l01
  myRadio.setChannel(108); 
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.openWritingPipe(addresses[1]);
}

void loop() {
  packet1.data11 = analogRead(flex_1); 
  packet1.data11=map(packet1.data11, 450, 950, 3000, 4000); 
  packet1.data22 = analogRead(flex_2);
  packet1.data22=map(packet1.data22, 450, 950, 3300, 4500);
  packet1.data33 = analogRead(flex_3);
  packet1.data33=map(packet1.data33, 450, 950, 3000, 4000);
  packet1.data44 = analogRead(flex_4);
  packet1.data44=map(packet1.data44, 450, 950, 3000, 4000);
  packet1.data55 = analogRead(flex_5);
  packet1.data55=map(packet1.data55, 450, 950, 3000, 4000);
  packet1.accxx=ax;
  packet1.accyy=ay;
  packet1.acczz=az;

  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);


  if (myRadio.write(&packet1, sizeof(packet1))) {
    Serial.print(F("flex1 = "));
    Serial.print(packet1.data11);
    Serial.print(F(" flex2 = "));

    Serial.print(packet1.data22);
    Serial.print(F(" flex3 = "));
    Serial.print(packet1.data33);
    Serial.print(F(" flex4 = "));
    Serial.print(packet1.data44);
    Serial.print(F(" flex5 = "));
    Serial.print(packet1.data55);

    Serial.print(F(" accx = "));
    Serial.print(packet1.accxx);
    Serial.print(F(" accy = "));
    Serial.print(packet1.accyy);
    Serial.print(F(" accz = "));
    Serial.print(packet1.acczz);
    Serial.print(F(" con1 = "));

    Serial.println();
  } 

  else {
    Serial.print(F("Send failed."));
  }

}

Как видно, два передатчика,Я использовал разные адреса.Но я не уверен, что сделал все правильно.

Весь мой код и файлы .INO можно найти здесь .Большое спасибо.Я действительно надеюсь на любую помощь, это будет много значить.

1 Ответ

0 голосов
/ 21 апреля 2019

Похоже, что вы читаете только один пакет на стороне получателя, ожидая, что он будет содержать данные от обоих передатчиков;однако каждый передатчик передает отдельный пакет.Таким образом, вы читаете данные только с одного из передатчиков, в данном случае с передатчика 1, так как это то, что available() по умолчанию.Проверьте наличие пакета для каждого отдельного канала , вызвав available(&pipeNum) для каждого передатчика, где &pipNum Ссылка на переменную, содержащую назначенный номер канала.

...