Прием/передача данных с использованием радиомодулей
Как отмечено в статье про радиомодули, это хорошее средство для организации обмена данными на небольших расстояниях. Однако, применяемый в них метод модуляции ООК обладает крайне низкой помехоустойчивостью и без применения кодирования данных здесь не обойтись...
Наиболее популярные микросхемы кодера/декодера, применяемые с радиомодулями - это набор РТ2262/2272. Встретить клоны этих микросхем можно легко в бытовых приборах: дистанционном управлении люстрой, беспроводном звонке и т.д. Очень удобный набор, но приемник (РТ2272) обладает фиксированными возможностями, зашитыми в микросхему, а хочется, как правило, чего-то необычного... Часто такую проблему обходят использованием в качестве декодера не РТ2272, а микроконтроллера, например чего-нибудь из PIC-ов.
В данной статье будет описан несколько иной подход в реализации функции кодирования/декодирования данных.
Наиболее популярные микросхемы кодера/декодера, применяемые с радиомодулями - это набор РТ2262/2272. Встретить клоны этих микросхем можно легко в бытовых приборах: дистанционном управлении люстрой, беспроводном звонке и т.д. Очень удобный набор, но приемник (РТ2272) обладает фиксированными возможностями, зашитыми в микросхему, а хочется, как правило, чего-то необычного... Часто такую проблему обходят использованием в качестве декодера не РТ2272, а микроконтроллера, например чего-нибудь из PIC-ов.
В данной статье будет описан несколько иной подход в реализации функции кодирования/декодирования данных.
Алгоритм кодировки.
В качестве алгоритма кодирования данных использован иной (чем в РТ2262) принцип, заимствованный из популярного в 80-х годах ХХ века компьютера "Радио-86РК" - Манчестерская кодировка или код Манчестер II. Там сходная проблема была при работе с кассетным магнитофоном в качестве внешнего накопителя. Для простоты описания алгоритма кодировки, можно считать, что каждый бит данных в процессе записи заменяется двумя битами, причем логическая 1 заменяется на 01, а логический 0 — на 10. Для записи одного байта требуется передать через интерфейс 16 бит. Передача байта начинается со старшего бита. Вот этот принцип кодирования данных для радиомодулей и использован.
Передатчик (Кодер).
Для простоты реализации в качестве микроконтроллера-кодера передатчика использован модуль Arduino UNO R3 - см фото.
Данные для передачи снимаются с pin 13 - это удобно, т.к. к этому выводу подключен светодиод и можно визуально наблюдать работу передатчика. Сигнал с pin 13 подается прямо на вывод DATA модуля радиопередатчика, в качестве питания радиомодуля использованы линии +5В и GND Arduino UNO.
Программка (Sketch), реализует следующую процедуру. В исходном состоянии радиомодуль "выключен", т.е. на DATA подается логический ноль.
Для передачи информации используется посылка из нескольких байт. В данном случае:
Процедура передачи данных в цикле повторяет две посылки с интервалом около четырех секунд: в одной посылке идут "данные на включение" - первый байт данных равен 127, в следующей - "на выключение" - нулевой байт. Для контроля, кроме светодиодного индикатора, в последовательный канал Arduino отправляет значение первого байта данных из посылки.
Скорость передачи данных выбрана небольшой - 800 мкс на один информационный бит (задается процедурой delayMicroseconds(400), где 400 мкс - это половина времени передачи одного бита), что укладывается в диапазон скоростей передачи данных используемыми радиомодулями. В sketch-е легко разобраться и использовать процедуру передачи байта для создания чего-нибудь более осмысленного...
Данные для передачи снимаются с pin 13 - это удобно, т.к. к этому выводу подключен светодиод и можно визуально наблюдать работу передатчика. Сигнал с pin 13 подается прямо на вывод DATA модуля радиопередатчика, в качестве питания радиомодуля использованы линии +5В и GND Arduino UNO.
Программка (Sketch), реализует следующую процедуру. В исходном состоянии радиомодуль "выключен", т.е. на DATA подается логический ноль.
Для передачи информации используется посылка из нескольких байт. В данном случае:
- 10 "нулевых" байтов - вроде как "вступление";
- "синхробайт" 0хЕ6 - по аналогии с "прородителем", байт нам понадобится при декодировании для определения наличия инверсии сигнала в канале; кроме того байт является признаком начала передачи данных;
- два байта, по смыслу - младший и старший байты адреса устройства, которому предназначена данная посылка;
- четыре байта данных - произвольная информация;
- байт контрольной суммы - без него никак нельзя, помня про низкую помехоустойчивость; в реализации - это младший байт суммы всех переданных после "синхробайта" данных.
Процедура передачи данных в цикле повторяет две посылки с интервалом около четырех секунд: в одной посылке идут "данные на включение" - первый байт данных равен 127, в следующей - "на выключение" - нулевой байт. Для контроля, кроме светодиодного индикатора, в последовательный канал Arduino отправляет значение первого байта данных из посылки.
Скорость передачи данных выбрана небольшой - 800 мкс на один информационный бит (задается процедурой delayMicroseconds(400), где 400 мкс - это половина времени передачи одного бита), что укладывается в диапазон скоростей передачи данных используемыми радиомодулями. В sketch-е легко разобраться и использовать процедуру передачи байта для создания чего-нибудь более осмысленного...
Приемник (Декодер).
Так же для простоты реализации в качестве микроконтроллера-декодера приемника использован модуль Arduino UNO R3 - см фото.
Данные с приемника радиомодуля (вывод DATA) подаются на pin 2, в качестве питания радиомодуля использованы линии +5В и GND Arduino UNO.
Программка (Sketch), реализует следующую процедуру.
В непрерывном цикле микроконтроллер ожидает прихода "синхробайта" 0хЕ6 или его инверсного значения 0х19. Этим занимается процедура приема байта, при установке параметра процедуры в значение больше 10. При обнаружениеи "синхробайта" процедура запоминает признак инверсии сигнала в канале (переменная sinxro) и принимает первый байт посылки. Далее принимаются остальные шесть байт (см.формат посылки выше).
Вычисляется контрольная сумма принятого и, в случае ее совпадения с последним принятым байтом, все принятые данные выдаются в последовательный порт для наблюдения в мониторе порта системы программирования Arduino.
Процедура приема данных настроена на определенную скорость принимаемого потока (задается константой в процедуре delayMicroseconds(600), где 600 мкс - три четверти периода передачи одного бита). В sketch-е легко разобраться и использовать процедуру приема байта для создания чего-нибудь более осмысленного...
Практика показала, что один байт контрольной суммы - маловато для избавления от ложных срабатываний. Так, например, при приеме посылок, с описанным выше форматом и интервалом около 10 секунд, примерно раз в 30-40 секунд "проскакивала" ложная принятая посылка с хаотическими данными, но верной контрольной суммой. Поэтому стоит несколько усложнить алгоритм подтверждения верности передаваемых данных, например увеличить размерность контрольной суммы или увеличить размер самой посылки, или ....
Данные с приемника радиомодуля (вывод DATA) подаются на pin 2, в качестве питания радиомодуля использованы линии +5В и GND Arduino UNO.
Программка (Sketch), реализует следующую процедуру.
В непрерывном цикле микроконтроллер ожидает прихода "синхробайта" 0хЕ6 или его инверсного значения 0х19. Этим занимается процедура приема байта, при установке параметра процедуры в значение больше 10. При обнаружениеи "синхробайта" процедура запоминает признак инверсии сигнала в канале (переменная sinxro) и принимает первый байт посылки. Далее принимаются остальные шесть байт (см.формат посылки выше).
Вычисляется контрольная сумма принятого и, в случае ее совпадения с последним принятым байтом, все принятые данные выдаются в последовательный порт для наблюдения в мониторе порта системы программирования Arduino.
Процедура приема данных настроена на определенную скорость принимаемого потока (задается константой в процедуре delayMicroseconds(600), где 600 мкс - три четверти периода передачи одного бита). В sketch-е легко разобраться и использовать процедуру приема байта для создания чего-нибудь более осмысленного...
Практика показала, что один байт контрольной суммы - маловато для избавления от ложных срабатываний. Так, например, при приеме посылок, с описанным выше форматом и интервалом около 10 секунд, примерно раз в 30-40 секунд "проскакивала" ложная принятая посылка с хаотическими данными, но верной контрольной суммой. Поэтому стоит несколько усложнить алгоритм подтверждения верности передаваемых данных, например увеличить размерность контрольной суммы или увеличить размер самой посылки, или ....
Библиотеки 2262/2272
Сообщество Arduino не обошло стороной вопрос использования радиомодулей. Так, например, в одном из форумов приводится библиотека для работы с радиомодулями 433МГц по алгоритмам кодера/декодера PT2262/2272.
Я проверил работу приемника (можно использовать схему подключения приведенную выше - выход приемника подключен к pin 2). Прием и декодирование сигнала проходят нормально (использовался кнопка-передатчик беспроводного звонка), только пришлось подправить библиотеки (надо обязательно в библиотеках *.h поменять вызов библиотеки WProgram.h - надо заменить на Arduino.h). Исправленные библиотеки - тут (RemoteSwitch.zip).
скетч Show_received_code после исправления (Show_received_code.ino) работает, для пульта звонка (РТ2262) получено следующее:
Code: 70559, period duration: 166us.
Code: 70559, period duration: 167us.
Code: 70559, period duration: 167us.
приемник при этом был подключен к pin 2 Arduino.
Я проверил работу приемника (можно использовать схему подключения приведенную выше - выход приемника подключен к pin 2). Прием и декодирование сигнала проходят нормально (использовался кнопка-передатчик беспроводного звонка), только пришлось подправить библиотеки (надо обязательно в библиотеках *.h поменять вызов библиотеки WProgram.h - надо заменить на Arduino.h). Исправленные библиотеки - тут (RemoteSwitch.zip).
скетч Show_received_code после исправления (Show_received_code.ino) работает, для пульта звонка (РТ2262) получено следующее:
Code: 70559, period duration: 166us.
Code: 70559, period duration: 167us.
Code: 70559, period duration: 167us.
приемник при этом был подключен к pin 2 Arduino.
размещено: 30 июля 2013 года