Малопотребляющий датчик с передачей данных по радиоканалу

в 13:05, , рубрики: arduino, передатчик 433 МГц, приемник 433 МГц
Несколько лет назад я опубликовал статью о простейших приемниках и передатчиках для обмена данными на частоте 433 МГц (на рисунке внизу левая пара). Публикация была вызвана в основном тем фактом, что абсолютно во всех источниках в интернете приемник подключался неграмотно, и это значительно снижало возможности удобного и дешевого способа связи. Приемник MX-RM-5V (известен также под названием XD-RF-5V) представляет собой дешевую регенеративную схему, которая крайне чувствительна к помехам и капризна к настройке, что хорошо известно радиолюбителям, но почему-то совершенно темный лес для остального мира, включая даже опытных ардуинщиков. Поэтому такой приемник, как минимум, следует включать с отдельным хорошо зафильтрованным аналоговым стабилизатором, что сразу повышает дальность в разы.
Малопотребляющий датчик с передачей данных по радиоканалу - 1

Но оказалось, что не все обретенные таким образом пары работают с надлежащей дальностью, а некоторые приемники приходится вовсе отбраковывать (особенно, если их приобретали оптом на AliExpress). Потому здесь я хочу поговорить об проблемах, связанных с другими альтернативами этим модулям, а также указать на более простое и надежное решение, к которому пришел в результате поисков.
Главное, чем я руководствовался:

  • не уходить от частоты 433 МГц, как обладающей высокой дальностью и проникающей способностью при минимальном потреблении передатчиков (иначе берете просто ESP32, Ardino Nano 33 или Raspberry Pico W — и вперед по Питерской с WiFi наперевес, решать проблемы уже другого уровня);
  • получить в итоге решение: а) простое (не требующее спецнастроек, экзотических библиотек и специальных сред программирования); б) дешевое, т.е. такое, чтобы радиомодуль не оказался самым дорогим компонентом проекта простейшей метеостанции. По последней причине из рассмотрения выпадает довольно много разных любопытных вещичек — предупреждаю об этом во избежание недоумений.

А в чем, кстати, проблема с MX-RM-5V?

Вопрос с капризностью настройки регенеративных приемников я тогда оставил подвешенным в воздухе. Расчет был на то, что в приличных магазинах пару приемник-передатчик продают подогнанными друг под друга. Однако, как следует из самого принципа работы, для приемника все равно приходится оставлять возможность ручной подстройки «по месту»: в крайнем случае можно осторожно (пластиковой отверткой!) подкрутить на приемнике настроечную индуктивность (см. зеленый кубик на фото приемника). Примерно в восьми случаях из десяти это помогает подогнать пару друг под друга. Излишне говорить, что все это гуляет от температуры, наличия металлических предметов поблизости, поднесенных рук и так далее. Встречались и экземпляры приемников, которые подогнать никаким образом не удавалось, оставалось их списать и забыть. Раздражает все это безумно — покупать приходится с запасом и дальше долго возиться с проверками и подгонками.

Радиоудлинители UART

Потому я тогда же, по подсказке одного из читателей статьи, обратил внимание на приемопередатчики HC-12 (в центре на рисунке в начале статьи), о чем писал здесь. Они удобны тем, что не требуют специальных библиотек, представляя собой просто аппаратный беспроводной удлинитель UART. Причем работают «из коробки» на скорости 9600, не требуя никаких отдельных настроек. По дальности связи они легко кроют все эти ваши вайфаи любые другие способы, кроме LoRa, но последняя гораздо дороже и требует возни.

Недостатков у модулей HC-12 при применении с классическими Arduino два и оба серьезные. Первый связан скорее с недостатками самой платформы Arduino, использующей единственный встроенный UART для загрузки ПО, и тем самым сильно ограничивающей его штатное применение. Если у вас в проекте что-то подключено к выводам UART, то, как минимум, перед подключением к программирующему USB-кабелю это «что-то» требуется отключить: в свое время вследствие недооценки этого обстоятельства мне довелось пожечь немало дорогущих модулей Xbee. А с HC-12 оказалось еще хуже: он оказался дубовее деликатных Xbee, так что горели уже не модули, а адаптер USB/UART, встроенный в Arduino Uno/Nano. Платы при этом не совсем окирпичиваются — основной контроллер в порядке, и их все еще можно запрограммировать через ISP-разъем (ну или, возможно, через внешний адаптер USB/UART, как Arduino Mini), но, согласитесь, смысл применения именно Arduino исчезает при этом разве что чуть менее, чем полностью.

