Как настроить пульт 433 мгц

Обучаемый 433МГц пультик для клонирования статичного кода.


Эта статья является небольшим логическим продолжением статьи «Кодграббер статичного кода».
На пробу были приобретены «обучаемые брелки для копирования», чтобы посмотреть как это сделано.
Стоимость примерно 120 и 140 рублей за штуку.
Заявлено, что эти брелки позволяют записать посылку из существующего устройства и воспроизвести по нажатию кнопки. Ограничены протоколом посылок SC2262 и подобных.
Далее мы посмотрим что у них там внутри и попробуем настроить под себя.

Первым сюрпризом было то, что в одном из брелков используется элемент А27, который тоньше А23. Пришлось дозаказывать ещё и батарейки.

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

Для обучения нажимаем и удерживаем обучаемую кнопку. Вплотную подносим копируемого и включаем на передачу.
Светодиод заморгает, значит сигнал пойман и записан.
После этого обученная кнопка при нажатии и удержании будет выдавать в эфир запомненный код.
Перезаписать отдельную кнопку нельзя. Сначала стираем всё, затем программируем каждую кнопку.

Всё работает как и описано, но возникают трудности с копированием слабых сигналов.
Чувствительность приёмника в копировщике «никакая», подносить приходится антенна к антенне.
К тому же, хочется записывать коды просто «из головы», не копировать, а самостоятельно составлять и воспроизводить.


Немного реверс-инжиниринга.
Внутри пультика видим различную мелкую рассыпуху, четырнадцатиногую микросхему без маркировки и EEPROM с I2C интерфейсом AT24C02.
Вполне очевидно, что все данные хранятся внутри внешней EEPROM, осталось только понять что и как там хранится.
Впоследствии оказалось, что при внешней схожести микросхем основного контроллера в брелках, они всё-таки разные. Используют разные адреса, по разному запоминают данные.

Начнём с брелка с антеннкой.
Подключаем логический анализатор «USBEE» к пинам SDA и SCL микросхемы EEPROM.
Стираем, обучаем, воспроизводим и при этом смотрим, какие адреса и данные EEPROM используются.

В процессе выяснилась непонятная особенность работы логического анализатора.
Это недорогая китайская поделка на CY7C68013, которая может притворяться и USBEE и Logic-U.
Оказалось Logic-U почему-то не распознаёт часть посылки.
На картинках видно, что не рашифровывается считываемый байт.

Logic-U

USBEE

Разбираться я не стал, воспользовался USBEE софтом, хотя Logic-U удобнее.

После некоторых экспериментов с клонированием различных пультиков получаем:
базовый адрес в EEPROM для каждой кнопки:
Верхняя правая: 0x06
Нижняя правая: 0x10
Верхняя левая: 0x1A
Нижняя левая: 0x24

данные для каждой из четырёх кнопок
base_addr+0x00 — признак что кнопка запрограммирована (0 — запрограммирована)
base_addr+0x01 — записывается 0, при чтении не используется
base_addr+0x02 — тайминг 1t, ориентировочно 340 ед/мс (для расчёта значения необходимо время 1t в мс умножить на 340)
base_addr+0x03 — младшие 8 бит кода (0 — короткий импульс, 1 — длинный имульс)
base_addr+0x04 — средние 8 бит кода (0 — короткий импульс, 1 — длинный имульс)
base_addr+0x05 — старшие 8 бит кода (0 — короткий импульс, 1 — длинный имульс)
base_addr+0x06 — записывается 0, чтается при воспроизведении
base_addr+0x07 — записывается 0x18, может быть количество байт в посылке
base_addr+0x08 — тайминг 1t, дублируется base_addr+0x02

Формируем свою посылку.
Теперь попробуем заставить брелок воспроизводить любой код в формате SC2262 и подобных.
Например, для управления радиоуправляемой розеткой из статьи на хабре ««Заводим» радиоуправляемые розетки без пульта».

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

4 канал, код включения «000100001000»
в формате HS2272
«0» — соответствует «короткий + короткий импульс»
«1» — соответствует «длинный + длинный импульс»
«F» — соответствует «короткий + длинный импульс»

в формате обучаемого брелка каждый импульс кодируется одним битом
0 — короткий импульс
1 — длинный имульс

значит «000100001000» преобразуется в 000000110000000011000000 = 0x0300C0 (в память оно ляжет младшим байтом вперёд).

