Интернет. Компьютер. Помощь. Советы. Ремонт

Дистанционный переключатель 433 мгц своими руками. Использование RF-модулей. Задание режима работы

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

В первую очередь берем 2 платы Arduino и подключаем к ним приемник и передатчик, как показано на рисунке:

Компоненты для повторения (купить в Китае):

Перед тем как преступить к работе, нужно указать, что для полноценной работы, к модулям необходимо припаять антенну. Рекомендуемая длина антенны для передатчиков с частотой 433 МГц равна 17 см.

Библиотека необходимая для работы с модулем VirtualWire

Её необходимо распаковать и добавить в папку "libraries" в папке с Arduino IDE. Не забывайте перезагрузить среду, если на момент добавления IDEшка была открыта.

Пример программного кода

#include void setup (void ) { vw_set_ptt_inverted(true ); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) } void loop (void ) { int number = 123; char symbol = "c" ; String strMsg = "z " ; strMsg += symbol; strMsg += " " ; strMsg += number; strMsg += " " ; char msg; strMsg.toCharArray(msg, 255); Serial .println (msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay (200); }

Разберем этот код для полного понимания.

Во первых мы формируем строку strMsg. Используем тип String, т.к. с ним проще работать (можно конкатенировать его с числами, используя оператор "+").

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

После этого преобразовываем тип String к стандартному массиву символов при помощи метода toCharArray и передаем его в команду vw_send .

Наш код будет отправлять строку "z c 123".

Перейдем к коду приемника:

Пример программного кода

// Тестировалось на Arduino IDE 1.0.1 #include void setup () { Serial .begin (9600); vw_set_ptt_inverted(true ); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира } void loop () { uint8_t buf; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) // Если принято сообщение { // Начинаем разбор int i; // Если сообщение адресовано не нам, выходим if (buf != "z" ) { return ; } char command = buf; // Команда находится на индексе 2 // Числовой параметр начинается с индекса 4 i = 4; int number = 0; // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != " " ) { number *= 10; number += buf[i] - "0" ; i++; } Serial .print (command); Serial .print (" " ); Serial .println (number); } }

Сообщение будет считано в буфер buf, который нужно разобрать.

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

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

В данной статье рассмотрен простейший вариант общения. В идеале нужно задуматься о кодировании передаваемой информации, т.к. её будут получать не только ваши приемники.

P.S. Работая с данными модулями, мы наткнулись на один не приятный подводный камень, а именно конфликт, невозможность работы с библиотекой "servo.h".

Данное устройство позволяет управлять четырьмя нагрузками по радиоканалу. В качестве процессора используется PIC12F675. В нем залиты ключи активации для всех 4х каналов. В качестве радиомодулей применены дешевые FS1000A с несущей частотой 433 МГц.

Схема передатчика радиоуправления 433 МГц

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

Все каналы независимы и можно использовать одновременно все. Устройство довольно легко повторяется. Дальность активации нагрузок по прямой видимости до 70 метров. Вся сложность при изготовлении заключается в прошивке микроконтроллера PIC12F675. Для прошивки использовал программу winpic800 и вот такой очень простой COM-программатор:

Транзистор полевой BS170 заменил на 2N7000. Как программатор поведет себя с переходниками USB-COM не знаю.

При первом чтении МК ОБЯЗАТЕЛЬНО записываем или гравируем на чипе последние 4 символа в коде. До прошивки, открываем hex файл и добавляем в конец кода значения константы (4 символа - они разные для каждого МК). Это заводская константа, если ее не записывать, то можно выкинуть контроллера. Затем только прошиваем микроконтроллер. WinPic800 сама записывает значения константы и прошивает все правильно, но на всякий случай лучше записать их где-нибудь.

Прошивка написана товарищем "4uvak" с сайта "паяльник". Вот архив с файлами, в том числе на печатные платы. А вот готовое устройство дистанционного управления по радиоканалу:

Пульт ДУ упаковал так:

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

Насчет антенн - это куски провода 0.5-1 мм в диаметре, длиной 16 см. Это как раз 1/4 волны с учетом коэффициента укорочения. В спираль антенны не советую закручивать, диаграмма направленности при этом будет не круговая, а похожа на штаны.

