Tutorial UART para Arduino y ESP8266

En este tutorial aprenderás todo lo que necesitas sobre la comunicación UART, desde la arquitectura y la transmisión de datos hasta un ejemplo práctico

En este tutorial, profundizamos en el UART corto de receptor-transmisor asíncrono universal.

Aprende las siguientes partes:

  • Configuración de protocolo
  • Transmisión de datos y encuadre
  • Ventajas y desventajas

Al final de este tutorial, encontrará un ejemplo paso a paso de la comunicación UART entre un Arduino Uno y un ESP8266 NodeMCU

UART en miniatura

Comparación de protocolos de comunicación de microcontroladores desde una perspectiva UART

UART es el único protocolo de comunicación en serie asíncrono y se utiliza en módulos lectores de tarjetas RFID como interfaz de comunicación independiente. Pero UART generalmente se encuentra más dentro de microcontroladores.

En comparación con I2C y SPI, UART es el protocolo de comunicación más antiguo, inventado en 1960 por Gordon Bell en Digital Equipment Corporation.
La siguiente tabla compara los protocolos de comunicación I2C, SPI y UART según diferentes categorías.

. . . . . . . . . .

 DescripciónI2CSPIUART
Inventado por1982 por Philips Semiconductor1970 por Motorola1960 por Gordon Bell en Digital Equipment Corporation
Transferencia de datos síncronaSe necesita una línea de reloj para sincronizar la comunicaciónVerdaderoVerdaderoFalso
Transferencia de datos asíncronaEn lugar de una señal de reloj, el propio vapor de datos contiene señales de inicio y de paradaFalseFalseTrue
RendimientoDe 10.000 a 1.000.000 de bits/sHasta 10.000.000 de bits/sHasta 115.200 bits/s
El esclavo necesita una dirección únicaVerdaderoFalsoFalso
Número de pines necesarios242
Protocolo de comprobación de erroresVerdaderoFalsoVerdadero
Multi-maestroPuede tener varios maestros que controlen uno o varios esclavosVerdaderoFalsoFalso
Multi-esclavoPuede conectar varias salves a un solo maestroVerdaderoVerdaderoFalso
Conmutación de paquetesLos datos transferidos se agrupan en paquetes/mensajes, compuestos por una cabecera y una carga útilVerdaderoFalsoFalso
Single-endedLos datos se transfieren por un solo cableTrue
Datos en serie (SDA)
Falso
Master in Slave Out (MISO)
Master Out Slave In (MOSI)
False
Conexión serieLos datos se transfieren bit a bit a lo largo de un solo cableVerdaderoVerdaderoVerdadero

La principal desventaja de UART es que no se admite la comunicación multimaestro y multiesclavo. Por lo tanto, siempre hay 1 dispositivo maestro y 1 dispositivo esclavo.

Dado que la transferencia de datos es asincrónica, UART no necesita una señal de reloj para sincronizar la transferencia de datos, y los datos se pueden enviar y recibir en diferentes momentos. Si los dispositivos maestro y esclavo envían y reciben datos al mismo tiempo, lo que se denomina comunicación dúplex completo, cada dispositivo necesita 2 registros de desplazamiento para almacenar los caracteres de transmisión y recepción. Esto es necesario porque un dispositivo puede recibir un nuevo byte de datos mientras envía un byte de datos.
En comparación, en la comunicación SPI, el maestro y el esclavo solo necesitan un registro de desplazamiento para recibir señales porque, debido a la transferencia de datos sincrónica, el registro de desplazamiento se vacía y se llena al mismo tiempo y debido a que el tamaño del registro de desplazamiento es el mismo para todos los dispositivos, el la transferencia de datos comienza y termina al mismo tiempo.

Además de la comunicación full duplex, existen otras dos formas de comunicación que solo requieren un registro de turno único:

  • simplex: una dirección sin provisión para el dispositivo receptor (disparar y olvidar)
  • semidúplex: los dispositivos transmiten y reciben a su vez

Configuración del protocolo de comunicación UART

En la mayoría de las aplicaciones, el bit menos significativo se transmite primero. Para evitar la pérdida de datos a altas velocidades de transmisión, muchos dispositivos UART tienen un pequeño búfer FIFO (primero en entrar, primero en salir) entre el registro de desplazamiento y el sistema host.

La frecuencia del reloj suele ser de 8 a 16 veces la tasa de bits. El receptor prueba el estado de la señal entrante con la frecuencia del reloj. Si el bit de inicio excede al menos la mitad del tiempo del bit, el receptor detecta el bit de inicio válido. De lo contrario, se ignora el bit de inicio. La velocidad del reloj, también conocida como velocidad en baudios, generalmente se establece en 9600 bits por segundo.

Transmisión de datos y encuadre UART

Transmisión y encuadre de datos UART

Una ventaja de UART es que solo se necesitan 2 cables para la comunicación entre el dispositivo maestro y esclavo, ya que no hay necesidad de una línea de reloj y, al igual que la comunicación SPI, ya no hay una línea de selección esclava. Las 2 líneas son:

  • TX (transmisión)
  • RX (recepción)

En la imagen de arriba, ves que las líneas están cruzadas para que TX y RX estén conectados entre los dispositivos.

Primero, el dispositivo que transmite los datos recibe la trama de datos en paralelo desde el bus de datos. El dispositivo UART agrega el bit de inicio, el bit de paridad y los bits de parada a la trama de datos antes de que el paquete de datos completo se envíe a través de UART al dispositivo receptor. El dispositivo UART receptor extrae la trama de datos y la transmite en paralelo a través del bus de datos.

