Радиоуправление на 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В в приемнике).

 unsigned char battery_level[2][3] = {{135, 147, 155}, {67, 73, 77}}; //Значения, характеризующие уровень заряда  //  unsigned char get_battery(unsigned char n) {    volatile unsigned char a, i;    battery = adc_read(n + 6, 0);    //    for (i = 0;i < 2;i++)    {       if (battery < battery_level[i][0]) a = 0;       else if (battery < battery_level[i][1]) a = 1;       else if (battery < battery_level[i][2]) a = 2;       else a = 3;       }    //    return a; }

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

 x = get_battery(0);

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

 x = get_battery(1);

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

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

Fuse-биты

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

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

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

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

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

Фото 1 Фото 2

Фото 3 Фото 4

Так же, хочу напомнить, что для корректной работы модуля NRF24L01+ необходимо подпаять к его выводам питания два конденсатора: электролитический, емкостью ~47мкФ, и керамический ~100нФ (последнее фото). Либо, как вариант, предусмотреть посадочные места для них на плате, непосредственно возле разъема для подключения радио модуля.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U0 Линейный регулятор LM1117-3.3 1 Расположен вне платы
U1 МК AVR 8-бит ATmega8 1 TQFP-32
U4 Линейный регулятор L7805AB 1 TO220
U5 Датчик температуры DS18B20 1 Опционально
R1, R2 Резистор 10 кОм 2 0805
R3, R4 Резистор 1 кОм 2 0805
R9, R10 Резистор 4.7 кОм 2 0805
C6, C7 Конденсатор 100 нФ 2 0805
C8 Электролитический конденсатор 470мкФ 1 16В
C9, C10 Конденсатор 33 пФ 2 0805
J1-J7, J10-J11 Разъем PLS-40 1
X2 Кварцевый резонатор 8МГц 1 Низкопрофильный