Где можно использовать такую штуку? Практически везде, где используется электричество. Самый простой вариант - в качестве нагрузки приемника реле использовать и коммутировать уже все что угодно, начиная от настольных ламп и утюгов, заканчивая компьютерами и замками. А можно и машинку на радиоуправлении сделать - команды ведь как раз четыре (^ v < > ).

Обсудить статью ДИСТАНЦИОННОЕ УПРАВЛЕНИЕ ПО РАДИОКАНАЛУ

Fun fact! Существуют другие, но совместимые передатчики на 433 МГц, в частности раз и два . Кроме того, есть и альтернативный приемник . Но он не вполне совместим, так как на выходе всегда выдает какой-то сигнал, независимо от того, осуществляется ли реально сейчас передача, или нет.

Для своих экспериментов я также использовал купленный на eBay пульт от гаража с внутренним DIP-переключателем:

При некотором везении такие пульты все еще можно найти как на eBay, так и на AliExpress по запросу вроде «garage door opener 433mhz with dip switch». Но в последнее время их вытесняют «программируемые» пульты, умеющие принимать и копировать сигнал других пультов. Доходит вплоть до того, что продавцы высылают пульты без DIP-переключателя даже в случае, если он явно изображен на представленном ими фото и указан в описании товара. Полагаться на внешнюю схожесть пульта с тем, что использовал я, также не стоит. Впрочем, если вы решите повторить шаги из этой заметки, наличие или отсутствие DIP-переключателя не сыграет большой роли.

Модули крайне просто использовать в своих проектах:

Как приемник, так и передатчик, имеет пины VCC, GND и DATA. У приемника пин DATA повторяется дважды. Питаются модули от 5 В. На фото слева собрана схема, в который светодиод подключен к пину DATA приемника. Справа собрана схема с передатчиком, чей пин DATA подключен к кнопке и подтягивающему резистору. Плюс в обоих схемах используется стабилизатор LM7805. Проще некуда.

Запишем сигнал при помощи Gqrx и откроем получившийся файл в Inspectrum:

Здесь мы видим такие же короткие и длинные сигналы, что нам показал осциллограф. Кстати, такой способ кодирования сигнала называется On-Off Keying . Это, пожалуй, самый простой способ передачи информации при помощи радиоволн, который только можно вообразить.

Запускаем, и на Scope Plot видим:

Практически такой же сигнал, что нам показал осциллограф!

Как видите, копеечные радиомодули на 433 МГц дают нам огромный простор для творчества. Их можно использовать не только друг с другом, но и со многими другими устройствами, работающими на той же частоте. Можно вполне успешно использовать их в чисто аналоговых устройствах без какого-либо микроконтроллера, например, с таймером 555 . Можно реализовывать собственные протоколы с чексуммами, сжатием, шифрованием и так далее, безо всяких ограничений, скажем, на длину пакета, как у NRF24L01 . Наконец, модули прекрасно подходят для broadcast посылки сообщений.

А какие потрясающие применения этим радиомодулям приходят вам на ум?

Дополнение: Также вас могут заинтересовать посты

Такс, в порядке работы над коммерческим проектом (и не спрашивайте о каком — не скажу), который сожрал все мое свободное время огромной зазубренной ложкой, раскурил до самого пепла радиомодули HopeRF HM-R433/HM-T433 . Сегодня собрал полудуплексную схему на четырех модулях и провел сеанс дальнобойной приемо-передачи.

Итак, что из себя представляла установка:

Блок А:

  • Передатчик: HM-T433
  • Приемник: HM-R433
  • Расположение блока: 5 этаж, на столе. У северной стены.
  • Питание: 5 вольт.
  • Скорость передачи: 4800 бод.
  • Длина пакета данных: 10 байт.

Блок Б:
  • Передатчик: HM-T433
  • Приемник: HM-R433
  • Антенна передатчика: Кусок провода МГТФ длинной 17см (1/4 от длины волны 433Мгц сигнала) загнутый абы как.
  • Антенна приемника: та же херня.
  • Расположение модулей: параллельно друг другу, на расстоянии 2см, усики антенн разбросаны в разные стороны, на манер тараканьих.
  • Расположение блока: У меня в руках, на земле. С южной стороны дома (смотри схему)
  • Питание: 5 вольт.
  • Скорость передачи: 4800 бод.
  • Длина пакета данных: 10 байт.
Условие передачи:
Блок Б дает десятибайтный пакет блоку А, тот, убедившись, что пакет принят без искажений, шлет подтверждение обратно на блок Б, те же десять байт. Блок Б, получив подтверждение зажигает зеленый диод. Передача идет с обрывом несущей. Т.е. после отправки пакета передатчик вырубается полностью.

Проведение опыта:
Щелкая кнопкой передачи и фтыкая в зеленую лампочку, я начал спускаться по лестнице. К моей радости, даже когда я спустился на первый этаж зеленая лампочка бодро сигнализировала о том, что передача идет без помех, несмотря на то, что меня от другого блока отделяло как минимум 5 бетонных плит перекрытий, не считая кирпичных стен. После я вышел из подъезда и подорвался к противоположному углу дома. Примерно на 50 метрах от подъезда связь прервалась и ответа не было. Тогда я начал возвращаться обратно. Связь восстановилась лишь когда я подошел почти вплотную к своему подъезду. Поначалу мне казалось, что наверху тупо зависла софтина, оказалось все ок. В чем была причина не знаю. Возможно, стоящее в тот момент возле подъезда, такси имело у себя на борту 433МГц передатчик и насрало мне в эфир. Так как следующий отход на другой конец здания подтвердил дальность и качество приема. Это при том, что на прямой видимости, между мной и другим концом был практически весь кирпичный дом, продольно.

Алгоритм работы с двумя приемниками и двумя передатчиками:
Итак, что мы имеем:

  • У нас два приемника и два передатчика.
  • Приемник можно заглушить выходом Enable , так что он не будет принимать.
  • А вот передатчик передает всегда когда на входе есть активность. Засыпает он спустя 70ms бездействия.
  • А еще мы знаем, что два передатчика одновременно фурычить не могут — несущие у них разные, а значит приемники посылают в пешее эротическое путешествие обоих. Ну или того чей сигнал слабее.

Чтобы организовать в таких мерзких условиях дуплекс приходится извращаться.
Для передачи нужно во-первых инициализировать несущую. Проблема в том, что когда несущей нет, то приемник ловит всякую муть, а входящая линия UART принимающего контроллера захлебывается от дерьма. Так что тут, в целях экономии ресурсов проца, имеет смысл выставить минимальную скорость приема 600бод, чтобы его реже дергало прерыванием от UART RX . Сразу слать байт нельзя — так как у нас на входе мусор, а протокол RS232 отличается тем, что конец байта практически не отличим от середины, то если тупо взять и послать, то с вероятностью в 90% у нас произойдет смешение части байта из окружающего мусора и нахлынувшими данными из вдруг образовавшегося канала. Получится рассинхронизация и на выходе будет полная ахинея.
Так что вначале надо поднять несущую и синхронизировать протокол. Несущая у нас встает как только меняется состояние линии DATA , а вот с протоколом хитрее. Вспомним пост про — видите, спокойное состояние UART’a — высокий уровень. Так что после подъема несущей нужно выставить DATA в High , дольше чем на один байт по текущей скорости протокола, но не дольше чем на 70ms — иначе у нас передатчик опять заснет. При этом на выходе DATA приемника тоже выставится High и UART , спокойно прожевав очередную порцию дерьма из эфира, успокоится и приготовится к приему нормального корма. Дальше можно слать данные.
Чтобы не заморачиваться с дрыганьем ножкой и вычислением задержек,можно просто послать раза три число 255 — это фактически сплошной высокий уровень, с небольшим провалом в виде старт бита. Но на одном из байтов таки произойдет синхронизация и дальше можно слать данные. И повышать скорость передачи (помните я чуть выше говорил про понижение до минимума), после взаимной договоренности сторон.

