Что не так с моими кодами Arduino? (NRF24) - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь построить дрон на основе Arduino. Прямо сейчас я пытаюсь сделать свой собственный передатчик и приемник с двумя nRF24. Если честно, у меня нет 2-х arduino, поэтому сейчас я использую два atmega328p с внешними часами, но я не думаю, что это может повлиять на вопрос.

По сути, этот код должен принимать от последовательного монитора два числа, отображать их и отправлять информацию через два NRF24.

Сейчас я использую Arduino uno в качестве передатчика, atmega328p в качестве приемника и atmega328p в качестве контроллера полета, который должен принимать входные сигналы PWM. Проблема в том, что контроллер полета вообще не отвечает на сигналы, которые я посылаю, но он это сделал, когда я тестировал его, поэтому я полагаю, что проблема заключается в соединении двух модулей.

Код передатчика:

byte i = 0; //First value to be sent
byte b = 127; //Second value to be sent

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


const uint64_t pipeOut = 0xE8E8F0F0E1LL;//Pipe address

RF24 radio(8,9); // CE/CSN

struct MyData { // 6 Datas to be sent, we will have just the first two variable as test
  byte throttle; //All of the must be between 0 and 255, not specified in the code, but
  byte yaw;     //assumed by the programmer
  byte pitch;
  byte roll;
  byte AUX1;
  byte AUX2;
};

typedef struct MyData my_data;

my_data data;


void resetData() 
{
  //This are the start values of each channal
  // Throttle is 0 in order to stop the motors, 127 the middle

  data.throttle = 0;
  data.yaw = 127;
  data.pitch = 127;
  data.roll = 127;
  data.AUX1 = 0;
  data.AUX2 = 0;

}

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

  // Setting up the radio comunication

  radio.begin();
  radio.openWritingPipe(pipeOut);
  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);
  radio.stopListening();

  resetData(); //Resetting the data


}

void loop() {

  if(Serial.available()>0){

  int a = Serial.parseInt();
    i = a; //Taking in input the first value
  int c = Serial.parseInt();
    b=c; //Taking in input the second value after a space or a char

  Serial.print("Throttle = ");
  Serial.print(i);
  Serial.print(" Yaw = ");  
  Serial.println(b);

  }

  data.throttle = i; //Sending i as throttle value
  data.yaw      = b; //Sending b as yaw value
  data.pitch    = 127; //Fixed values, no need for the test
  data.roll     = 127;
  data.AUX1     = 0;
  data.AUX2     = 0;
  radio.write(&data, sizeof(MyData));


}

Код получателя:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

int tempo;

int pwm_width_2 = 0; //Define widths of the pwm signals
int pwm_width_3 = 0;
int pwm_width_4 = 0;
int pwm_width_5 = 0;
int pwm_width_6 = 0;
int pwm_width_7 = 0;

Servo PWM2; //Using servo library to generate PWM signals
Servo PWM3;
Servo PWM4;
Servo PWM5;
Servo PWM6;
Servo PWM7;


struct MyData {
byte throttle;     //Like in the trasmitter
byte yaw;
byte pitch;
byte roll;
byte AUX1;
byte AUX2;
};


typedef struct MyData my_data;

my_data data;

const uint64_t pipeIn = 0xE8E8F0F0E1LL;     //Remember that this code is the same as in the transmitter

RF24 radio(9, 10); // CE/CSN

void resetData()
{
data.throttle = 0;
data.yaw = 127;
data.pitch = 127;
data.roll = 127;
data.AUX1 = 0;
data.AUX2 = 0;
}

/**************************************************/

void setup()
{

  PWM2.attach(2);  //Set the pins for each PWM signal
  PWM3.attach(3);
  PWM4.attach(4);
  PWM5.attach(5);
  PWM6.attach(6);
  PWM7.attach(9);

  //Configure the NRF24 module
  resetData();
  radio.begin();  
  radio.openReadingPipe(1,pipeIn);
  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);

  //we start the radio comunication
  radio.startListening();
}

/**************************************************/

unsigned long lastRecvTime = 0;

void recvData()
{
while ( radio.available() ) {
radio.read(&data, sizeof(MyData));
lastRecvTime = millis(); //here we receive the data
}
}

/**************************************************/

void loop()
{

recvData();

unsigned long now = millis();
//Here we check if we've lost signal, if we did we reset the values 
if ( now - lastRecvTime > 1000 ) {
// Signal lost?
resetData();
}

pwm_width_2 = map(data.throttle, 0, 255, 1000, 2000);     //PWM value on digital pin D2
pwm_width_3 = map(data.yaw,      0, 255, 1000, 2000);     //PWM value on digital pin D3
pwm_width_4 = map(data.pitch,    0, 255, 1000, 2000);     //PWM value on digital pin D4
pwm_width_5 = map(data.roll,     0, 255, 1000, 2000);     //PWM value on digital pin D5
pwm_width_6 = map(data.AUX1,     0, 255, 1000, 2000);     //PWM value on digital pin D6
pwm_width_7 = map(data.AUX2,     0, 255, 1000, 2000);     //PWM value on digital pin D7


//Now we write the PWM signal using the servo function
PWM2.writeMicroseconds(pwm_width_2);
PWM3.writeMicroseconds(pwm_width_3);
PWM4.writeMicroseconds(pwm_width_4);
PWM5.writeMicroseconds(pwm_width_5);
PWM6.writeMicroseconds(pwm_width_6);
PWM7.writeMicroseconds(pwm_width_7);

}

ПОСТ СКРИПТУМ:

Это не мой код, я взял его с www.electronoobs.com и адаптировал его для связи с Serial Monitor, но он совсем не работает: (

...