Аналогично:
4 канал, код выключения «000100000000» преобразуется в 0x030000
5 канал, код включения «011000001000» преобразуется в 0x3С00С0
5 канал, код выключения «011000000000» преобразуется в 0x3С0000

Настройка таймингов.
Вскроем наш приёмник сигналов, и посмотрим какой резистор Rosc установлен у микросхемы HS2272.
По цветовой маркировке получается 390К, тестер показывает 394К.
По графику из pdf пытаемся прикинуть частоту OSC, но в разных pdf по разному рисуют графики зависимости.
Поэтому, напрямую осциллографом смотрим частоту на OSC2 ножке микросхемы.
У меня получилась частота около 70 КГц.
В pdf написано что при приёме в импульс должно помещаться от 2,5 до 8 клоков OSC.
Расчётное значение 1t получается 0,114 мс, но с таким таймингом приёма нет.
На практике получилось, что работает с таймингами 1t = 0,150-0,350 мс. Всё что быстрее или медленнее не принимается.

Почему так — не понимаю, если больше поэкспериментировать с разными приёмниками, то может чего и прояснилось бы.

Выберем значение «с потолка» 0,25 мс * 340 = 85 (0x55).

Запрограммируем любым доступным I2C программатором (CH341 например), подключившись к SDA, SCL, GND, VCC ножкам EEPROM.

левая верхняя кнопка — включение канала 4
с адреса 0x1A запишем данные 0x00 0x00 0x55 0xC0 0x00 0x03 0x00 0x18 0x55
левая нижняя кнопка — выключение канала 4
с адреса 0x24 запишем данные 0x00 0x00 0x55 0x00 0x00 0x03 0x00 0x18 0x55
правая верхняя кнопка — включение канала 5
с адреса 0x06 запишем данные 0x00 0x00 0x55 0xC0 0x00 0x3C 0x00 0x18 0x55
правая нижняя кнопка — выключение канала 5
с адреса 0x10 запишем данные 0x00 0x00 0x55 0x00 0x00 0x3C 0x00 0x18 0x55

Читайте также:  Opera не работает строка ввода

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

Проверяем, работает.
Дополнительно можно защитить от стирания, подняв 7 ножку EEPROM и посадив её на 8 ногу.

Второй брелок, без антенны с А27 батарейкой имеет другую «карту памяти».
Базовый адрес:
Нижняя правая: 0x0A
Нижняя левая: 0x14
Верхняя правая: 0x1E
Верхняя левая: 0x28

Данные:
base_addr+0x00 — признак что кнопка запрограммирована (см. примечание *)
base_addr+0x01 — младшие 8 бит кода (0 — короткий импульс, 1 — длинный имульс)
base_addr+0x02 — средние 8 бит кода (0 — короткий импульс, 1 — длинный имульс)
base_addr+0x03 — старшие 8 бит кода (0 — короткий импульс, 1 — длинный имульс)
base_addr+0x04 — тайминг 1t

*примечание — если у предыдущего брелка признак запрограммированности кнопки — значение 0 по соответствующему адресу (остальные значения воспринимаются как «кнопка не запрограммирована»), то здесь для каждой кнопки индивидуальные значения.
При стирании:
по адресу 0x0A пишется значение 0x30,
по адресу 0x14 пишется 0x3A,
по адресу 0x1E пишется 0x44,
по адресу 0x28 пишется 0x4E.
При запоминании:
по адресу 0x0A пишется значение 0x0A,
по адресу 0x14 пишется 0x14,
по адресу 0x1E пишется 0x1E,
по адресу 0x28 пишется 0x28.

Кроме того, при стирании по адресу 0x6E пишется 0x6E, при запоминании любой кнопки туда пишется 0x00.

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

Тайминги у контроллеров также отличаются. В первом брелке мы записывали 0x55, во втором оно сохраняется как 0x43.

P.S.
Хорошо бы сравнить дальнобойность этих брелков с какими-нибудь другими, необучаемыми.
Да и живучесть батарейки также может отличаться, потребление в режиме сна разное.
Но, мне кажется, что эти параметры будут примерно одинаковые.

Схему срисовывать не стал.
Вот фотографии с двух сторон, все дорожки навиду.

Комментарии ( 13 )

