Совершенно случайно наткнулся в каталоге Ч-и-Д на аттракцион невиданной щедрости. Сейчас дополнительные беспроводные розетки для комплекта Velleman 7500-3B стоят всего 100 рублей за штуку. Но это за розетку без пульта, то есть с несколько неясными перспективами ее использования, поскольку до вскрытия не очень понятно, что там внутри, а образца управляющих кодов нет. Если же закладываться на пульт, то предложение сразу перестает быть таким интересным.
Несмотря на некоторый риск (хотя что там тех ста рублей?!), стало интересно, чем это изделие, причем именно в такой конфигурации, поможет социалистической революции в масштабах одного отдельно взятого домашнего хозяйства.
Перед посещением магазина я теоретически подковался. То есть — поискал, что есть в этом нашем интернете на тему указанных розеток. И практически успокоился, когда выяснил, что они совместимы (Velleman WRS3B) с библиотекой RC-Switch, которую уже давно использую в домашнем контроллере для управления розетками, выполнения команд по сигналам радиопультов и обмена данными с периферией.
Это вселяло надежду.
. вот такая упаковка
Небольшое предисловие
Обычно розетки (и пульты) такого типа выполняются на специализированных кодирующих и декодирующих чипах семейства 2262/2272. Причем перед цифрами могут быть совершенно разные индексы: PT, SC, HS. А индексы после чисел определяют режим работы и конфигурацию линий адреса и данных. А чаще всего используются чипы с 8 битами адреса и 4 битами данных, хотя возможны варианты — вплоть до 12 бит адреса или до 6 бит данных.
В рамках используемого протокола бит может принимать одно из трех значений: 1, 0 и F. Вместе биты адреса и данных (всего 12 бит) составляют кодовое слово, которое для надежности повторяется 4 раза, что, соответственно, представляет собой один кадр. Если честно, то проблема в том, что даже чтение даташитов не приблизило меня к пониманию того, в каком именно порядке располагаются биты в кодовом слове, и что подразумевается под таинственным состоянием F.
Так что из двух часов чтения я вынес примерно следующее.
Базовый принцип работы заключается в том, что для передачи команды в передатчике (кодере) и приемнике (декодере) устанавливается один и тот же адрес, а управление осуществляется, как правило, по линиям данных. То есть, на каждую кнопку пульта приходится по одному, предположительно уникальному, адресу.
Типовая реализация также включает в себя два бита данных, которые и говорят, что нужно сделать с периферией по конкретному адресу — включить или выключить.
. оборотная сторона
Богатый внутренний мир
Вскрытие объекта, к счастью, оправдало надежду на популярный чип семейства 2272. Если точнее — HS2272-L4 (раз и два), что означает кодировку с 8 битами адреса, 4 битами данных и фиксацией состояния. Т.е. для каждого адреса существует две статичные команды на изменение состояния. В случае с розеткой это значит, что включаем одной кнопкой, а выключаем — другой.
В отличие от моих радиорозеток здесь не 4 канала, а целых 8 — есть где разгуляться. Смена каналов реализована с помощью, так сказать, аппаратного конвертера из десятичной системы в двоичную.
. пластик мягкий, энкодер жесткий, маркер-указатель розетки почти незаметный. Пришлось подкрасить фломастером.
Энкодер представляет собой поворотную втулку с контактами-«усами» и ее ответную часть — плату с рисунком дорожек, замыкание которых «усами» и определяет состояние трех из 8 бит адреса. Несложно догадаться, что именно эти три бита и определяют 8 каналов управления.
Беглое ознакомление с заляпанной флюсом платой раскрывает следующую картину:
1) Линии адреса A0, A5 — A7 сразу посажены на землю (т.е. соответствующие биты установлены в 0).
2) Линии адреса A1 — A4 с одной стороны подтянуты к +5В через резисторы, а с другой — сажаются на землю энкодером (т.е. принимают значения от 000 до 111).
3) Линии данных D1 — D3 также подключены к земле, а управляющий бит оставлен на откуп D0.
Это пожалуй, самое интересное. Из менее интересного — тип реле, по которому видно, что заявленный в характеристиках киловатт, оно должно выдержать.
Угадай мелодию
Ага, вот эти биты! Хотите немного уличного реверс-инжиниринга?
Конечно же розетки не реагировали на имеющиеся у меня пульты — но оно и хорошо. Конечно же вслепую подобрать хотя бы один код не получилось. Хотя нет, вру — в процессе случайно набрел на один из кодов уже работающих у меня розеток. Вот уж повезло. Параллельно я размышлял над тем, почему автор RC-Switch говорит о протоколе с тремя состояниями битов, хотя в примерах использует только два: 0 и F.
Это, а также заявленная совместимость с библиотекой, несколько сбивали с толку. Поэтому я решил пойти простым путем, т.е. избавиться от лишних битов и состояний. Логика работы энкодера недвусмысленно намекала, что у него есть положение с тремя гарантированными нулями в битах адреса, отвечающих за выбор канала управления. Добавим к этому посаженные на землю остальные линии адреса — и получим 8 нулей. Останется только вычислить управляющие биты линии данных.
Забавно, но упомянутые три нуля мультиметр показал, если установить энкодер в положение восьмого канала. Т.е. кодировка получилась «задом наперед»:
8 — 000
7 — 100
6 — 010
5 — 110
4 — 001
3 — 101
2 — 011
1 — 111
И здесь, кстати, обнаружилось третье состояние, которое не встречается в практических примерах RC-Switch. Иными словами, адрес состоит из 0 и 1, а как раз F и не используется.
Что касается линий данных, то судя по распиновке в даташитах, управляющим битом с одинаковой степенью вероятности могли быть и D0 и D3. Но на практике это все же D0 (если судить по схеме кодового слова).
В результате дальнейших экспериментов выяснилось, что команда включения представляет собой F000, а выключения — 0000 по линии данных.
/*
http://dzrmo.wordpress.com/2012/07/08/remote-control-pt2272-for-android/
http://sui77.wordpress.com/2011/04/12/163/
http://code.google.com/p/rc-switch/
*/
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
// передатчик на цифровом пине 10
mySwitch.enableTransmit(10);
}
// первый бит всегда 0
// следующие три бита, соответствующие номерам каналов (розеток)
// 8 - 000
// 7 - 100
// 6 - 010
// 5 - 110
// 4 - 001
// 3 - 101
// 2 - 011
// 1 - 111
// биты 5-8 - 0000
// последние четыре бита: F000 - ВКЛ
// 0000 - ВЫКЛ
void loop() {
// переключаем розетку #2 с интервалом в секунду
mySwitch.sendTriState("00110000F000");
delay(1000);
mySwitch.sendTriState("001100000000");
delay(1000);
}
Резюме
Что хотел — то и получил. Розетки вполне пригодны для домашнего использования, система команд героическими усилиями разгадана (опять я угадывал вместо получения знаний) и легко реализуется с помощью библиотеки RC-Switch в коде для Arduino. Пульт не нужен.
Итого — до 8 крайне экономически эффективных каналов ДУ из коробки и перспектива их увеличения за счет использования дополнительных линий адреса (нужно только разрезать дорожки и подтянуть их либо к плюсу, либо к земле (главное — не допускать пересечения адресного пространства с техникой, которая управляется теми же битами данных).
Очевидные минусы — единое (из той же коробки) для всех розеток адресное пространство и система команд. То есть, если ваш сосед купит такие же, будете щелкать розетками друг друга, если, конечно, кто-то не догадается подкорректировать адреса.
В общем, можно пользоваться.
ps. Описанное колдовство по угадыванию может не сработать, если попадется кардинально другой чип, или его алгоритм, реализованный в отдельном микроконтроллере (обычно какой-нибудь PIC) без столь наглядных линий адреса и данных. В этих случаях придется действительно приложить голову.
Автор: spc