Потому надежные пути применения HC-12 со штатным Arduino — либо выстроить софтверный UART, не пересекающийся с аппаратным (что также связано с рядом ограничений), либо отгородиться от UART-бутлоадера вовсе, и считать, что мы имеем дело с голым контроллером.

Я пошел в основном по последнему пути: Arduino Uno с контроллером на панельке использовалась в качестве программатора, затем контроллер из нее извлекался и устанавливался в схему. В другом варианте (особенно, если задействован аппаратный UART контроллера) вместо загрузки выводится hex-файл (Скетч > Экспорт бинарного файла) и версия без бутлоадера загружается через ISP-программатор. Это дает больше свободы в выборе и типа контроллера, и его тактовой частоты, но принуждает вручную следить за установкой фьюзов.

Конфликт с пересечением функций последовательного порта можно также разрешить отказом от классического Arduino в сторону контроллеров с увеличенным количеством аппаратных UART (это как известный Mega 2560, так и ATmega328PB и его родственники — см. сюда и сюда), но решение громоздкое, не универсальное и в части ATmega328PB все-таки отдает экзотикой: нельзя сказать, чтобы такие модели были в мейнстриме. Применение более продвинутых 32-разрядных контроллеров, постепенно вытесняющих классику Arduino из DIY-практики (STM32, или все того же Raspberry Pico, например) поможет решить проблему, но одно только усложнение настройки и программирования уже не отвечает ранее объявленным условиям.

И тут еще вылезает второй недостаток HC-12: достаточно большое потребление (до 16 мА с пиками до 100mA в момент передачи), причем автоматически модуль в сон не погружается. Для этого есть специальная AT-команда, но справиться с ней с полпинка не удалось. Да я и не очень-то старался, т.к. такое грубое нарушение условий минимума настроек меня не удовлетворяет; к тому же AT-команды выполняются долго, и все это время модуль продолжает потреблять свои сумасшедшие миллиамперы. Поэтому решение для датчиков с батарейным питанием было применено лобовое (отражено в упомянутой статье на вот этой картинке): просто отключать модуль от питания MOSFET-ключом. Это действительно работает, хотя и выглядит не очень красиво.

И че, обойтись без таких нагромождений ну никак не получится?

Комплект SYN115 и SYN480R

Автор вот этой книжки (перевод скоро выйдет в ДМК-Пресс) в том числе описывает разные способы радиообмена данными (в приложении к пультам дистанционного управления). И, кстати, очень не советует применять обсуждавшийся выше комплект с простейшим регенеративным приемником. Перебрав предложенные им варианты через поиск Яндекса, я быстро нашел многочисленные ссылки на приемлемый по цене комплект SYN115 (передатчик) и SYN480R (приемник, на рисунке в начале статьи пара справа). Некоторые популярные блогеры почему-то отзываются о нем не очень, но не верьте: скорее всего автору рекомендаций просто не повезло при покупке оптом наткнуться на китайскую подставу. Принцип работы этой пары не предполагает никаких подвохов и она должна работать вполне надежно. Я приобрел шесть комплектов в отечественном интернет-магазине за смешные по нынешним временам деньги, и все заработали прямо «из коробки», причем в парах, составленных в случайном порядке.

Потребление модулей на хорошем уровне: передатчика SYN115 1 мкА в паузе, 3-12 мА в момент передачи; у приемника SYN480R менее 1 мкА в паузе, 3-4 мА в момент приема. При приобретении смотрите на числа, выдавленные на резонаторах (для рисунка в начале статьи я специально подбирал фото, где цифры хорошо видны): если они отличаются, проверьте, не подсовывают ли вам модули на 315 МГц по американскому стандарту. Конечно, при такой мощности никакой Роскомнадзор к вам не прибежит, но все-таки формальности нарушать без нужды не следует: у вас просто недостаточно информации для оценки последствий во всех возможных ситуациях.

Раздражающим недостатком комплекта на первый взгляд являются разные диапазоны питания, причем слабо пересекающиеся: +1.8V to +3.6V для передатчика SYN115 и для +3.3V to +5.5V для приемника SYN480R (у приемника на частоте 433 МГц, как утверждает документация, снижать питание даже до 3,0 вольт нельзя). На самом деле это не проблема, потому что передатчики SYN115 обычно ставят в автономных системах, там пониженное питание будет только в плюс, а на приемной стороне обеспечить 5 В не вопрос, все равно какой-нибудь дисплей придется запитывать. На всякий случай отметим, что приемники SYN480R ловят передатчики FS1000A, что решает проблему разных питаний, если уж припрет. Правда, нет уверенности, что функционирующие в таком качестве экземпляры FS1000A не придется отбирать индивидуально, так что покупайте с запасом.

