Archivo del Autor: ecarletti

Control de relés con control remoto IR: Domótica (3)

En este ejemplo probamos el sistema de encendido de lámparas y equipos eléctricos conectados al voltaje de red manejado por un control remoto estándar (IR = Infrarrojo). Los comandaremos con teclas elegidas del control remoto, que primero identificaremos con un simple programa en Arduino.

Si usted desea leer con más detalle sobre control remoto con infrarrojo desde Arduino, le recomendamos el artículo Módulo transmisor de infrarrojo KY-005 (Kit de sensores Keyes 5) en nuestra página.

Para controlar artefactos con voltaje de red, usaremos las salidas normalmente abiertas de un módulo de relé. Si no conoce los módulos de relé que son estándar en la línea Arduino, recomendamos leer el artículo que inició esta serie Módulos de relé y Arduino: Domótica (1).

Utilizamos el mismo circuito armado en el artículo anterior: Control con relés por interfaz serie: Domótica(2). Le agregamos únicamente el sensor de recepción de infrarrojos, un sensor VS1838B proveniente de China, muy común en los kits de Arduino y en el mercado.

Se puede utilizar cualquier receptor de control remoto, incluso uno obtenido de desarme, si se tienen identificados sus pines de conexión.

El sensor no es un tan solo un fototransistor, posee un circuito integrado interno que filtra la señal de 38 KHz que modula el haz de infrarrojo, y es la que contiene los comandos de control. La salida de señal entrega una onda cuadrada de niveles TTL entre 0 y 5V. Existen modelos que entregan señal a niveles de 0 a 3,3V.

Es posible que usted encuentre el kit de la imagen que sigue en los sitios especializados, pero no es necesario. Alcanza con conectar el sensor al Arduino y utilizar un control remoto cualquiera de los que haya en su casa.

El sensor utilizado en este kit es, justamente, el VS1838B.


La que sigue es la manera más básica de conectarlo al Arduino, y es el circuito con el que comenzaremos a trabajar en las pruebas iniciales. La principal de ellas, obtener el listado de los datos que llegan al Arduino al presionar cada tecla.

Advertencia: cuando realiza proyectos que están conectados a la red eléctrica, realmente debe saber lo que está haciendo, de lo contrario, puede producirse un accidente. Este es un tema serio y queremos que esté seguro. Si no está 100% seguro de lo que va a hacer, por favor no toque nada.
¡Pregúntele a alguien que sepa!

El siguiente programa utiliza la biblioteca IRemote (creada por >shirriff). Consiste de un ciclo continuo que espera a que llegue un comando de control remoto, y entonces lo muestra por el Monitor Serie.

Con este programa en el Arduino y la pantalla del monitor serie abierta, pulsar cada tecla del control remoto para conocer sus valores. Es conveniente escribir los valores en un TXT para utilizarlos cada vez que sea necesario. Una lista como la que sigue, que corresponde a un control remoto de Direct TV. Los valores están en decimal.

48799: [guide]
45244: [active]
38057: [list]
33026: [exit]
57063: [back]
4985: [menu]
864: [info]
64187: [rojo]
14499: [verde]
49424: [amar]
59787: [azul]
57375 63414: [vol+]
53295 63414: [vol-]
31762: [guion bl]
16195: [enter]
65001: [prev]
61455: [mute]
6654: [flecha adel]
1579: [flecha atrás]
57094: [flecha derecha]
38068: [flecha izquierda]
22183: [select]
32630: [1]
23217: [2]
28078: [3]
59460: [4]
44135: [5]
37740: [6]
54067: [7]
11155: [8]
45264: [9]
29399: [0]
26583 26583 39270 63414: [on]
26583 26583 39270 63414: [off]
32895 63414: [tv input]

El control remoto del kit de sensor IR Keyes posee los siguientes valores en hexadecimal (puede diferir según el modelo):

0xFFA25D: CH-
0xFF629D: CH
0xFFE21D: CH+
0xFF22DD: PREV
0xFF02FD: NEXT
0xFFC23D: PLAY/PAUSE
0xFFE01F: VOL-
0xFFA857: VOL+
0xFF906F: EQ
0xFF6897: 0
0xFF9867: 100+
0xFFB04F: 200+
0xFF30CF: 1
0xFF18E7: 2
0xFF7A85: 3
0xFF10EF: 4
0xFF38C7: 5
0xFF5AA5: 6
0xFF42BD: 7
0xFF4AB5: 8
0xFF52AD: 9

Circuito para estas pruebas

Nota: en este circuito se alimentan los led emisores de los optoacoples desde la misma fuente de los relés. Para separar totalmente los circuitos, quitar el jumper entre VCC y JD-VCC y alimentar VCC desde los 5V de la placa Arduino.

Criterio de control

En este primer experimento hemos elegido como comandos para encender y apagar las salidas un conjunto de letras a enviar por línea serie. Para el relé 1 enviamos la letra “A” para encender, y la letra “a” para apagar. El relé 2 se enciende con la letra “B” y se apaga con la “b”. Y así sucesivamente si hubiese más relés. Para apagar todo al mismo tiempo elegimos enviar un “0” (cero).

La lista de comandos es como sigue:

Botón 1 – Activa el relé 1 / Botón 2 – Apaga el relé 1
Botón 3 – Activa el relé 2 / Botón 4 – Apaga el relé 2
Botón 0 – Apaga todos los relés

Programa 1 para dos relés

Copie el siguiente código en su IDE de Arduino y súbalo a su placa.

Advertencia: no es conveniente cargar código nuevo cuando su Arduino
está conectado al módulo de relés. Siempre quite la alimentación de 5V a este módulo.

Programa 2

