Cuando queremos controlar elementos que están conectados a grandes voltajes, como por ejemplo una bombilla de nuestra casa, necesitamos de un componente que por un lado se conecte a la red eléctrica y por otro lado se pueda conectar a nuestra placa de Arduino y que esta controle esa conexión. Para ello disponemos de los reles, unos interruptores eléctricos que conmutan una red de alto voltaje (por ejemplo 220V) a través de un voltaje de control mucho inferior (5V de la Arduino UNO o 3.3V de la Arduino MKR1000). Con este ejemplo serás capaz de controlar cualquier luz de tu casa vía web con un relé y Arduino MKR1000.
La bombilla nos sirve a modo de ejemplo. Con un relé y nuestra placa de Arduino podremos controlar cualquier aparato eléctrico que tengamos en nuestra casa y dar un paso más a domotizarla.
¿Que es un relé?
Como ya te he comentado es un interruptor que podemos activar mediante una señal eléctrica. Un relé esta compuesto por una bobina que al circular una pequeña corriente (3.3V, 5V o 12V) genera un campo magnético y este a su vez hace mover una placa metálica abriendo o cerrando un circuito eléctrico independiente que es por el que circula un voltaje superior (220V).
Existen otros componentes para conmutar un circuito, como son los transistores, pero cuando vamos a trabajar controlando el flujo de tensión de circuitos de media y alta tensión lo debemos hacer con este componente. Los reles están diseñados para aguantar un voltaje alto ya que por un lado el circuito de baja tensión es independiente y por otro el de alta tensión consta de laminas de contacto que soporten grandes tensiones. Pero no todos los reles son iguales y nos tenemos que fijar en unas características para comprar el que necesitamos.
Que tipo de relé necesitamos
Si queremos un relé para nuestro Arduino UNO necesitaremos un relé cuya bobina se pueda excitar con 5V, si lo queremos para nuestra Arduino MKR1000 deberá ser de 3V. Puedes comprar el relé suelto, pero necesitaras para tu circuito un optoacoplador y un diodo. El optoacoplador es un componente muy interesante, hace las funciones de conmutador con un diodo emisor y un fototransistor ajustando la corriente que necesita el relé. También necesitaremos un diodo para evitar que los picos de voltaje del relé llegue a nuestro Arduino.
Pero ya existen reles ensamblados en circuitos impresos con estos componentes por lo que te sugiero que adquieras uno de estos. Cada fabricante pone los pines de conexión de forma diferente, así es que toma esta imagen como ejemplo aunque no variara mucho de tu relé.
(Se puede utilizar un relé de 5V en la MKR1000 utilizando el pin 5V pero necesariamente la placa debe ser alimentada por USB o por el pin Vcc con una alimentación de 5V. Si trabajamos con una batería de 3.7V este pin sacara estos voltajes y no podremos excitar la bobina del relé de 5V)
Ejemplo propuesto
El ejemplo por el que yo aconsejo empezar es controlar una bombilla, ya sea un casquillo con una bombilla o una lampara de mesa. Es el ejemplo clásico pero con el podremos entender como funciona un relé. Este ejemplo lo vamos a hacer con nuestra Arduino MKR1000 y como lo que nos gusta en programarfacil.com es programar, este simple ejemplo lo vamos a transformar en controlar la luz de una estancia a través de una web.
Esto segundo que parece tan complicado, si lo hacemos con la Arduino MKR1000 y siguiendo nuestros consejos, se convierte en algo tan fácil como el primer ejemplo. Así es que vamos a ello!
(Si tienes un Arduino UNO o similar el ejemplo va a seguir siendo valido salvo que no podrás controlarla vía web, pero si entender el funcionamiento de un relé y como programarlo para utilizarlo).
Configurar Arduino MKR1000
Si todavía no has configurado el Arduino MKR1000, sigue estos artículos.
En esta ultima entrada, al final, explica el código que vamos a utilizar. Allí indica que modifiques el pin digital 9 por el pin digital 6, pero en este caso no lo modificaremos vamos a trabajar con el pin 9 y lo vamos a utilizar para encender nuestra bombilla a través de una web.
Esquema eléctrico
El esquema eléctrico con un relé integrado en una PCB con los componentes necesarios (octoacoplador y diodo), es por un lado muy simple y por otro complejo debido, como ya te he comentado, a que cada fabricante coloca los pines de forma diferente. Aunque son todos muy similares. Nosotros vamos a utilizar el que está en este kit que es un relé de un canal.
Así es que a modo de ejemplo te pongo el siguiente esquema para que te pueda servir de orientación y se vea la conexión con la bombilla y la red eléctrica:
En la imagen ves que utilizamos tres conexiones desde nuestro Arduino (para Arduino UNO es igual), la tierra que ira al conector tierra del relé, los 3.3V a la entrada de voltaje y un pin digital que ira a la entrada de señal del relé. Como te he dicho antes, estos pines los montan cada fabricante de forma diferente pero no es difícil averiguar cual es cual. Ahora pasamos a la conexión de alta tensión.
En esta parte estamos trabajando con altos voltajes, así es que si solo quieres excitar el relé y no tu corazón, toda precaución es poca.
Como ves en la imagen la conexión con nuestra bombilla o lampara es muy sencilla. Los relés tienen tres salidas y funcionan a pares, el de en medio con uno de los otros. Tenemos un par que funciona «normalmente cerrado» es decir, este lado con el de en medio esta conectado si no se excita la bobina (circuito cerrado) y el otro «normalmente abierto» que solo conmuta cuando se excita la bobina y es el que vamos a utilizar para este ejemplo. (Para saber que tipo de relé tienes, puedes utilizar la función de continuidad de un tester. Con el relé desconectado puedes comprobar por que par de salidas circula la corriente, esan dos serán las salidas normalmente cerradas).
Conectamos la salida que esta normalmente abierta a la bombilla y la otra a la alimentación. Y ya solo faltaría conectar el cable que falta de la bombilla a la alimentación y tendríamos el circuito terminado.
Código
Para encender una bombilla con un relé, tan solo necesitamos el código necesario para encender un LED, es exactamente igual. El ejemplo del blink con el LED13 nos valdría y haríamos parpadear la luz cada segundo. Lo modificamos con el pin 9 para seguir el contexto y le ponemos dos segundos de pausa. Quedaría así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* Blink para Arduino Autor: Alfonso Contreras López acontreras@gmail.com www.programarfacil.com */ //Pin a utilizar int LedPin = 9; void setup() { pinMode(LedPin, OUTPUT); //modo salida } void loop() { digitalWrite(LedPin, HIGH); // Enciende el pin 6 delay(500); // Espera medio segundo digitalWrite(LedPin, LOW); // Apaga el pin 6 delay(500); // Espera medio segundo } |
Podríamos controlar nuestra bombilla mediante algún componente, por ejemplo podríamos utilizar alguno de estos componentes: un pulsador, un potenciomentro, …
La gran ventaja que nos ofrece la MKR1000 es poder controlar Arduino de manera inalámbrica. Podemos crear una web muy sencilla que permita encender y apagar la bombilla a través de un dispositivo móvil:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
/* WiFi Web Server LED Blink */ #include <SPI.h> #include <WiFi101.h> char ssid[] = "yourNetwork"; // your network SSID (name) char pass[] = "secretPassword"; // your network password int keyIndex = 0; // your network key Index number (needed only for WEP) int status = WL_IDLE_STATUS; WiFiServer server(80); void setup() { Serial.begin(9600); // initialize serial communication pinMode(9, OUTPUT); // set the LED pin mode // check for the presence of the shield: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); while (true); // don't continue } // attempt to connect to Wifi network: while ( status != WL_CONNECTED) { Serial.print("Attempting to connect to Network named: "); Serial.println(ssid); // print the network name (SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } server.begin(); // start the web server on port 80 printWifiStatus(); // you're connected now, so print out the status } void loop() { WiFiClient client = server.available(); // listen for incoming clients if (client) { // if you get a client, Serial.println("new client"); // print a message out the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) { // loop while the client's connected if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); // the content of the HTTP response follows the header: client.print("Enciende la luz <a href=\"/H\">aqui</a><br>"); client.print("Apaga la luz <a href=\"/L\">aqui</a> turn the LED on pin 9 off<br>"); // The HTTP response ends with another blank line: client.println(); // break out of the while loop: break; } else { // if you got a newline, then clear currentLine: currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } // Check to see if the client request was "GET /H" or "GET /L": if (currentLine.endsWith("GET /H")) { digitalWrite(9, HIGH); // GET /H turns the LED on } if (currentLine.endsWith("GET /L")) { digitalWrite(9, LOW); // GET /L turns the LED off } } } // close the connection: client.stop(); Serial.println("client disonnected"); } } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your WiFi shield's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); // print where to go in a browser: Serial.print("To see this page in action, open a browser to http://"); Serial.println(ip); } |
Este código es exactamente igual que el blink que viene en el articulo de configuración, salvo que le hemos dejado el pin digital 9 y hemos modificado los enlaces que salen para que ponga un texto acorde con lo que vamos a controlar. (No olvides cambiar en las lineas 7 y 8 tu configuración de red WiFi)
Con este código y nuestro montaje listo ya solo nos queda probar: