Don-stroitel.ru

Все о ремонте
11 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как подключить радиомодуль nrf24 к микроконтроллеру

Радиоуправление на ATmega8 и радиомодулях NRF24L01+PA+LNA. Приемник

В данной статье, являющейся логическим продолжением предыдущей, будет рассмотрен приемник радиоуправления.

Как и в случае с передатчиком, основой устройства выступает микроконтроллер ATmega8. Этот выбор не обусловлен ничем, кроме того, что у меня несколько таких микроконтроллеров валялось без дела. Кроме микроконтроллера в схеме фигурируют уже знакомые нам NRF24L01+ (или их модификации), линейные стабилизаторы L7805 и LM1117-3.3, а так же несколько разъемов, кварцевый резонатор и резисторы с конденсаторами.

Принципиальная схема приведена ниже:

Печатная плата

Внимание! На схеме не указан стабилизатор LM1117-3, подключенный к выходу L7805, и питающий радиомодуль NRF24L01 (на схеме обозначено точкой «VCC_NRF24»).

Разъем J2 предназначен для подключения дискретных (включено/выключено) нагрузок, но для управления чем-то, что требует тока >20 mA, необходимо установить транзисторные ключи. J3 служит для измерения напряжения батареи (делитель на R1 и R4 уже подключен к входу стабилизатора L7805). J4, а так же S1, S2, S3 — это исполнительные устройства (которым требуется пропорциональное управление). J5, J6 — шины питания, выведены для удобства подключения. К J7 подключаются два проводника, при замыкании которых микроконтроллер определяет, что в корпусе появилась вода (все-таки управление создавалось для водной модели). Но, если вам эта функция не нужна, просто можете не выводить этот разъем. J10 это разъем питания, к нему подключается аккумуляторная батарея.

С J11 и J12 несколько интереснее. Изначально планировалось подключать к управлению два датчика температуры DS18B20, так как на модель должно было быть установлено два двигателя. Но в ходе работ оказалось, что второй двигатель не нужен, и датчик к нему как следствие тоже. В прошивке, на момент написания статьи, возможно использование только одного датчика температуры, который подключен к разъему J11. J12 пока что не используется, но немного изменив прошивку, к нему можно будет подключить светодиод для индикации приема команд.

Программа для микроконтроллера, как и в случае с передатчиком, писалась на C под AVR-GCC (WinAVR). Все исходные файлы присутствуют в архиве, прикрепленном к статье.

Алгоритм работы программы можно описать так:

  1. Инициализация таймера, АЦП, прерываний и регистров ввода-вывода.
  2. Инициализация исполнительных устройств (сервомашинки и т.д.)
  3. Инициализация радиомодуля.
  4. Перевод радиомодуля в режим приема.
  5. Ожидание приема, а так же циклический опрос АЦП с целью мониторинга напряжения аккумуляторной батареи. Опрос датчика DS18B20, датчика воды.
  6. При приеме данных, корректируется положение исполнительных механизмов, состояние нагрузок. Если получен флаг запроса состояния, отправляются данные о температуре и напряжении.
  7. Работа с переменными-счетчиками, переход к пункту 5.

Есть момент, на котором, на мой взгляд, стоит остановиться подробнее.

Измерение напряжения (уровня заряда) аккумулятора несколько отличается от аналогичной процедуры в передатчике. Всему виной различное опорное напряжение АЦП микроконтроллера (3,3В в передатчике против 5В в приемнике).

Выше представлена упрощенная процедура для оценки уровня заряда. Принцип действия прост — если нужно узнать общий уровень заряда, вызываем:

Если же только «нижней» банки, то:

Для примерной оценки «верхней» банки можно сначала узнать общий уровень и сравнить его с уровнем «нижней». Если вам необходимо более точно контролировать уровень заряда, то можно сделать следующим образом: измерять напряжение на делителе R1-R4, далее измерить на R2-R3. Полученную разницу сохранить в отдельную переменную. После этого все три двухбайтовых переменных можно будет разбить на пары байт и отправить на передатчик, для последующего отображения.

При прошивке микроконтроллера Fuse-биты выставляются в соответствии с образцом (мной использовался Khazama AVR Programmer в связке с USBasp):

Fuse-биты

Печатная плата, как и в случае с приемником является односторонней. Что, однако, повлекло за собой использование перемычек. Размеры готовой платы составляют 70х40(мм).

Печатная плата

Разъем для программирования не выведен, так что для заливки прошивки в микроконтроллер необходимо аккуратно припаяться тонкими проводками к печатным проводникам, либо использовать программатор со специальной панелькой для программирования МК еще до установки на плату.

Про возможную замену деталей в данном случае можно не упоминать. Единственное, L7805 заменить на L78L05 нельзя — от нее питаются и сервоприводы, а «облегченная» версия не потянет ток более 100мА.

Немного фотографий, а так же видео:

Фото 1Фото 2

Фото 3Фото 4

