Проблемы nRF24l01+. Данные принимаются как 0

Я пытаюсь передать значения трех потенциометров через nRF24L01 + (с антенной). Я использую регулятор, предназначенный для nRF24L01 +, поэтому не думаю, что мне нужно добавлять развязывающий конденсатор. Я использую структуру данных для отправки выходных данных БАНКА в виде байтов. На конце передатчика значения структуры данных верны. Однако на приемнике каждое значение структуры данных принимается как 0. У меня есть оператор if, чтобы проверить, доступно ли radio.available(), и, по-видимому, радио доступно. Если я изменю проводку приемника или передатчика, радио будет недоступно, поэтому я предполагаю, что оно подключено правильно. Кроме того, регулятор делает это довольно просто.

У меня есть :

  • CE = D7
  • CSN = D8
  • (и все остальные обязательные контакты 11, 12, 13 подключены правильно) и D10 установлен на выход без подключения. (Я читал в другом посте, что D10 должен быть установлен на вывод, чтобы сделать его мастером SPI, или что-то в этом роде) ...

Я пытаюсь уже несколько дней и никак не могу понять, что я делаю не так. Дайте мне знать, если вам понадобится дополнительная информация.

//Передатчик//    
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

// Определение цифровых входов
#define liftPOT A2  // Кнопка джойстика 1
#define thrustPOT A0  // Кнопка джойстика 2
#define rudderPOT A1   // Тумблер 1

RF24 radio(7, 8);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001"; // Адрес
// Максимальный размер этой структуры составляет 32 байта - NRF24L01 buffer limit
struct Data_Package {
  byte thrustPOT;
  byte liftPOT;
  byte rudderPOT;
};
Data_Package data; //Создать переменную с приведенной выше структурой
void setup() {
  Serial.begin(9600);
  // Определить радиосвязь
  radio.begin();
  radio.openWritingPipe(address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  
  // Установить начальные значения по умолчанию
  data.thrustPOT = 127; // Значения от 0 до 255. Когда джойстик находится в положении покоя, значение находится посередине, или 127. На самом деле мы сопоставляем значение банка от 0 до 1023 от 0 до 255 потому что это однобайтовое значение
  data.rudderPOT = 127;
  data.liftPOT = 1;
}
void loop() {
  // Считывает все аналоговые входы и сопоставляет их с одним байтовым значением
  data.thrustPOT = map(analogRead(A1), 0, 1023, 0, 255); // Преобразуйте аналоговое значение считывания от 0 до 1023 в БАЙТОВОЕ значение от 0 до 255
  data.rudderPOT = map(analogRead(A0), 0, 1023, 0, 255);
  data.liftPOT = map(analogRead(A2), 0, 1023, 0, 255);
  radio.write(&data, sizeof(Data_Package));

  int liftVal, thrustVal, rudderPOS;
  liftVal = map(analogRead(A2), 0, 1023, 0, 255);
  thrustVal = map(analogRead(A0), 0, 1023, 0, 255);
  rudderPOS = map(analogRead(A1), 0, 1023, 0, 255);
  Serial.print("Lift : ");
  Serial.print(data.liftPOT);
  Serial.print(" Thrust : ");
  Serial.print(data.thrustPOT);
  Serial.print(" Rudder : ");
  Serial.println(data.rudderPOT);
//Приемник//
    #include <RF24Network.h>
#include <RF24Network_config.h>
#include <Sync.h>

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

RF24 radio(7, 8);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
Servo thrustESC;  // создать объект servo для управления ESC
Servo liftESC;
Servo rudder;
int thrustVal, liftVal, rudderVal;
// Максимальный размер этой структуры составляет 32 байта - NRF24L01 buffer limit
struct Data_Package {
  byte thrustPOT;
  byte liftPOT;
  byte rudderPOT;
};
Data_Package data; //Создать переменную с приведенной выше структурой
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); // Установить модуль в качестве приемника
  resetData();
  thrustESC.attach(6);
  liftESC.attach(5);
  rudder.attach(3);
  pinMode(10, OUTPUT);
 
}
void loop() {
  // Проверьте, продолжаем ли мы получать данные, или у нас есть соединение между двумя модулями
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // Если текущее время больше 1 секунды с момента получения последних данных, это означает, что мы потеряли соединение
    resetData(); // Если соединение потеряно, сбросьте данные. Это предотвращает нежелательное поведение, например, если дрон поднимает дроссельную заслонку, если мы теряем соединение, он может продолжать улетать, если мы не сбросим функцию
  }
  // Проверьте, есть ли данные для получения
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Прочитайте все данные и сохраните их в структуре "данные"
    lastReceiveTime = millis(); // На данный момент мы получили данные
    Serial.print("recieving");
  }
  // Управление сервоприводами
  rudderVal = map(data.rudderPOT, 0, 255, 0, 50);
  rudder.write(rudderVal);
  // Управление бесщеточным двигателем с помощью ESC
  // Подъемный винт
  liftVal = map(data.liftPOT, 0, 255, 1000, 2000); // Сопоставьте форму приемного значения от 0 до 255 до 0 от 1000 до 2000, значения, используемые для управления ЭСК
  liftESC.writeMicroseconds(liftVal); // Отправить сигнал управления ШИМ в ESC
  
  // Тяга пропеллера
  thrustVal = constrain(data.thrustPOT, 130, 255); // Джойстики остаются посередине. Таким образом, нам нужны только значения верхних значений от 130 до 255
  thrustVal = map(thrustVal, 130, 255, 1000, 2000);
  thrustESC.writeMicroseconds(thrustVal);
  Serial.print("Lift : ");
  Serial.print(data.thrustPOT);
  Serial.print(" Thrust : ");
  Serial.print(thrustVal);
  Serial.print(" Rudder : ");
  Serial.println(rudderVal);
}
void resetData() {
  // Сброс значений при отсутствии радиосвязи - Установить начальные значения по умолчанию
  data.thrustPOT = 127;
  data.liftPOT = 1;
    data.rudderPOT = 127;
    Serial.println("reset");
  
}

