Подключение радиомодулей к микроконтроллеру

Подключение радиомодулей
Я давно думал о подключении радиомодулей к микроконтроллеру для осуществления беспроводной передачи данных, и однажды просматривая сеть, наткнулся на дешевые радио-модули под платформу Arduino. Это простые радиомодули, передатчик (модель FS1000A) собран на двух транзисторах, модуляция сигнала амплитудная, несущая частота равна 433 Мгц, стабилизирована ПАВ резонатором. Плата передатчика имеет три вывода: Vcc, Gnd для питания (3,5-12В), вывод data является входом для модуляции данных, высокий логический уровень на этом выводе включает передатчик.

Приемник XY-MK-05VПриемник (модель XY-MK-5V) представляет собой сверхгенератор, на выходе которого стоит компаратор, приемники такого типа являются очень простыми из-за малого количества деталей, обладают высокой чувствительностью и автоматической регулировкой усиления, однако есть и недостатки, из-за высокой чувствительности и широкой полосы пропускания, он ловит много помех, на выходе всегда присутствует шум. Плата приемника имеет четыре вывода: Vcc, Gnd – питание 5В, и выход в виде двух совмещенных выводов (data). Комплект модулей можно приобрести здесь.

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

Получается, что приемник не может принимать длинные импульсы, это указывает на наличие определенной минимальной скорости передачи данных. Если передавать байт с числом 255 (все биты равны 1) или число 0 (все биты равны 0), то передача может сорваться. То есть для нормальной работы приемника необходимо постоянно менять логические уровни. Для устранения этой проблемы советуют использовать манчестерский код, где логической единице соответствует переход от низкого к высокому логическому уровню, логический ноль – переход от высокого к низкому уровню. При этом данный код увеличивает количество передаваемой информации в два раза, я не стал его применять, воспользовавшись другим алгоритмом, о котором будет сказано ниже.

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

После раздумий мне пришла идея кодировать биты длительностью логических сигналов. Биты передаются комбинацией низкого и высокого логического уровня различной длительности, для нуля продолжительность сигналов составляет 500 и 250 мкс, для единицы наоборот 250 и 500 мкс. Таким образом, отпадает надобность в манчестерском коде, хотя в этом случае количество передаваемой информации также увеличивается. С выхода приемника микроконтроллер измеряет время между изменениями уровня сигнала, при правильных характеристиках сигнала выделяется лог.1 или лог.0, допустимое отклонение длительности сигнала установлено на уровне ±100 мкс (250±100 мкс , 500±100 мкс). При таком алгоритме контролируется правильность каждого бита информации, также устраняется проблема ложного срабатывания.
Протокол беспроводной связи
Этот алгоритм работал, но приемник не всегда получал команды, иногда они терялись. Почитав статьи по данной тематике, я разобрался в причине неуверенного приема, перед отправкой данных необходимо передать преамбулу в виде последовательности нулей и единиц, в результате чего приемник лучше подстраивается под несущую частоту передатчика и в дальнейшем ведет уверенный прием. Кроме этого, преамбула дает возможность синхронизироваться, то есть определить начало передачи информационных данных. Теперь перед посылкой команды я отправляю последовательность нулей и единиц длиной в 16 бит (2 байта), длительность логических уровней для каждого бита составляет 500 мкс, в результате чего приемник начал стабильно принимать команды.

Приемник собран на микроконтроллере PIC16F628A (схема представлена ниже), выход (data) радио-модуля подключен к линии ввода-вывода RB4, прием ведется на прерываниях, в микроконтроллере включены прерывания по изменению уровня на входах RB4-RB7. Причем линии RB5-RB7 настроены на выход, чтобы не вызывать ложных прерываний, так как в данном микроконтроллере нельзя разрешать прерывания по отдельности на каждую линию. Микроконтроллер работает от внутреннего тактового генератора в 4 Мгц. Ниже представлен код программы:

Между прерываниями запускается таймер TMR0 , в подпрограмме обработки прерываний проверяется его значение, и если оно соответствует установленным значениям с учетом допустимых отклонений (250±100 мкс , 500±100 мкс), то далее определяется уровень сигнала. Если зафиксирован низкий уровень сигнала, дается разрешение для приема сигнала с высоким логическим уровнем в следующем прерывании. После фиксации высокого логического уровня с правильной длительностью, происходит определение полученного бита (0 или 1). Таким образом, прием бита происходит в два прерывания. При правильной идентификации бита начинается отсчет количества полученных бит, то есть происходит синхронизация. В моем варианте команда состоит из 2-ух байт со значениями 196 и 46, которые хранятся и считываются при помощи косвенной адресации. После приема 16-го бита, в подпрограмме обработки прерываний устанавливается флаг получения команды, который опрашивается в основной программе. После получения команды она проверяется, при совпадении происходит включение или выключение светодиода (HL1 на схеме) в зависимости от его предыдущего состояния. Если во время приема будет зафиксирован сигнал с неправильной длительностью либо бит не прошедший идентификацию, то прием начнется заново, сбросятся регистры отсчета количества полученных байт и бит, также сбросится бит разрешения приема высокого логического уровня. Для большей стабильности приема лучше установить внешний кварцевый резонатор для микроконтроллера, так как частота внутреннего генератора меняется в зависимости от напряжения питания и температуры, что может привести к неуверенному приему. Кроме этого была выявлена зависимость стабильного приема от емкости сглаживающего конденсатора C2, малая емкость может привести к неуверенному приему, желательно устанавливать конденсатор емкостью не менее 100 мкФ.
Схема подключения радиомодулей
Передатчик собран на микроконтроллере PIC12F675, конструкция питается от батарейки “Крона” напряжением 9В, от величины напряжения зависит мощность передаваемого сигнала и соответственно дальнодействие, для питания микроконтроллера установлен стабилизатор напряжения 78L05. Микроконтроллер работает на частоте 4 Мгц от внешнего кварцевого резонатора. Код программы представлен ниже:

После подачи питания микроконтроллер настраивает внутренние регистры, и засыпает. При нажатии кнопки SB1 происходит прерывание по изменению уровня на линии GP1, в результате чего микроконтроллер просыпается, далее опрашивается состояние кнопки, переход в обработчик прерываний не происходит, так как глобальные прерывания запрещены. Если кнопка находится в нажатом состоянии (низкий логический уровень на линии GP1), вызывается подпрограмма передачи преамбулы, далее идет передача команды в виде двух байт со значениями 196 и 46, после передачи вызывается подпрограмма паузы в 200мс. Если кнопка удерживается нажатой, то выполняется повторная передача команды, соответственно на приемнике светодиод будет поочередно включаться и выключаться. При отжатии кнопки происходит переход в спящий режим. Как видно, в случае передатчика все просто, в целях экономии батареи вместо микросхемы 78L05 следует применить микромощный стабилизатор напряжения на 5В, с малым током покоя.

Скорость передачи данных в моем варианте составляет 1333 бит/сек, один бит передается за 750мкс. Дальность уверенной связи в пределах прямой видимости составила 50-60м, при увеличении расстояния до 100м наблюдался неуверенный прием, думаю для таких простых и дешёвых модулей это нормальный результат. В качестве антенны использовался медный провод диаметром 0,5мм и длиной 17см (четверть от длины волны). На основе кода рассмотренного в статье можно использовать радиомодули в различных конструкциях, например для беспроводного звонка, дистанционное радиоуправление, беспроводной датчик температуры и т.д. На данных модулях я собрал для себя радиоуправляемую поворотную платформу и беспроводной термометр.