Так же, хочу напомнить, что для корректной работы модуля NRF24L01+ необходимо подпаять к его выводам питания два конденсатора: электролитический, емкостью

47мкФ, и керамический

100нФ (последнее фото). Либо, как вариант, предусмотреть посадочные места для них на плате, непосредственно возле разъема для подключения радио модуля.

Как подключить и использовать NRF24L01 с Arduino

1 Описание и характеристики приёмопередатчика NRF24L01

NRF24L01 – миниатюрный (4×4 мм) приёмопередатчик на одном чипе. Он очень дешёвый, при этом обеспечивает устойчивую радиосвязь на расстояниях в десятки метров (а при усилении и с хорошей антенной – сотни метров в зоне прямой видимости), и поэтому получил широкое распространение среди радиолюбителей. Основные технические характеристики чипа nRF24L01:

NRF24L01 можно приобрести в составе готового модуля. Назначение выводов модуля показано на иллюстрации. На обратной стороне модуля радиоэлементов нет.

Внешний вид и назначение выводов приёмопередатчика nRF24L01 Внешний вид и назначение выводов приёмопередатчика nRF24L01

Для организации приёма и передачи понадобятся как минимум два подобных модуля с nRF24L01.

Выводы приёмопередатчика nRF24L01

НазваниеНазначениеПримечание
GNDЗемля
VDDПитание1,9…3,6 В. Если сигнал на MOSI/MISO >3,6 В, то питание не более 2,7…3,3 В.
CEЦифровой входChip Enable. Активирует режим приёма или передачи. Активный уровень «1» (HIGH).
CSNЦифровой входSPI Chip Select. Режим выбора устройства SPI. Активный «0» (LOW).
SCKЦифровой входSPI Clock. Линия синхронизации SPI.
MOSIЦифровой входВход данных SPI от контроллера к nRF24L01. Толерантность к 5 В.
MISOЦифровой выходВыход данных SPI от nRF24L01 к контроллеру. Толерантность к 5 В.
IRQЦифровой выходПин прерывания. Активный «0» (LOW).

По традиции, сначала подключим nRF24L01 к Arduino и проверим его работоспособность, используя существующие библиотеки. А затем детально рассмотрим протокол управления и научимся работать с приёмопередатчиком без библиотек.

2 Подключение приёмопередатчика nRF24L01к Arduino

Подключим модули к Arduino, как показано на рисунке. Каждый модуль к своему контроллеру.

Схема подключения nRF24L01 к Arduino Схема подключения nRF24L01 к Arduino

Модули подключаются одинаково, как можно догадаться. А программы в Ардуино будут разные. Один модуль будет работать в режиме приёмника, а другой – передатчика. Но сначала необходимо загрузить библиотеку для nRF24L01 и установить её обычным способом. Библиотека прилагается также в конце статьи.

Напишем для передатчика простейший скетч, который раз в секунду будет отправлять сообщение и инкрементируемый счётчик. Загрузим в одну из плат Arduino скетч передатчика:

Скетч передатчика nRF24L01 (разворачивается)

В другую Ардуинку загрузим скетч приёмника:

Скетч приёмника nRF24L01 (разворачивается)

В моём случае макет с подключёнными модулями выглядит так:

Подключение передатчика и приёмника nRF24L01 к Arduino Подключение передатчика и приёмника nRF24L01 к Arduino

Часто пользователи сообщают о проблемах в питании данных модулей nRF24L01. Это проявляется в том, что приёма нет. В таком случае попробуйте припаять на свободное место модуля конденсатор ёмкостью 1…2 пФ.

Передатчик nRF24L01 подключён к Arduino Nano Передатчик nRF24L01 подключён к Arduino Nano

Запустим монитор последовательного порта для платы Arduino, которая управляет приёмником nRF24L01. В мониторе мы увидим, что 1 раз в секунду нам приходят пакеты, 31 байт в которых не меняется, а последний, 32-ой, байт содержит увеличивающийся счётчик.

Принимаемые радиоприёмником nRF24L01 пакеты в мониторе последовательного порта Принимаемые радиоприёмником nRF24L01 пакеты в мониторе последовательного порта

Мы убедились, что модули работают, и что мы можем с помощью них передавать и принимать данные по радиоканалу. Теперь залезем под «капот» и разберёмся, как же управлять приёмопередатчиком nRF24L01.

3 Режимы работы и управление приёмопередатчиком nRF24L01

Приёмопередатчик может находиться в четырёх состояниях: выключен, ожидание, приём, передача. Чип nRF24L01 имеет встроенную машину состояний, которая обеспечивает корректный переход между этими состояниями. Пользователь управляет состояниями, загружая в управляющие регистры специальные команды.

Режим выключения (power down mode)

В этом режиме чип потребляет минимальный ток, но может принимать команды по SPI от контроллера.

Режим ожидания (standby mode)

Есть два режима ожидания.

