Hay ocasiones en las que tendremos que comunicar nuestra placa Arduino con otros dispositivos externos, lo que significa que tendremos que hacer que nuestra Arduino hable con estos otros elementos. Por lo general, esta comunicación se realiza a través de un estándar muy práctico y extendido llamado comunicación en serie. En forma practica, usaremos la placa Arduino y el puerto serie.
Las comunicaciones en serie proporcionan una manera fácil y flexible para que tu placa Arduino interactúe con tu ordenador y con otros dispositivos.
En este artículo veremos cómo conectar y programar nuestra placa Arduino y el puerto serie para que sea capaz de comunicarse con nuestro ordenador usando comunicación en serie.
Lo que aprenderás aquí es directamente aplicable a cualquier otra conexión que tengas que hacer con otro dispositivo que se pueda comunicar usando comunicaciones en serie y el puerto serie.
¿Qué es la comunicación en serie?
La comunicación en serie es el método más utilizado para intercambiar información entre dos dispositivos.
Y ¿qué son dispositivos?, son cosas como tu teléfono móvil, tu ordenador personal, tu tablet, y por supuesto, tu placa Arduino.
La comunicación en serie es una forma muy fiable y segura de comunicaciones entre dispositivos. Esta seguridad y confiablidad se soporta sobre un conjunto de reglas muy bien definidas, que establecen la forma en que dos dispositivos pueden comunicarse.
A este conjunto de reglas se le llama protocolo, y definen la forma en que los dispositivos van comunicarse. Es como establecer previamente que idioma se va hablar.
¿Cómo funciona la comunicación en serie?
En comunicación en serie, los datos se envían y reciben en forma de pulsos binarios. En otras palabras, podemos decir que un uno lógico “1” representa un pulso alto o VCC y un cero lógico “0” representa un pulso bajo o GND.
La comunicación en serie puede tomar muchas formas dependiendo del tipo y del modo de transmisión y recepción de datos. Los modos de transmisión se clasifican en Simplex, Half Duplex y Full Duplex. Siempre habrá una fuente (también conocida como emisor) y un destino (también llamado receptor) para cada modo de transmisión.
El modo Simplex es una técnica de comunicación unidireccional. Solo un cliente (el emisor o el receptor) están activos a la vez. Si un emisor transmite, el receptor solo puede aceptar. La transmisión de radio y televisión son ejemplos del modo de comunicaciones Símplex.
En modo Half Duplex, tanto el emisor como el receptor están activos, pero no a la vez, es decir, si un emisor transmite, el receptor puede aceptar, pero no puede enviar y viceversa. Un buen ejemplo es internet. Si un cliente (un ordenador) envía una solicitud de una página web, el servidor web procesa la orden y devuelve la información.
El modo Full Duplex es la más ampliamente utilizada. Aquí tanto el emisor como el receptor pueden transmitir y recibir al mismo tiempo. Un ejemplo de esto es una llamada telefónica.
¿Qué es el puerto serie?
Un puerto serie (también denominado puerto serial) es la interfaz (conexión física) entre dos dispositivos mediante la utilización de un cable.
En el pasado, en un ordenador solían haber uno o dos puertos serie. Estos puertos podían ser de 25 pines (DB25) o de 9 pines (DB9).
Actualmente, estos puertos han sido sustituidos por los puertos USB, que son mucho más cómodos y veloces. Pero aún es posible usar los viejos equipos electrónicos que usen el formato anterior de conectores DB9 o DB25, mediante el uso de cable adaptador USB-Serie.
¿Cómo funciona el puerto serie?
El funcionamiento de un puerto serie depende de un interfaz controlador especial, el UART (Universal Asynchronous Receiver/Transmitter – Receptor/Transmisor Asincrónico Universal). En el pasado el UART era un chip especializado independiente del procesador principal del ordenador. Hoy día esta funcionalidad está incorporada directamente en el chip procesador.
Básicamente, un UART toma los datos en paralelo (un byte, que consta de 8 bits) y los transforma en forma de datos en serie (un bit detras de otro) para su transmisión a través del puerto serie. Para funcionar más rápido, la mayoría de los chips UART tienen un buffer (memoria) incorporado. Este búfer permite que el chip guarde temporalmente los datos que llegan desde el procesador mientras procesa los datos que salen al puerto en serie.
La velocidad de transmisión y recepción puede ser ajustada desde un mínimo de 110 bps (bits por segundo) hasta en algunos casos un máximo de 921600 bps, siendo la velocidad más estándar 115200 bps o 115Kbps.
¿Cómo conecto mi Arduino al puerto serie?
Las placas Arduino UNO, Arduino MEGA2560 y Arduino Due tienen un puerto serie UART que se conecta al puerto USB en la placa.
Este puerto permite cargar programas en la placa Arduino mediante un cable USB. El código en un programa puede usar el mismo puerto USB/serie para comunicarse con el ordenador usando el monitor de puerto serie, o alguna otra aplicación de procesamiento de datos en serie. En el ordenador, el puerto USB aparece como un puerto COM virtual.
Puertos serie disponibles en la placa Arduino
El puerto serie mencionado anteriormente para programar la placa Arduino es un puerto serie de hardware.
El microcontrolador en la placa Arduino tiene un puerto serial de hardware incorporado, de modo que una vez que el puerto serie se haya inicializado mediante el programa, el hardware enviará cada byte recibido al puerto en serie y viceversa.
La placa Arduino UNO tiene solo un puerto serie de hardware porque el microcontrolador utilizado, el Atmega328p, tiene solo un puerto en serie incorporado. Las placas Arduino MEGA 2560 y Arduino Due tienen 3 puertos serie de hardware adicionales, haciendo un total de 4 puertos serie.
¿Cómo uso el puerto serie con mi placa Arduino?
Usar el puerto serie en la placa Arduino es realmente muy fácil. El siguiente programa hará que la placa Arduino haga eco de cualquier cosa que se le envíe. Si envías una letra, un numero o una frase, la placa Arduino enviara de regreso lo que hayas escrito.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * Ejemplo de uso del puerto serie * * https://www.proyectoarduino.com * */ byte dato; void setup() { // Inicializa el puerto serie Serial.begin(9600); } void loop() { // verifica si han llegado datos if (Serial.available()) { // lee el byte recibido dato = Serial.read(); // transmite de regreso el dato recibido Serial.write(dato); } } |
¿Cómo usar puertos serie adicionales con mi placa Arduino?
Se puede usar un puerto en serie adicional en la placa Arduino UNO, pero se debe simular mediante software, utilizando la librearía SoftwareSerial.
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 |
/* * Ejemplo de uso de la librearia SoftwareSerial * * https://www.proyectoarduino.com * */ #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // Pin 10 -> RX, Pin 11 -> TX void setup() { // Inicia el puerto serie y espera a que esté listo Serial.begin(57600); while (!Serial) { ; // Espera por conexión de puerto. Solo necesario para el puerto USB } Serial.println("¡Hola desde el puerto USB!"); // Inicializa el puerto SoftwareSerial mySerial.begin(4800); mySerial.println("¡Hola desde el puerto de software!"); } void loop() { if (mySerial.available()) { Serial.write(mySerial.read()); } if (Serial.available()) { mySerial.write(Serial.read()); } } |
¿Cómo utilizar puertos serie adicionales en las placas Arduino MEGA 2560 y Arduino Due?
Los puertos de hardware adicionales en las placas Arduino MEGA 2560 y Arduino Due se pueden usar de la misma manera que el puerto serie USB principal que se usa en los programas de la placa Arduino UNO, solo cambiando el nombre del puerto. El puerto serial USB, o el puerto serial 0 se conoce como Serial en los programas. Para usar el puerto serie 1, el nombre cambia a Serial1. Los puertos serie 2 y 3 se conocen como Serial2 y Serial3.
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 |
/* * Ejemplo de uso de puertos serie adicionales * para las placas Arduino Mega 2560 y Arduino Due * * https://www.proyectoarduino.com * */ void setup() { // Inicia los puertos serie y espera a que estén listos Serial.begin(57600); while (!Serial) { ; // Espera por conexión de puerto Serial (UART0) } Serial1.begin(57600); while (!Serial1) { ; // Espera por conexión de puerto Serial1 (UART1) } Serial2.begin(57600); while (!Serial2) { ; // Espera por conexión de puerto Serial2 (UART2) } Serial3.begin(57600); while (!Serial3) { ; // Espera por conexión de puerto Serial3 (UART3) } Serial.println("¡Hola desde el puerto USB!"); Serial1.println("¡Hola desde el puerto Serial1!"); Serial2.println("¡Hola desde el puerto Serial2!"); Serial3.println("¡Hola desde el puerto Serial3!"); } void loop() { char data; if (Serial.available()) { data = Serial.read(); Serial1.write(data); Serial2.write(data); Serial3.write(data); } } |