En esta modificación de programa utilizamos una opción que nos permite usar una única letra de comando para encender y apagar. El «truco» consiste en alternar el estado del relé de encendido a apagado en cada recepción de la letra, utilizando una operación lógica NOT, que se representa con el símbolo !




Criterio de control

En este caso la lista de comandos es como sigue:
Botón 1 – Activa el relé 1 / Botón 1 apaga el relé 1 al pulsar de nuevo
Botón 2 – Activa el relé 2 / Botón 2 apaga el relé 2 al pulsar de nuevo

Programa 3:

El que sigue es un ejemplo para ampliar el manejo a 4 relés. Como observarán, sólo es necesario copiar y pegar y usar los códigos correspondientes.

En estos programas, la parte del código donde llega el código de comando está entre dos hileras de asteriscos. Reemplazando ese bloque de código es posible utilizar otros métodos de ingreso de datos para comandar la placa de relés.

Puede ser utilizando caracteres llegados desde una placa bluetooth, por I2C o SPI desde otro microcontrolador, un módulo de interfaz RS-485, o diversos sistemas basados en RF o enlaces de luz infrarroja, láser, etc.

En todos los casos, la comunicación de control se basará en caracteres de control ingresados por TX/RX u otro medio similar, incluyendo un ingreso directo implementado con entradas digitales y pulsadores.

El resto del código será siempre el mismo, la función con la estructura Switch…Case.

Las opciones las desarrollamos en la serie de artículos anteriores y los que siguen a este.

Artículos relacionados:

Módulos de relé y Arduino: Domótica (1)
Control con relés por interfaz serie: Domótica (2)
Descripción y funcionamiento del Bus I2C
¿Qué es la comunicación serie?



Control con relés por interfaz serie: Domótica (2)

En este ejemplo haremos un sistema de encendido lámparas y equipos eléctricos que funcionan con voltaje de red, y los controlaremos con caracteres enviados por línea serie a través del Monitor Serie del IDE de Arduino. Si usted desea leer con más detalle sobre la comunicación serie, le recomendamos el artículo ¿Qué es la comunicación serie? en nuestra página.

Para controlar artefactos con voltaje de red, usaremos las salidas normalmente abiertas de un módulo de relé. Si no conoce los módulos de relé utilizados usualmente en la línea Arduino, recomendamos leer el artículo previo de esta serie Módulos de relé y Arduino: Domótica (1).

Advertencia de seguridad

Antes de continuar con este proyecto, queremos recordarle que está tratando con la tensión de la red. Lea atentamente la siguiente advertencia de seguridad.

Advertencia: cuando realiza proyectos que están conectados a la red eléctrica, realmente debe saber lo que está haciendo, de lo contrario, puede producirse un accidente. Este es un tema serio y queremos que esté seguro. Si no está 100% seguro de lo que va a hacer, por favor no toque nada.
¡Pregúntele a alguien que sepa!

Partes necesarias

■ Módulo de 8 relés (o menos si lo desea, según la necesidad)
■ Arduino UNO
■ Cable USB
■ Cables, portalámparas, lámparas y tomacorrientes
■ Fuente de 5V 2A para alimentación de los relés

Esquemático

El sistema armado como prototipo se ve aproximadamente como en la foto que sigue:

Criterio de control

En este primer experimento hemos elegido como comandos para encender y apagar las salidas un conjunto de letras a enviar por línea serie. Para el relé 1 enviamos la letra “A” para encender, y la letra “a” para apagar. El relé 2 se enciende con la letra “B” y se apaga con la “b”. Y así sucesivamente para los 8 relés. Para apagar todo al mismo tiempo elegimos envíar un “0” (cero).

La lista de comandos es como sigue:

A – Activa el relé 1 / a – Apaga el relé 1
B – Activa el relé 2 / b – Apaga el relé 2
C – Activa el relé 3 / c – Apaga el relé 3
D – Activa el relé 4 / d – Apaga el relé 4
E – Activa el relé 5 / e – Apaga el relé 5
F – Activa el relé 6 / f – Apaga el relé 6
G – Activa el relé 7 / g – Apaga el relé 7
H – Activa el relé 8 / h – Apaga el relé 8
0 – Apaga todos los relés




Programa 1

Copie el siguiente código en su IDE de Arduino y prográmelo en su placa Arduino utilizando la opción «Subir».

Advertencia: no es conveniente cargar código nuevo cuando su Arduino
está conectado al módulo de relés. Siempre quite la alimentación de 5V a este módulo.

Colocamos entre dos hileras de asteriscos la parte del código donde se obtiene la letra de comando desde la línea serie. Reemplazando ese bloquecito de código es posible utilizar diversos métodos de ingreso de datos para comandar la placa de relés.

Por ejemplo utilizando caracteres llegados desde una placa bluetooth, por I2C o SPI desde otro microcontrolador, un módulo de interfaz RS-485, o diversos sistemas basados en RF (Wi-Fi, 2,4 GHz, etc.) o enlaces de luz infrarroja, láser, etc.

En todos los casos, la comunicación de control se basará en caracteres de control ingresados por TX/RX u otro medio similar de comunicación de caracteres, incluyendo una entrada paralela de 8 bits implementada por un puerto o con el uso de un chip auxiliar, y convertidos en una variable char (cuando es necesario).

El resto del código será siempre el mismo, la función con la estructura Switch…Case.

Por supuesto, usted puede iniciar sus pruebas con un circuito más sencillo, como el que sigue:

Todas las diferentes opciones de control las desarrollamos en detalle en la serie de artículos que siguen en la secuencia de publicación.

Programa 2

En esta modificación de programa utilizamos una opción que nos permite usar una única letra de comando para encender y apagar. El «truco» consiste en alternar el estado del relé de encendido a apagado en cada recepción de la letra, utilizando una operación lógica NOT, que se representa con el símbolo !

Criterio de control

