Проблемы передачи NRF24L01 между Arduino UNO и Arduino Nano

Я новичок в использовании модуля tranceiver NRF24L01. Я попробовал отправить простое "Привет, мир" с помощью Arduino Nano и Arduino UNO с использованием двух модулей NRF24L01. Я не получаю никакого выхода в последовательном мониторе со стороны приемника. Я проверил соединение провода много раз. Также проверена скорость передачи данных как кода приемника, так и последовательного монитора, и адреса кода tranceiver и кода приемника одинаковы. Ищем решение. Заранее спасибо.

Вот мой код трансивера:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}
void loop() {
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  delay(1000);
}

И это мой код приемника:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
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() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

, 👍1


4 ответа


1

У меня была та же проблема, и когда я попробовал функцию isChipConnected (), она сказала мне, что один из nrf24l01 не был подключен к SPI, и я предположил, что один был плохим. Я купил 2 nrf24l01 с антеннами, и они хорошо работают (в основном). ( Вот ссылка на справочник по библиотеке. Кроме того, убедитесь, что вы используете версию библиотеки TMRh20, вот эту. Насколько мне известно, это более обновлено и улучшено.

Как бы все предложили, попробуйте припаять конденсатор емкостью 10 куб. См между GND и VCC (иногда этот модуль требует больше энергии). И последнее, что я пытался сделать, - это использовать один из этих адаптеров сокетов для 2-х модулей здесь, чтобы использовать выход 5 В от arduino, так как он может выдавать больше mA, и, следовательно, модуль может работать лучше. Это руководство немного поможет мне, я оставлю его здесь Я не вижу ничего плохого в коде, но я новичок, как и вы (похоже, мы используем один и тот же адрес в наших кодах)

,

0

Вы также можете попробовать использовать библиотеку NRFLite. Это намного проще в использовании. Также убедитесь, что у вас есть минимум 3,3 В и 0,5 А мощности на выводе радиоприемника. Если нет, он может не передавать.

Вот пример передачи TX и RX для отправки текста с помощью NRFLite. Это прекрасно сработало для меня!

TX:

/*

Демонстрирует отправку и получение пакетов различной длины.

Радио Arduino
CE    -> 9
CSN -> 10 (Аппаратный SPI SS)
MOSI -> 11 (Аппаратный SPI MOSI)
МИСО -> 12 (Аппаратный SPI МИСО)
SCK -> 13 (Аппаратный SPI SCK)
IRQ -> Нет подключения
VCC -> Не более 3,6 вольт
GND -> GND

*/

#include <SPI.h>
#include <NRFLite.h>

const static uint8_t RADIO_ID = 1;
const static uint8_t DESTINATION_RADIO_ID = 0;
const static uint8_t PIN_RADIO_CE = 9;
const static uint8_t PIN_RADIO_CSN = 10;

struct RadioPacket1
{
    uint8_t FromRadioId;
    uint8_t Counter;
};

struct RadioPacket2
{
    uint8_t FromRadioId;
    char Message[31];    // Обратите внимание, что максимальный размер пакета составляет 32, поэтому 31-это все, что мы можем здесь использовать.
};

NRFLite _radio;
RadioPacket1 _radioData1;
RadioPacket2 _radioData2;

void setup()
{
    Serial.begin(115200);

    if (!_radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN))
    {
        Serial.println("Cannot communicate with radio");
        while (1); // Wait here forever.
    }

    _radioData1.FromRadioId = RADIO_ID;
    _radioData2.FromRadioId = RADIO_ID;
}

void loop()
{
    // Pick a number from 0 - 60,000.
    uint16_t randomNumber = random(60001);

    if (randomNumber > 30000)
    {
        // Отправить RadioPacket1.

        _radioData1.Counter++;

        Serial.print("Sending ");
        Serial.print(_radioData1.Counter);

        if (_radio.send(DESTINATION_RADIO_ID, &_radioData1, sizeof(_radioData1)))
        {
            Serial.println("...Success");
        }
        else
        {
            Serial.println("...Failed");
        }
    }
    else
    {
        // Отправить RadioPacket2.

        // Создайте сообщение и назначьте его пакету.
        // Строки необходимо преобразовать в массив символов, и обратите внимание, что они не могут быть длиннее
        // более 31 символа, так как это размер _radioData2.Message.
        String msg = "Hello " + String(randomNumber);
        msg.toCharArray(_radioData2.Message, msg.length() + 1);

        Serial.print("Sending '");
        Serial.print(msg);
        Serial.print("'");

        if (_radio.send(DESTINATION_RADIO_ID, &_radioData2, sizeof(_radioData2)))
        {
            Serial.println("...Success");
        }
        else
        {
            Serial.println("...Failed");
        }
    }

    delay(1000);
}

