Pull to refresh

Управляем розеткой AB400S Wireless Switch без пульта

Reading time4 min
Views29K
Недавно у меня появились 3 розетки AB400S Wireless Switch управляемые по радиоканалу 433 МГц. Пульт от них был утерян и хозяину они стали не нужны. Как всегда, осмотр начался с разбора на составляющие.
Вот, собственно, вид внутренностей этой розетки. Синие провода и резистор 1,2кОм были припаяны мной, но об этом позже.

image

Сверху сразу видно конденсаторный блок питания и реле 24В, внизу приемник сигнала с фильтром на ОУ и собственно декодер принятого сигнала НХ2272-L2. Справа от него видны ножки от переключателя (DIP switch), которым выставляется «адрес» розетки.

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

Передатчик на 433МГц у меня был от другого устройства. Чтобы исключить неработоспособность радиоканала при тестировании программы передающей данные на декодер, решил соединить микроконтроллер с декодером напрямую. Припаиваем провода к контактам VCC(18), GND(9) и DIN(14). Я их припаивал не конкретно к ножкам микросхемы, а просто на этих линиях там, где было удобно.

image

Из описания микросхемы следует, что информация, передаваемая на декодер, состоит из одного слова (word) состоящего из 12 бит, за ними следует синхронизирующий бит. Конкретно для нашего декодера это выглядит так:

image

Значение битов устанавливается уровнем напряжения на входах А0-А9, биты D0-D1 соответствуют одноименным выходам. Если принятые адресные биты совпадают со значениями, выставленными на переключателе, то выходы D0 и D1 принимают значения принятых бит D0 и D1. Бит может принимать значения 0, 1 или f (floating). В случае с «floating» вход остается не подключенным. На плате розетки можно использовать 0 и «floating». Выставить единицу нет возможности, так как нет подтягивающего резистора (pull-up). В программе я использовал все три варианта, поэтому к А0 для проверки работоспособности был припаян резистор 1,2кОм.

Кодируются биты следующим образом:

image

Каждый бит состоит из двух пульсов. Для 1 и 0 первый и второй пульсы совпадают, а „floating“ в первом цикле имеет последовательность «0», во втором «1». α – период тактового генератора декодера. Его величина задается резистором подключенным к ножкам OSC1 и OSC2. В нашем варианте платы он имеет величину 1 МОм.

По приведенным графикам можно определить частоту, на которой работает декодер. Шкала частоты логарифмическая и 10 кГц смещены. Из рисунка следует, что частота тактового генератора приблизительно равна 35кГц.

image

Проверяем осциллографом. Для этого ставим щуп осциллографа на ножку OSC2.

image

Берем более точное значение. Для декодера α будет равняться 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 бит. Затем отправляется синхронизирующий импульс. Он имеет другие временные характеристики.

image

На этапе теста с разобранной розеткой о работоспособности программы можно было судить по загорающемуся светодиоду (индикатору включения розетки), т.к. питание подавалось 5В, а реле рассчитано на 24В.

После успешного тестирования и подключения передатчика (433 МГц) розетка сразу начала управляться по радиоканалу.

Следующая цель связать микроконтроллер со смартфоном и управлять тремя розетками. Но это уже другая история.
Tags:
Hubs:
Total votes 15: ↑15 and ↓0+15
Comments39

Articles