这是我的第一篇文章,如果出现问题,请告诉我我可以做得更好。
我正在尝试通过ghz将树莓与arduinos连接起来。连接有效,但是我得到了错误的数字。
所以:
myData.device = 2
和myData.value = 3 ;
Arduino receives
myData.device = 1 and
myData.value = 0`(我的问题是,为什么?我做错了什么? )(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;
}
感谢您的帮助。我希望有足够的信息。
答案 0 :(得分:0)
在我添加的arduino代码中找到了答案
radio.setPALevel(RF24_PA_LOW);
也需要在Raspi上添加相同的行。
然后,通信应该可以正常工作。
感谢您的帮助。
//已关闭