En este caso la lista de comandos es como sigue:

a – Activa el relé 1 / a apaga el relé 1 al pulsar de nuevo
b – Activa el relé 2 / b apaga el relé 2 al pulsar de nuevo
c – Activa el relé 3 / c apaga el relé 3 al pulsar de nuevo
d – Activa el relé 4 / d apaga el relé 4 al pulsar de nuevo
e – Activa el relé 5 / e apaga el relé 5 al pulsar de nuevo
f – Activa el relé 6 / f apaga el relé 6 al pulsar de nuevo
g – Activa el relé 7 / g apaga el relé 7 al pulsar de nuevo
h – Activa el relé 8 / h apaga el relé 8 al pulsar de nuevo
0 – Apaga todos los relés

Artículos relacionados:

Módulos de relé y Arduino: Domótica (1)
Control de relés con control remoto IR (domotica-3)
Descripción y funcionamiento del Bus I2C
¿Qué es la comunicación serie?



Módulos de relé y Arduino: Domótica (1)

En este artículo ofrecemos información para controlar dispositivos que funcionan con el voltaje de red usando un módulo de relé. Al final de este trabajo usted debería poder controlar cualquier dispositivo eléctrico con un microcontrolador como el Arduino.

Módulo de dos relés

Un relé es un interruptor mecánico operado eléctricamente que se puede encender o apagar, dejando pasar la corriente o no, y se puede controlar con voltajes bajos, como los 5V utilizados en la alimentación de un Arduino.

Nota: «NO» corresponde al inglés Normally Open (normalmente abierto) y «NC» a Normally Closed (normalmente cerrado). Un relé desactivado tiene unidos entre sí los contactos COMÚN y NC, y cuando se lo activa aplicando corriente a su bobina, quedan unidos entre sí los contactos COMÚN y NO.

Controlar un módulo de relé con el Arduino es lo mismo que controlar cualquier otra salida digital. El consumo de corriente de una de sus entradas es el mismo que se necesita para encender un led.

Aquí vemos cómo los relés están marcados en la parte de abajo, del mismo modo que se puede ver el símbolo con la disposición de los contactos del relé en la salida de alto voltaje del módulo:

Diagrama interno de los módulos de relé (se muestra para un solo relé, los circuitos se repiten)

En primer lugar veamos el esquemático que ofrece el fabricante:

El conector amarillo horizontal, el que no tiene un nombre de identificación, es el juego de pines de entrada de alimentación. Por allí ingresan al módulo tres valores:

GND, común o tierra.
VCC o alimentación positiva de 5V para la parte de la lógica de entrada: el resistor R1, la sección de emisión de luz de U1 (pines 1 y 2 del optoacoplador), N1 (led indicador) y IN0 (entrada del control).
■ Y JD-VCC, por donde ingresan 5V para alimentar el circuito de accionamiento del relé, compuesto por el fototransistor de U1 (pines 3 y 4 del optoacoplador), el resistor R2, el transistor Q1 para manejar la corriente de la bobina, D1 (diodo para eliminar la contracorriente del bobinado) y la bobina en sí del relé.

El conector J1 lleva al exterior los contactos del relé:

■ 1 es NO (Normally Open = Normalmente Abierto)
■ 2 es C, el contacto Común
■ 3 es NC (Normally Closed = Normalmente Cerrado).

Como es posible que algún lector no conozca el funcionamiento de un optoacoplador (también llamado optoacople), lo explicamos aquí.

Un optoacoplador es un chip como el de la imagen. Posee una entrada de dos pines (1 y 2 en el diagrama) que conectan a un led (diodo emisor de luz) y una salida de dos pines que conectan a un fototransistor (3 y 4 en el diagrama). El encendido del led pone en conducción al fototransistor, lo que cierra circuito entre su colector (pin 4) y su emisor (pin 3). Lo más importante del funcionamiento es que no hay contacto eléctrico entre entrada y salida. El único contacto es la luz emitida por el led, lo que implica una aislación muy elevada entre entrada y salida (en el orden de los 5000V), protegiendo las entradas (en este caso conectadas a un microcontrolador) ante cualquier riesgo de alto voltaje producido en el área de salida.

Estado desactivado del relé:

Estado activado del relé:

El módulo de relé de la foto del principio de este artículo tiene dos canales (los relé son las piezas azules). Hay otros modelos con uno, cuatro, ocho y hasta dieciséis canales. Este módulo debe ser alimentado con 5V, lo que es apropiado para usar con un Arduino. Hay otros módulos de relé que funcionan con 3,3V, ideal para ESP32, ESP8266 y otros microcontroladores, y también hay modelos de 12V.

Conexiones del módulo de relé

La siguiente figura muestra la función de los contactos del módulo de relé.

Los seis pines en el lado izquierdo del módulo del relé controlan voltaje alto, y los pines en el lado derecho se conectan al componente que entrega bajo voltaje, como los pines digitales de un Arduino u otro microcontrolador.

Conexiones de tensión de red

El lado de alto voltaje tiene dos conectores, cada uno con tres contactos: común (COM), normalmente cerrado (NC: Normally Closed) y normalmente abierto (NO: Normally Open).

COM : pin común

NC (Normalmente cerrado): la salida normalmente cerrada se usa si es necesario que el relé cierre circuito en estado de reposo, sin alimentación incluso, de modo que la corriente fluya por estos contactos hasta que se envíe una señal por las entradas del módulo para abrir ese circuito y detener la corriente.

NO (normalmente abierto): la configuración normalmente abierta funciona a la inversa: este contacto del relé está siempre abierto, y el circuito no conduce corriente a menos que se envíe una señal por su entrada para activar el circuito.

Si solo se desea encender una lámpara ocasionalmente, lo mejor es usar la configuración de circuito normalmente abierto.




