Проблема с NRF24L01

Я пробовал и пробовал, чтобы nrf24l01 работал в течение некоторого времени, и, похоже, они никогда не работают. Прямо сейчас я просто пытаюсь включить и выключить светодиод по радио, но он не работает.

Вот код для передатчика

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

#define button 5
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
boolean buttonState = 0;
void setup() {
  pinMode(5, INPUT_PULLUP);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}
void loop() {

  buttonState = digitalRead(button);
  radio.write(&buttonState, sizeof(buttonState));
}

А вот код получателя

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

int led = 2;
RF24 radio(7, 8); // CE, CSN
boolean buttonState = 0;
const byte address[6] = "00001";
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}
void loop() {
 radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) 
  {
    digitalWrite(led, HIGH);
  }
  else 
  {
    digitalWrite(led, LOW);
  }
}

У меня есть регулятор напряжения, который выводит arduino 5 В на чип 3,3, поэтому я не думаю, что отсутствие конденсатора (что рекомендовали другие) является проблемой. У меня оба радиочипа подключены к наноустройствам arduino.

Для передатчика и приемника у меня есть CE=7,CSN=8, SCK=13, MO=11 и MI=12

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

, 👍2

Обсуждение

Конденсатор не используется для регулирования напряжения, например, он используется для того, чтобы убедиться, что подаваемое напряжение "чистое", когда радио передает, что оно очень быстро потребляет "много" тока, и если регулятор не может справиться с этим скачком, напряжение падает. Я обнаружил, что использование конденсатора в этих радиоприемниках устраняет некоторые проблемы., @Chad G


4 ответа


1

Почти уверен, что ваша проблема в том, что вы не используете конденсатор. Я использовал конденсатор емкостью 10 мкФ, и он отлично работает.

Вы устанавливаете конденсатор на контакты 1 и 2, убедитесь, что заземление находится на выводе 1.

Конденсатор должен обеспечивать достаточную подачу энергии, когда он в ней нуждается. Без конденсатора это приводит к ненадежной связи.

Если у вас есть другие проблемы, это отличное краткое видео об использовании приемопередатчиков NRF24L01+: https://www.youtube.com/watch?v=kDTJULtFPgE

,

2

Нелегко найти проблему удаленно. Вот что я бы сделал:

  1. Моей первой проблемой всегда были связи. Я отказался от использования макетов и других разъемов. Вместо этого используйте пайку, чтобы убедиться, что ваша схема правильно подключена.

  2. Добавьте несколько последовательных.println() в оба кода, чтобы увидеть, что именно будет отправлено и что было получено.

  3. В коде отправителя добавьте задержку(100) в цикл. Это дало бы буферам модуля возможность обрабатывать.

  4. Вы можете улучшить его еще больше, проверив значение кнопки, которое вы прочитали, со старым значением, и отправив значение только в том случае, если состояние изменилось.

,

1

Сначала проверьте эти вещи:

  • Ваш источник питания обеспечивает постоянное напряжение 3,3 В и минимум 0,5 А(500 мА)?
  • Вы на правильной скорости передачи последовательных данных?
  • Является ли путь от радио до Arduino как можно короче?
  • Ваши провода МИСО и МОСИ переплетены друг с другом?
  • Попробуйте изменить свой CE на контакт 9, а CSN-на контакт 10.

Если ничего из этого не поможет, пожалуйста, скажите мне, какую библиотеку вы используете. У меня было много проблем с библиотекой RF24, так что, возможно, попробуйте использовать библиотеку NRFLite.

,

3

Интересно. У меня также была проблема с nRF24L01, поэтому я попробовал ваш код (измененный для переключения передатчика и печати вывода). Возможно, у вас та же проблема, что и у меня (nRF24L01 непрерывно считывающий закрытый канал), поэтому я изменил ваш код следующим образом:

void loop() {
 uint8_t pipeNum;
 radio.startListening();
  while (!radio.available(&pipeNum));
  radio.read(&buttonState, sizeof(buttonState));
  if (pipeNum < 2) {
    if (buttonState == HIGH) 
    {
      digitalWrite(led, HIGH);
      Serial.println("ON");
    }
    else 
    {
      digitalWrite(led, LOW);
      Serial.println("OFF");
    }
  }
}

и тогда это сработало для меня. PS: Я обычно добавляю строку "в то время как (!Последовательный);" после последовательного.начинайте удерживать выход до тех пор, пока не будет установлен монитор.

,