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");
}
}
@Alen Ramic, 👍-1
Обсуждение1 ответ
Как указал @Majenko в комментариях, в паре ваших операторов if в скетче RX поменялись местами операторы присваивания (=) и сравнения равенства (==).
Более подробная информация об этой распространенной ошибке c ++ находится здесь.
- вопрос по трубке nRF24L01
- Как подключить NodeMCU к NRF24L01
- Переключение каналов NRF24l01
- Использование функции уровня сигнала модуля nRF24L01
- Как автоматически сбросить nrf24l01+ с кодом?
- NRF24L01+ PA не работает с Arduino Mega (работает с Nano)
- Пустое значение не игнорируется, как должно быть.
- Не получаем данные от NRF24L01
Проверьте свои операторы сравнения (= Vs ==), @Majenko
Я пробовал оба способа, и это все еще не работает, @Alen Ramic
по-прежнему сравнивается только
==
, @Jurajпочему ваш код такой сложный? ... сократите свой код до передачи и приема только одного фиксированного байта... когда это сработает должным образом, разверните код для передачи нескольких байтов... добавляйте джойстик и двигатели только после того, как связь станет надежной, @jsotola