Cableado de pines

El lado de baja tensión tiene un conjunto de cuatro pines, y otro conjunto de tres pines.

El conjunto señalado con flechas de color posee las conexiones de VCC y GND para alimentación de la lógica digital del módulo (esencialmente, los leds de los optoacopladores de entrada), y la entrada 1 (IN1) y entrada 2 (IN2) para controlar los relés 1 y 2, respectivamente, aplicando un nivel lógico BAJO.

El otro conjunto de pines (señalado por flechas grises) tiene los pines JD-VCC, VCC y GND. El pin JD-VCC es la alimentación para los electroimanes de los relés, y se lo alimenta generalmente con una fuente de 5V separada. Para hacerlo se retira el puente (celeste en la imagen) que une la alimentación de los leds de los optoacopladores con la alimentación de las bobinas de los relés. Usando dos fuentes independientes se obtiene la máxima separación eléctrica entre las entradas de control y la línea controlada de 220V, u otro voltaje superior a 5V, en las salidas.

NOTA: observe que el módulo tiene un puente que conecta los pines VCC y JD-VCC; el que se muestra aquí es azul, pero el de su módulo puede ser de un color diferente. El puente permite elegir si el circuito está físicamente conectado a los 5V del Arduino o no, y se puede optar por tenerlo colocado o no. Con el puente puesto, los pines VCC y JD-VCC están unidos. Eso significa que el electroimán del relé se alimenta directamente del pin de alimentación del Arduino, de modo que el módulo de relé y los circuitos de Arduino no están físicamente aislados entre sí. Sin el puente, se debe proporcionar una fuente de alimentación independiente para activar el electroimán del relé a través del pin JD-VCC. Esa configuración aísla físicamente los relés del Arduino, gracias al optoacoplador incorporado en el módulo.

Las conexiones entre el módulo de relé y el Arduino son realmente simples:

GND : va a común o “tierra” (lado negativo de la alimentación)
IN1 : controla el primer relé (se conectará a un pin digital Arduino)
IN2 : controla el segundo relé (debe estar conectado a un pin digital Arduino si se está utilizando este segundo relé. De lo contrario, no necesita conectarlo)
VCC : va a 5V

Luego de esta introducción para familiarizarnos con los módulos, veremos algunos detalles mecánicos y electrónicos, y luego un ejemplo sencillo para controlar el relé con un programa en el Arduino.

Un relé por dentro:


Conclusión

Controlar un módulo de relé con el Arduino es tan simple como controlar una salida digital: solo se deben enviar señales ALTAS o BAJAS utilizando un pin digital de Arduino, u otro microcontrolador o circuito digital. Con el módulo de relé se pueden controlar casi todos los dispositivos caseros de corriente alterna (no solo lámparas). Si usted va a manejar motores, es conveniente utilizar un componente de potencia de mayor capacidad, por ejemplo un relé de estado sólido.

Esta recomendación se debe a que los contactos de un relé que maneja excesiva corriente con voltajes altos producen chispas al abrirse y al cerrarse, y el efecto es mucho más si la carga que manejan es inductiva (bobinados). Luego de un tiempo, los contactos metálicos pueden quedar pegados entre sí, o dejar de conducir corriente por la carbonización del metal.

En la foto que sigue se muestran a la izquierda contactos de relé en perfectas condiciones, y a la derecha cómo quedan cuando son afectados por las chispas debidas a sobrecargas de corriente.

Prueba 1:

Para visualizar de manera rápida y simple la activación de un relé con una lámpara conectada, usted puede correr el programa básico Blink que se ofrece en la lista de ejemplos del IDE de Arduino, conectando la entrada (IN1, por ejemplo) al pin digital 13, y alimentando el módulo con 5V y GND desde las salidas del Arduino. Esto solo es conveniente como experimento, una prueba simple, pero recuerde que hay que limitarse a trabajar con un solo un relé conectado y activado a la vez. El relé cerrará cada vez que el led se apague, una vez por segundo.

Diagrama para la prueba:

En el artículo que sigue, Activar relés usando línea serie: Domótica (2), mostraremos una de las maneras de comandar estos módulos para su uso en control de luces y artefactos eléctricos.

Artículos relacionados:


Control con relés por interfaz serie: Domótica (2)
Control de relés con control remoto IR (domotica-3)
Descripción y funcionamiento del Bus I2C
¿Qué es la comunicación serie?



Pez robot se mueve alimentado con “sangre” falsa

La historia comienza a centenares de metros de altura con las aves migratorias, y termina con un pez robótico nadando en el agua debajo. Para prepararse para sus viajes, las aves engordan mucho, hasta casi duplicar su peso, lo que las convierte en baterías emplumadas. Queman esa reserva de energía para impulsar sus alas a lo largo de muchos días y muchos kilómetros, y para evitar morir de hambre y congelarse. Finalmente, llegan extenuadas a sus destinos.

Una buena idea, pensaron los ingenieros de Cornell y de la Universidad de Pennsylvania, para un nuevo sistema de alimentación de potencia para máquinas. Les hizo pensar: la grasa es una batería genial, pero no es muy factible replicarla en un robot. ¿Pero… y la sangre? En un ser humano, la sangre distribuye oxígeno y energía para las células en todo el cuerpo. Y algunos robots, ya se mueven en base a fluidos, en forma de hidráulica. Entonces, ¿por qué no modificar ese fluido para transportar energía, ya que nuestra sangre alimenta nuestros músculos?

A lo que han llegado no es un ave robot (demasiado complicada y con intensa necesidad de energía) sino a un pez león robot que utiliza un sistema vascular rudimentario y «sangre» para energizarse y alimentar hidráulicamente sus aletas. Esta tecnología aún está en sus primeros días, y de hecho este pez es extremadamente lento, pero quizás algunas máquinas del mañana podrían deshacerse de las baterías y los cables y alimentarse como organismos biológicos.

