NRF24 и Arduino Nano при одновременном использовании
Я создаю проект радиоуправляемого автомобиля и использую 2 NRF24 для связи. У меня есть Arduino Uno, Nano и Nano Every. NRF отлично работает с Uno и Nano в любых комбинациях, но использование Nano в качестве TX или RX не работает.
Я попробовал NRF24 и NRFLite, и оба говорят: "Не удается связаться с радио".
При использовании примеров библиотеки NRFLite, Basic_TX в Uno/Nano и Basic_RX в Nano Every, Uno/Nano сообщает, что передача прошла успешно, даже если в каждом указано "Не удается связаться с радио". Это длится около 1 секунды, прежде чем Uno/Nano сообщит, что передача снова не удалась. Это происходит каждый раз, когда вы сбрасываете настройки. Это похоже на то, как если бы NRF24 включился, но затем не смог связаться с каждым.
Я использую адаптеры питания для NRF и подключаю их через вывод 5 В. С конденсаторами тоже не повезло. Поменяли местами все провода, а также дважды проверили все соединения.
Что-то не так с нанотехнологиями? Работает ли это с NRF24 для кого-нибудь?
У меня совершенно закончились идеи, как это исправить. Заранее благодарю вас
@Sumemerboy, 👍3
Обсуждение1 ответ
Я столкнулся с той же проблемой, когда использовал nRF24L01+ и Arduino Nano Every для передачи данных в Arduino Uno с помощью nRF24L01+. Поэтому я решил проблему следующим образом. Я надеюсь, что это может помочь вам и кому-то еще.
- Прежде всего, вы должны добавить платы Arduino megaAVR в менеджер плат.
1.1 Сначала необходимо добавить URL-адрес JSON-файла их Менеджера плат в: Файл > Настройки >> Дополнительные URL-адреса менеджера плат и вставить ссылку: >>https://raw.githubusercontent.com/amperka/iskra-boards/master/package_amperka_index.json
1.2. Затем перейдите в раздел Инструменты>Менеджер плат, найдите платы Arduino SAMD и установите их>
1.3. Выберите Arduino Nano Every в меню Инструменты>Плата>>Платы Arduino megaAVR>>>Arduino Nano Every>>>
Загрузите библиотеку для RF24. Он должен быть совместим с архитектурой megaavr, потому что в Arduino Nano Every использует микросхему ATmega4809. Я использую последнюю версию RF24-1.4.1. Вот ссылка на библиотеку: https://www.arduinolibraries.info/libraries/rf24
Вы должны проверить, правильно ли вы подключили nRF24L01+ и arduino.
Распиновка Arduino Uno выглядит следующим образом: 5 В - VCC при подключении nRF24L01+ через адаптер nRF24L01+ (я использую адаптер) или 3,3 В - VCC без адаптера
GND - GND
9 - контактный - CE
10 - контактный - CSN
11 pin - MOSI
12 контакт - МИСО
13 контакт - SCK
не подключен - IRQ
Тем не менее, я использую другую распиновку для Arduino Nano Every. Когда я использую ту же распиновку, что и Arduino Uno, он не может найти nRF24L01+. Вы можете проверить это в последовательном мониторе, используя рисунок ниже. Если вы получите нули в третьей строке, например, что-то вроде этого: RX_ADDR_P0-1 = 0x0000000070 0x0000000000. Это означает, что Arduino Nano Every неправильно подключен к nRF24L01+, и Arduino Nano Every этого не видит. Я полагаю, что проблема с библиотекой RF24 и ее следует исправить. Возможно, я ошибаюсь, и проблема в другом.
Поэтому я использую следующие распиновки для Arduino Nano Every: 5 В - VCC при подключении nRF24L01+ через адаптер nRF24L01+ (я использую адаптер) или 3,3 В - VCC без адаптера
GND - GND
10 - контактный - CE
A3 - CSN (если вы получите нули в третьей строке RX_ADDR_P0-1 в последовательном мониторе, затем измените A3 на другой. Вы можете варьировать вывод от A5 и так далее до A0). не используйте A7 и A6, потому что на некоторых платах разработчиков моделей A6 и A7 являются только аналоговым входом.
11 pin - MOSI
12 контакт - МИСО
13 контакт - SCK
не подключен - IRQ
Скетч для проверки:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(10,A3); // for arduino nano every
//RF24 radio(9,10); // for arduino uno
const uint8_t num_channels = 128;
uint8_t values[num_channels];
void setup(void)
{
Serial.begin(9600);
printf_begin();
radio.begin();
radio.setAutoAck(false);
radio.startListening();
radio.printDetails();
delay(5000);
radio.stopListening();
int i = 0;
while ( i < num_channels ) {
printf("%x",i>>4);
++i;
}
printf("\n\r");
i = 0;
while ( i < num_channels ) {
printf("%x",i&0xf);
++i;
}
printf("\n\r");
}
const int num_reps = 100;
void loop(void)
{
memset(values,0,sizeof(values));
int rep_counter = num_reps;
while (rep_counter--) {
int i = num_channels;
while (i--) {
radio.setChannel(i);
radio.startListening();
delayMicroseconds(128);
radio.stopListening();
if ( radio.testCarrier() )
++values[i];
}
}
int i = 0;
while ( i < num_channels ) {
printf("%x",min(0xf,values[i]&0xf));
++i;
}
printf("\n\r");
}
int serial_putc( char c, FILE * ) {
Serial.write( c );
return c;
}
void printf_begin(void) {
fdevopen( &serial_putc, 0 );
}
Вот правильный вывод в последовательном мониторе третьей строки без нулей: RX_ADDR_P0-1 = 0xf0f0f0f0d2 0xc2c2c2c2c2
SPI Speedz = 10 Mhz
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0d2 0xc2c2c2c2c2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0d2
RX_PW_P0-6 = 0x20 0x20 0x20 0x20 0x20 0x20
EN_AA = 0x00
EN_RXADDR = 0x02
RF_CH = 0x00
RF_SETUP = 0x14
CONFIG = 0x0f
DYNPD/FEATURE = 0x38 0x38
Data Rate = 1 MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_HIGH
ARC = 15
следующие две строки представляют собой список доступных каналов, которые следует читать сверху вниз (т. е. у нас 127 каналов, еру каналы представлены в 16-разрядной версии, первая строка-первая цифра каждого из 127 каналов, вторая строка-вторая цифра каждого из 127 каналов).
00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
затем отображается уровень шумности каналов. Примерно от канала 09 до канала 3f есть шумы. этот шум от моего Wi-Fi-роутера и какой-то другой электроники. вы должны выбрать бесплатные каналы для своей цели.
00000010114663444533233300000000001000011233544433221100112223212010000000000000000000000000000000000000000000000000000000000000
00200000035575656777697332111321022125625559643632551111000333012000000000100000010001000000001000000000000011010000000000000000
00000001135a9a767767c89a85646565866555645897434644445200121212122000000000000000000000001000000000000000011000000010000000000000
00101000035567667357878a51123341220322335373542222122000112313112000000001010000000001000000020000000010000000000000100000000010
11000011047587577457694521122232111121243247542232210100002222111000000000100002000002000000000000000000000000000010000000000000
Примечание:
Проверьте Инструменты. Там должно быть: Плата:Arduino Nano Every; Эмуляция регистров: "ATMEGA328"; Порт:COM#(каждый Arduino Nano).
некоторые ошибки передачи могут возникать из-за плохих контактов между проводами и выводами arduino, поэтому провода следует припаять.
Если все в порядке, то вы можете использовать свои скетчи для приемника и передатчика соответственно. Удачи!
итак, вы говорите: вывод 9 не работает как CE или вывод 10 не работает как CS, если Nano Every используется с эмуляцией ATmega328? не могли бы вы попробовать, в чем проблема?, @Juraj
Проблема в том, что CSN не работает на цифровых выводах Arduino Nano, но он работает на одном из Arduino Uno. CSN работает только на аналоговых выводах (A5-A0) Arduino Nano Каждый. CE хорошо работает, если вы подключаете его к 9 или 10 контактам arduino nano каждый. На самом деле я нашел его случайно., @stremyanka2000
UPD: Если вы используете эмуляцию регистров "Нет (ATMEGA4809)", это тоже работает. Я имею в виду, если вы используете распиновку, как показано выше. Иначе это не сработает., @stremyanka2000
У меня нет проблем с использованием pin 10 в качестве CS (для Ethernet) даже в режиме эмуляции 328p, @Juraj
Спасибо вам за эти прекрасные инструкции. После нескольких дней попыток заставить эту проклятую нанотехнологию работать с nRF24L01+, ваш гид сделал это! Я не могу думать о тебе достаточно. Я надеюсь, что это нормально, поделиться этим URL-адресом с другими, кто также пытается встречаться...?? Овации, @Blondie SL
- вопрос по трубке nRF24L01
- Как подключить NodeMCU к NRF24L01
- Переключение каналов NRF24l01
- Использование функции уровня сигнала модуля nRF24L01
- Как автоматически сбросить nrf24l01+ с кодом?
- NRF24L01+ PA не работает с Arduino Mega (работает с Nano)
- Пустое значение не игнорируется, как должно быть.
- Не получаем данные от NRF24L01
Как вы подключаете Nano каждый и определяете определение контакта на своем скетче? Нано у каждого есть штифт SS на [D8](https://github.com/arduino/ArduinoCore-megaavr/blob/master/variants/nona4809/pins_arduino.h#L47), не похоже на большинство плат на базе Arduino AVR на выводе 10., @hcheung
У меня есть SCK на D13, MISO на D12, MOSI на D11, CE на 7 и CSE на 8. Я не знаю, что такое пин SS :(, @Sumemerboy
SS-это ведомый выбор, некоторые называются Chip Select (CS), вы можете попробовать использовать контакт 8 в качестве CE и выбрать другой контакт для CSE., @hcheung
К сожалению, с этим не повезло. Я купил новый nrf24, и это тоже не помогло, он работал с обычным Nano tho. Похоже, у меня все Нано просто сломано., @Sumemerboy