На прием тоже есть пара хитростей. Сразу же после передачи нам нужно дождаться А) Когда байт таки отправится до конца Б) когда наш собственный передатчик заснет от бездействия. Т.е. это 70ms + время на передачу байта . Чтобы не словить сигнал от своего же передатчика. Как только наш передатчик отвалится можно врубать приемник и начинать ждать несущей от вражеской станции. Отличить полезный сигнал от дерьма очень просто — достаточно за начало передачи взять 10 одинаковых байт. Как только пришло 10 одинаковых байт — опа, есть коннект. Вероятность появления 10 одинаковых байт в мусоре эфира микроскопическая. Особенно если это байты численно близкие к нулю. (в среднем, шум, по значениям, колеблется от 50 до 255, крайне редко проваливаясь ниже 20)

Организация сети:
А если нам нужно не два, а больше приемо передатчиков? Как быть? А тут рулит эстафета aka Token Ring — когда передатчик по очереди передает служебный байт-эстафетную палочку. Получив этот пакет передатчик имеет право вещать. Если же ему вещать нечего, то он отсылает это право другому и так по кругу. Разумеется делается это все программно.

Приколы с контроллером:
При отладке этого девайса у меня сдохли три (!!!) ATTiny2313 . В первой убился порт PB4 — там висела кнопка и она стала самопроизвольно срабатывать. Замеряю напряжение подтяжки (внутренней) — 0.5 вольта вместо положенных 4.5. Вот засада:/ Заменил (точнее перепаял, т.к. была в SOIC — фен рулит! :)). Это к вопросу о внешней подтяжке резисторами. Внешняя подтяжка рулит, что бы там не бубнили любители минимализма на плате! Зажал я пару резисторов и, в итоге, просрал три контроллера, а так, может быть, даже и не заметил бы пробоя ноги.

Потом опять сдохла ножка PB4 , попутно унеся в могилу еще и ногу RXD . Да что за засада??? Неужели статика? Сколько десятков ATTiny2313 пустил в оборот — ни одна от статики не сдохла, а тут уже вторая. Что то тут нечисто. Ладно, хрен с ней, у меня еще в палке этих ATTiny2313 штук 70 лежит. Перепаял. Фен воистину рулит!!!

Когда на третьей микросхеме сдохла нога PB4 я стал искать где же собака порылась… Статика… не статика это как авиабомба — дважды в одну и ту же воронку не падает. Схемотехника? Да не, откуда там пробои — пассивка одна вокруг… И тут я вспомнил когда пробивало ногу — когда я антенну передатчика сворачивал в этакое колечко вокруг платы и закрывал в коробочку, а после жал на передачу… Гляжу — точка запайки антенны передатчика в аккурат над ногой процессора, а потом антенна идет с другой стороны платы вдоль дорожки от этой злосчастной ноги. Дорожка длинная, сантиметра три-четыре. Вот сижу и чешу репу — неужели наводка с антенны модуля столь мощная была, что пробивала нафиг транзистор в МК? На всякий случай между антенной и платой проложил кусок фольгированного текстолита и заземлил его на массу. Выглядит как броня, зато теперь ножки не дохнут. От так!

З.Ы.
На этом тему модулей HopeRF HM-R433/HM-T433 считаю закрытой.
Разве что библиотечку кода под обработку этого барахла потом предоставлю, когда отлажу и вычищу все баги. Вопросы в комменты.

На этом уроке мы решим задачу по передаче радиосигнала между двумя контроллерами Ардуино с помощью популярного приемопередатчика с частотой 433МГц. На самом деле, устройство по передаче данных состоит из двух модулей: приемника и передатчика. Данные можно передавать только в одном направлении. Это важно понимать при использовании этих модулей. Например, можно сделать дистанционное управление любым электронным устройством, будь то мобильный робот или, например, телевизор. В этом случае данные будут передаваться от пульта управления к устройству. Другой вариант — передача сигналов с беспроводных датчиков на систему сбора данных. Здесь уже маршрут меняется, теперь передатчик стоит на стороне датчика, а приемник на стороне системы сбора. Модули могут иметь разные названия: MX-05V, XD-RF-5V, XY-FST, XY-MK-5V, и т.п., но все они имеют примерно одинаковый внешний вид и нумерацию контактов. Также, распространены две частоты радиомодулей: 433 МГц и 315 МГц.