Inflexiblemente, los robots actuales están segmentados. Tienen una batería de iones de litio, que distribuye la energía por medio de cables a los motores de sus extremidades, a los que se conoce como actuadores. Este nuevo pez león robótico tiene baterías, pero están esparcidas por todo su cuerpo y funcionan en conjunto con dos bombas, una para alimentar las aletas pectorales y otra para la cola. Juntas, las baterías y las bombas actúan más como corazones biológicos que como una batería de ion litio en un robot tradicional.

El primer componente es la «sangre», en esencia un fluido hidráulico cargado con iones disueltos, lo que le da potencial químico para alimentar la electrónica. «El fluido hidráulico transmite fuerza, y solo fuerza», dice Robert Shepherd, el robotista de Cornell, coautor de un nuevo artículo en Nature que describe el sistema. «En nuestro fluido, estamos transmitiendo fuerza y estamos transmitiendo energía eléctrica».




Este líquido cargado fluye a través de las células de la batería en el abdomen y las aletas del pez. Cada celda tiene dos piezas de metal opuestas: un cátodo y un ánodo. A medida que el fluido fluye más allá de estos, crea un desequilibrio de carga o voltaje que hace que los electrones fluyan a través de la electrónica que alimenta las dos bombas. Estos a su vez mantienen el bombeo del fluido. Finalmente las celdas de la batería se agotarán, ya que el líquido pierde iones y dejará de circular. En ese momento es posible recargar el líquido para que los peces sigan funcionando. «En realidad, podrían drenar el fluido e inyectar más fluido cargado», dice Shepherd, «algo así como llenar su tanque de combustible en la estación de servicio».

El fluido, entonces, energiza a los peces. Pero también actúa como un fluido hidráulico tradicional, ya que transmite fuerza a la cola y las aletas pectorales. Cuando las bombas empujan el fluido hacia las aletas, se doblan hacia atrás y hacia delante para impulsar el robot. Las aletas pectorales funcionan de la misma manera para guiar a los peces hacia la izquierda y hacia la derecha.

Esto no mueve al robot de manera particularmente rápida: los peces pueden cubrir aproximadamente 1,5 veces la longitud de su cuerpo por minuto. «Definitivamente se lo comerían si estuviera en el océano», dice Shepherd.

Pero la velocidad del robot mejorará, ya que Shepherd y su equipo pueden aumentar el área de superficie de los ánodos y cátodos para mejorar la densidad de potencia. A diferencia de un robot tradicional de cuerpo duro, pueden llenar con celdas de batería donde lo deseen y dejar que la forma blanda del robot se adapte a los componentes adicionales. De este modo, se construye un sistema circulatorio robótico extendido: bombas y baterías que transportan el líquido por todo el robot.

Este sistema tiene algunas limitaciones importantes, especialmente teniendo en cuenta el estado avanzado de la tecnología de iones de litio. «La densidad de potencia es de 30 a 150 veces menos en lo que se observa en comparación con la capacidad de una batería de ión litio», dice el robotista del MIT CSAIL Robert Katzschmann, cuyo pez robot utiliza una batería de ión litio tradicional. Eso significa que el robot de Katzschmann puede moverse 20 veces más rápido que este nuevo pez.

Además, la naturaleza distribuida de este nuevo sistema de energía en los peces implica que no es posible cambiar con facilidad una batería sobre la marcha. «Cada vez que iba al océano, simplemente reemplazaba la batería por una nueva, así que no tengo que esperar para recargar mi prototipo», dice Katzschmann.

Aún así, podría haber un lugar para esta nueva visión de la robótica, junto con los sistemas tradicionales de iones de litio. Hay un montón de peces en el mar, después de todo.



¿Qué es la comunicación serie?

La electrónica integrada se conforma con circuitos interconectados (procesadores u otros circuitos integrados) para crear un sistema en el que están repartidas las funciones. Para que esos circuitos individuales intercambien su información, deben compartir un protocolo de comunicación común. Se han definido muchos protocolos de comunicación para lograr este intercambio de datos y, esencialmente, cada uno puede ubicarse en una de dos categorías: 1. Paralelo o 2. Serie.

Paralelo versus serie

Las interfaces paralelas transfieren múltiples bits simultáneamente. Por lo general, requieren barras (buses) de datos, que se transmiten a través de ocho, dieciséis o más cables. Los datos se transfieren en amplios oleajes de 1s y 0s.

Un bus de datos de 8 bits, controlado por un reloj,
que transmite un byte por cada pulso de reloj. Se utilizan 9 líneas


En cambio, las interfaces serie transmiten sus datos un bit a la vez. Estas interfaces pueden operar con tan solo un cable, por lo general nunca más de cuatro.

Ejemplo de una interfaz serie, transmitiendo un bit cada pulso de reloj. Solo se requieren 2 cables


Piense en las dos interfaces como una fila de automóviles: una interfaz paralela sería una autopista de 8 carriles o más, mientras que una interfaz en serie es más parecida a una carretera de dos carriles. Durante un lapso determinado, la autopista tiene el potencial de llevar a más personas a destino, pero en muchos casos ese sistema sencillo de dos carriles responde a su propósito, y construirlo cuesta una fracción de los fondos.

La comunicación paralela ciertamente tiene sus beneficios. Es rápida, directa y relativamente fácil de implementar. Pero requiere muchas más líneas de entrada/salida (E/S). Si alguna vez ha tenido que traspasar un proyecto de un Arduino Mega a un Arduino UNO básico, sabe que las líneas de E/S en un microprocesador pueden ser preciosas por lo limitadas. Por lo tanto, cada vez más optamos por la comunicación en serie, sacrificando una velocidad potencial para ahorrar pines.

