NRF24L01 не проводит успешную передачу

Я пытаюсь отправить простой массив от передатчика к приемнику, но приемник не получает нужную информацию. Передатчик правильно сохраняет массив, поэтому я не уверен, что не так. Когда я читаю, что принимает приемник, это очень непредсказуемо с такими числами, как 32567. Он ведет себя спорадически, почти как плавающий контакт. Информация, получаемая Rx, подключается к выходу двигателя постоянного тока, и двигатель ерзает взад и вперед (если это помогает). Любой совет приветствуется!

Код Tx:

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
#define motorPWM 6

RF24 radio(7,8); //CE, CNS
const byte address[6] = "00001";
const int button = 3;
int buttonPressed;

byte motorPin1 = 4;
byte motorPin2 = 5;

int joystick;


void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening(); //transmitter


  
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPWM, OUTPUT);
  
}

void loop() {
  
  
  joystick = analogRead(A1);
  Serial.println(joystick);

  if(joystick > 530)
  {
    motorForward(joystick); 
  }
  if(joystick < 480)
  {
    motorBackward(joystick);
  }
  if(joystick >= 480 && joystick <= 530)
  {
    motorStill();
  }
  
}


void motorBackward(int jsInput)
{
 //digitalWrite(motorPin1, LOW);
 //digitalWrite(motorPin2, HIGH);
 int motorSpeed = map(jsInput, 480, 0, 0, 255);
 int message[] = {2, motorSpeed};
 radio.write(&message, sizeof(message));
 //analogWrite(motorPWM, motorSpeed);

 
 delay(20);
 
}

void motorForward(int jsInput)
{

 //digitalWrite(motorPin1, HIGH);
 //digitalWrite(motorPin2, LOW);
 int motorSpeed = map(jsInput, 530, 1023, 0, 255);
 int message[] = {1, motorSpeed};
 radio.write(&message, sizeof(message));
 //analogWrite(motorPWM, motorSpeed);
 delay(20);
 Serial.println(message[0]);
 Serial.println(message[1]); 

 
}

//void decelerate()
//{
//  for (int  motor_speed=255; motor_speed>=0; motor_speed--) {
//    analogWrite(motorPWM, motor_speed); 
//    delay(20);  //delay 20 milliseconds
//}


void motorStill()
{
    //digitalWrite(motorPin1, LOW);
    //digitalWrite(motorPin2, LOW); 
    int message[] = {0};
    radio.write(&message, sizeof(message));
}

Вот мой Rx-код:

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
#define motorPWM 6

RF24 radio(7,8); //
const byte address[6] = "00001"; 

byte motorPin1 = 4;
byte motorPin2 = 5;

void setup() {
  // поместите сюда свой установочный код, чтобы запустить его один раз:
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0,address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();

 pinMode(motorPin1, OUTPUT);
 pinMode(motorPin2, OUTPUT);
 pinMode(motorPWM, OUTPUT);

 //тестовый двигатель
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPWM, 600);
delay(3000);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, LOW);


}

void loop() {
  
  // поместите сюда свой основной код для повторного запуска:
  
if(radio.available())
{
   //0 = тем не менее, 1 - прямое, а 2 - обратное
  int message[2];
  radio.read(&message, sizeof(message));
  
  if(message[0] = 1)
  {
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    analogWrite(motorPWM, message[1]);
    delay(20);
    Serial.println("move forward");
  }

  if(message[0] == 2)
  {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    analogWrite(motorPWM, message[1]);
    delay(20);
  }

  if(message[0] = 0)
  {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    delay(20);
  }

  Serial.println("radio available");
  
  
}

  
  
}

, 👍-1

Обсуждение

Проверьте свои операторы сравнения (= Vs ==), @Majenko

Я пробовал оба способа, и это все еще не работает, @Alen Ramic

по-прежнему сравнивается только ==, @Juraj

почему ваш код такой сложный? ... сократите свой код до передачи и приема только одного фиксированного байта... когда это сработает должным образом, разверните код для передачи нескольких байтов... добавляйте джойстик и двигатели только после того, как связь станет надежной, @jsotola


1 ответ


-1

Как указал @Majenko в комментариях, в паре ваших операторов if в скетче RX поменялись местами операторы присваивания (=) и сравнения равенства (==).

Более подробная информация об этой распространенной ошибке c ++ находится здесь.

,