La siguiente imagen y descripción brindan una explicación más detallada de los procesos de encuadre durante la comunicación UART.

Encuadre de datos UART

Si no hay comunicación UART activa, el estado inactivo en las líneas de comunicación es lógico ALTO porque en el momento de la telegrafía, una línea preparada alta indica que el transmisor no está dañado.

El bit de inicio es el primer bit que se transfiere como lógica BAJA, indica que se transfiere un nuevo carácter.

Después, el bit de inicio sigue la trama de datos real, cuyo formato y tamaño de los datos se pueden configurar entre 5 y 9 bits.

Después de que la trama de datos sigue un bit de paridad opcional que le da a UART la capacidad de verificar errores. El bit de paridad es 0 si la suma de 1 bits en la trama de datos es par y 1 si la suma de 1 bits en la trama de datos es impar. Este método de verificación de errores evita que los bits cambien durante la transferencia.

Los últimos bits se reservan como bits de parada e indican que el carácter está completo. Por lo tanto, los bits de parada tiran de la línea ALTA

Si la comunicación se termina y debe terminarse, el maestro ha puesto la línea en lógica BAJA por más de un tiempo de carácter. Esto le indica al esclavo que la comunicación UART está completa.

Ventajas y desventajas de UART

Ventajas

  • UART solo usa 2 cables para la comunicación
  • No se necesita una línea de señal de reloj adicional
  • La comprobación de errores es posible gracias al bit de paridad

Desventajas

  • El tamaño de la trama de datos está limitado a 9 bits.
  • No hay soporte para la comunicación con múltiples maestros o esclavos.

Comunicación UART entre Arduino y ESP8266

La siguiente tabla le ofrece una descripción general de todos los componentes y partes que utilicé para este tutorial.

Arduino UnoAmazonAliExpress
ESP8266 NodeMCUAmazonAliExpress
Pantalla LCD de 20×4AmazonAliExpress
Pantalla LCD 16×2AmazonAliExpress

En el siguiente ejemplo, queremos enviar una cadena desde un Arduino Uno a un ESP8266 NodeMCU a través de la línea de comunicación UART y mostrar la cadena en una pantalla LCD.

La siguiente imagen muestra la conexión entre el microcontrolador Arduino y ESP8266 y la pantalla LCD. Si no sabe qué son los pines TX (transmisión) y RX (recepción), encontrará una descripción general muy útil en los artículos de asignación de pines del microcontrolador: Arduino Nano, Arduino Uno, Arduino Mega, ESP8266. O mejor si descarga el libro electrónico de la hoja de datos del microcontrolador.

Haga clic en la imagen para ampliarla y ver mejor qué pines se utilizan.

Comunicación UART Arduino y ESP8266

En la siguiente parte, vamos paso a paso por el código del programa.

La primera parte es el script Arduino Uno que envía una cadena a través de UART.

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("CATr");
  delay(1000);
}

El guión es muy breve y sencillo. No se incluyen bibliotecas. En la función de configuración, necesitamos establecer la velocidad en baudios en 9600. Un segundo argumento opcional configura los datos, la paridad y los bits de parada. El valor predeterminado es 8 bits de datos, sin paridad y un bit de parada que estamos usando en este ejemplo.

En la función de bucle, enviamos la cadena a través de la función en serie cada segundo. La parte ” r” le dirá al receptor que la cadena está completa.

Ahora nos ocupamos del script del receptor para el ESP8266 NodeMCU.

#include "LiquidCrystal_I2C.h"
#include "Wire.h"
LiquidCrystal_I2C lcd(0x27, 20, 4); 
char buff [50];
volatile byte indx;

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
}

void loop() {
  if (Serial.available() > 0) {
    byte c = Serial.read();
    if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == 'r') { //check for the end of the word
        lcd.print(buff);
        delay(1000);
        indx= 0; //reset button to zero
        lcd.clear();
      }
    }
  }
}

Primero necesitamos incluir la biblioteca LiquidCrystal_I2C para facilitar la comunicación con la pantalla LCD. Se debe incluir el segundo cable de la biblioteca para permitir la comunicación I2C entre el NodeMCU y la pantalla LCD.
Inicializamos la pantalla LCD de 20 × 4 a la dirección HEX 0x27. Para identificar la dirección hexadecimal de su dispositivo I2C, encontrará un escáner de direcciones hexadecimales en este artículo.
Las variables buff almacenan los valores entrantes a través de UART y la variable indx almacena el índice de 8 bits.

En la función de configuración, la velocidad en baudios también se establece en 9600, que debería coincidir con la velocidad en baudios del Arduino Uno. La pantalla LCD también se inicializa, limpia y la luz de fondo está encendida.

En la función de bucle, verificamos si la conexión en serie está disponible y luego leemos los datos en serie entrantes byte por byte mientras escribimos cada byte en el búfer de matriz de bytes. Si detectamos el final de la cadena, definido por ” r”, imprimimos el contenido de la tabla en la pantalla LCD. Después de 1 segundo, restablecemos el índice de la matriz y limpiamos la pantalla para los siguientes datos entrantes.

UART en miniatura

Conclusión

En este tutorial, primero comparamos el protocolo de comunicación UART con I2C y SPI. También discutimos la configuración de UART y cómo se transmiten los datos entre 2 dispositivos. Al final de este artículo, vimos un ejemplo para transferir una cadena de un Arduino Uno a un NodeMCU a través de UART.

Si tiene alguna pregunta sobre la comunicación UART, utilice la sección de comentarios a continuación para hacer sus preguntas. Les responderé lo antes posible.


Deja un comentario