Перед сборкой к модулям необходимо припаять антенны. Фирменная спиралька показана рисунке в начале статьи посередине (она одинаково годится для всех таких радиомодулей), только не стоит путать диапазоны: нам нужно именно 433 МГц, антеннка на 315 МГц имеет другие размеры. Работать будет (даже вообще без антенны), но за дальность никто не отвечает. Если фирменные спиральки приобрести не удалось (или их размещать в вашем конструктиве неудобно), можно заменить на отрезок монтажного провода (из сплошной меди, а не гибкий из тонких проволочек!) диаметром 0,6-0,7 мм и длиной 170 мм.

Простейшая проверка

Схемы для простейшего тестирования приобретенной пары приведены на рисунках ниже.
Малопотребляющий датчик с передачей данных по радиоканалу - 2
Малопотребляющий датчик с передачей данных по радиоканалу - 3
Так как с 5-вольтового Uno на 3-вольтовый передатчик SYN115 сигнал идет только в одну сторону, для сопряжения сигнальных выводов можно обойтись простым резисторным делителем. Arduino Uno можно заменить на Arduino Nano, но следует учесть, что в оригинальных платах Nano (производства итальянской Arduino CC), ток вывода 3V3 ограничен величиной 50 мА, и не стоит при передаче подключать еще каких-либо серьезных потребителей к этому питанию. Впрочем, большинство клонов Nano имеют отдельный стабилизатор 3,3 вольта, так что об этом можно не беспокоиться.

Обратите внимание, что передача идет через вывод 10, а прием — через вывод 3 Arduino. Это совершенно не предопределенные выводы портов — они произвольно задаются в программах, и в этих целях могут быть выбраны абсолютно любые порты общего назначения из доступных в ATmega328P, кроме разве что занятых под программирование выводов последовательного порта D0 и D1.

Тестовые программы для простой проверки Proba433MHz_peredatchik и Proba433MHz_priemnik размещены в архиве по ссылке в конце статьи, там же имеется ссылка на библиотеку VirtualWire.

Для проверки комплекта антенны можно не припаивать — рядом на столе они сработают и так. Убедившись, что вы не перепутали передатчик с приемником, загрузите программу в передатчик, отключите его от USB и переключите на автономное питание от адаптера. Затем подключите приемник к USB, загрузите программу и запустите монитор последовательного порта.

Если все в порядке, передатчик каждый раз при передаче будет мигать светодиодом (примерно через каждые 4,5 секунды), одновременно должен мигнуть приемник и выдать в монитор порта расположенные в столбик десятичные ASCII-коды цифр 2597 (50, 53, 57, 54). (Число можно интерпретировать, как значение температуры -13,4, переведенное в градусы Кельвина и умноженное на десять — увидите далее, зачем нужен такой сложный формат).

Схема датчика

Для реального датчика я буду использовать контроллер ATmega328P, запрограммированный через Arduino Uno и затем вставленный в панельку на плате датчика с подключенным резонатором. Нам следует обеспечить номинальное питание 3,3 вольта, как этого требует передатчик SYN115 (см. описание комплекта выше). ATmega328P, согласно документации, может работать в диапазоне 1,8–5,5 вольта, что удовлетворяет этому требованию.

Осталось организовать питание. Макетирование показало, что схема работает, начиная от 2,3-2,4 вольта. Так что в принципе все будет пахать от двух щелочных батареек, но это неэкономичное решение. Полный диапазон напряжений для щелочного АА-элемента — от 1,62 вольта в начале до 0,9 вольта при полном исчерпании. А остаточное напряжение 1,15-1,2 вольта означает примерно 40-50% неизрасходованной емкости. Дешевле и удобнее поставить три элемента с начальным напряжением 4,5-4,8 вольта и предусмотреть ограничение в расчете на те компоненты, которые не могут работать выше 3,3 вольт.

Обычный малопотребляющий стабилизатор типа LP2950ACZ-3.3 добавит к потреблению в паузах больше 100 мкА. Стоит поискать стабилизатор с минимальным собственным током потребления, наподобие установленного на плате модуля GY-21 (см. раздел «Модуль температуры-влажности» ниже). Я выбрал XC6206P332, с выходным напряжением 3,3 вольта, можно попробовать заменить на XC6206P302 (3,0 вольта). Типовой допустимый выходной ток у них равен 100 мА при входном напряжении 6 вольт, типовое собственное потребление менее 10 мкА. Единственный недостаток XC6206P — крайне неудобный для макетирования и DIY-применений миниатюрный корпус SOT23-3, но в интернет-магазинах легко найти платку переходника к обычному шагу 2,54 мм, совместимому с макетными платами.

