Arduino Nano + 4-канальное реле: Управление роллетами и АС-моторами
Компоненты и расходные материалы
| Arduino Nano R3 | × | 1 |
| ControlEverything.com 4-CHANNEL RELAY CONTROLLER FOR I2C | × | 1 |
| Твердотельное реле 4 канала (Solid State Relay) | × | 1 |
| Мотор роллета (до 4 моторов на один Arduino) | × | 1 |
| Конденсатор 100 нФ 630 В (на каждый мотор) | × | 1 |
| Резистор 100 Ом (мин. 0.5 Вт!) (на каждый мотор, НЕ точные синие!) | × | 1 |
| Варистор 275 VAC (на каждый мотор) | × | 1 |
| Диод (любой сигнальный или силовой) (на каждый роллет) | × | 3 |
| Raspberry Pi 3 Model B (опционально, для удалённого управления) | × | 1 |
| Модуль nRF24L01+ (опционально, 2 шт. для удалённого управления) | × | 2 |
Необходимые инструменты
- Паяльник
Приложения и сервисы
- Arduino IDE
- Domoticz (опционально, для удалённого управления)
О проекте
Введение
Купил дом, решил автоматизировать всё, начиная с роллетов. Казалось просто, но получился кошмар: мощные моторы (150 Вт) сжигали реле и триаки, выбор беспроводной связи и контроллера неочевиден, помехи в линиях вызывали случайные срабатывания (страшно ночью). В итоге решил всё дешёвыми компонентами — делюсь, чтобы сэкономить вам время и нервы.
Не любите программировать, но любите паять? Читайте дальше — в конце есть дискретная схема без МК.
Объяснение проблемы
При управлении моторами главная проблема — индуктивность. При размыкании цепи ток стремится продолжить течь, создавая огромное перенапряжение. Малое реле — контакты привариваются. Триак (SSR) — перенапряжение (я замерял пики >1600 В) убивает полупроводник.
В сети люди решают покупкой крупных реле (всё равно нужны малые для управления крупными), контакты всё равно страдают. Как инженер, не мог принять неоптимальное решение. В схеме ниже — решение: всего один резистор, конденсатор и варистор вместо громоздких реле.
- Варистор защищает триак от перенапряжения.
- RC-гаситель (резистор + конденсатор) поглощает энергию при коммутации.
PS: Схему писал из памяти давно после постройки. Пересматривая плату, увидел: в реальности RC-гаситель стоит между коричневым и серым проводами мотора (по цветам схемы), а не на контактах триака. Оба варианта работают, но второй лучше — гаситель не постоянно под сетевым напряжением.
PS2: SebDominguez сделал наглядную схему реальной конфигурации:

Вместо двух пинов на роллет (вверх/вниз) используется общая линия направления — всего 5 входов вместо 8. Без аппаратного фильтра, антидребезг программный.
Алгоритм: Arduino включает релейный модуль (выбор направления), после малой задержки (контакт уже замкнут) — включает триак, питая мотор 230 ВАС через дешёвые реле и триаки без проблем. Размыкание в обратном порядке: сначала триаки, потом реле — реле никогда не коммутируют нагрузку под напряжением.
Можно использовать 1–4 мотора без изменения кода. Неиспользуемая логика не мешает, если пины не нужны для чего-то ещё.
У меня два этажа — две цепи. Команды пульта должны быть уникальны, код работает для любой цепи за счёт закомментирования одной строки при прошивке. Одна цепь — ничего менять не надо. Две — решение бесплатно. На самом деле три цепи, 8 роллетов: в одной все 4 входа заняты, в других — 3 и 1. Дублированные цепи реагируют одинаково, но где ничего не подключено — нечему срабатывать. С MySensors можно до 256 узлов по 4 роллета без изменения кода.