В процессе выяснилась непонятная особенность работы логического анализатора.
Это недорогая китайская поделка на CY7C68013, которая может притворяться и USBEE и Logic-U.
Оказалось Logic-U почему-то не распознаёт часть посылки.

то здесь для каждой кнопки индивидуальные значения.

Любопытно выглядят — на адреса похожи. А по адресам 30/3А/44/4Е какие-то данные есть?

Схему с брелков не снимал? Любопытно взглянуть на реализацию RF-части.

Полный дамп памяти у второго брелка не считывал.
Надо EEPROM выпаивать. Несложно вроде. Но «зачем»?

Схему, опять же, не снимал.
Мне не к чему, в RF я слабо разбираюсь, повторять самостоятельно не планирую.

Мне не к чему, в RF я слабо разбираюсь, повторять самостоятельно не планирую.

Ну, для меня сними, мне интересно

Источник

Еще раз о передатчиках и приемниках 433 МГц

Простейший комплект из приемника и передатчика ISM-диапазона 433 МГц завоевал заслуженную популярность в среде любителей электроники. Комплекты дешевы (даже в «Чипе-Дипе» их можно купить рублей за 300, а на Ali, говорят, вообще за полтинник), просты и надежны. Кроме того (о чем вы, возможно, не подозреваете), это самый дальнодействующий и проникающий способ беспроводного обмена данными — сигнал на частоте 433 МГц куда лучше проходит через препятствия и действует на более далеком расстоянии, чем в популярном диапазоне 2,4 ГГц (433 МГц полностью задерживаются стенкой в полметра бетона, а Wi-Fi умирает уже на 10 сантиметрах). Допускаю, что недавно появившиеся модули MBee-868, будучи снабженными соответствующей (направленной) антенной, «стреляют» дальше, но они как минимум на порядок дороже, сложнее в подключении, требуют управления энергосбережением и предварительной настройки. И вдобавок частота 868 МГц вдвое хуже проходит через препятствия (хотя, конечно, несравненно лучше частоты 2,4 ГГц).

О приемниках-передатчиках 433 МГц написано очень много (в том числе и на хабре, конечно). Однако, правильно включать в схему этот комплект по какой-то странной причине, кажется, не умеет никто. Когда я в который раз прочел вот тут, что комплект «принимал на 8-ми метрах в пределах прямой видимости, 9-ый метр осилить не удалось», мое терпение лопнуло. Какие еще 8 метров?! В 40-50 я бы поверил, хотя в реальности, наверное, дальность еще больше.

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

У меня такой комплект работает за городом на расстоянии примерно 25-30 метров под острым углом к бревенчатой стенке, так, что на пути сигнала оказывается примерно метр (в сумме) стен и перегородок, причем частично экранированных фольгированным утеплителем. На гораздо меньшем расстоянии, почти прямо за стенкой, WiFi уже полностью теряет сигнал. В городе сигнал добивает от одного конца трехкомнатной городской квартиры к другому через две межкомнатные перегородки, а также с балкона, где по прямой линии между передатчиком и приемником не менее 80 сантиметров кирпичной кладки и гипсолитовая перегородка. Никаких более дорогих вариантов комплектов, упомянутых в приведенном обзоре, я не употреблял.

Читайте также:  Как настроить колонки edifier

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

Давайте разберемся, в чем тут подводные камни.

Подключение передатчика

Передатчик (он носит название FS1000A), как мы видим из его схемы ниже, представляет собой простейший генератор на основе ПАВ-резонатора на 433 МГц. Генератор собран на транзисторе Q1, а транзистор Q2, на базу которого подаются цифровые данные — просто ключ, который подключает генератор к питанию (к шине GND) при наличии высокого уровня (логической единицы) на входе. Питание может быть от 5 до 12 вольт, причем, по утверждению производителей, чем выше питание, тем дальше работает связь.

Принципиальных преимуществ увеличенного питания в рамках своей задачи я не заметил. Тем не менее, не следует пренебрегать фактом, что особых требований к питанию тут не предъявляется, и при повышенном напряжении девайс будет работать только лучше. Удобно подключать передатчик непосредственно к напряжению с адаптера 9-12 вольт, аккумулятора или комплекта из 6 батареек (контакт Vin Arduino). При нестабилизированном питании, которое может превышать 12 вольт (как, например, у аккумуляторов) я обычно развязываю передатчик от основной схемы отдельным 9-вольтовым стабилизатором (можно простейшим 78L09), причем разницы в работе между питанием 9 и 12 вольт я не наблюдаю никакой. У Uno или Nano можно для питания самого контроллера и остальных схем (например, датчиков) при этом использовать встроенный стабилизатор 5 вольт, а для Mini (особенно — его дешевых клонов) я бы посоветовал поставить отдельный 5-вольтовый стабилизатор, подключив его к выводу 5V.

Следует отметить, что в последнее время стали появляться передатчики, выглядящие несколько нестандартно (см. рис. ниже). Оказалось, что отсутствие дросселя L1 (трехвиткового), от которого остались только отверстия — фикция, он просто заменен на соответствующий SMD-компонент. Хуже в этом варианте другое: неряшливая полиграфия может ввести в заблуждение относительно подключения выводов данных и питания. Правильное подключение показано на рисунке, оно для всех вариантов одинаково:

Самое поразительное в этом деле — то, что при перепутанном подключении данных и питания передатчик на небольших расстояниях продолжает работать! Если вы рассмотрите схему, то поймете в чем дело: база Q2 через резистор при этом оказывается подключенной к питанию, транзистор всегда открыт, и влияния на работу схемы не оказывает. А логический высокий уровень на шине питания просто запитывает в нужный момент генератор. Несуразности начинаются на некотором расстоянии — понятно, что из логического вывода источник питания получается плохой.

Подключение приемника

При приобретении приемника (он может носить название вроде MX-RM-5V или XD-RF-5V) обращайте внимание на длину выводов — мне как-то попалась целая партия с укороченными штырьками, отчего из стандартного разъема PBS приемник вываливался при малейшем перекосе и его приходилось к плате специально крепить.

У приемника схема гораздо сложнее (я ее не буду воспроизводить, но можете ознакомиться, например, тут). Она должна принять и усилить высокочастотный сигнал, отфильтровать частоту 433 МГц, выделить всплески и преобразовать их в логические уровни. Приемник имеет подстроечный дроссель (посередине платы), но без точных приборов для измерения амплитудно-частотной характеристики я его крутить не советую — скорее всего, вы ничего не улучшите, а только испортите.

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

Стандартный метод снижения помех, известный в мои времена каждому школьнику, собравшему хоть один радиоприемник или усилитель, заключается в том, что для чувствительных к помехам узлов необходимо делать отдельное питание, по максимуму изолированное от остальных схем. Можно его делать разными методами: когда-то ставили отдельный стабилитрон, сейчас часто изолируют питание проблемного узла LC-фильтром (так рекомендуется поступать, например, для АЦП, посмотрите даташиты на AVR-контроллеры). Но в наших условиях, когда современные компоненты невелики и дешевы, проще просто поставить на приемник отдельный от всего остального стабилизатор.

Стабилизатор, например, типа LP2950-5.0 плюс два необходимых конденсатора к нему в самом дешевом варианте (когда оба конденсатора — керамические, в диапазоне 1–3,3 мкФ) добавит к стоимости вашей схемы рублей шестьдесят максимум. Но я предпочитаю не экономить: на выходе ставлю обычный керамический, а на входе электролит (10–100 мкФ), причем твердотельный (полимерный) или танталовый. Обойтись керамическими конденсаторами и там и там можно, если входное напряжение 7-12 вольт поступает с батареек-аккумуляторов или с другого аналогового стабилизатора. Импульсные стабилизированные источники и простейшие нестабилизированные выпрямители требуют дополнительной фильтрации. Можно использовать дешевый алюминиевый электролит, если ставить параллельно ему керамический 0,1 мкФ, еще лучше поставить на входе последовательную индуктивность в несколько долей или единиц миллигенри.

Читайте также:  Можно ли отремонтировать рулонные шторы

Стабилизатор следует устанавливать прямо около приемника, длина проводников должна быть минимальна. Вместо LP2950 можно взять LM2931 или аналогичный с маленьким проходным напряжением (это особенно важно, если схема питается от батареек — для обычного LM78L05 входное напряжение должно быть не менее 7,5, а лучше 8-9 вольт).

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