Serie asíncrono (asincrónico)

A lo largo de los años, se han creado docenas de protocolos en serie para satisfacer las necesidades particulares de los sistemas integrados. USB (Universal Serial Bus = Bus Serie Universal) y Ethernet son dos de las interfaces serie de computación más conocidas en la actualidad. Otras interfaces serie muy comunes son SPI (del inglés Serial Peripheral Interface), I²C (del inglés Inter-Integrated Circuit) y el interfaz serie estándar TX/RX, del que hablaremos aquí. Estas interfaces serie pueden clasificarse en uno de dos grupos: sincrónico o asincrónico.

Una interfaz serie sincrónica siempre necesita tener una señal de reloj junto a las líneas de datos, por lo que todos los dispositivos en un bus serie sincrónico comparten un pulso común de reloj. Esto hace que en una transferencia en serie más directa, a menudo más rápida, también se requiera al menos un cable adicional entre los dispositivos de comunicación. Entre los ejemplos de interfaces sincrónicas están SPI e I²C.

Asincrónico significa que los datos se transfieren sin el respaldo de una señal de reloj conectada entre sistemas. Este método de transmisión es ideal para minimizar los cables necesarios, y en consecuencia la cantidad de pines de E/S utilizados, pero implica que debemos poner un poco de esfuerzo adicional en transferir y recibir datos de manera confiable. El protocolo en serie que analizaremos es la forma más común para las transferencias asincrónicas. De hecho, es tan común que cuando la mayoría de la gente dice «en serie», “o serial”, están hablando sobre este protocolo.

El protocolo serie sin reloj que analizaremos se usa ampliamente en electrónica integrada. Si está buscando agregar un módulo serie GPS, Bluetooth, XBee, LCD, o muchos otros dispositivos externos a su proyecto, es probable que necesite un interfaz serie.

Reglas de la comunicación serie

El protocolo serie asincrónico tiene una serie de reglas integradas: mecanismos que ayudan a garantizar transferencias de datos sólidas y sin errores. Estos mecanismos, que obtenemos para evitar la señal del reloj externo, son:

   ■ Bits de datos
   ■ Bits de sincronización
   ■ Bits de paridad
   ■ Velocidad en baudios

Teniendo en cuenta la variedad de estos mecanismos de señalización, vemos que no hay una sola manera de enviar datos en serie. El protocolo es altamente configurable. La parte crítica es asegurarse de que ambos dispositivos en una línea serie estén configurados para usar exactamente los mismos protocolos.

Velocidad en baudios

La especificación de velocidad de transmisión indica qué tan rápido se envían los datos a través de una línea serie. Normalmente se expresa en unidades de bits por segundo (bps). Si se invierte la velocidad en baudios, se puede averiguar cuánto tiempo se tarda en transmitir cada bit. Este valor determina durante cuánto tiempo el transmisor mantiene en alto/bajo una línea serie, o a qué velocidad muestrea su línea el dispositivo receptor.

Las velocidades en baudios pueden ser casi cualquier valor dentro de lo que permite el hardware. El único requisito es que ambos dispositivos funcionen a la misma velocidad. Una de las velocidades en baudios más comunes, especialmente para cosas simples donde la velocidad no es crítica, es de 9600 bps. Otras velocidades en baudios «estándar» son 1200, 2400, 4800, 19200, 38400, 57600 y 115200.

Cuanto mayor sea la velocidad en baudios, más rápido se envían/reciben los datos, pero existen límites para la velocidad a la que se pueden transferir los datos. Por lo general, no verá velocidades superiores a 115200, lo que es suficientemente rápido para la mayoría de los microcontroladores. Aumente demasiado y comenzará a ver errores en el extremo receptor, ya que los pulsos de reloj y los períodos de muestreo no pueden mantenerse.

Estructurando los datos

Cada bloque de datos (generalmente un byte) que se transmite se envía en realidad en un paquete de bits. Los paquetes se crean agregando bits de sincronización y paridad a nuestros datos.

Algunos símbolos en la estructura del paquete tienen tamaños de bits que son configurables.

Vamos a entrar en los detalles de cada una de estas partes de la estructura del paquete, o bloque.

Bloque de datos

La verdadera sustancia de cada paquete serie es la información que lleva. Ambiguamente llamamos a este bloque de datos un “bloque”, porque su tamaño no está específicamente establecido. En este estándar, la cantidad de datos en cada paquete se puede establecer en valores de 5 a 9 bits. Ciertamente, el tamaño de datos clásico es un byte de 8 bits, pero se usan otros tamaños. Un bloque de datos de 7 bits puede ser más eficiente que 8 si solo está transfiriendo caracteres ASCII de 7 bits.

Después de acordar la longitud para un caracter, ambos dispositivos serie también tienen que acordar el formato de sus datos. ¿Se envían los datos desde el bit más significativo (most significative bit = msb) al menos significativo, o viceversa? Si no se indica lo contrario, generalmente se puede asumir que los datos se transfieren enviando primero el bit menos significativo (least significative bit = lsb).

Bits de sincronización

Los bits de sincronización son dos o tres bits especiales transferidos con cada porción de datos. Son el bit de inicio y el(los) bit(s) de parada. Tal como indica su nombre, estos bits marcan el principio y el final de un paquete. Siempre hay un único bit de inicio, pero la cantidad de bits de parada se puede configurar en uno o dos (aunque normalmente se deja en uno).

El bit de inicio siempre se indica mediante una línea de datos inactiva que pasa de 1 a 0 (ALTO a BAJO). Los bits de parada volverán al estado inactivo manteniendo la línea en 1 (ALTO).

Bits de paridad

