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

标签 c++ arduino raspberry-pi

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

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

所以:

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

  • 我的问题是:为什么2.无法获得正确的值(value)?

    这是我的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;
    }
    

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

    最佳答案

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

    radio.setPALevel(RF24_PA_LOW);
    

    在Raspi上也需要添加同一行。

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

    感谢您的帮助。

    //关闭

    关于c++ - arduino//使用nRF24L01库通过Ghz进行树莓派连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52702972/

    相关文章:

    c++ - 具有私有(private)数据成员的内联类函数

    c++ - WiFiNINA 获取 JSON 数据时出现问题

    C++ - 函数在尝试忽略同一行时读取它两次

    c++ - 为什么 std::to_string() 没有模板化?

    c - Arduino函数变量值在函数调用之间变化

    c - 通过串行端口发送整数并打印到 LCD

    linux - 重启后 SSH 卡住

    Linux 上的 C++ : Listening to keyboard input while running as systemd service

    ubuntu - 树莓派开发

    c++ - VS2008中如何开启 "auto-build"选项