Мы, конечно, еще хотим контролировать напряжение батарейки. Для этого в схему добавляется делитель напряжения R2/R3, подключенный к входу АЦП A0. Делитель рассчитан на входное напряжение до 5+ вольт при внутреннем опорном источнике 1,1 вольта.

В результате получается схема, приведенная на рисунке.
Малопотребляющий датчик с передачей данных по радиоканалу - 4
Выводы платы Arduino для ориентировки обозначены на схеме серым цветом. Сигнальный светодиод Led1, заменяющий встроенный на порту 13 Arduino, выбирается из следующих соображений. Замечено, что суперяркие цветные светодиоды (с номинальной яркостью 1000 мкд и более) вполне работают при токах порядка долей миллиампера. Если их установить в зачерненном углублении корпуса, они будут хорошо заметны визуально даже днем, при этом потребляя сущие копейки. Заодно при малых токах у них снижается собственное падение напряжения, что позволяет их использовать при пониженном питании. Изначально в схеме будет работать суперяркий светодиод любого цвета, но при снижении напряжения по мере истощения батареек до минимума (около 2,7-2,8 вольта) самые удобные в таких условиях синие светодиоды могут отказать раньше, чем схема перестанет работать, потому лучше использовать красные.

В качестве приемника используем тот же самый макет на основе Arduino Uno/Nano, что применялся для тестирования выше, но с другой програмой. Программы передатчика Proba_Data_Vbatt_WDT_8s и приемника SYN480r_priemnik вы также найдете в архиве, указанном в конце статьи. Программа приемника SYN480r_priemnik — общий шаблон для приема данных с метеодатчика с контролем батарейки, она же пригодится для работы с реальным сенсором далее. Для доведения до практического использования в ней надо только обеспечить вывод данных на какой-нибудь дисплей вместо последовательного порта.

В строке номер 72 скетча приемника SYN480r_priemnik имеется коэффициент пересчета данных АЦП в напряжение (в данном случае 5,6) — его надо будет подобрать «по месту» (сравнивая выводимое значение с измерениями мультиметра).

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

Модуль температуры-влажности

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

Не вдаваясь в подробности, сразу скажу, что лучшим выбором, по моему мнению, будет модуль на основе сенсора SHT21 (либо его аналога Si7021, безразлично). Другие аналогичные сенсоры имеют метрологические качества не хуже (иными словами, одинаково отвратительные, см. мою статью по этому поводу), но у SHT21 минимальное потребление (наноамперы в паузах, сотни микроампер при измерении) и нужный диапазон питания (2,1–3,6 В).

Платы модулей с датчиком SHT21 продаются под названиями: GY-21, HTU21, Si7021 и т.п., в зависимости от производителя (иногда вовсе без названия). Важно, что любая из них может работать при питании 3-3,3 вольта, а вот ардуиновские 5 вольт потянут только некоторые. Причем, как обычно, производители модулей спецификациями не заморачиваются, прилагая фирменный даташит на сам сенсор, потому в этом вопросе царит дикая и ненужная путаница: можно встретить обзор, где в характеристиках написано питание до 3,6 вольта, а дальше схема с платой без каких-то комментариев подключается к 5 вольтам Arduino Uno. Откровенно безграмотный вариант тоже встречается: запитать датчик от вывода 3,3 вольт, а линии SCL/SDA подключить к 5-вольтовым выводам Arduino (хотя бы для приличия ограничили ток через защитные диоды последовательными резисторами).

Самое интересное в том, что как минимум сенсоры SHT21 от Sensirion покорно сносят подобные издевательства. Причина этого вскрывается при внимательном чтении документации (см. ссылку выше): в разделе «Absolute Maximum Ratings» (стр. 6) указано, что сенсор выдерживает максимальное напряжение питания, равное 5 вольтам. Аналогичное ограничение для Si7021 (см. стр. 10) равно 4,2 вольта, так что такие модули могут и погореть.

