Arduino Nano + Relé 4 Canales: Control de Persianas y Motores AC
Componentes y materiales
| Arduino Nano R3 | × | 1 |
| Controlador 4 canales I²C (ControlEverything.com) | × | 1 |
| Placa estado sólido 4 canales (triacs) | × | 1 |
| Motor de persiana (hasta 4 por Arduino) | × | 1 |
| Condensador 100 nF 630 V (uno por motor) | × | 1 |
| Resistencia 100 Ω 0.5 W mínimo (uno por motor, ¡no usar de precisión/azules!) | × | 1 |
| Varistor 275 VAC (uno por motor) | × | 1 |
| Diodo genérico (señal o potencia, uno por persiana, 3 total) | × | 3 |
| Raspberry Pi 3 Model B (opcional, control remoto) | × | 1 |
| Módulo nRF24L01+ (opcional, control remoto, 2 uds) | × | 2 |
Herramientas necesarias
- Soldador (genérico)
Aplicaciones y servicios en línea
- Arduino IDE
- Domoticz (opcional, solo para control remoto; cualquier controlador sirve o ninguno, solo para lanzar comandos)
Sobre el proyecto
Introducción
Compré casa nueva y quise automatizar todo, empezando por las persianas. Lo que parecía fácil se volvió pesadilla: los motores de 150W destruían mis relés y triacs, la comunicación inalámbrica y el controlador no eran obvios, el ruido en las líneas activaba persianas aleatoriamente (aterrador de noche)... Finalmente resolví todo con componentes muy baratos y espero ahorrar dolores de cabeza y tiempo a otros.
¿No te gusta programar pero sí soldar? Lee el tutorial y al final encontrarás un circuito discreto que hace lo mismo, pero sin inteligencia.
Explicación técnica
Al controlar motores, la inductancia hace que al abrir el circuito la corriente insista en fluir, generando sobretensión. Un relé pequeño suelda sus contactos; un triac (relé estado sólido) sufre picos (medí >1600V) que destruyen el semiconductor.
Mucha gente usa relés más grandes (caros, voluminosos), pero los contactos siguen sufriendo. Como ingeniero busqué la solución eficiente. En el esquemático adjunto: un varistor, una resistencia y un condensador protegen el triac.
- Varistor: protege el triac de sobretensión.
- RC Snubber (R + C): absorbe la energía durante la conmutación de apertura.
PS: Al revisar mi placa real, puse R y C entre las líneas marrón y gris de cada motor (colores del esquema) en vez de en los contactos del triac. Ambas funcionan, pero así el Snubber no está permanentemente conectado a red.
PS2: SebDominguez aportó un esquema con la configuración real:
En lugar de 2 pines por persiana (subir/bajar), los interruptores comparten una línea común de dirección. Usamos 5 entradas en vez de 8. Sin filtro hardware, antirrebote por software.
Secuencia: Arduino activa relés para seleccionar dirección → pequeño retardo → activa triac → motor recibe 230VAC. Para apagar: primero triac, luego relés → los relés nunca conmutan en carga.
De 1 a 4 motores sin modificar código. En casa tengo dos plantas = dos circuitos. Los comandos remotos deben ser únicos, así que el código sirve para cualquiera comentando una línea al subir. Si solo un circuito, sin cambios. Si dos, ya tienes la solución. En realidad tres circuitos, 8 persianas totales: uno usa 4 motores, los otros 4 repartidos en dos Arduinos (3 entradas en uno, 1 en otro). Los circuitos duplicados reaccionan igual a los comandos; donde no hay motor, no pasa nada. Con versión MySensors: hasta 256 nodos con 4 persianas cada uno sin tocar código.
Cabe en caja 22×15×5.2 cm (justo). Montado en caja de madera abierta con pistola de silicona caliente: práctico, rápido, fácil.
El IDE web de Arduino encuentra librerías automáticamente.
Control remoto (opcional)
El objetivo era resolver el problema de inductancia, pero añadí control remoto por radio nRF24L01+.
El código incluye dos modos:
- MySensors (recomendado)
- Enviar entero con nº persiana y acción (0/1 = subir/bajar).
En ambos uso Raspberry Pi como maestro con nRF24L01+ directo y Domoticz instalado.
Opción 1: MySensors
Instalar gateway MQTT MySensors (guía). Mi config (Ethernet en 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
Integración en Domoticz: añadir hardware "MySensors MQTT Gateway", alimentar nodo, aparece automáticamente.
Opción 2: Aplicación personalizada (sin MySensors)
Un interruptor virtual ejecuta comando consola:
./remote -m XY
(X: nº persiana, Y: acción). Detalles en cabecera del sketch Arduino.
Código base en hack.lenotta.com. Solo sirve sección "The Lamp Switch Application". Sección hardware útil para conexiones radio. Siempre poner condensador 10 µF en pines alimentación del radio. Considerar módulo con antena externa: en interior, antena PCB tiene alcance limitado (<10 m), especialmente si módulos van empotrados en paredes.
Modificar código Raspberry: ajustar parámetros radio a los del Arduino y enviar comando una sola vez (no reintentar 5 veces si no hay ACK, si no verás persianas actuar-parar-actuar).
Código final Raspberry (compilado para Pi 3):
#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("No response...\n\r");
return false;
}else{
radio.read(&got_message, sizeof(unsigned long));
printf("Got reply > %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 NRF24L01+ friends...\n");
while(switched == false && counter < 1){
switched = sendMessage(atoi(optarg));
counter++; sleep(1);
}
}else{
printf("\nUsage: -m idAction (ej. 121 = persiana 1, acción 1)\n");
}
}
return (counter < 5) ? 0 : 2;
}
Todo lo necesario para el lado Raspberry (código modificado, librerías, binario compilado Pi 3) en: https://goo.gl/ocCwk3. Descomprime en la Pi y ejecuta ./remote.
Resultado
Tres pares de interruptores en pared controlan tres persianas. Tablet en pared muestra Domoticz con interruptores virtuales. Detrás, Raspberry Pi con controlador. Arduino cerca de persianas (foto anterior); Pi y Arduino vinculados por radio.
Google Home + IFTTT Webhooks + Domoticz → comandos de voz: "Hey Google, persianas abajo".
Video demostración rápida en el proyecto original.
¡Dime si este tutorial te ayudó! — gomecin
Extra: Circuito discreto sin inteligencia (por curiosidad o si odias programar). Lo construí y funciona, pero antes de conocer Arduino; este es más flexible y fiable. No lo explico en detalle, no es el objetivo. Si te sirve, genial, pero lo desaconsejo.
Código
Sketch Arduino
(El código completo está en el proyecto original; aquí se omite por extensión pero sigue la lógica descrita).
Esquemáticos
Proceso de manufactura
- Control de Calidad: La Piedra Angular de la Fiabilidad del Motor
- Alquiler de energía y HVAC fiables para un control climático sin interrupciones
- Tecnología de bulldozers: diseño, fabricación e innovaciones futuras
- Paneles de Control Eléctrico: Fundamentos de Diseño para Seguridad y ROI
- Circuitos permisivos e de interbloqueo en sistemas de control industrial
- Circuitos avanzados de control de motor: retención, parada y técnicas de retardo
- Cálculo de Disipación de Potencia en Circuitos Resistivos
- Control de Velocidad de Motor Hidráulico con PWM y Control Remoto: Guía Práctica
- Infineon presenta serie TLE985x Embedded Power para control de motores automotriz
- Edge IA y hardware de bajo consumo impulsan el auge del control por voz
- STMicroelectronics presenta ST-MC-SUITE: plataforma digital única para diseño de control de motor STM32/STM8