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



Подключение радиомодулей
Я давно думал о подключении радиомодулей к микроконтроллеру для осуществления беспроводной передачи данных, и однажды просматривая сеть, наткнулся на дешевые радио-модули под платформу 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 – подключение и тестирование

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

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

Последние записи:

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

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

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

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

      • Схемы стабилизаторов в интернете есть. А вот радиокнопок с кодировкой на 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. Зачем изобретать велосипед-есть формат keeloq -апноты на него есть и исходники согласно им и надо было кодер и декодер.Если рядом будет сигналка с форматом пакета starline-возможно ложные срабатывания ибо у них единица и ноль тоже 500 мкс и 250 мкс

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

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

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

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

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

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

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

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

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

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

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

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *