Я пытаюсь построить дрон на основе 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, но он совсем не работает: (