В современных домохозяйствах большинство устройств (лампочки, телевизоры, кондиционеры и т.д.) запитываются от напряжения переменного тока. Мы можем управлять включением и выключением этих устройств с помощью платы Arduino и реле, эти способы управления домашними электронными устройствами рассматривались на нашем сайте в проектах автоматизации дома. Но если нам нужно не просто управлять процессами включения/выключения устройств, а нужно еще, к примеру, регулировать яркость свечения лампы или частоту вращения вентилятора, то здесь нам необходимо использовать методы управления фазами и статические переключатели наподобие симисторов (TRIAC) для управления фазами напряжение переменного тока.
В данной статье мы рассмотрим создание регулятора силы света (диммера, dimmer) лампы переменного тока на основе платы Arduino и симистора. Для переключения режимов лампы переменного тока мы будем использовать симистор (TRIAC) – быстродействующий электронный переключатель, наиболее хорошо подходящий для проектов подобного вида.
На нашем сайте вы можете также посмотреть проекты, в которых использовалась регулировка силы света:
- регулятор силы свечения светодиода на микроконтроллере AVR ATmega32;
- автоматическое управление яркостью свечения светодиода с помощью Arduino;
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Оптопара MCT2E (купить на AliExpress).
- Оптопара MOC3021 (купить на AliExpress).
- Симистор (TRIAC) BT136 (купить на AliExpress).
- Понижающий трансформатор (12-0V, 500mA) (купить на AliExpress).
- Резисторы 1 кОм, 10 кОм, 330 Ом (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Лампа переменного тока с держателем (патроном).
- Соединительные провода.
Методика обнаружения перехода через ноль
Для управления напряжением переменного тока первое, что мы должны уметь делать – это обнаруживать переходы через ноль сигнала переменного тока. Следовательно, в каждый момент времени, когда этот сигнал переходит через ноль, мы должны переключать симистор. Момент перехода через ноль сигнала переменного тока показан на следующем рисунке.
Принцип работы симистора
Симистор (симметричный триодный тиристор, в англ. TRIAC) представляет собой переключатель переменного тока с тремя выводами, который можно переключить при помощи подачи отпирающего импульса на его управляющий вывод (затвор). Но в отличие от других подобных переключателей, которые проводят ток в одном направлении, симистор может управлять током в обоих направлениях. В нашем проекте мы будем использовать симистор BT136.
Принцип управления симистора переменным током показан на следующем рисунке.
Как показано на рисунке, мы можем переключать, к примеру, симистор на угле 90 градусов при помощи подачи отпирающего импульса на его управляющий вывод. В этом случае мы будем подавать ток на лампу только в половине времени положительной полуволны сигнала (на графике время t1), соответственно, лампа будет гореть вполовину мощности. Уменьшая или увеличивая это время мы можем заставить лампу гореть ярче или тусклее.
Частота сигнала переменного тока в нашей сети составляет 50 Гц, соответственно, период сигнала равен 1/f =20 миллисекунд. Значит, половина периода будет равна 10 мс. Поэтому мы можем изменять время t1 на приведенном графике для управления яркостью свечения лампы переменного тока в диапазоне от 0 до 10 мс (10000 мкс).
Оптопара
Оптопару (оптрон) также называют оптоизолятором. Она используется для изоляции друг от друга двух электрических цепей постоянного или переменного тока. Принцип ее действия достаточно прост: светодиод внутри нее излучает инфракрасный свет, а фотодатчик обнаруживает его. В нашем проекте мы будем использовать оптопару MOC3021 для управления лампой переменного тока, с помощью платы Arduino, использующей сигналы постоянного тока.
Схема проекта
Схема регулятора силы света (диммера) на Arduino и симисторе представлена на следующем рисунке.
Схема соединения симистора и оптопары показана на следующем рисунке.
Эту схему мы собрали на перфорированной плате, у нас получилась конструкция следующего вида:
Оптопару MCT2E и соединения с ней мы также разместили на перфорированной плате и подсоединили ее к понижающему трансформатору.
Конструкция всего проекта в сборе выглядит следующим образом:
Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу проекта, приведены в конце статьи, здесь же мы кратко рассмотрим основные фрагменты кода.
В самом начале программы нам необходимо объявить используемые глобальные переменные. Симистор у нас подключен к контакту 4 платы Arduino. В переменной dim_val мы будем хранить значение шага диммирования (регулирования силы света), который мы далее будем использовать в программе.
1 2 |
int LAMP = 4; int dim_val=0; |
Далее, в функции void setup() для контакта, к которому подключен симистор, мы зададим режим работы на вывод данных. Затем мы используем функцию attachInterrupt чтобы сконфигурировать контакт 2 на обработку внешнего прерывания. При срабатывании этого прерывания будет вызываться функция обработки прерывания zero_cross.
1 2 3 4 5 |
void setup() { pinMode(LAMP, OUTPUT); attachInterrupt(digitalPinToInterrupt(2), zero_cross, CHANGE); } |
Внутри функции void loop() мы будем считывать аналоговое значение с потенциометра, подключенного к контакту A0 платы Arduino. Затем мы будем конвертировать это значение в диапазон 10-49. Чтобы вычислить этот диапазон нам пришлось сделать некоторые вычисления. Ранее мы говорили, что каждая половина цикла (периода) волны переменного тока в сети составляет 10 000 микросекунд. К примеру, мы хотим управлять регулировкой силы света с помощью 50 шагов (это значение является произвольным, его вы можете изменить по своему усмотрению). В этом случае мы использовали минимальный шаг, равный 10 (значения от до 9 не рекомендуются в силу ряда физических процессов). А в качестве максимального значения шага мы использовали значение 49.
Время каждого шага можно рассчитать следующим образом: 10000/50=200 микросекунд. В результате этих вычислений мы и написали следующий фрагмент кода:
1 2 3 4 5 6 |
void loop() { int data=analogRead(A0); int data1 = map(data, 0, 1023,10,49); dim_val=data1; } |
Теперь все, что нам нужно сделать, это запрограммировать функцию обработки прерывания zero_cross. В ней мы время регулировки (dimming_time) рассчитываем при помощи умножения индивидуального времени шага на число шагов. Далее мы делаем задержку в программе на рассчитанное время и после этой задержки переключаем симистор с помощью небольшого импульса длительностью 10 микросекунд.
1 2 3 4 5 6 7 8 |
void zero_cross() { int dimming_time = (200*dim_val); delayMicroseconds(dimming_time); digitalWrite(LAMP, HIGH); delayMicroseconds(10); digitalWrite(LAMP, LOW); } |
Тестирование работы проекта
На следующих трех рисунках показаны 3 степени регулировки яркости лампы переменного тока.
1. Маленький шаг регулировки.
2. Средний шаг регулировки.
3. Максимальный шаг регулировки.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
int LAMP = 4; int dim_val=0; void setup() { pinMode(LAMP, OUTPUT); attachInterrupt(digitalPinToInterrupt(2), zero_cross, CHANGE); } void zero_cross() { int dimming_time = (200*dim_val); delayMicroseconds(dimming_time); digitalWrite(LAMP, HIGH); delayMicroseconds(10); digitalWrite(LAMP, LOW); } void loop() { int data=analogRead(A0); int data1 = map(data, 0, 1023,10,49); dim_val=data1; } |