Первый режим ожидания (Standby-I) используется для снижения потребления. В этом режиме чип принимает команды по SPI, быстро переходит в режим передачи, и так же быстро возвращается обратно в режим ожидания 1. Для перехода в этот режим нужно подать на CE «HIGH» и в регистре CONFIG установить бит PWR_UP в «1».

Второй режим ожидания (Standby-II) более энергозатратен по сравнению с первым: чип работает полностью, и устройство готово к приёму и передаче практически моментально (около 130 мкс). Как только в передающем буфере оказываются данные, микросхема nRF24L01 начинает передачу. Для перехода в этот режим нужно держать CE в «HIGH» и в регистре CONFIG должен быть установлен бит PWR_UP в «1».

Режим приёма (RX mode)

Это режим, в котором чип nRF24L01 используется как приёмник. При этом он постоянно сканирует эфир на наличие валидных пакетов. Как только валидный пакет будет найден, он помещается в свободный слот приёмного буфера. Если буфер полностью заполнен, то пакет игнорируется.

Для перехода в режим приёма нужно установить биты PWR_UP и PRIM_RX в «1», и вывод CE установить в «HIGH». Режим будет держаться до тех пор, пока контроллер не переключит его в другой (например, режим ожидания или выключения).

Режим передачи (TX mode)

Режим передачи используется для передачи данных.

Для перехода в режим приёма нужно установить бит PWR_UP в «1», бит PRIM_RX в «0», и вывод CE установить в «HIGH». Данные передаются пакетами максимальной длиной по 32 байта. Режим будет держаться до тех пор, пока передаётся пакет. По окончанию передачи пакета чип перейдёт в режим ожидания 2 (standby-II).

Важно не держать nRF24L01 в режиме передачи дольше 4 мс! Чип поддерживает расширенный режим Enhanced ShockBurst, который соблюдает это требование. Кроме того, этот режим обеспечивает автоматическую обработку пакетов.

Радиостанции большого радиуса действия на Arduino и модулях nRF24L01

Мы сегодня живем в эпоху доминирования 4G и наступающей эры средств связи 5G, но, тем не менее, простые УКВ радиостанции (еще их называют walkie-talkie) все еще продолжают играть важную роль в тех ситуациях, когда необходимо организовать простую и дешевую радиосвязь на небольшие расстояния. Например, подобные радиостанции очень удобны для строителей/рабочих, строящих какой-нибудь объект, или туристов/рыбаков/охотников, которые находятся в местах, куда не достает привычная нам сотовая связь. Поэтому в данной статье мы рассмотрим создание на основе платы Arduino и радиочастотных модулей nRF24L01 радиостанций большого радиуса действия.

Внешний вид радиостанций на Arduino и модулях nRF24L01

Принцип работы наших радиостанций

Основными компонентами проектируемых нами радиостанций являются платы Arduino и радиочастотные модули nRF24L01, подключение которых к плате Arduino мы рассматривали в этой статье. Для данного проекта радиостанций радиочастотные модули nRF24L01 были выбраны ввиду их следующих преимуществ:

  • они работают в диапазоне ISM 2.4 ГГц (а на западе в этом диапазоне можно работать без получения лицензии);
  • доступные скорости передачи для этих модулей составляют 250 Кбит/с, 1 Мбит/с и 2 Мбит/с;
  • в данных модулях доступно 125 возможных каналов с шагом сетки частот 1 МГц, что позволяет развернуть в одном месте 125 независимо работающих модемов.

Также одним из достоинств наших радиостанций будет то, что их диапазон работы не будет перекрываться с используемыми частотными диапазонами других УКВ радиостанций, тех, которые используют полиция, экстренные службы, рыбаки, охотники и т.д. Одиночный модуль nRF24L01 может одновременно взаимодействовать с 6-ю другими такими же модулями, находящимися в зоне его действия, то есть он будет передавать информацию, а 6 других модулей будут ее принимать. Также к достоинствам модулей nRF24L01 относится их низкое энергопотребление.

Существуют два типа модулей nRF24L01: NRF24L01+ и NRF24L01+PA+LNA (показанный на рисунке ниже) со встроенной и внешней антеннами.

Внешний вид модуля NRF24L01+PA+LNA