La paridad es una forma de comprobación de errores muy simple y de bajo nivel. Se presenta en dos variantes: impar o par. Para generar el bit de paridad, se suman todos los bits del byte de datos (5 a 9), y el resultado de la suma define si el bit es 1 o 0. Por ejemplo, suponiendo que la paridad se establece en par y se agrega a un byte de datos como 0b01011101, que tiene una cantidad impar de 1s (5), el bit de paridad quedaría en 1. Por el contrario, si el modo de paridad se configuró en impar, el bit de paridad sería 0.

La paridad es opcional, y no se usa mucho. Puede ser útil para transmitir a través de medios ruidosos, pero también ralentizará un poco la transferencia de datos y requiere que tanto el transmisor como el receptor implementen el manejo de errores (generalmente, si se detecta error, los datos recibidos con falla deben reenviarse).

Un ejemplo

9600 8N1 – 9600 baudios, 8 bits de datos, sin paridad y 1 bit de parada: es uno de los protocolos serie más utilizados. Entonces, ¿cómo se vería un paquete o dos de datos de 9600 8N1?

Un dispositivo que transmita los caracteres ASCII ‘O’ y ‘K’ tendría que crear dos paquetes de datos. El valor ASCII de O (en mayúsculas) es 79, que se divide en un valor binario de 8 bits de 01001111, mientras que el valor binario de K es 01001011. Todo lo que queda es agregar bits de sincronización.

No se establece específicamente, pero la norma más aceptada es que los datos se transfieren enviando primero el bit menos significativo. Observe cómo se envía cada uno de los dos bytes a medida que se lee de derecha (bit 0) a izquierda (bit 7).

Dado que estamos transfiriendo a 9600 bps, el tiempo empleado en mantener cada uno de esos bits alto o bajo es 1/9600 (bps) o 104 µs por bit.

Por cada byte de datos transmitidos, en realidad como mínimo se envían 10 bits: un bit de inicio, 8 bits de datos y un bit de parada. Entonces, a 9600 bps, en realidad estamos enviando 9600 bits por segundo o 960 (9600/10) bytes por segundo.

Ahora que sabemos cómo construir paquetes serie, podemos pasar a la sección de hardware. Allí veremos cómo esos 1s y 0s, y la velocidad de transmisión, se implementan a un nivel de señal.

Cableado y Hardware

Un bus serie consta de solo dos cables, uno para enviar datos y otro para recibir. Entonces, los dispositivos serie deben tener dos pines serie: el receptor: RX y el transmisor: TX.

Cableado en serie

Es importante tener en cuenta que esas etiquetas RX y TX son con respecto al dispositivo en sí. Entonces, el RX de un dispositivo debe ir al TX del otro y viceversa. Es extraño si uno está acostumbrado a conectar Vcc con Vcc, GND con GND, MOSI con MOSI, etc., pero —pensándolo— tiene sentido. El transmisor debe estar comunicándose con un receptor, no con otro transmisor.

Una interfaz en serie en la que ambos dispositivos pueden enviar y recibir datos es dúplex completo (full-duplex) o semidúplex. Full-duplex significa que ambos dispositivos pueden enviar y recibir simultáneamente. La comunicación semidúplex significa que los dispositivos serie deben turnarse para enviar y recibir.

Algunas conexiones serie pueden implementarse con una sola línea entre un dispositivo de transmisión y un dispositivo de recepción. Por ejemplo, los LCD que tienen conexión serie son solo receptores, y realmente no tienen ningún tipo de información para devolver al dispositivo de control. Esto es lo que se conoce como comunicación serie simplex. Todo lo que necesita es un solo cable desde la transmisión del dispositivo maestro a la línea RX del que recibe.

Implementación de hardware

Hasta ahora fue una cobertura de la comunicación serie asíncrona desde un lado conceptual. Sabemos qué cables necesitamos, pero, ¿cómo se implementa realmente la comunicación en serie a nivel de señal? En una variedad de formas, en realidad. Hay todo tipo de estándares para la comunicación en serie. Veamos algunas de las implementaciones de hardware más populares de serie: nivel lógico o TTL, y RS-232.

Cuando los microcontroladores y otros circuitos integrados de bajo nivel se comunican en serie, generalmente lo hacen a un nivel TTL (Transistor Transistor Logic = Lógica Transistor-Transistor). Las señales serie TTL están en el rango del voltaje que alimenta a un microcontrolador, generalmente de 0V a 3,3V, 0V o 5V. Una señal en el nivel VCC (3,3V, 5V, etc.) indica una línea inactiva, un bit de valor 1 o un bit de parada. Una señal de 0V (GND) representa un bit de inicio o un bit de datos de valor 0.

El protocolo RS-232, que se puede encontrar en algunas de las computadoras y periféricos más antiguos, es como una interfaz serie TTL puesta cabeza abajo. Las señales RS-232 generalmente oscilan entre -13V y 13V, aunque la especificación permite cualquier cosa desde +/- 3V a +/- 25V. En estas señales, un voltaje bajo (-5V, -13V, etc.) indica la línea inactiva, un bit de parada o un bit de datos de valor 1. Una señal RS-232 alta significa un bit de inicio o un bit de datos de valor 0. Eso es lo contrario del protocolo TTL.

Entre los dos estándares de señal en serie, el TTL es mucho más fácil de implementar en circuitos integrados. Sin embargo, los niveles de baja tensión son más susceptibles a sufrir pérdidas en las líneas de transmisión largas. El RS-232 o estándares más complejos —como RS-485— son más adecuados para transmisiones en serie de largo alcance.

Cuando conecte dos dispositivos serie juntos, es importante asegurarse de que coincidan los voltajes de su señal. No se puede conectar directamente un dispositivo serie TTL con una línea RS-232. Se deben adaptar esas señales.

