Подключение nRf24L01 к Atmega328PU с проблемой внешнего кристалла 8 МГц
Я пытаюсь решить проблему связи между двумя nRf24l01+, один из которых подключен к Arduino Uno, а другой - к Atmega328PU с внешним кристаллом 8 МГц.
Загрузчик на Atmega328PU — «Arduino Pro или Pro Mini», 3,3 В, 8 МГц. Проблема в том, что nRf24L01+ на Atmega328PU не отвечает (работает). Я использую библиотеку RF24, как показано в коде ниже. Я уже пробовал несколько вещей:
- Чтобы убедиться, что оба модуля nRf24L01+ работают, я подключил один к Arduino Uno, а другой к Arduino Mega, и они работают отлично. Значит, проблема не в модулях нРф.
- Я поменял внешний кристалл atmega328PU на 16 МГц и поменял загрузчик на Arduino Uno. Опять не сработало.
Принципиальная схема показана ниже:
Код передатчика:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, ДНС
const byte address[6] = "00001";
const int btn = 4;
int buttonState = 0;
int programState = 0;
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
pinMode(btn, INPUT);
}
void loop() {
buttonState = digitalRead(btn);
// проверяем, нажата ли кнопка. Если это так, то состояние кнопки ВЫСОКОЕ:
if ((buttonState == LOW) && (programState == 0)) {
programState = 1;
}
else if((buttonState == HIGH)&& (programState == 1)){
const char text[] ="Hello World"; // вы можете настроить этот текст по своему желанию
radio.write(&text, sizeof(text));
programState = 0;
Serial.println("BUTTON");
delay(1000);
}
}
Код получателя:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, ДНС
const byte address[6] = "00001";
const int output = 2;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
pinMode(output,OUTPUT);
digitalWrite(output, LOW);
delay(1000);
}
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
if (strcmp(text,"Hello World")==0){
Serial.println("CORRECT");
digitalWrite(output, HIGH);
delay(2000);
digitalWrite(output, LOW);
delay(2000);
}
}
}
@Jon depoy, 👍4
Обсуждение1 ответ
Предполагая, что базовый тест MCU работает, скажем, скетч мигания работает с нормальной скоростью (0,5 Гц), попробуйте следующий формат конструктора:
Радио RF24(7, 8, 4000000); // устанавливаем скорость SPI на 4 МГц вместо 10 МГц по умолчанию
Значение по умолчанию 10 МГц может быть слишком высоким для вашей конфигурации MCU.
Из https://github.com/nRF24/RF24/blob/master/COMMON_ISSUES.md
Еще несколько вещей, которые стоит попробовать:
ИЗМЕНИТЬ
Большинство проблем с Nrf24L01 связаны с неадекватным питанием. Некоторые источники питания на 3,3 В, например, источники питания Nano, где 3,3 В получают от адаптера USB/UART, здесь не работают. Вы можете попробовать добавить два конденсатора на шины питания в той точке макетной платы, где подается питание для nrf24L01. Используйте керамику емкостью 100 нФ и электролит емкостью от 10 до 100 мкФ. У вас, у Barebone-системы atmega328p, в любом случае должен быть свой собственный развязывающий конденсатор как можно ближе к контактам питания чипа. Используйте керамику 100 нФ.
По ссылке выше описаны другие способы устранения неполадок.
Пробовал, не получилось., @Jon depoy
@Jondepoy Я добавил еще несколько предложений в ответ., @6v6gt
- Советы по размещению печатных плат Nrf24l01 smd
- SPI.begin не работает после tristate
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Не удается снова загрузиться после смены платы
- вопрос по трубке nRF24L01
- ATMEGA328P-U vs ATMEGA328-PU
- Модуль SIM808 GSM работает нормально, GPS не работает (нет сообщения о готовности GPS при включении питания)
Кристалл — это компонент электроники, где вам необходимо иметь определенные знания в области электронного проектирования. Вы не можете просто подключить кристалл и надеяться, что он будет работать. Различные кристаллы имеют разную нагрузочную емкость (для этого необходимо прочитать техническое описание кристалла) и требуют некоторых расчетов, чтобы подобрать правильные нагрузочные конденсаторы и обеспечить правильную работу., @hcheung
Я не уверен, как вы узнали, что я включил в схему кварцевый резонатор (генератор), не зная, что делаю! У каждого электронного компонента есть таблица данных, которую каждый должен прочитать перед использованием. Я использовал кристалл с конденсатором емкостью 22 пФ, как указано в его технических характеристиках и как предложено в технических характеристиках Atmega328PU., @Jon depoy
Что ж, если вы выполните поиск по запросу [кристалл 8 МГц](https://sg.element14.com/search?st=8mhz%20crystal&gs=true), вы заметите, что разные кристаллы имеют разную нагрузочную емкость. Вам нужно прочитать техническое описание вашего кристалла, а не техническое описание MCU, затем вам нужно выполнить некоторые [расчеты](https://blog.adafruit.com/2012/01/24/choosing-the-right-crystal -and-caps-for-your-design/) на основе таблицы данных о емкости нагрузки подсказывает вам, какие конденсаторы подходят для конкретного кристалла. Кстати, если я правильно помню, в таблице данных ATmega328 указан диапазон 12–22 пФ, в зависимости от кристалла, который вы используете., @hcheung
На простой диаграмме Fritzing ATmeaga328P есть ошибка, заключающаяся в том, что только одна ножка правого кристаллического нагрузочного конденсатора подключена к чему-либо., @6v6gt
Я предполагаю, что ваш базовый процессор Atmega328PU может запускать простые скетчи, например мигание светодиода?, @Fahad
@Fahad Да, он может мигать светодиодом, @Jon depoy
Вот несколько вещей, которые вы можете попробовать. Потому что похоже, что настройка оборудования вызывает у вас проблемы. Потому что на мега, как вы упомянули, работал тот же код. Я предполагаю, что вы будете использовать загрузчик Arduino Uno и кварцевый генератор 16 МГц. Добавьте подтягивание к штырю сброса. Используйте для микроконтроллера питание 5 В (лучше, если вы сможете использовать стабилизатор). Подключите 5 В к контактам 7 и 20 и GND к контактам 8 и 22 (на вашем изображении этого не видно). Используйте фильтрующий конденсатор между контактами 7 и 8. Убедитесь, что кристалл правильно подключен с помощью колпачков (на изображении показано, что один контакт не подключен). ....., @Fahad
.....Модулю необходимо 3,3В. Поэтому не подключайте 5В. Выводы модулей выдерживают напряжение 5 В. При этом сначала проверьте, можете ли вы запустить пример мигания, мигая светодиодом. Затем попробуйте свой код., @Fahad
Источник питания, которым не является Arduino! Обычно, но не всегда, они выходят из строя при подключении к ним радиоприемников, это происходит с перерывами и сведет вас с ума, пытаясь его найти., @Gil
В зависимости от того, как вы прошиваете загрузчик, вы можете установить фьюзы, соответствующие внешнему кристаллу 8 МГц., @Mykolaha99