1. Подключение

Передатчик имеет всего три вывода: Gnd, Vcc и Data.
Подключаем их к первой плате Ардуино по схеме: Собираем оба устройства на макетной плате и приступаем к написанию программ.

2. Программа для передатчика

Для работы с радиомодулями воспользуемся библиотекой RCSwitch . Напишем программу, которая будет каждую секунду по-очереди отправлять два разных сообщения. #include RCSwitch mySwitch = RCSwitch(); void setup() { mySwitch.enableTransmit(2); } void loop() { mySwitch.send(B0100, 4); delay(1000); mySwitch.send(B1000, 4); delay(1000); } Разберем программу. Первое что мы сделали — объявили объект для работы с передатчиком и назвали его mySwitch. RCSwitch mySwitch = RCSwitch(); Затем, внутри стандартной функции setup включили передатчик и указали вывод, к которому он подключен: mySwitch.enableTransmit(2); Наконец, в основном цикле программы loop отправляем сначала одно сообщение, а затем и второе с помощью функции send : mySwitch.send(B1000, 4); Функция send имеет два аргумента. Первый — это отправляемое сообщение, которое будет отправляться в эфир в виде пачки импульсов. Второй аргумент — это размер отправляемой пачки. В нашей программе мы указали сообщения в формате двоичного числа. На это указывает английская буква «B» в начале кода B1000. В десятеричном представлении это число превратится в восьмерку. Так что мы могли вызвать функцию send так: mySwitch.send(8, 4); Также send умеет принимать двоичные строки: mySwitch.send("1000", 4);

3. Программа для приемника

Теперь напишем программу для приемника. Для демонстрации факта передачи мы будем зажигать светодиод, подключенный к выводу №3 на плате Ардуино. Если приемник поймал код B1000 — включим светодиод, а если B0100 — выключим. #include RCSwitch mySwitch = RCSwitch(); void setup() { pinMode(3, OUTPUT); mySwitch.enableReceive(0); } void loop() { if(mySwitch.available()){ int value = mySwitch.getReceivedValue(); if(value == B1000) digitalWrite(3, HIGH); else if(value == B0100) digitalWrite(3, LOW); mySwitch.resetAvailable(); } } Функция available возвращает истину, если передатчик принял хоть какие-то данные: mySwitch.available() Функция getReceivedValue извлекает из потока данных одну пачку и декодирует её в число. В программе мы присваиваем полученное число переменной value : int value = mySwitch.getReceivedValue();

Задания

Теперь можно попробовать потренироваться и сделать разные полезные устройства. Вот несколько идей.
  1. Пульт для светильника. На стороне приемника , включенный в цепь питания светильника (осторожно, 220 Вольт!). На стороне передатчика: . Написать программы для приемника и передатчика, которые по нажатию кнопки будут включать удаленное реле. При повторном нажатии кнопки реле будет выключаться.
  2. Уличный термометр с радиоканалом. На стороне передатчика разместить . Предусмотреть автономное питание от батареек. На стороне приемника: . Написать программы для приемника и передатчика, которые позволят выводить показания температуры с удаленного датчика на дисплее.

Заключение

Итак, теперь мы знаем простой и недорогой способ передавать данные на расстоянии. К сожалению, скорость передачи и дистанция в таких радиомодулях весьма ограничены, так что мы не сможем полноценно управлять, например квадрокоптером. Однако, сделать радиопульт для управления простым бытовым прибором: светильником, вентилятором или телевизором, нам под силу. На основе приемопередатчиков с частотой 433 МГц и 315 МГц работает большинство радиоканальных пультов управления. Имея Ардуино и приемник, мы можем декодировать сигналы управления и повторить их. Подробнее о том, как это сделать мы напишем в одном из следующих уроков!
Понравилась статья? Поделитесь с друзьями!
Была ли эта статья полезной?
Да
Нет
Спасибо, за Ваш отзыв!
Что-то пошло не так и Ваш голос не был учтен.
Спасибо. Ваше сообщение отправлено
Нашли в тексте ошибку?
Выделите её, нажмите Ctrl + Enter и мы всё исправим!