arduino //使用nRF24L01库通过Ghz进行树莓派连接

时间:2018-10-08 13:03:29

标签: c++ arduino raspberry-pi

这是我的第一篇文章,如果出现问题,请告诉我我可以做得更好。

我正在尝试通过ghz将树莓与arduinos连接起来。连接有效,但是我得到了错误的数字。

所以:

  1. Arduino处于侦听模式,直到触发Raspi代码为止。
  2. Raspberry发送myData.device = 2和myData.value = 3 ;
    Arduino receives
    myData.device = 1 and myData.value = 0`(我的问题是,为什么?我做错了什么? )
  3. Arduino将答案(myData.value = 666, myData.device = 1)发送回Raspberry,Raspberry收到(666, 1)正常。

我的问题是:为什么2.没有收到正确的值?

这是我的Arduino Nano上的代码:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#include <Adafruit_Sensor.h>
#include <Arduino.h>

/*********** Struct to send over GHZ *////////////////////    
struct dataStruct{
  uint32_t value;
  uint32_t device;
}myData;

/****************RF24 GHZ Setup ***************************/
RF24 radio(7,8);    /* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
byte addresses[][6] = {"1Node","2Node"};
bool radioNumber = 1;     // Set this radio as radio number 0 or 1

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


  /***      NRF24L01 GHZ Initialize                 ***/
  radio.begin();
  radio.setPALevel(RF24_PA_LOW);

  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }

  // Start the radio listening for data
  radio.startListening();
}  

void loop() {
  Serial.println("Loop Start");
  radio.startListening();
    myData.device = 0;
    //Serial.println(sizeof(myData));
    delay(1000);

    unsigned long started_waiting_at = micros();               // Set up a timeout period, get the current microseconds
    boolean timeout = false;                                   // Set up a variable to indicate if a response was received or not

    while ( ! radio.available() ){                             // While nothing is received
      if (micros() - started_waiting_at > 800000 ){            // If waited longer than 200ms, indicate timeout and exit while loop
          timeout = true;
          break;
      }      
    }

    if ( timeout ){                                             // Describe the results
        Serial.println(F("Failed, or no input"));
    } else {  
      radio.read( &myData, sizeof(myData));
        Serial.print("Device number: ");
        Serial.println(myData.device);
        Serial.print("Value input: ");
        Serial.println(myData.value);
        if (myData.device == 1) {
          Serial.println("input received");
          radio.stopListening();
          myData.value = 666;
          myData.device = 1;
          radio.write( &myData, sizeof(myData) );
        } else {
          Serial.println("Wrong Device number received, not my bread");
        }
    }
} 

这就是我的Raspi上的代码。

#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <unistd.h>
#include <RF24/RF24.h>
#include <stdlib.h>
#include <stdio.h>

struct dataStruct{
  uint32_t value;
  uint32_t device;
}myData;


using namespace std;

//Hardware configuration

/****************** Raspberry Pi ***********************/

// RPi generic:
RF24 radio(22,0);

/********** User Config *********/
// Assign a unique identifier for this node, 0 or 1
bool radioNumber = 0;

/********************************/    
// Radio pipe addresses for the 2 nodes to communicate.
const uint8_t pipes[][6] = {"1Node","2Node"};    

int main(int argc, char** argv){
    std::cout << sizeof(myData);
    if(!bcm2835_init()) {
        printf("GPIO initialization failed!\n");
        return 1;
    }
    printf("RASPI is up and running\n\n");
    printf("test\n");
    // Setup and configure rf radio
    radio.begin();

    // optionally, increase the delay between retries & # of retries
    radio.setRetries(30,30);    

    if ( !radioNumber )    {
        radio.openWritingPipe(pipes[0]);
        radio.openReadingPipe(1,pipes[1]);
    } else {
        radio.openWritingPipe(pipes[1]);
        radio.openReadingPipe(1,pipes[0]);
    }

    myData.device = 2;
    myData.value = 3;
    radio.write(&myData, (sizeof(myData)));                   
    radio.startListening();

    unsigned long started_waiting_at = millis();

    bool timeout = false;
    while ( ! radio.available() && ! timeout ) {
        if (millis() - started_waiting_at > 200000 )
            timeout = true; 
        }     

        if (timeout) {
            printf("Timeout!");
        } else {
            radio.read( &myData, sizeof(myData));
            printf("Value: %i", myData.value);
            printf("Device: %i", myData.device);
        }

    return 0;
}

感谢您的帮助。我希望有足够的信息。

1 个答案:

答案 0 :(得分:0)

在我添加的arduino代码中找到了答案

radio.setPALevel(RF24_PA_LOW);

也需要在Raspi上添加相同的行。

然后,通信应该可以正常工作。

感谢您的帮助。

//已关闭

相关问题