Но есть и еще одна причина такой стойкости. Для того, чтобы ориентироваться во всем этом бардаке, посмотрите на рисунок:
Малопотребляющий датчик с передачей данных по радиоканалу - 5
На фиолетовой плате (вверху на рисунке; в других вариантах она бывает красного цвета) установлен только датчик с резисторами, что в данном случае подчеркнуто надписью о питании 3,3 вольта. Тогда как на синей плате (внизу, с названием GY-21) на оборотной стороне по отношению к датчику стоит узнаваемый линейный стабилизатор (с тремя выводами) и паучок преобразователя уровня для сигнальных линий. Так что если хотите иметь возможность беспроблемного макетирования на обычном Arduino, покупайте модуль с таким дополнением, — как ни странно, увеличения потребления по сравнению с «голым» датчиком при этом не чувствуется (или оно настолько невелико, что находится за пределами моих измерительных возможностей).

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

Малопотребляющий датчик с передачей данных по радиоканалу - 7

Разбираемся в программах

Начнем с библиотек для радиомодулей. Сами по себе подобные модули (в отличие от HC-12) могут только одно: зафиксировать приемником перепад логического уровня, который был подан на вход передатчика. По сути приемник и передатчик обмениваются непрерывной последовательностью бит, выделения байт или слов аппаратно не происходит. Библиотеки формально разделяют последовательность на байты, а все остальное — личное дело пользователей. Потому для радиомодулей разработана тьма вариантов библиотек, в которых это простейшее действие дополняется той или иной практически полезной функциональностью. Для нас это все не требуется, потому все рекомендуемые варианты ничем не выигрывают в сравнении с заслуженной VirtualWire. Ее можно скачать по адресу, указанному в конце статьи. Часто рекомендуемая RadioHead — это просто усложненная VirtualWire.

Родным форматом, с которым оперирует VirtualWire, является строка или байтовый массив. Потому перед пересылкой чисел размером больше байта следует каким-то способом преобразовать их в последовательность отдельных байт. Я привык каждое такое число сдвигать в положительную область (чтобы избавиться от знака минус), приводить к единому целочисленному формату в 4 десятичных разряда (т.е. умножением на 10 добавлять к целой части первый разряд после запятой, и добавлением 4-разрядной константы вгонять в пределы 1000-9999) и затем посылать в виде строкового ASCII-кода — так впоследствии проще парсить полученные данные. Пример того, как это выполняется на практике, растолковывается в упомянутой статье про приемники-передатчики; один из показанных там вариантов с применением типа String используется в программах к данной публикации. Сигнатурная последовательность, предваряющая строку данных (здесь это просто «DAT» для примера) в реальном датчике должна быть заменена на уникальную трехсимвольную последовательность, однозначно идентифицирующую данный датчик.

Для сенсора SHT21 также наплодили массу библиотек, от разнообразия которых просто разбегаются глаза. Я советую не заморачиваться выбором, а использовать напростейшую под названием SHT2x (автор Eduard Iten, ссылка в конце статьи). Простоту ее использования можете оценить по примерам к библиотеке, а также по тексту программы датчика.

Энергосбережение организовано с помощью системной библиотеки avr/sleep.h и сторожевого таймера WDT (библиотека avr/wdt.h). Состояние сна настраивается на режим Power Down. Сторожевой таймер настраивается на режим прерываний по пробуждению, с максимально возможной периодичностью 8 секунд. В тестовой программе прерывание ничего не делает (резетит WDT) и далее однократно выполняются заданные в основном цикле измерение и отсылка данных, после чего контроллер снова уходит в сон. В программе датчика в прерывании увеличивается счетчик пробуждений, если он не достиг заданного количества, то контролер тут же засыпает снова. При достижении счетчиком значения 4 (по 8 секунд между ними, т.е. прошло 32 секунды) выполняется измерение и отсылка данных.

В измерении напряжения батарейки применено осреднение методом скользящего среднего. В массиве (в данном случае из четырех значений) в каждом цикле наиболее старый элемент заменяется новым измерением, затем вычисляется обычное среднее арифметическое. Метод пригоден для нестабильных источников данных с постоянной времени, намного большей цикла измерения, и позволяет эффективно сгладить выбросы и дребезг. Для напряжения батареек его применять необязательно (оно почти не дребезжит и резко не меняется), потому здесь метод приведен скорее в качестве примера его практической реализации, на случай, если он понадобится для каких-то целей. Наиболее сложный момент в этом методе — период начального накопления данных, когда массив еще полностью не заполнен. Здесь показан прием с переменным делителем в вычислении среднего, так что на это время не требуется приостанавливать выдачу во избежание ложных показаний.

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

Ссылки:
VirtualWire
SHT2x
Архив с примерами

Автор: YRevich

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js