Проблемы передачи 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);
}
}
@Tharu D., 👍1
4 ответа
У меня была та же проблема, и когда я попробовал функцию isChipConnected (), она сказала мне, что один из nrf24l01 не был подключен к SPI, и я предположил, что один был плохим. Я купил 2 nrf24l01 с антеннами, и они хорошо работают (в основном). ( Вот ссылка на справочник по библиотеке. Кроме того, убедитесь, что вы используете версию библиотеки TMRh20, вот эту. Насколько мне известно, это более обновлено и улучшено.
Как бы все предложили, попробуйте припаять конденсатор емкостью 10 куб. См между GND и VCC (иногда этот модуль требует больше энергии). И последнее, что я пытался сделать, - это использовать один из этих адаптеров сокетов для 2-х модулей здесь, чтобы использовать выход 5 В от arduino, так как он может выдавать больше mA, и, следовательно, модуль может работать лучше. Это руководство немного поможет мне, я оставлю его здесь Я не вижу ничего плохого в коде, но я новичок, как и вы (похоже, мы используем один и тот же адрес в наших кодах)
Вы также можете попробовать использовать библиотеку 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);
}
}
@Эрик Наваррте @dragonflyrobotics Большое вам спасибо за ваш ответ, я перепробовал все варианты, которые вы упомянули, но по неизвестной причине у меня ничего не вышло. Затем я изучил подробнее и нашел базовый модуль NRF24L01.Этот базовый модуль NRF24L01 поможет вам без каких-либо проблем установить 8-контактный радиочастотный модуль серии NRF24L01. А также этот модуль поставляется с регулятором 3,3 В и встроенным конденсатором и простым контактным соединением для подключения PIC или arduino. Используя модуль NRF24L01 и базовый модуль NRF24L01, я смог успешно передавать данные.Еще раз спасибо, что нашли время ответить, очень ценю это.
Я использую китайский клон 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 PA+LNA с Arduino
- nRF24L01+ Невозможно установить адрес
- nrf24l01+ противоречит самому себе?
- Не вызовут ли помехи одновременно работающие радиомодули nrf24L01 ?
- Состояние цифрового вывода Arduino не передается через NRF24L01, тогда как состояние аналогового вывода передается, почему?
- Использую передатчик + Arduino *Uno*..и приемник + arduino *nano* будет ли это работать?
- Код правильный? Nrf24l01
- Arduino NRF24LO1
Неважно, я все понимаю. Это странно зависит от напряжения. Часто то, что происходит, когда вы добавляете регулятор ближе к nRF24L01 (по любому другому вопросу), заключается в том, что вы также получаете лучшую развязку или просто лучшую текущую емкость., @timemage