В простейшем варианте в качестве антенн можно обойтись обрезками одножильного провода сечением не меньше 0,5 мм и длиной 17 см ± 1-3 мм. Не следует употреблять многожильный монтажный провод! В продаже имеются более компактные спиральные антенны, но я лично их эффективность не испытывал. Кончик антенны и у передатчика и у приемника запаивается в соответствующее отверстие в углу платы (не ошибитесь в модернизированном варианте передатчика — там слово ANT тоже не на месте, см. рис. выше).

Формирование и обработка передаваемых данных

Это второй крупный недостаток большинства обзоров по нашей теме: авторы ограничиваются какой-то локальной задачей, не формулируя ее в общем виде, как передачу произвольных данных одним пакетом. Как вы поняли из описания выше, передаваться нашим комплектом может только простая последовательность бит. Стандартная библиотека VirtualWire кодирует их специальным образом (каждая тетрада кодируется 6-ю битами, впереди добавляется синхронизирующий заголовок, и еще добавляется контрольная сумма для всего пакета) и на выходе превращает в более привычную последовательность байт. Но разбираться с ней уже приходится программисту самостоятельно.

Далее мы считаем, что передатчик и приемник подключены к Arduino. Кроме VirtualWire, в связи с бумом «умных домов», есть еще много всякого подобного, вроде RC-Switch или RemoteSwitch, но они ориентированы на другие задачи, и для передачи произвольных данных их употреблять явно не стоит.

Максимальная длина одного сообщения в VirtualWire равна 27 байт (см. документацию). Передача одного полного сообщения (оно автоматически дополняется сигнатурой 0xb38, значением длины сообщения и контрольной суммой) при выбранной мной скорости 1200 бит/с составляет 0,35 секунды.

Чем больше, кстати, выбранная скорость передачи, тем дальность передачи будет меньше. По опыту применения RS-232 известно, что при увеличении дальности допустимая скорость передачи экспоненциально падает: на скорости 19200 неэкранированная линия работает на 15 метров, на 9600 — 150 метров, а на скорости 1200 — более километра. Интересно было бы экспериментально выяснить характер этой зависимости для нашего случая, ведь очень много здесь зависит и от применяемой математики.

Инициализация передатчика в VirtualWire выглядит так:

Разберем принципы формирования данных на конкретном примере. Пусть у нас имеется выносной датчик температуры-влажности. Он выдает значения (переменные temperature и humidity) в формате действительного числа со знаком (float). Чтобы было проще разбираться на приемном конце, будем все приводить к виду положительного целого числа с числом десятичных разрядов не менее 4, переводить разряды по отдельности в ASCII-символы, передавать получившуюся строку, а на приемном конце выполнять обратные операции. Конечно, можно упростить задачу (например, обойтись без преобразования в ASCII и укоротить числа), но в таком виде она получается единообразной для почти любых разновидностей цифровых данных, что упрощает разборку при приеме.

На практике для формирования сообщения удобно воспользоваться типом String, примерно так:

Если требуется передавать более точные числа с большим количеством разрядов, то вы просто увеличиваете длину массива msg. Глобальные «волатильные» переменные tmpr и hum нужны в случае, если вы осредняете несколько показаний, в противном случае они тоже могут быть объявлены локальными внутри функции loop(). Сообщение, как видите, состоит из значений преобразованных температуры и влажности, в ASCII-строках по четыре байта каждое, предваряемых строкой из трех символов «DAH» (символы могут быть любыми другими из таблицы ASCII). Это сигнатура, которая позволит выделить данное сообщение из числа возможных других, посылаемых аналогичными устройствами. Не пренебрегайте сигнатурой, даже если вы полагаете, что других устройств поблизости в этом диапазоне не предвидится, заодно она служит дополнительной гарантией целостности принимаемых данных.

Заметьте также, что при преобразовании строки в массив необходимо указать на один символ больше, чем суммарная длина сообщения (3+4+4=11), это учитывается нулевой символ, замыкающий строку. А величина массива msg[] должна быть указана с запасом и может быть любой, в данном случае от 13 до 27 байт. При передаче все равно отправится ровно столько, сколько вернет функция strlen(msg), то есть 11 байт + нулевой символ.

В приемной части полученный массив ASCII-кодов придется разбирать (парсить). Но сначала нужно его принять. Для инициализации приема выполняются следующие действия:

Собственно прием с разборкой строки такой:

Надеюсь, у вас теперь будет меньше вопросов по применению этих дешевых и удобных в применении устройств.

Источник

Оцените статью