RX:

/*

Демонстрирует отправку и получение пакетов различной длины.

Радио Arduino
CE    -> 9
CSN -> 10 (Аппаратный SPI SS)
MOSI -> 11 (Аппаратный SPI MOSI)
МИСО -> 12 (Аппаратный SPI МИСО)
SCK -> 13 (Аппаратный SPI SCK)
IRQ -> Нет подключения
VCC -> Не более 3,6 вольт
GND -> GND

*/

#include <SPI.h>
#include <NRFLite.h>

const static uint8_t RADIO_ID = 0;
const static uint8_t PIN_RADIO_CE = 9;
const static uint8_t PIN_RADIO_CSN = 10;

struct RadioPacket1
{
    uint8_t FromRadioId;
    uint8_t Counter;
};

struct RadioPacket2
{
    uint8_t FromRadioId;
    char Message[31];    // Обратите внимание, что максимальный размер пакета составляет 32, поэтому 31-это все, что мы можем здесь использовать.
};

NRFLite _radio;
RadioPacket1 _radioData1;
RadioPacket2 _radioData2;

void setup()
{
    Serial.begin(115200);

    if (!_radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN))
    {
        Serial.println("Cannot communicate with radio");
        while (1); // Ждите здесь вечно.
    }
}

void loop()
{
    // 'hasData' возвращает размер полученного пакета или 0, если данных нет.
    uint8_t packetSize = _radio.hasData();

    if (packetSize == sizeof(RadioPacket1))
    {
        _radio.readData(&_radioData1);

        Serial.print("Received ");
        Serial.print(_radioData1.Counter);
        Serial.print(" from radio ");
        Serial.println(_radioData1.FromRadioId);
    }
    else if (packetSize == sizeof(RadioPacket2))
    {
        _radio.readData(&_radioData2);

        String msg = String(_radioData2.Message);

        Serial.print("Received '");
        Serial.print(msg);
        Serial.print("' from radio ");
        Serial.println(_radioData2.FromRadioId);
    }
}
,

1

@Эрик Наваррте @dragonflyrobotics Большое вам спасибо за ваш ответ, я перепробовал все варианты, которые вы упомянули, но по неизвестной причине у меня ничего не вышло. Затем я изучил подробнее и нашел базовый модуль NRF24L01.Этот базовый модуль NRF24L01 поможет вам без каких-либо проблем установить 8-контактный радиочастотный модуль серии NRF24L01. А также этот модуль поставляется с регулятором 3,3 В и встроенным конденсатором и простым контактным соединением для подключения PIC или arduino. Используя модуль NRF24L01 и базовый модуль NRF24L01, я смог успешно передавать данные.Еще раз спасибо, что нашли время ответить, очень ценю это.

,

1

Я использую китайский клон nRF24L01. Он имеет очень узкий допуск напряжения. Мой Arduino тоже клон. Выходное напряжение 3,3 В составляло 3,27. nRF24L01 не работал. Я добавил 3-клеммный регулятор между выходным выводом Arduino 5V и nRF24L01. Напряжение составляло 3,303 В. Тогда nRF24L01 работал нормально.

///////////////////////////////////////////////
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10);
const byte rxAddr[6] = "00001";
void setup()
{
  radio.begin();
  radio.setRetries(15, 15);
  radio.openWritingPipe(rxAddr);
radio.stopListening();
pinMode(4,OUTPUT);
}
void loop()
{
  const char text[] = "Kawasaki_JP";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}
////////////////////////////////////////////////

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10);
const byte rxAddr[6] = "00001";
void setup()
{
  Serial.begin(9600);
  while (!Serial);
  radio.begin();
  radio.openReadingPipe(0, rxAddr);
   radio.startListening();
}
void loop()
{
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

////////////////////////////////////////////

библиотека ; https://downloads.arduino.cc/libraries/github.com/TMRh20/RF24-1.4.0.zip

,

Неважно, я все понимаю. Это странно зависит от напряжения. Часто то, что происходит, когда вы добавляете регулятор ближе к nRF24L01 (по любому другому вопросу), заключается в том, что вы также получаете лучшую развязку или просто лучшую текущую емкость., @timemage