После множества экспериментов выяснились следующие особенности радиомодулей:
1. Модуль приемника чувствителен к помехам на линии питания. В одной моей конструкции на линии питания с приемником стоял драйвер светодиодных семисегментных индикаторов MAX7219, при этом приемник не ловил команды или ловил очень редко, стоило отключить драйвер, и приемник начинал получать команды. Вероятно, драйвер создает низкочастотные помехи на линии питания, которые влияют на приемник. Это явление наблюдалось и с другими драйверами для семисегментников, а также при совместной работе с сервоприводами. Установка всяких фильтров не помогало полностью избавиться от помех. Лучшим решением оказалась установка отдельного стабилизатора напряжения для приемника. В любом случае в цепи питания приемника желательно ставить конденсатор емкостью от 100 мкФ.
2. При увеличении напряжения питания модуля передатчика больше 9В, нарушалась радиопередача данных, приемник ничего не ловил. Хотя везде указано, что максимальное напряжение питания передатчика составляет 12В.
3. Я не силен в СВЧ радиотехнике, но читая различную информацию выделил следующие особенности: для лучшей эффективности несимметричной антенны (штыревая антенна) необходим противовес (аналог заземления). В качестве противовеса могут выступать провода подводящие питание, дорожки на печатной плате подключенные к общему проводу, при этом длина и площадь дорожек, должны быть как можно большими. В случае использования двусторонней платы, роль противовеса может выполнять одна из фольгированных сторон. Если устройство является портативным, например брелок, то тело человека также является дополнительным противовесом.

Я провел тестирование другого комплекта подобных модулей с названиями WL101-341 и WL102-341, они показали лучший результат по сравнению с модулями описанными в этой статье, подробнее можно почитать в статье Радиомодули WL101-341 WL102-341 – подключение и тестирование. Кроме этого, я тестировал радиомодули HC-12 с UART интерфейсом, они представляют собой приемопередатчик на основе трансивера Si4463, дальность связи может достигать 1,8 км, более подробно читайте в статье Подключение модулей HC-12.

Обновление: В конце статьи дополнительно прикрепил прошивку и схему двух-режимного приемника на PIC16F628A. В данном приемнике с помощью переключателя можно выбрать два режима:
1 – Поочередное включение и выключение светодиода при поступлении команды с передатчика, то что было описано выше в статье.
2 – Режим повторения, светодиод светится пока нажата кнопка на передатчике.
РадиопередатчикПриемник 433Мгц

Прошивка и исходник передатчика (PIC12F675)
Прошивка и исходник приемника (PIC16F628A)
Прошивка приемника на два режима (PIC16F628A)
Прошивка приемника (PIC12F675)