Модуль NRF24L01+ имеет только встроенную в плату антенну, поэтому диапазон его действия составляет около 100 метров, что подходит для его применения внутри помещений, но является явно недостаточным для связи на большие расстояния на открытом воздухе. Модуль NRF24L01+PA+LNA с внешней антенной имеет в своем составе параметрический усилитель (PA), который усиливает уровень сигнала перед его передачей в антенну. Также этот модуль содержит малошумящий усилитель (LNA — Low Noise Amplifier), который с минимальными шумами усиливает слабые сигналы и тем самым значительно улучшает чувствительность модуля. Таким образом, с внешней антенной (с коэффициентом усиления 2 дБ) и двумя дополнительными усилителями дальность действия модуля NRF24L01+PA+LNA составляет примерно 1000 метров, что вполне подходит для проектируемых нами радиостанций.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress) или другие типы плат Arduino – 2 шт.
  2. Радиочастотный модуль NRF24L01+PA+LNA с внешней антенной с КУ 2 дБ – 2 шт. (купить на AliExpress).
  3. Усилитель звуковой частоты – 2 шт. (купить на AliExpress).
  4. Цепь микрофона – вы можете сделать ее сами (рассмотрено далее в статье) или купить модуль датчика звука.
  5. Преобразователь (step-up booster module) DC to DC – 2 шт. (купить на AliExpress).
  6. Модуль регулятора напряжения (voltage regulator module) 3.3V AMS1117 (купить на AliExpress).
  7. Светодиод для индикации мощности – 2 шт. (купить на AliExpress).
  8. Резистор 470 Ом – 2 шт. (купить на AliExpress).
  9. 4-й дюймовый громкоговоритель (динамик) – 2 шт.
  10. Кнопка PTT (Push-to-Talk — «нажал — говори») – 2 шт.
  11. Конденсатор 104 пФ для кнопки PTT – 2 шт. (купить на AliExpress).
  12. Конденсатор 100 нФ для модуля NRF24L01 – 2 шт. (купить на AliExpress).
  13. Резистор 1 кОм для кнопки PTT – 2 шт. (купить на AliExpress).
  14. Два комплекта литий-ионных батарей.
  15. Модуль заряда и защиты литий-ионных батарей – 2 шт. (купить на AliExpress).
  16. Соединительные провода и джамперы.

Схема радиостанции

Схема радиостанции на основе платы Arduino и модуля nRF24L01 представлена на следующем рисунке.

Схема радиостанции на основе платы Arduino и модуля nRF24L01

Важно : питающее напряжение для модуля NRF24L01 составляет от 1.9 В до 3.6 В максимум. Для повышения стабильности питающего напряжения мы подключили конденсатор 100 нФ между контактами +VCC и –GND модуля, остальные контакты модуля NRF24L01 могут выдерживать напряжение до 5 В.

Изготовление радиостанций

Шаг 1 . Мы начали изготовление радиостанций с того, что сделали самодельную печатную плату для них как показано на рисунке ниже. Мы подключили микросхему Atmega328p к программатору и загрузили в нее код программы. Затем мы подключили кварцевый генератор на 16 МГц к контактам 9 и 10 микросхемы Atmega328p.

Размещение микросхемы Atmega328p на самодельной печатной плате

Шаг 2 . Далее мы произвели подключение модуля NRF24L01 в соответствии с ранее представленной схемой радиостанции: CE – к контакту 7, CSN – к контакту 8, SCK – к контакту 13, MOSI – к контакту 11, MISO – к контакту 12, IRQ – к контакту 2.

Подключение модуля NRF24L01

Для того, чтобы запитать модуль NRF24L01, нам необходимо понизить напряжение с 5 до 3,3 В, для этого мы использовали регулятор напряжения MS1117 на 3,3 В, который достаточно компактный и поэтому существенно не повысит габариты нашей радиостанции. Также для повышения стабильности питающего напряжения мы подключили конденсатор на 100 нФ к контакту земли и контакту VCC модуля.

Регулятор напряжения на основе микросхемы LM317

Если вы хотите сделать эту плату регулятора напряжения сами, вам необходимо купить микросхему регулятора напряжения на 3,3 В и добавить к ней необходимые резисторы и конденсаторы. Также подобный регулятор напряжения можно сделать на основе микросхемы LM317.

Шаг 3 . Вы можете купить датчик звука (акустический датчик) или сделать простую микрофонную цепь своими руками как показано на следующих рисунках. Эта цепь будет содержать NPN транзистор 2n3904.

Самодельная микрофонная цепь для нашей радиостанции

Также мы перерисовали схему радиостанции в другом виде – возможно, он кому то покажется более удобным чем ранее представленная схема на основе макетной платы.

Схема нашего проекта радиостанции в другом виде

Шаг 4 . Для усиления звука с выхода платы Arduino (контакты 9 и 10) мы использовали стерео усилитель звуковой частоты PAM8403, поскольку звук с выхода контактов платы Arduino достаточно слабый для того, чтобы подавать его на громкоговоритель (максимум его можно подавать на головные телефоны). С модуля PAM8403 сигнал можно подавать на два громкоговорителя, и при этом модуль достаточно дешево стоит. Модуль PAM8403 содержит достаточно мощный усилитель звуковой частоты в SMD исполнении и занимает очень мало места. Его внешний вид показан на рисунке ниже.

Внешний вид усилителя звуковой частоты на основе микросхемы PAM8403

Соединения с этим модулем достаточно простые. Напряжение питания ему требуется от 3.7V до 5V. Левый и правый каналы аудиовходов данного усилителя подключаются к контактам 9 и 10 платы Arduino. В нашем случае в качестве выходной нагрузки данного усилителя мы использовали 4-дюймовый 8-омный громкоговоритель (динамик). Мы задействовали в данном случае только выход правого канала. Если хотите, то вы можете использовать два громкоговорителя в этой схеме – усилитель звуковой частоты позволяет реализовать это.