Continuando, exploraremos la herramienta que usan los microcontroladores para convertir sus datos que se encuentran presentes en un bus paralelo desde y hacia una interfaz serial: se llama UART.

UARTs

La última pieza de este armado en serie es encontrar algo para crear los paquetes en serie y controlar las líneas de hardware físico. Esto se concreta con un módulo llamado UART (Universal Asynchronous Receiver/Transmiter = Receptor/Transmisor Asíncrono Universal).

Un receptor/transmisor asíncrono universal es un bloque de circuitos responsable de implementar la comunicación en serie. En esencia, este UART actúa como un intermediario entre las interfaces paralelas y seriales. En un extremo del UART hay un bus de ocho o más líneas de datos (más algunos pines de control), en el otro lado están los dos cables serie: RX y TX.

UART simplificado
UART
Los UART existen como circuitos integrados independientes, pero en la actualidad es más común que se encuentren dentro de los microcontroladores. Debemos consultar la hoja de datos de un microcontrolador para ver si tiene algún UART. Algunos no tienen, otros tienen uno, otros tienen varios. Por ejemplo, el Arduino UNO, basado en el «antiguo y fiel» ATmega328, tiene un solo UART, mientras que el Arduino Mega, construido sobre un ATmega2560, tiene cuatro UART.

Como lo indican las letras R y T en el acrónimo, los UART son responsables de enviar y recibir datos en serie. En el lado de transmisión, un UART debe crear el paquete de datos —agregando la sincronización y los bits de paridad— y enviar ese paquete por la línea TX con una sincronización precisa (de acuerdo con la velocidad de transmisión establecida). En el extremo de recepción, el UART tiene que muestrear la línea de RX a velocidades acordes con la velocidad de transmisión que se espera, seleccionar los bits de sincronización y entregar como resultado los datos.

UART interno

Los UART más avanzados pueden enviar los datos que reciben a un archivo de memoria de respaldo, llamado búfer, donde pueden permanecer hasta que el microcontrolador vaya a buscarlos. Los UART generalmente publicarán sus datos almacenados en un búfer con un sistema de “el primero que entra es el primero que sale” (First In First Out = FIFO). Los búfer pueden tener apenas unos pocos bits, o pueden ser de gran tamaño, como miles de bytes.

Diagrama de bloques de un UART con FIFO


UARTs de software

Si un microcontrolador no tiene un UART, o no tiene suficientes, se puede implementar la interfaz en serie en bits que son controlados directamente por el procesador. Este es el enfoque que tienen las bibliotecas de Arduino como SoftwareSerial. El uso de bits es intensivo en el procesador, y no suele ser tan preciso como un UART, pero funciona en caso de necesidad.

Errores comunes

Eso fue todo lo básico sobre la comunicación en serie. Podemos dejar señalados algunos errores comunes que un ingeniero, de cualquier nivel de experiencia, puede llegar a cometer:

RX a TX, / TX a RX

Parece bastante simple, pero es un error que algunos cometen un par de veces. Por mucho que desee que sus etiquetas coincidan, siempre asegúrese de cruzar las líneas RX y TX entre los dispositivos serie.

FTDI Basic programando un Pro Mini. Note que RX y TX están cruzados


Discrepancia en la velocidad de transmisión

Los valores de baudios son como claves en lenguajes de la comunicación en serie. Si dos dispositivos no están hablando a la misma velocidad, los datos pueden ser mal interpretados o completamente perdidos. Si todo lo que el dispositivo receptor ve en su línea de recepción está compuesta de caracteres extraños, llamados “basura” en el ambiente, verifique que coincidan las velocidades en baudios definidas en ambos extremos.

Datos transmitidos a 9600 bps, pero recibidos a 19200 bps. Desajuste de baudios = basura


Contención de transferencia en la línea

La comunicación en serie está diseñada para permitir que solo dos dispositivos se comuniquen a través de un bus en serie. Si más de un dispositivo está intentando transmitir en la misma línea serie, podría encontrarse con una contención de bus.

Por ejemplo, si está conectando un módulo GPS a su Arduino, puede conectar la línea de transmisión de ese módulo a la línea RX de Arduino. Pero ese pin Arduino RX ya está conectado al pin TX del convertidor de USB a serie (por ejemplo un chip FTDI) que se usa cada vez que se programa el Arduino, o se usa el Monitor Serie. Esto establece la situación potencial en la que tanto el módulo GPS como el chip FTDI intentan transmitir en la misma línea al mismo tiempo.

Ejemplo de contención de línea (o bus)

No es bueno que dos dispositivos intenten transmitir datos al mismo tiempo en la misma línea. En el mejor de los casos, ninguno de los dispositivos podrá enviar sus datos. En el peor de los casos, las líneas de transmisión de ambos dispositivos se volverán locas (aunque eso es raro y generalmente están protegidos contra esta situación).

Puede ser seguro conectar varios dispositivos receptores a un solo dispositivo de transmisión. Realmente no cabe dentro de las especificaciones, y probablemente esté mal visto por un ingeniero experimentado, pero funcionará. Por ejemplo, si conectamos un LCD serie a un Arduino, el método más sencillo puede ser conectar la línea RX del módulo LCD a la línea TX del Arduino. El TX de Arduino ya está conectado a la línea RX del programador USB, pero eso deja solo un dispositivo controlando la línea de transmisión.

Implementación segura pero dudosa de un transmisor y dos receptores

La distribución de una línea de transmisión de este tipo puede ser peligrosa desde la perspectiva del firmware, ya que no puede elegir qué dispositivo recibe cual transmisión. La pantalla LCD terminará recibiendo datos que no están destinados a ella, lo que podría ordenarle que pase a un estado desconocido.

Hay formas de implementarlo, usando un poco de hardware adicional, pero esto es tema para otro artículo.