У этой записи 62 комментариев

  1. Пожалуйста помогите собрать приёмник на PIC12F675 и прицепить это дело к “Музыкальный звонок на микроконтроллере” . Звонок собрал. всё отлично работает. А вот беспроводную кнопку никак не могу найти приемлемую схему. Если повторить то что здесь получится два PIC16F628A что по моему слишком для этого. К сожалению в программировании чайник, код сам написать не могу (хотя пытаюсь). Есть модули FS1000A, XY-MK-5V. Или если знаете дайте ссылку где это описано. Передатчик отличный а 12 вольтовую батарейку к нему можно прицепить ? Приемник бы к нему такой же.

    1. Я постараюсь в ближайщее время перенести приемник на PIC12F675, передатчик останется таким же.

      При 12В скорее всего передатчик не будет работать, из моих опытов стабильно работает до 9В, в схеме моего передатчика для питания микроконтроллера стоит стабилизатор напряжения 78L05, который в свою очередь постоянно потребялет ток несколько миллиампер, что не очень хорошо для батарейки, вместо него лучше собрать микромощный стабилизатор с малым потреблением.

      1. Схемы стабилизаторов в интернете есть. А вот радиокнопок с кодировкой на 1 канал не нашел. Подождем.

        1. Привет, отправил тебе на почту прошивку для PIC12F675

          1. Большое спасибо!
            Попытаюсь разобраться в программе благо пример есть.
            Я пока временно приспособил вот такой пульт
            http://ru.aliexpress.com/item/1set-2pcs-2262-2272-Four-Ways-Wireless-Remote-Control-Kit-M4-the-lock-Receiver-with-4/1752500196.html?http_swift_null= . Выход подключил через транзисторный ключ вроде всё работает.
            Подскажи пожалуйста в PIC16F628A есть энергонезависимая память ? Просто хочу переделать твою программу , убрать режим плеера оставить только две копки (одна звонок, другая выбор мелодии). Файлы назвать 01.wav 02wav, и так далее (больше 10-20 и ненужно) и нужно что бы при нажатии 2-й кнопки происходила смена мелодии с запоминанием . Можно так сделать или нужно на карту памяти выбор сохранять?

      2. Добрый день, выложите, пожалуйста прошивку для приемника на. Pic12f675.

        1. Здравствуйте, прошивку выложил в конце статьи.

          1. Благодарю Вас!!! Что с модулями на 2,4 ГГц NRF24L01? Есть два таких модуля а простейшего применения на pic16f628 не могу найти.

            1. Про модули NRF24L01 ничего сказать не могу, я пока не изучал их.

          2. Все отлично работает!! Респект! А можно прошивку и схему двух-режимного приемника на PIC12F675? Пожалуйста!

  2. Зачем изобретать велосипед-есть формат keeloq -апноты на него есть и исходники согласно им и надо было кодер и декодер.Если рядом будет сигналка с форматом пакета starline-возможно ложные срабатывания ибо у них единица и ноль тоже 500 мкс и 250 мкс

    1. я не слышал ранее о keeloq, у меня единица и ноль это последовательность 0 и 1, а не просто 0 или 1, ложное срабатывание маловероятно, должен совпасть еще сам код, кроме того временные интервалы я могу поменять.

  3. Можно ли уменьшить преамбулу до 3 бит, ухудшиться ли качество приёма?

    1. Ничего не могу сказать на счет 3-х байт, надо экспериментировать, я пробовал 8 бит (1 байт) нормально работало.

  4. Зачетная штучка.Легко повторить. .asm без заморочек.
    Прекрасная основа для написания собственного софта.
    Я сделал пять пятикомандных трансиверов на этих модулях.

  5. Оказалось очень полезным покрутить сердечник на контуре приемника.
    Настроены они плохо.У меня некоторые и на полметра не работали.
    После настройки брал по всей квартире. Это метров 15. При 4.5 вольтах питания передатчик-приемник.

    1. Я с таким пока не сталкивался, может это единичный случай и вам достались плохо настроенные модули.

  6. Здравствуйте! Для изменения длины передаваемой преамбулы в программе передачи надо строчку 76
    preamb movlw .8
    заменить на
    preamb movlw .4
    а где надо сделать изменения в программе приемника для приема преамбулы длиной 8бит.
    Спасибо!

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

  7. Здравствуйте.
    Подскажите пожалуйста как сделать так, чтобы светодиод в приемнике светился только при нажатии кнопки.
    Есть нажатие – горит светодиод, нет нажатия – не горит, а не переключался при каждом нажатии на кнопку.
    Спасибо!

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

    2. Выложил новую версию приемника в конце статьи.

  8. Большое спасибо за новую версию приемника, работающего в двух режимах.

  9. Можно ли коммутировать не GP1, сделать его постоянно замкнутым, а коммутировать непосредственно батарейку, долго ли будет “загружаться” PIC и радиомодуль, чтобы подать в эфир сигнал? Или только последовательно, сначала питание, потом GP1 на землю? Одно-командный пульт мог бы не потреблять энергию в режиме простоя. По идее нужно было бы переделать прошивку.

    1. Можно и так сделать, коммутировать по питанию, прошивку можно и не переделывать, а замкнуть GP1 на общий провод. Вообще для уменьшения потребления вместо обычно стабилизатора напряжения 7805 можно поставить микромощный MCP1702 (на 5В) с собственным током потребления 1 мкА, микроконтроллер в спящем режиме потребляет менее 1 мкА, в итоге потребление составит 1-1,5 мкА.

      Я применял такой микромощный стаблизатор в следующих конструкциях: https://radiolaba.ru/microcotrollers/povorotnaya-platforma-s-distantsionnyim-upravleniem.html и https://radiolaba.ru/microcotrollers/termometr-s-besprovodnyim-datchikom.html

      1. Не получается коммутировать подавая питание, при GP1 притянутом на GND.

          1. Работает! Коммутировать питанием правильно т.к. 99% времени бездействует

            1. Отлично!
              В изначальной прошивке микроконтроллер уходил в спящий режим, основное потребление в схеме идет только от стабилизатора напряжения 78L05, собственный ток потребления которого несколько миллиампер, МК в спящем режиме потребляет несколько микроампер.

              Наиболее правильное решение это не коммутировать по питанию, а установить микромощный стабилизатор, о чем я писал выше в комментариях

              1. Да, согласен, например НТ серия стабилизаторов “нюхающих” электричество.
                Добавьте еще один канал, пожалуйста, памяти в 629/675 пике куча и порты свободные есть. У вас ассемблером все в порядке.

  10. Добрый день, не много не разберусь с кодом передатчика, метка preamb:
    1) в описании к коду вы говорите, что передается 0101… , хотя я по коду вижу меандр с периодом 1 мс, да и по графику видно, что он не соответствует ни 0 ни 1;
    2) в описании к коду вы говорите, что передается 16 бит, хотя я по коду вижу 8 бит передачи (preamb movlw .8);
    Спасибо.

    1. Биты преамбулы и информационные биты по форме не совпадают, преамбула как таковая представляет собой меандр, как вы и заметили, там не обязательно иметь форму сигнала как у информационных битов, а 16 бит это я условно посчитал каждый логический уровень (лог.0 и лог.1).

  11. добрый день, как реализовать на pic16f628a + nrf24l01 передатчик на 6 кнопок и приемник на 6 диодов? в программировании я полный ноль((((((

    1. Здравствуйте, я приемопередатчики nrf24l01 не изучал, так что не могу пока по ним подсказать, если с программированием у вас плохо, то лучше поискать готовые проекты.

      1. на данном мк все проекты без использования кнопок, у меня есть 2 pic и 2 nrf, по сути так же связь что и у вас, только мне нужна передача сигнала с пинов одного мк на теже пины другого

  12. Подскажите пожалуйста как изменять интервал 20мс на выходе 6 в PIC12F675
    вот ссылка на код который Вы присылали.

    1. В подпрограмме паузы надо изменить значение числа 26 которое загружается в регистр Sec, числу 1 соответствует пауза 0,765 мс, например для числа 50 пауза составит 50*0,765=38,25 мс.

      movlw .26 ;подпрограмма паузы 20мс
      movwf Sec
      a2 movlw .255
      movwf Sec0
      a1 decfsz Sec0,F
      goto a1
      decfsz Sec,F
      goto a2

  13. Добрый день! Спасибо за конструкцию и программную реализацию, хорошее решение, не могли бы добавить второй канал, спасибо еще раз!

  14. подскажите пожалуйста ,а где схема приемника на 12f675.
    хочу добавить при питании модуля передатчика 12в прием увеличился до 300м,
    у передачика и приемника припаяна антенна провод 17см

    1. Прошивка приемника приведена в конце статьи, там в архиве и схема. Что-то с трудом верится в дальность 300 м.

  15. здравствуйте , не буду точно утверждать что это было 300м . проведу испытание опишу условия. если можно вас спросить ,ищу возможность сделать радиоканал с обратной связью,
    на pic встречал конструкции на mrf49xa нужно решить такую задачу для включения насоса на участке . повторил несколько устройств на pic , не программист но очень затягивает.

    1. Приветствую, для радиоканала с обратной связью лучше использовать радиомодули HC-12, это получается трансивер, приемник и передатчик в одном модуле, позиционируется как беспроводной удлинитель интерфейса UART, максимальная дальность для них приводится в 1 км, один модуль стоит в среднем 200 руб в Китае. Сам приобрел такие модули уже давненько, но протестировать никак времени не могу найти.

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

    1. Здравствуйте, я сам не проверял такой способ, но думаю что работать будет, если вы хотите таким образом сэкономить заряд батареи, то лучше рекомендую поставить микромощный стабилизатор напряжения MCP1702, собственный ток потребления которого составляет 2 мкА.

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

    1. Спасибо! В ближайшее время я опубликую статью о радиомодулях HC-12, которые построены на трансивере (приемопередатчике), там будет обратная связь.

      1. Любопытно,но лучше бы NRF24L01 занялись.
        Шесть независимых каналов прием/передача да еще 125 каналов по частоте.
        Правда частота 2,4Ггц.На все стенки натыкаться будет.

        1. Я как-то хотел изучить радиомодули NRF24L01, но посмотрев документацию, понял что на полное изучение уйдет много времени, очень объемная документация. Да и малый радиус действия модулей убавил интерес к ним, может как нибудь и рассмотрю их…

          1. Оно сначала страшно-потом привыкаешь.
            С внешней антенной пишут до 1000 метров.
            Вполне…

            1. Александр, вы собирали чего-нибудь на HRF24L01 ? У меня валяются два модуля, хотел управление устройствами на PIC простейшем подключить. Посмотрел проекты людей, такой сложняк, мне просто надо бы несколько каналов туда и обратно управление организовать. не подскажите что-нибудь без дисплеев и проч.

              1. Мучаю сейчас их.Наскоками.Нет времени.Результата нет.
                Но осваиваются потихоньку.
                Вот хорошо изложено.Но для AtMega8.
                Перевожу с Си на ассемблер для PIC.
                ссылка

                1. Так отож, найти бы где может на планете кто-нить на Си и для PIC написал код для готового устройства, вот как уважаемый Руслан, автор устройства управления поворотной платформой, несколько каналов использовать. Модули и приемник и передатчик в одном, возможностей куча.

  18. Будем ждать статьи о применении HC-12,

  19. Руслан, приветствую!
    Скажите, а на PIC12F675 приемник может работать в двух режимах или нет?

    1. Привет, в приемнике на PIC12F675 заложен только один режим, переключающийся при каждом нажатии кнопки на передатчике.

  20. Добрый день, ищу приемник практически такого-же протокола как у вас только наоборот. Для 1 вкл 550мкс и выкл на 200мкс , а для 0 надо вкл 200мкс и выкл 550мкс. Даже длинна пакета 750 мкс. Пример передаваемого пакета 0101111101010100010101000 . Не могли бы вы подправить прошивку под мои нужды. Приемник должен управлять 1 реле (одна команда вкл, вторая – выкл). В частности тот пакет что написан выше это “включение реле”.

  21. Здравствуйте! А в каком месте программы исходника изменить код, чтобы не мешали друг другу если испольщуется несколько таких устройств.

    1. В программе приемника поменять значение чисел 196 и 46 на любые другие, либо поменять только одно значение:

      movlw data1 ;проверка первого и второго байта команды на соответствие
      movwf FSR ;с командой, отправленной с передатчика
      movf INDF,W
      xorlw .196
      btfss STATUS,Z
      goto opros ;первый байт команды неверный:переход на метку opros
      incf FSR,F

      movf INDF,W
      xorlw .46
      btfss STATUS,Z
      goto opros ;второй байт команда неверный:переход на метку opros

      В программе передатчика также поменять эти числа на другие, соответствующие числам в программе приемника:
      nagat call preamb ;вызов подпрограммы передачи преамбулы
      movlw .196 ;передача числа 196 на передатчик
      call send ;
      movlw .46 ;передача числа 46 на передатчик
      call send ;
      return ;выход из подпрограммы

  22. Здравствуйте, судя по вашему коду все будет работать только не на этих модулях, так как они инвертируют сигнал

  23. Доброго времени суток , кого-нибудь интересует адаптация данной программы для ATtiny 2313 ?

Имя (обязательно)Email (обязательно)Веб-сайт

Добавить комментарий