Недавно у меня появились 3 розетки AB400S Wireless Switch управляемые по радиоканалу 433 МГц. Пульт от них был утерян и хозяину они стали не нужны. Как всегда, осмотр начался с разбора на составляющие.
Вот, собственно, вид внутренностей этой розетки. Синие провода и резистор 1,2кОм были припаяны мной, но об этом позже.
![image](https://habrastorage.org/files/d6f/e13/52b/d6fe1352b6574a18b3e484f9746669b4.jpg)
Сверху сразу видно конденсаторный блок питания и реле 24В, внизу приемник сигнала с фильтром на ОУ и собственно декодер принятого сигнала НХ2272-L2. Справа от него видны ножки от переключателя (DIP switch), которым выставляется «адрес» розетки.
Я задался целью связать его с микроконтроллером ATmega8 и попытаться включить реле. Я не любитель конденсаторных блоков питания, тем более, когда плата будет лежать на столе перед носом. Для питания использовал источник 5В, от которого работает мой микроконтроллер, вставленный в бредборд (в макетную плату с втыкаемыми контактами).
Передатчик на 433МГц у меня был от другого устройства. Чтобы исключить неработоспособность радиоканала при тестировании программы передающей данные на декодер, решил соединить микроконтроллер с декодером напрямую. Припаиваем провода к контактам VCC(18), GND(9) и DIN(14). Я их припаивал не конкретно к ножкам микросхемы, а просто на этих линиях там, где было удобно.
![image](https://habrastorage.org/files/5d0/8f2/2de/5d08f22de38b49c287566bde9e4ce8c9.png)
Из описания микросхемы следует, что информация, передаваемая на декодер, состоит из одного слова (word) состоящего из 12 бит, за ними следует синхронизирующий бит. Конкретно для нашего декодера это выглядит так:
![image](https://habrastorage.org/files/0e4/ad6/430/0e4ad643034b4ee1a3d95e7478fdcd17.png)
Значение битов устанавливается уровнем напряжения на входах А0-А9, биты D0-D1 соответствуют одноименным выходам. Если принятые адресные биты совпадают со значениями, выставленными на переключателе, то выходы D0 и D1 принимают значения принятых бит D0 и D1. Бит может принимать значения 0, 1 или f (floating). В случае с «floating» вход остается не подключенным. На плате розетки можно использовать 0 и «floating». Выставить единицу нет возможности, так как нет подтягивающего резистора (pull-up). В программе я использовал все три варианта, поэтому к А0 для проверки работоспособности был припаян резистор 1,2кОм.
Кодируются биты следующим образом:
![image](https://habrastorage.org/files/70e/29a/2e6/70e29a2e63274bbfac7080efd85687c7.png)
Каждый бит состоит из двух пульсов. Для 1 и 0 первый и второй пульсы совпадают, а „floating“ в первом цикле имеет последовательность «0», во втором «1». ? – период тактового генератора декодера. Его величина задается резистором подключенным к ножкам OSC1 и OSC2. В нашем варианте платы он имеет величину 1 МОм.
По приведенным графикам можно определить частоту, на которой работает декодер. Шкала частоты логарифмическая и 10 кГц смещены. Из рисунка следует, что частота тактового генератора приблизительно равна 35кГц.
![image](https://habrastorage.org/files/fbf/5f0/d6a/fbf5f0d6a6824221a997b4124ba079b1.png)
Проверяем осциллографом. Для этого ставим щуп осциллографа на ножку OSC2.
![image](https://habrastorage.org/files/4f5/73e/4fe/4f573e4fef7d4ee6ba8914efb2d2b158.PNG)
Берем более точное значение. Для декодера ? будет равняться 1/34,26кГц = 29,19 мкс. Из описания следует, что декодер работает на частоте в 2,5… 8 раз большей, чем устройство, формирующее поступающий на ножку DIN сигнал. Значит, для кодирования сигнала ? передатчика может быть равна, например, 29,19 мкс/ 4 = 7,3 мкс.
Про код оговорюсь сразу, что я не программист. Если есть предложения, как сделать его лучше, буду рад вашим советам.
Данные для отправки хранятся в векторе. Биты A0… A9 соответствуют значениям выставленным на переключателе. (Стандартная комбинация из инструкции по эксплуатации) К выходу D0 декодера через транзистор подключено реле. Порт, к которому подключен вход декодера, настроен на выход и при инициализации сразу включен.При прошивке микроконтроллера, реле должно в соответствии с данными в векторе сразу включаться.
Цикл передачи одних и тех же данных повторяется 3 раза. Нажатие на кнопку приводит к инвертированию последнего бита (функция вкл/выкл) и сбросу количества передач (transmitNum). Я использовал таймер, который вызывает функцию (rf_function) каждые 7,3 мкс, если была нажата кнопка, соединенная с микроконтроллером.
Каждый раз при вызове функции счетчик ? увеличивается на единицу. Если количество пройденных ? соответствует необходимому количеству тактов для формирования того или иного бита, то происходит инвертирование значения пина. После 16? (время одного цикла) счетчик ? обнуляется и увеличивается на единицу счетчик циклов. Операция повторяется снова. После двух циклов из вектора берется новый бит и операция повторяется до тех пор, пока не будут переданы 12 бит. Затем отправляется синхронизирующий импульс. Он имеет другие временные характеристики.
![image](https://habrastorage.org/files/150/cb6/d5c/150cb6d5cece44909230f46370cc9795.PNG)
На этапе теста с разобранной розеткой о работоспособности программы можно было судить по загорающемуся светодиоду (индикатору включения розетки), т.к. питание подавалось 5В, а реле рассчитано на 24В.
После успешного тестирования и подключения передатчика (433 МГц) розетка сразу начала управляться по радиоканалу.
Следующая цель связать микроконтроллер со смартфоном и управлять тремя розетками. Но это уже другая история.
Вот, собственно, вид внутренностей этой розетки. Синие провода и резистор 1,2кОм были припаяны мной, но об этом позже.
![image](https://habrastorage.org/files/d6f/e13/52b/d6fe1352b6574a18b3e484f9746669b4.jpg)
Сверху сразу видно конденсаторный блок питания и реле 24В, внизу приемник сигнала с фильтром на ОУ и собственно декодер принятого сигнала НХ2272-L2. Справа от него видны ножки от переключателя (DIP switch), которым выставляется «адрес» розетки.
Я задался целью связать его с микроконтроллером ATmega8 и попытаться включить реле. Я не любитель конденсаторных блоков питания, тем более, когда плата будет лежать на столе перед носом. Для питания использовал источник 5В, от которого работает мой микроконтроллер, вставленный в бредборд (в макетную плату с втыкаемыми контактами).
Передатчик на 433МГц у меня был от другого устройства. Чтобы исключить неработоспособность радиоканала при тестировании программы передающей данные на декодер, решил соединить микроконтроллер с декодером напрямую. Припаиваем провода к контактам VCC(18), GND(9) и DIN(14). Я их припаивал не конкретно к ножкам микросхемы, а просто на этих линиях там, где было удобно.
![image](https://habrastorage.org/files/5d0/8f2/2de/5d08f22de38b49c287566bde9e4ce8c9.png)
Из описания микросхемы следует, что информация, передаваемая на декодер, состоит из одного слова (word) состоящего из 12 бит, за ними следует синхронизирующий бит. Конкретно для нашего декодера это выглядит так:
![image](https://habrastorage.org/files/0e4/ad6/430/0e4ad643034b4ee1a3d95e7478fdcd17.png)
Значение битов устанавливается уровнем напряжения на входах А0-А9, биты D0-D1 соответствуют одноименным выходам. Если принятые адресные биты совпадают со значениями, выставленными на переключателе, то выходы D0 и D1 принимают значения принятых бит D0 и D1. Бит может принимать значения 0, 1 или f (floating). В случае с «floating» вход остается не подключенным. На плате розетки можно использовать 0 и «floating». Выставить единицу нет возможности, так как нет подтягивающего резистора (pull-up). В программе я использовал все три варианта, поэтому к А0 для проверки работоспособности был припаян резистор 1,2кОм.
Кодируются биты следующим образом:
![image](https://habrastorage.org/files/70e/29a/2e6/70e29a2e63274bbfac7080efd85687c7.png)
Каждый бит состоит из двух пульсов. Для 1 и 0 первый и второй пульсы совпадают, а „floating“ в первом цикле имеет последовательность «0», во втором «1». ? – период тактового генератора декодера. Его величина задается резистором подключенным к ножкам OSC1 и OSC2. В нашем варианте платы он имеет величину 1 МОм.
По приведенным графикам можно определить частоту, на которой работает декодер. Шкала частоты логарифмическая и 10 кГц смещены. Из рисунка следует, что частота тактового генератора приблизительно равна 35кГц.
![image](https://habrastorage.org/files/fbf/5f0/d6a/fbf5f0d6a6824221a997b4124ba079b1.png)
Проверяем осциллографом. Для этого ставим щуп осциллографа на ножку OSC2.
Берем более точное значение. Для декодера ? будет равняться 1/34,26кГц = 29,19 мкс. Из описания следует, что декодер работает на частоте в 2,5… 8 раз большей, чем устройство, формирующее поступающий на ножку DIN сигнал. Значит, для кодирования сигнала ? передатчика может быть равна, например, 29,19 мкс/ 4 = 7,3 мкс.
Про код оговорюсь сразу, что я не программист. Если есть предложения, как сделать его лучше, буду рад вашим советам.
Данные для отправки хранятся в векторе. Биты A0… A9 соответствуют значениям выставленным на переключателе. (Стандартная комбинация из инструкции по эксплуатации) К выходу D0 декодера через транзистор подключено реле. Порт, к которому подключен вход декодера, настроен на выход и при инициализации сразу включен.При прошивке микроконтроллера, реле должно в соответствии с данными в векторе сразу включаться.
short sendVector[12] = {0,2,0,2,0,0,2,2,2,2,0,1}; // A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 D1 D0
// BIT0 =0; BIT1 =1; BITf =2
Цикл передачи одних и тех же данных повторяется 3 раза. Нажатие на кнопку приводит к инвертированию последнего бита (функция вкл/выкл) и сбросу количества передач (transmitNum). Я использовал таймер, который вызывает функцию (rf_function) каждые 7,3 мкс, если была нажата кнопка, соединенная с микроконтроллером.
rf_function
void rf_function(void) {
static short alphaCounter = 0; // подсчет количества тактов
static short bitCounter = 0; // подсчет переданных бит
static short cycle = 0; // подсчет количества повторов
if (bitCounter < 12) // отправить 12 бит
{
alphaCounter++;
if (cycle == 0) {
if ((alphaCounter == 4) && (sendVector[bitCounter] != 1)) // BIT0 и BITf идентичны
{
togglePin('C', _PIN0); //инвертировать пин
}
if ( (alphaCounter == 12) && (sendVector[bitCounter] == 1))
{
togglePin('C', _PIN0);
}
}
else {
if ((alphaCounter == 4) && (sendVector[bitCounter] == 0)) // BIT1 и BITf идентичны
{
togglePin('C', _PIN0); //инвертировать пин
}
if ( (alphaCounter == 12) && (sendVector[bitCounter] != 0))
{
togglePin('C', _PIN0);
}
}
if (alphaCounter == 16) // один цикл завершен
{
togglePin('C', _PIN0);
cycle++;
alphaCounter = 0; //сброс после выполнения одного цикла
}
if (cycle == 2) // переходим на следующий бит в векторе после 2х циклов
{
cycle = 0;
bitCounter++;
}
}
else //передаем синхронизирующий импульс
{
alphaCounter++;
if (alphaCounter == 4)
{
togglePin('C', _PIN0);
}
if (alphaCounter == 128)
{
togglePin('C', _PIN0);
bitCounter = 0; //сбросить счетчик после передачи всех бит
alphaCounter = 0; //сброс перед новой передачей
transmitNum++; // увеличить счетчик после каждой передачи
}
}
}
Каждый раз при вызове функции счетчик ? увеличивается на единицу. Если количество пройденных ? соответствует необходимому количеству тактов для формирования того или иного бита, то происходит инвертирование значения пина. После 16? (время одного цикла) счетчик ? обнуляется и увеличивается на единицу счетчик циклов. Операция повторяется снова. После двух циклов из вектора берется новый бит и операция повторяется до тех пор, пока не будут переданы 12 бит. Затем отправляется синхронизирующий импульс. Он имеет другие временные характеристики.
На этапе теста с разобранной розеткой о работоспособности программы можно было судить по загорающемуся светодиоду (индикатору включения розетки), т.к. питание подавалось 5В, а реле рассчитано на 24В.
После успешного тестирования и подключения передатчика (433 МГц) розетка сразу начала управляться по радиоканалу.
Следующая цель связать микроконтроллер со смартфоном и управлять тремя розетками. Но это уже другая история.