, 👍0

Обсуждение

Более подробная информация:, @Robert Spiers

Дополнительная информация: я припаял все свои провода, так как эта настройка должна быть постоянной. Я проверил непрерывность с помощью мультиметра на 100% системы, и все подключено правильно. Питание nRF24L01 осуществляется от: источника питания 9 В, подключенного к Vin, выхода 5 В, подключенного к VCC вывода регулятора nRF24L01 VCC, и этот регулятор питает фактический nRF24L01. Я передаю и получаю от двух Nanos (старый загрузчик)., @Robert Spiers

Пожалуйста, [отредактируйте] свой вопрос, чтобы добавить все детали, не скрывайте их в комментариях., @Mat

Ваш вопрос кажется потенциальным дубликатом [этого](https://arduinoprosto.ru/q/38010/nrf24l01-only-receiving-zeros). Я бы ожидал, что проблема с проводкой проявится по-другому, но, очевидно, то, что вы видите, возможно при таком сценарии. Если это окажется вашей проблемой, сообщите нам об этом, и мы сможем закрыть это как дубликат., @timemage

@RobertSpiers вы отлаживаете проблему связи ... сфокусируйте свой код на достижении этой цели ... удалите весь код, который не связан с передачей данных .... отправляйте что-то вроде "abc124" раз в 5 секунд, не более того... упростите код получения, чтобы только подтвердить правильность получения данных, @jsotola

Вы питаете nRF24 напряжением 5 вольт? Рабочее напряжение модуля составляет от 1,9 до 3,6 В!, @Mats Karlsson

И то, что говорит @jsotola, - это ПОЦЕЛУЙ (будь простым и глупым) другими словами, сделай базовую отправку номера и получи код номера, прежде чем продвигаться., @Mats Karlsson

Я много раз проверял контакты, которые я подключаю... Кажется, я не могу найти ничего неуместного. Я полностью упростил код и не включил ничего, кроме функции radio.isChipConnected(); которая возвращает false... Я перемонтировал его, и у меня все та же проблема. IsChipConnected сообщает мне, что Rf24 подключен неправильно, верно? Я дважды проверил и даже перепаял соединения..., @Robert Spiers

@MatsKarlsson, я подключаю 5 В к дополнительному регулятору RF24, разработанному специально для него, который регулирует напряжение до 3,3., @Robert Spiers

@timemage, запуск функции radio.isChipConnected показал мне, что у меня действительно ошибка подключения. Не стесняйтесь удалить этот пост., @Robert Spiers

Добавьте это в качестве ответа и выберите его в качестве ответа. А что касается упрощения кода, я имею в виду его еще проще, проверьте: https://forum.arduino.cc/index.php?topic=217865.0, @Mats Karlsson

Отвечает ли это на ваш вопрос? [NRF24L01 получает только нули](https://arduinoprosto.ru/q/38010/nrf24l01-only-receiving-zeros ), @timemage

Если вам интересно, он, по-видимому, автоматически добавляет приведенный выше комментарий, если вы пометите его как дубликат. На данном этапе это кажется немного неудобным, но удаление его не кажется хорошей идеей, не зная обычной процедуры для этого., @timemage


1 ответ


1

Чтобы диагностировать мой proplem, я использовал функцию radio.isChipConnected() . Когда функция возвращает 0, у вас есть проблема с проводкой. Если вы получаете последовательные высокие или низкие значения, запустите вышеприведенную функцию. Если вы возвращаете значение 1, это означает, что nRF24L01 подключен правильно и, скорее всего, произошла программная ошибка. Упростите все в коде до такой степени, чтобы передавалась и принималась только одна простая вещь. Я бы рекомендовал начать с малого, не привязывая к arduino ничего, кроме радиомодуля. Как только это будет сделано правильно, шаг за шагом приближайтесь к своей цели, проверяя ее по пути. Моя ошибка заключалась в том, что я паял всю свою установку непосредственно на arduino, а затем пытался устранить неполадки.

,