Подключение nRf24L01 к Atmega328PU с проблемой внешнего кристалла 8 МГц

Я пытаюсь решить проблему связи между двумя nRf24l01+, один из которых подключен к Arduino Uno, а другой - к Atmega328PU с внешним кристаллом 8 МГц.

Загрузчик на Atmega328PU — «Arduino Pro или Pro Mini», 3,3 В, 8 МГц. Проблема в том, что nRf24L01+ на Atmega328PU не отвечает (работает). Я использую библиотеку RF24, как показано в коде ниже. Я уже пробовал несколько вещей:

  1. Чтобы убедиться, что оба модуля nRf24L01+ работают, я подключил один к Arduino Uno, а другой к Arduino Mega, и они работают отлично. Значит, проблема не в модулях нРф.
  2. Я поменял внешний кристалл 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);
    }  
  }
}

, 👍4

Обсуждение

Кристалл — это компонент электроники, где вам необходимо иметь определенные знания в области электронного проектирования. Вы не можете просто подключить кристалл и надеяться, что он будет работать. Различные кристаллы имеют разную нагрузочную емкость (для этого необходимо прочитать техническое описание кристалла) и требуют некоторых расчетов, чтобы подобрать правильные нагрузочные конденсаторы и обеспечить правильную работу., @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


1 ответ


0

Предполагая, что базовый тест 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