Оглавление:

Декодер датчика RF Arduino: 5 шагов
Декодер датчика RF Arduino: 5 шагов

Видео: Декодер датчика RF Arduino: 5 шагов

Видео: Декодер датчика RF Arduino: 5 шагов
Видео: Как настроить ПУЛЬТ для Arduino?! Инфракрасный приемник датчик CHQ1838 VS1838B 38кГц 2024, Июль
Anonim
Декодер датчика RF Arduino
Декодер датчика RF Arduino

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

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

Шаг 1: модули датчиков

Модули датчиков
Модули датчиков
Модули датчиков
Модули датчиков
Модули датчиков
Модули датчиков
Модули датчиков
Модули датчиков

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

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

Шаг 2: Оборудование

Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение

Первоначально я построил декодер датчика, используя микроконтроллер PIC и язык ассемблера. Недавно я играл с вариантами Arduino, поэтому подумал, что посмотрю, смогу ли я воспроизвести его. Простая схема показана выше, а также есть изображение моего прототипа. Все, что я сделал, это использовал три общих перемычки, чтобы перейти от Arduino Nano к плате радиоприемника. Все, что нужно - это питание и одна линия передачи данных.

Если вы прочтете мою инструкцию по «Дисплею времени и погоды 3-в-1», вы увидите, что я использую обычный приемник RXB6, 433 МГц. Возможно, вы сможете заставить действительно дешевые приемники работать на коротком расстоянии, необходимом для этого проекта, но я все же рекомендую использовать супергетеродинный приемник.

Шаг 3: Программное обеспечение

Программа преобразует полученные биты в отображаемые символы ASCII. Он выводит значение длины синхронизации и длины 1 и 0 битов. Поскольку я уже знал длину синхронизации и битовые форматы, я мог бы написать программное обеспечение специально для них. Вместо этого я решил посмотреть, смогу ли я написать его, чтобы отсортировать длины синхронизации и автоматически вычислить биты данных. Это должно упростить изменение, если я когда-нибудь захочу попытаться обнаружить другие форматы. Важно отметить, что программное обеспечение не знает, является ли первый бит сообщения 1 или 0. Оно предполагает, что это 1, но, если оно выясняет, что это должен был быть ноль, оно инвертирует биты в завершенном сообщении перед его отправкой через последовательный порт.

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

Обработчик прерывания сначала определяет, достаточно ли длительность записанного счетчика, чтобы быть импульсом запуска / синхронизации. Различные устройства, которые у меня есть, используют синхроимпульсы длительностью 4, 9, 10 и 14 миллисекунд. Операторы определения минимальных / максимальных допустимых значений синхронизации находятся на переднем плане в программном обеспечении и в настоящее время установлены на 3 и 16 миллисекунд. Время передачи битов также различается между датчиками, поэтому алгоритм декодирования битов должен учитывать это. Битовое время первого бита сохраняется, как и время следующего бита, которое значительно отличается от первого бита. Прямое сравнение последующих битовых времен невозможно, поэтому используется определение «коэффициента ошибочности» («Вариация»). Битовое декодирование начинается с предположения, что первый бит данных всегда записывается как логическая 1. Это значение сохраняется и затем используется для проверки последующих битов. Если последующий счет битов данных находится в пределах окна дисперсии сохраненного значения, то он также записывается как логическая 1. Если он находится за пределами окна дисперсии сохраненного значения, то он записывается как логический 0. Если логический 0 битовое время короче, чем первое битовое время, тогда устанавливается флаг, сообщающий программному обеспечению, что байты необходимо инвертировать перед отображением. Единственный случай, когда этот алгоритм не работает, - это когда все биты в сообщении равны нулю. Мы можем принять это ограничение, потому что такое сообщение бессмысленно.

Все интересующие меня датчики имеют длину сообщения 24 бита данных, но программное обеспечение не ограничено этой длиной. Имеется буфер размером до семи байтов (можно добавить больше) и определяет минимальную и максимальную длину сообщения в байтах. Программное обеспечение настроено для сбора битов, преобразования их в байты, временного хранения и последующего вывода в формате ASCII через последовательный порт. Событие, которое запускает вывод сообщения, - это получение нового импульса запуска / синхронизации.

Шаг 4: Регистрация данных

Регистрация данных
Регистрация данных

Программное обеспечение настроено для вывода преобразованных данных в виде символов ASCII через последовательный (TX) выход Arduino. Когда я сделал версию PIC, мне нужно было взаимодействовать с программой терминала на ПК, чтобы отображать данные. Одним из преимуществ Arduino IDE является то, что в нее встроена функция Serial Monitor. Я установил скорость последовательного порта на 115,2k, а затем установил в окне Serial Monitor такую же скорость. На снимке экрана здесь показан типичный дисплей с выходными сигналами различных датчиков, которые у меня есть. Как видите, данные иногда не идеальны, но вы можете легко определить, каким должно быть реальное значение каждого датчика.

Шаг 5: Образец программного обеспечения приемника

Образец программного обеспечения приемника
Образец программного обеспечения приемника

Я включил образец программного обеспечения, в котором показано, как вы можете использовать собранную информацию для получения определенного набора кодов для вашего приложения. Этот пример настроен для эмуляции одной из моих удаленных точек Etekcity. Одна команда включает светодиод, встроенный в Nano (D13), а другая команда выключает светодиод. Если у вас нет встроенного светодиода в Arduino, добавьте резистор и светодиод, как показано на схеме. В реальном приложении эта функция будет включать / выключать питание электрической розетки (с помощью реле или симистора). Время синхронизации, битовое время и ожидаемые байты данных определяются заранее для простоты модификации. Вы можете использовать любую из оставшихся строк данных для включения / выключения и т. Д. Для вашего конкретного приложения. Просто добавьте соответствующий код команды, определяющий и замените логику включения / выключения светодиода в «цикле» в соответствии с вашими потребностями.

Рекомендуемые: