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

Силовое питания и коммутация

В эту часть схемы входят входные и выходные цепи, и контакты реле, через которые питается нагрузка.

Катушки реле входят в 3-ю часть схемы.

Ноль и фаза поступают дальше.

Схема питания 220 – 12 В

На эту часть приходит напряжение 220В, ноль и фаза. Ноль проходит на диодный мост через дроссель, который в некоторой степени устраняет высокочастотную помеху по питанию, которая может приводить к сбоям. Для этой же цели служит конденсатор С1.

Фаза на диодный мост приходит через гасящий конденсатор С2, который для безопасной работы зашунтирован резистором R1.

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

Выход диодного моста нагружен на конденсаторы фильтра С3 и С4, которые служат для фильтрации низкочастотной и высокочастотной составляющих выходного напряжения моста. Напряжение стабилизируется цепочкой из последовательно соединенных стабилитрона VD2 на 12В и ограничительного резистора R4.

В результате в точке А образуется напряжение постоянного тока 12,5-15В по отношению к нулевому проводу (минус диодного моста).

Ключевые транзисторы

Ключевые транзисторы – это по сути усилители дискретного сигнала, который поступает с декодера. Они включены по классической схеме.

Схема питания 12 – 5 В

Далее напряжение 12В поступает на схему стабилизации питания 5В. Напряжение на входе этого стабилизатора понижается и стабилизируется цепочкой из резистора R6 и стабилитрона VD4 на 12В и подается на интегральный стабилизатор 78L05. Далее, стабилизированное напряжение 5В дополнительно фильтруется конденсаторами С5 и С6, поскольку нужно особое качество постоянного напряжения.

Радиомодуль

Напряжение питания 5В поступает на питание радиомодуля. Назначение радиомодуля – принять из радиоэфира сигнал от пульта управления, и выдать его в таком виде, чтобы его мог раскодировать декодер.

Декодер радиосигнала

Декодер получает сигнал на частотах, каждая из которых соответствует заранее обозначенному сигналу. Что творится в декодере – секрет фирмы, даташит на микросхему HS153SP-J найти не удалось.

Если у кого-то есть – поделитесь, пожалуйста!

“Продукт жизнедеятельности” декодера радиосигнала – дискретные напряжения порядка 5В, которые открывают ключевые транзисторы.

Вариант контроллера люстры:

Все контроллеры имеют примерно одинаковую схему, разные лишь бренды. Например. Фото блока управления люстрой, присланное читателем:

Если не ремонтировать

Если ремонт зашёл в тупик, и продолжать его уже нет ресурсов (психологических, материальных и временных), то контроллер можно просто купить.

Я полагаю, что эти три контроллера имеют одинаковую начинку, за исключением количества реле с транзисторами, и мощностью внутренней схемы питания.

Всех тонкостей схемотехники и ремонта радиоуправляемых контроллеров люстр тут описать, конечно, не возможно, поэтому – задавайте вопросы в комментариях, будем разбираться вместе.

Как устроен контроллер с пультом для люстры

Коротко ещё раз, о чём речь.

Этот дистанционный выключатель, как система, физически состоит из двух устройств – из передатчика (Transmitter), то есть пульта управления, на котором пользователь нажимает кнопки), и приемника (Receiver), который входит в состав контроллера.

Вся система выглядит таким образом:

Куда подключаются провода контроллера, в этой статье рассматривать не будем. Этому уделено достаточно много внимания в других моих статьях, ссылки выше.

Инструкция по использованию и подключению блока управления дана на его корпусе:

Вскрываем корпус. Для этого надо открутить один шуруп, остальное – как обычно в таких устройствах, на защелках:

На фото специально пульт и контроллер положил рядом, чтобы было видно название.

Контроллер, который мы ремонтируем

Теперь самое интересное – я опишу процесс ремонта контроллера Kedsum K-PC803, фото внешнего вида которого я уже приводил в начале статьи.

В процессе ремонта этого контроллера, как и любой бестрансформаторной электроники, нужно помнить о опасности – схема всегда находится под напряжением сети!

Схема этого контроллера почти полностью совпадает со схемой, приведенной выше. Разница лишь в том, что в этом контроллере не 2 канала, а 3. Но принцип абсолютно тот же. Уделим немного времени, чтобы познакомиться с некоторыми внутренностями и отличиями от приведенной схемы.

Вот как выглядит контроллер для управления люстрой на 3 канала изнутри:

Чуть поближе:

Три реле (черные, слева) соответствуют трем каналам управления.

Справа от верхнего реле видим ряд черных полукруглых деталек. Это три ключевых транзистора и стабилизатор на 5В. Вот как это выглядит в другого ракурса:

На этом фото можно различить транзисторы Q1, Q2, Q3 – ключевые для включения реле (тип – С9013), стабилизатор 5В для питания радиочастотной части – L78L05, и микросхему декодера радиосигнала HS153SP-J.

Обратная сторона схемы (сторона пайки). На фото подписал выводы, чтобы было легче провести рекогнисцировку:

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

Передатчик (он носит название 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) обращайте внимание на длину выводов — мне как-то попалась целая партия с укороченными штырьками, отчего из стандартного разъема

приемник вываливался при малейшем перекосе и его приходилось к плате специально крепить.

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

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

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

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

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

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

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

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

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

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

Схема контроллера светодиодной люстры

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

Схема контроллера приведена ниже:

Типичные неисправности блока управления (контроллера) люстры

Следует помнить, что чаще всего в любых электронных устройствах проблемы возникают с подключением или с питанием.

В схеме контроллера ремонт может идти по таким пунктам:

  1. Проверка наличия входного напряжения 220В.
  2. Проверка напряжения холостого хода 12…15В на выходе диодного моста. Если этого напряжения нет, проверить ограничительный конденсатор, диодный мост, конденсаторы фильтра, стабилитрон. Для исключения влияния последующих частей схемы отключить нагрузку схемы питания, перерезав дорожку на плате.
  3. Проверить напряжение на входе и выходе стабилизатора 5В.
  4. Проверить работу декодера. При наличии сигналов с пульта на выходах декодера и соответствующих базах транзисторов будет появляться напряжение.
  5. Проверить ключевые транзисторы. При их открытии должны включаться реле.
  6. При включении реле фаза должна появляться на соответствующих выходах контроллера.

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

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

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

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

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

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

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

. . . . .
#include <VirtualWire.h>
. . . . .
void setup() {
  vw_setup(1200); // Скорость соединения VirtualWire
  vw_set_tx_pin(10);   // Вывод передачи VirtualWire D10
. . . . .
}

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

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

. . . . .
// глобальные переменные в начале
#define ledPin 13 //вывод светодиода (D13, вывод 19 ATmega) 
char msg[13];
volatile int tmpr=0;
volatile int hum=0;
. . . . .
void loop() {
  delay(1000); //пауза 1 c
float temperature;
float humidity;
. . . . .  //здесь получаем значения temperature и humidity с датчика
//температуру с десятыми в целое положительное число 4 разряда:
  tmpr = temperature*10 2731; //2731 = абсолютный ноль в десятых градуса
//влажность в целое число 4 разряда:
  hum = humidity*10 1000; 
// формируем сообщение:
  digitalWrite (ledPin,HIGH); //зажигаем светодиод — начало передачи
  String strMsg="DAH"; //сигнатура - данные
  strMsg =tmpr; //температуру в строку
  strMsg =hum; //присоединяем влажность
  strMsg.toCharArray(msg,12); //переводим строку в массив, 12 – количество знаков
// и посылаем:
  vw_send((uint8_t *)msg, strlen(msg)); // передача сообщения
  vw_wait_tx(); // ждем завершения передачи
  delay(500); //пауза 500 мс
  digitalWrite (ledPin, LOW); //гасим светодиод — конец передачи
}

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

Сообщение, как видите, состоит из значений преобразованных температуры и влажности, в ASCII-строках по четыре байта каждое, предваряемых строкой из трех символов «DAH» (символы могут быть любыми другими из таблицы ASCII). Это сигнатура, которая позволит выделить данное сообщение из числа возможных других, посылаемых аналогичными устройствами.

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

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

#include <VirtualWire.h>
char str[5]; вспомогательная строка для преобразований ASCII в число
  uint8_t buf [VW_MAX_MESSAGE_LEN];  //буфер для хранения принятых данных
  uint8_t buflen = VW_MAX_MESSAGE_LEN;  // max длина принятых данных
. . . . .

void setup() {
  vw_set_rx_pin(2); //D2 Вывод приемника VirtualWire
  vw_setup(1200); // Скорость соединения VirtualWire
. . . . .
} 


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

void loop() {
  vw_rx_start();  // готовность приема
  buflen = VW_MAX_MESSAGE_LEN; //размер буфера задавать каждый раз
 if (vw_have_message()) { //ждем приема
 if (vw_get_message(buf, &buflen)) // Если данные приняты
  {
    vw_rx_stop(); //останавливаем прием и парсим:
        for (byte i=0; i<3; i  )  // получить первые три байта
                str[i]= buf[i]; // 
                str[3]='';
      if ((str[0]=='D')&&(str[1]=='A')&&(str[2]=='H')) {
//сигнатура правильная, датчик обнаружен
       for (byte i=3;i<7;i  )  // Получить четыре байта температуры
                str[i-3]= buf[i]; // упаковать их в строку
      int tmpr=atoi(str); //преобразовать в целое число
      tmpr=tmpr-2731; //вычесть 2731, получаем в десятых долях Цельсия
. . . . .//здесь можно поделить на 10 и преобразовать во float, если надо
. . . . . // здесь выводим температуру куда-то
// влажность:
      for (byte i=7;i<11;i  )  // Получить четыре байта влажности
                str[i-7]= buf[i]; // упаковать их в строку
      int hh = atoi(str); //преобразовать в целое число
      hh=(hh-1000)/10;
      if (hh>99) hh=99; //получаем влажность в %, целое число
. . . . . //выводим куда-то
   } //end проверка сигнатуры DAT
  } //end данные приняты
 } //прием 
} // end loop

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Оставьте комментарий