Реальная установка в коробке 22×15×5.2 см, плотно. Собрал в открытой деревянной коробке на термоклее: практично, быстро, просто.
В Arduino Web Editor библиотеки подхватятся автоматически.
Удалённое управление (опционально)
Цель урока — решить проблему индуктивности, но добавил и радиоуправление.
Код поддерживает два способа через nRF24L01+: MySensors (рекомендую) или передачу целого числа (номер роллета + 0/1 вверх/вниз).
В обоих случаях мастер — RPi с nRF24L01+, контроллер — Domoticz.
Вариант 1: MySensors
Нужен MySensors MQTT Gateway (инструкция). Моя конфигурация (Ethernet на localhost):
sudo ./configure --my-gateway=mqtt --my-controller-ip-address=127.0.0.1 \
--my-mqtt-publish-topic-prefix=domoticz/in/MyMQTT \
--my-mqtt-subscribe-topic-prefix=domoticz/out/MyMQTT \
--my-mqtt-client-id=mygateway1 --my-transport=rf24 \
--my-port=1883 --my-rf24-irq-pin=15
Интеграция в Domoticz: добавить HW «MySensors MQTT Gateway», включить ноду — она сама появится в настройках HW.
Вариант 2: Кастомное приложение
Виртуальный переключатель выполняет консольную команду:
./remote -m XY
(X: номер роллета, Y: действие).
Код для RPi описан в статье. Нужна только секция «The Lamp Switch Application». Железо там тоже полезно. Обязательно конденсатор 10 мкФ на питании радио. Рассмотрите модуль с внешней антенной — PCB-антенна внутри стен даёт <10 м.
Код нужно немного поправить: подстроить параметры радио под Arduino, и отправлять команду один раз (не до 5 ретраев), иначе при потере ACK роллет будет дергаться: сработал-остановился-сработал.
Итоговый код для RPi (скомпилированный для Pi 3 в архиве https://goo.gl/ocCwk3):
#include <unistd.h>
#include <string>
#include <getopt.h>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <RF24/RF24.h>
using namespace std;
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
unsigned long got_message;
void setup(void){
printf("\nPreparing interface\n");
radio.begin();
radio.setRetries(15, 15);
radio.setChannel(0x70);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.printDetails();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
}
bool sendMessage(int action){
radio.stopListening();
unsigned long message = action;
printf("Now sending %lu...", message);
bool ok = radio.write(&message, sizeof(unsigned long));
if (!ok) printf("failed...\n\r");
else printf("ok!\n\r");
radio.startListening();
unsigned long started_waiting_at = millis();
bool timeout = false;
while (!radio.available() && !timeout) {
if (millis() - started_waiting_at > 1000) timeout = true;
}
if(timeout){
printf("Puta mierda, no me responde nadie...\n\r");
return false;
}else{
radio.read(&got_message, sizeof(unsigned long));
printf("Yeah, me han respondido > %lu.\n\r",got_message);
return true;
}
}
int main(int argc, char **argv){
char choice;
setup();
bool switched = false;
int counter = 0;
while((choice = getopt(argc, argv, "m:")) != -1){
if (choice == 'm'){
printf("\nTalking with my NRF24l01+ friends out there....\n");
while(switched == false && counter < 1){
switched = sendMessage(atoi(optarg));
counter++; sleep(1);
}
}else{
printf("\n\rIt's time to make some choices...\n");
printf("\n\rTIP: Use -m idAction for the message to send.");
printf("\n\rExample (id 12, action 1):\nsudo ./remote -m 121\n");
}
}
return (counter < 5) ? 0 : 2;
}
Архив содержит исходники, библиотеки и скомпилированный бинарь для RPi 3. Распакуйте и запускайте ./remote -m XY.
Результат

Три пары выключателей управляют тремя роллетами. Планшет на стене — Domoticz с виртуальными переключателями. За планшетом RPi с контроллером. Arduino у роллетов, связь по радио.

Google Home + IFTTT Webhooks + Domoticz = голосовые команды («Hey Google, blinds down»). Если дошли досюда — с голосом разберётесь сами.
Видео с демонстрацией (ссылка в оригинале).
Надеюсь, урок помог! Пишите в комментариях.
С уважением, gomecin
P.S. Дискретная схема без МК (для любопытства или если ненавидите программирование):

Собрал, работает, но сделал до знакомства с Arduino — она менее гибка и надёжна. Не вscope урока, не рекомендую использовать.
Код
Скетч для Arduino
(Код в оригинале не приведён полностью, см. репозиторий автора)
Схемы

Производственный процесс
- Разрешающие и блокирующие цепи в промышленных системах управления
- Продвинутые схемы управления двигателями: защёлкивание, стоп и задержка времени
- Расчет рассеиваемой мощности в резистивных цепях
- Технология бульдозеров: дизайн, производство и будущие инновации
- Edge AI и низкопотребляющее железо питают рост голосового управления
- Infineon представила серию TLE985x Embedded Power для автомобильного управления двигателями
- Контроль качества: краеугольный камень надежности двигателя
- Электрические щиты управления: основы проектирования для безопасности и ROI
- Надежная аренда энергоустановок и HVAC для бесперебойного климат-контроля
- Управление скоростью гидравлического мотора через ШИМ и ДУ: практическое руководство