Шаг 5 . Далее мы изготовили тангенту (PTT кнопку) в виде обычной кнопки. Мы подключили к контактам этой кнопки конденсатор емкостью 0.1 мкФ для уменьшения эффекта дребезга контактов и появления непредсказуемых сигналов при нажатии кнопки.

PTT кнопка для нашей радиостанции

В режиме передачи модуль NRF24L01+PA+LNA потребляет значительно больше электроэнергии, чем во время приема, поэтому во время нажатия кнопки PTT, которая включает режим передачи, значительно увеличивается потребляемый модулем ток. Чтобы сгладить эффект от этого резкого увеличения потребления тока мы использовали конденсатор емкостью 100 нФ, подключенный к контактам +vcc и Ground.

При нажатии кнопки PTT на контакт 3 планы Arduino подается сигнал прерывания – мы далее в программе конфигурируем этот контакт как контакт для обработки прерывания и мы будем отслеживать на нем уровень напряжения. Если на этот контакт поступает напряжение низкого уровня (low), то наша радиостанция продолжает оставаться в режим приема (режим по умолчанию). Если же на контакте 3 будет напряжение высокого уровня (high), то мы будем переключать радиостанцию в режим передачи, в котором мы сможем передавать по радиоканалу сигнал, поступающий с выхода микрофона, естественно, после преобразования его в радиосигнал – то есть первичный электрический сигнал с выхода микрофона модулируется, переносится на рабочую частоту 2,4 ГГц, усиливается и излучается с помощью антенны в окружающее пространство.

Шаг 6 . Для питания всех компонентов нашей схемы (платы Arduino, модуля NRF24L01+PA+LNA, усилителя звуковой частоты и цепи микрофона) мы использовали комплект из 2-х литий-ионных батарей (Li-ion battery) как показано на следующем рисунке.

Комплект из 2-х литий-ионных батарей

Хорошая литий-ионная батарея обеспечивает уровень напряжения от 3.8 до 4.2 В и заряжается напряжением от 4 до 4.2 В (ранее на нашем сайте мы рассматривали двухрежимное зарядное устройство литий-ионных батарей на основе платы Arduino). Литий-ионные батареи в настоящее время находят широкое применение в портативных устройствах и электромобилях. Но литий-ионные батареи не так надежны и устойчивы в работе как другие типы батарей, поэтому им нужна защита от излишней зарядки и слишком быстрой разрядки – то есть напряжение и ток заряжания/разряжания для них должны поддерживаться в безопасных для них режимах. Поэтому в нашем проекте для защиты этих батарей мы использовали один из самых распространенных модулей заряжания для них — TP4056.

Шаг 7 . Также в нашем проекте мы использовали преобразователь постоянного тока на 2А чтобы поднять уровень напряжения с выхода литий-ионной батареи, который составляет от 3.7V до 4.2V, до уровня 5 Вольт, который необходим для питания основных компонентов схемы нашей радиостанции. На нашем сайте мы уже рассматривали подобный, но только понижающий преобразователь постоянного тока на основе платы Arduino, так называемый Buck converter.

Преобразователь постоянного тока на 2А

После того как вы соедините между собой все компоненты схемы целесообразно поместить их в какую-нибудь коробку чтобы придать им облик радиостанции. Мы использовали для этой цели пластмассовую коробку, приведенную на следующем рисунке.

Размещение компонентов радиостанции в пластмассовом корпусе (вид сбоку)

Размещение компонентов радиостанции в пластмассовом корпусе (вид сверху)

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе нам необходимо подключить используемые библиотеки, которые можно скачать по следующим ссылкам:

В программе мы производим подключение заголовочных файлов этих библиотек.

Как подключить радиомодуль nrf24 к микроконтроллеру

В коде удаленны не используемые (действия и регистры).
Данная прошивка передаёт данные «AA+BB+CC+11+№посылки».

Внимание. прошивка только для «ПЕРЕДАТЧИКА» Attiny2313, специально оптимизирована, занимает 37% в памяти.

Внимание. прошивка только для «ПРИЁМНИКА» Atmega8, специально оптимизирована, занимает 11% в памяти.

Теперь для проектов свободного места в памяти «много».

Спам

Спам
Спам
Спам
Спам
Спам
+3 Спам
Спам
Спам

Раньше Я тоже был удивлён про Attiny13.
Код (в комментарии №173) для передатчика на NRF24L01 весит всего 590 byte, оставшиеся 410 byte должно вполне хватить для обработки кнопок.
Attiny13 можно использовать только для кода передатчика, но для приёмника не подойдёт. Пример kip96 в комментарии №94: http://avrproject.ru/forum/3-138-2

Спам
+1 Спам
+1 Спам
Спам
Спам

Вот код для Attiny13:
http://yadi.sk/d/QFWhJyGOJ4Aj7

+1 Спам
Спам

Здесь переработанная прошивка (оптимизирована под скоростную передачу):
1) передача 5 байт
http://yadi.sk/d/vF7D07Mx9g4QY
2) передача 15 байт
http://yadi.sk/d/FypcajG49g4SE
в прошивке описаны действия, поэтому принцип работы будет понятен.
Про кнопки можете почитать в интернете (например: http://avrhelp.mcselec.com/config_debounce.htm)

Спам

Доброго времени суток) Подскажите . вот есть у меня два модуля NRF24L01 . Смотрел исходники которые выкладывались на сайте, но чет
сложновата программа (для меня, сам уже несколько небольших проектов сделал, но программирую с трудом) . Как изменить код чтобы при одном внешнем прерывании контроллер передавал команду на
NRF24L01 другой NRF24L01 принимал и контроллер ставил на любую ножку лог.1 . И главное чтобы от прерывания до установки логической 1 прошло как можно меньше времени.
Не нашел как прикрепить файл так что вот ссылка, (чтобы вы не искали))) http://avrproject.ru/nrf24l01/nrf24l01_source.rar

Очень буду вам благодарен)

Спам
Спам
+1 Спам
Спам
Спам
Спам
Спам
Спам

Если Вы про это действие в прошивке приёмника:

'Сброс буфера
Set Ce
Waitms 1 'Нельзя убирать задержку
Reset Ce

D_bytes(1) = &HA0 'Положи 5 байт в TX pload буфера
D_bytes(2) = &HFF 'Байт 1
D_bytes(3) = &HFF 'Байт 2
D_bytes(4) = &HFF 'Байт 3
D_bytes(5) = &HFF 'Байт 4
D_bytes(6) = &HFF 'Байт 5
Reset Ss
Spiout D_bytes(1) , 6
Set Ss

— это нужно для сброса буфера nRF24L01 при первом включении, так как заметил что при больших скоростях работы начинает зависать, но если произвести сброс при первом включении, то всё работает отлично.
Насчёт этого действия в коде приёмника "Положи 5 байт в TX pload буфера", это не отправляет в передатчик, а отправляет в приёмник для сброса при первом включении. Правильнее будет написать "Положи 5 байт в RX pload буфера".

Насчёт функции Spiout, не хотелось делать "подпрограмму" в "подпрограмме", поэтому решил сделать отдельные Spiout. Отмечу: теперь с отдельными Spiout стало понятнее что происходит в коде. Хотя в случае необходимости можно сделать подпрограмму.

Спам
Спам

Заново начал проект над пультом с энергосбережением, как тут:

Но когда увидел Свои старые прошивки, решил упростить программный код, чтобы было удобнее работать. Результат Меня обрадовал, теперь стало проще работать с прошивкой для модулей NRF24L01.
Прошивки МАКСИМАЛЬНО оптимизированы под скоростную передачу байтов (в прошивке задержку Waitms 100 — это для мигания светодиода, её можно полностью убрать, ДРУГИЕ ЗАДЕРЖКИ Waitms 1 НЕОБХОДИМО ОСТАВИТЬ). Всё лишнее также удалено. Некоторые процессы с пояснениями, сам код стал понятнее.
В общем, может, кому пригодится.

№1: Передатчик на Attiny2313, а приёмник на Atmega8. В данной прошивке организована отправка 5 байт данных, например такие байты:
Dan(1) = &HAA 'Байт 1
Dan(2) = &HBB 'Байт 2
Dan(3) = &HCC 'Байт 3
Dan(4) = &H11 'Байт 4
Dan(5) = &H22 'Байт 5
При приёме байтов светодиод у приёмника начинает мигать.

Прошивку №1 закачал на Яндекс-диск:
http://yadi.sk/d/vF7D07Mx9g4QY

№2: Передатчик на Attiny2313, а приёмник на Atmega8. В данной прошивке организована отправка уже 15 байт данных, например такие байты:
Dan(1) = &HAA 'Байт 1
Dan(2) = &HBB 'Байт 2
Dan(3) = &HCC 'Байт 3
Dan(4) = &HDD 'Байт 4
Dan(5) = &HEE 'Байт 5
Dan(6) = &HFF 'Байт 6
Dan(7) = &H00 'Байт 7
Dan(8) = &H11 'Байт 8
Dan(9) = &H22 'Байт 9
Dan(10) = &H33 'Байт 10
Dan(11) = &H44 'Байт 11
Dan(12) = &H55 'Байт 12
Dan(13) = &H66 'Байт 13
Dan(14) = &H77 'Байт 14
Dan(15) = &H88 'Байт 15
При приёме байтов светодиод у приёмника начинает мигать.

Прошивку №2 закачал на Яндекс-диск:
http://yadi.sk/d/FypcajG49g4SE

Преимущества:
Передатчик на Attiny2313, передаёт 5 байт, теперь занимает 29% в памяти.
Передатчик на Attiny2313, передаёт 15 байт, теперь занимает 39% в памяти.
Приёмник на Atmega8, передаёт 5 байт, теперь занимает 8% в памяти.
Приёмник на Atmega8, передаёт 15 байт, теперь занимает 11% в памяти.

+4 Спам
Спам

Попробуй подключить "керамический конденсатор" к земле и к ножке SCK (точно не знаю, где-то Я такое уже видел, может поможет).

(((И когда будет возможность попробуй использовать "внешний кварц" с "керамическими конденсаторами"))).

Победа над nRF24L01: на три шага ближе

Многие испытывают трудности при соединении по эфиру радиомодулей nRF24L01. Об этом свидетельствует тема на форуме Амперки, открытая в конце 2014г. За пять с небольшим лет в теме накопилось более 120(!) страниц. Это при том, что автор темы не просто обозначил проблему, а поделился своим трехнедельным опытом победного для него боя. Кроме того, он тут же — в первом сообщении создал навигатор по страницам темы, где приводит ссылки на решения проблемы другими.

Я тоже не из тех счастливчиков, которым легко удалось связать радиомодули. Ниже — мой подход к решению проблемы.

Модули nRF24L01 работают в полудуплексном режиме. Это как разговор по рации: каждый из корреспондентов в один момент времени либо говорит, либо слушает. То есть, каждый из двух узлов работает в режиме и приемника и передатчика: передатчик, отправив сообщение ждет на подтверждение приема сообщения со стороны приемника.

Как правило, все тесты, которые мне встречались в Инете, сводятся к проверке работы и качества связи пары радиомодулей в полнофункциональном режиме, когда передатчик, послав пакет, ждет на подтверждение приема пакета приемником.

Я же разделил эту задачу на несколько простых задачек. Вначале модули проверяются на работоспособность и правильность подключения (шаг 1), затем один из пары работающих радиомодулей тестируется на работу в режиме передатчика без ожидания отклика с приемника (шаг 2) и последний этап — улучшение качества связи в этой связке передатчик-приемник (шаг 3).

Для общего представления — картинка с прототипом:

Шаг 1

Загрузить в контроллер платы Ардуино скетч сканера эфира, который можно найти среди примеров Arduino IDE: Файл -> Примеры -> RF24 -> scanner. Ниже под спойлером есть этот скетч с несущественным изменением. В нем изменено время между стартом и остановкой сканирования одного канала с 128 мксек на 512 мксек. Увеличение времени позволило за один цикл сканирования всего диапазона выявлять больше источников помех и сигналов. Это равнозначно замене результата измерений в канале на сумму четырех соседних результатов в этом канале до изменения времени задержки. При этом, время прохода всего прослушиваемого диапазона сканером увеличилось несущественно: примерно с 8 до 10 сек.

В разных скетчах адрес канала в командах приводится в разных форматах: в одних — . (0x6f), в других — . (112). Перевод с одного формата в другой станет понятным с примера перевода. Например, для (0x1а) — это: (1+1)*16 + а = (1+1)*16 + 10 = 42. Отсчет каналов начинается с частоты 2,4 ГГц, далее идет увеличение частоты на 1 МГц с увеличением номера канала на 1.

Далее подключаем модуль nRF24L01 к плате Ардуино или любому прототипу, собранному, допустим, на контроллере ATMEGA328P. Я собрал два образца на платах для прототипирования на контроллере ATMEGA328P по схеме контроллер + резонатор. Один образец подключаю к компу через плату Arduino UNO, а второй — через конвертор USB/TTL.

Мощность стабилизатора платы Arduino UNO вполне приемлема для подключения дополнительной импульсной нагрузки такой, как nRF24L01+ c адаптером 5В/3,3В для этого модуля или без адаптера.

На мониторе последовательного порта Arduino IDE увидите нечто похожее:

Если вы увидели похожую картинку — тест на работоспособность (исправность) радиомодуля и правильность его подключения пройден успешно. Замените радиомодуль другим, с которым планируете работать дальше.

Обратите внимание на чистый диапазон, начиная с канала 4а. У меня он остается чистым даже, если на расстоянии нескольких метров работает старая СВЧ-печь — мощный источник помех в этом диапазоне. А в общем-то, в Интернете рекомендуют выбирать каналы для своих проектов выше «60».

Если на каналах — шум, но радиомодуль определяется (смотрим преамбулу на мониторе Arduino IDE, подробно тут) — это однозначно копия. Не отчаивайтесь — ее тоже можно запустить.

Обращаю ваше внимание — на этом этапе не стоит выполнять никаких работ с паяльником. Тем же, кто не увидел похожей картинки и записал на видео процесс распаковки товара, разумно обратиться в торговую точку за заменой или возвратом денег.

Шаг 2

По схеме, аналогичной первой, собираем второй радиоузел. Это будет передатчик. В его контроллер загружаем скетч передатчика (под спойлером).

Логика работы приемника такая же, как и у сканера эфира, но он в отличие от сканера принимает сигналы только на частоте передатчика 6f и, как и сканер, не посылает автоответ. Скорость обмена информацией и размер контрольной суммы у приемника такие же, как у передатчика. После каждых 1000-и циклов прослушивания счетчик числа циклов обнуляется и выводится инфа о количестве принятых пакетов с передатчика в монитор порта Arduino IDE.

Включаем передатчик и приемник. Если приемник принимает хотя бы каждый третий пакет — это уже успех. У меня не получилось. Приемник по непонятным причинам принимал максимум 50 пакетов.

Подумал о увеличении мощности передаваемого сигнала с помощью дополнительной антенны. Для начала, подключил зажимом монтажный провод «папа-мама» к «корню» штатной антенны передатчика. И счастье привалило: сразу 999 принятых пакетов — максимально возможное число из 1 000!

Юзерам, которые захотят сделать все грамотно, придется поработать. Дополнительная антенна в данном случае — это отрезок коаксиального кабеля с волновым сопротивлением 50 Ом и длиной 115 мм. Антенна подключается к выводу 13 (АNT2) микросхемы nRF24L01+. Схему подключения и номиналы нескольких недостающих smd компонентов, которые надо поставить на плату радиомодуля, можно найти на принципиальной электрической схеме nRF24L01+ тут. Впрочем, есть альтернатива — в магазин за NRF24L01+PA+LNA

Теперь обязательно припаиваем между пинами GND и VCC обеих радиомодулей по два конденсатора. Керамический конденсатор, выполняющий роль ВЧ-фильтра, емкостью не менее 0,15 мкФ (чем больше, тем лучше) и электролит емкостью около 10 мкФ (можно и больше, но бесполезно) — это НЧ-фильтр. ВЧ-фильтр шунтирует высокочастотные помехи по цепи питания радиомодуля, а НЧ-фильтр сглаживает пульсации питания. Для надежности, цепи питания радиомодулей лучше непосредственно подпаять к пинам контроллеров.

Тут не могу не упомянуть о решении, предложенном GennPen в комментариях. Это установка на платах nRF24L01+ отсутствующего конденсатора С6 (1. 2pF). Конденсатор будет выполнять роль пассивной нагрузки. Без пассивной нагрузки модули nRF24L01+ со встроенной антенной «захлебываются» и часто нормально работают только на пониженных мощностях передатчика.

После того, как удалось установить наилучшую связь в паре передатчик — приемник, можно провести тестирование на определение дальности связи радиомодулей, задав мощность передатчика и свои критерии качества связи, допустим, 300 принятых пакетов из 1000. У меня пара в режиме усилителя PA_MAX обеспечивает связь «999:1000» в пределах квартиры через 3 кирпичных простенка.

И наконец, несколько слов о своей скромной статистике работы с модулем. В свое время купил 8 шт. радиомодулей nRF24L01+. Приобрел в разное время с интервалом больше года, в разных интернет-магазинах и, судя по стилю маркировки, от разных производителей. Сначала, безрезультатно повозившись с ними и начитавшись, как мучаются с nRF24L01+ другие, без особых проблем перешел на радиомодули LoRa. Жизнь заставила вернуться к nRF24L01+, поскольку заявленный максимальный ток потребления nRF24L01+ ниже, чем у LoRa. Кроме того, nRF24L01+совместим с малопотребляющим nRF52832 и другими. Это особенно важно для автономных систем с ограниченным ресурсом источников. В итоге удалось соединить все 8 радиомодулей по эфиру. Вывод простой — не надо верить мифам, что рынок переполнен неработающими копиями (клонами, репликами, подделками). Да и какой изготовитель станет запускать высокотехнологичное производство, чтобы тиражировать неработающие изделия! Клонов на рынке хватает. К сожалению, они не всегда стоят дешевле оригиналов. Уровень основных технических характеристик клонов ниже, чем у оригинальных продуктов. Единственная возможность отличить копию от оригинала — это тестирование. Основные признаки копии — это выше заявленного в спецификации энергопотребление, больший процент потерь пакетов и более низкая скорость при передаче.

Конечно, эти простые шаги не могут гарантировать решение всех проблем с nRF24L01 — мне их и не перечесть, но после того, как их сделаете, будете уверены, что:

  • радиомодули исправны;
  • подключены верно;
  • уровень сигнала передатчика, чувствительность приемника удовлетворительны и, в случае необходимости, обеспечиваются дополнительными мерами;
  • пара nRF24L01+ работает в режиме «передатчик-приемник» без откликов и ожидания на отклики. Иногда этого достаточно.

Все! Надеюсь, как и у меня, у вас в дальнейшем поубавится проблем с nRF24L01+ в своих проектах. Успехов!

голоса
Рейтинг статьи
Читайте так же:
Как отремонтировать откос снаружи
Ссылка на основную публикацию