¡Descubre Cómo Dominar el Puerto Serie en ATmega328P con Esta Guía Completa!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

Este escrito muestra cómo programar un microcontrolador ATmega328P, como el que se encuentra en las placas Arduino UNO, usando una conexión serial. La comunicación serial es un componente fundamental en una gran cantidad de proyectos de sistemas embebidos, y es uno de los elementos básicos que debemos aprender para poder sacar todo el potencial de microcontroladores como el ATmega328P.

La comunicación en serie es una forma muy fiable y segura de comunicaciones entre dispositivos. Un puerto es el nombre genérico con el que denominamos a las interfaces que permiten la comunicación entre dos ordenadores o dispositivos. Como los dispositivos electrónicos solo entienden de bits, es decir, de ceros y unos, toda la información que se envía a través del puerto es en bits. Un puerto serie envía la información mediante una secuencia de bits, lo que significa que primero se envía un bit, después otro, después otro, y así sucesivamente.

Por el contrario, un puerto paralelo enviaría la información mediante múltiples canales de forma simultánea. Históricamente, ambos tipos de puertos han convivido en los ordenadores, empleándose los puertos paralelos en aquellas aplicaciones que requerían la transmisión de mayores volúmenes de datos. Sin embargo, a medida que los procesadores se hicieron más rápidos, los puertos de serie fueron desplazando progresivamente a los puertos paralelos en la mayoría de aplicaciones, siendo hoy en día la comunicación serial más rápida y utilizada.

¿Qué es un Puerto Serie (UART/USART)?

Un puerto serial es un módulo de comunicación digital para un sistema embebido, es decir, permite la comunicación entre dos dispositivos digitales. La función principal de un puerto serial es la de empacar y desempacar paquetes de datos binarios seriales. La serialización significa convertir un dato paralelo (un byte) a un conjunto de pulsos seriales que puedan ser recibidos y enviados por una línea de transmisión. Cuenta con dos conexiones principales: RX (recepción) y TX (transmisión).

Al módulo serial también se le conoce como UART, USART o EUSART:

Lea también: Declarar Impuestos con Infonavit

  • UART - Universal Asynchronous Receiver and Transmitter, que en español se traduciría como Transceptor Asíncrono. La UART es una unidad que incorporan ciertos procesadores, encargada de realizar la conversión de los datos a una secuencia de bits y transmitirlos o recibirlos a una velocidad determinada. 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 detrás de otro) para su transmisión a través del puerto serie.
  • USART - Universal Synchronous and Asynchronous Receiver and Transmitter, que significa en español Transceptor Síncrono y Asíncrono.
  • EUSART - Enhanced Universal Asynchronous Receiver and Transmitter o Transceptor Asíncrono Universal Mejorado.

Para funcionar más rápido, la mayoría de los chips UART tienen un buffer (memoria) incorporado. Otros puertos seriales incluyen al puerto I2C, puerto SPI, puerto USB y puerto CAN en un microcontrolador.

La principal ventaja del puerto serial es la sencillez de su protocolo de comunicación. Sin embargo, también tiene desventajas, como que solo se pueden comunicar dos dispositivos directamente a un puerto.

Modos de Comunicación Serie

El modo de comunicación para un puerto serial se refiere a la forma en la que se envían y reciben los paquetes de información. De acuerdo al tipo de conexión, una UART tiene las líneas de transmisión y recepción separadas. Esta característica le permite poder operar los tres modos de comunicación asíncrona que existen, los cuales son:

  • Simplex: Es una técnica de comunicación unidireccional. Solo un cliente (el emisor o el receptor) está activo a la vez. Cuando solo podemos, ya sea recibir o transmitir. Si un emisor transmite, el receptor solo puede aceptar.
  • Duplex o Half-duplex: Es cuando solo podemos transmitir o recibir información, una cosa a la vez. Tanto el emisor como el receptor están activos, pero no simultáneamente; es decir, si un emisor transmite, el receptor puede aceptar, pero no puede enviar y viceversa. Lo recomendable en aplicaciones es usar el esquema de comunicación Half-duplex, donde solo se envíe información si así lo pide uno de los elementos en la comunicación.
  • Full-duplex: Significa que puede recibir y enviar información digital simultáneamente. Es el modo de comunicación más ampliamente utilizado, donde tanto el emisor como el receptor pueden transmitir y recibir al mismo tiempo.

Estructura Interna y Configuración del Puerto Serie

Una UART contiene, en su estructura interna, un generador de paridad, registros de corrimiento, un oscilador variable (para generar el BAUD), verificadores de las tres condiciones básicas (inicio, paridad, fin de transmisión) y lógica de control. Un paquete de datos se transmite a través de un registro de corrimiento. La velocidad a la que se transmite está controlada por el generador de BAUD.

Para configurar el módulo serial se requiere indicar la velocidad de operación. La velocidad se mide en BAUD's, una medida de cuántos bits por segundo se van a transmitir. Los BAUDios se configuran mediante un registro de propósito específico.

Lea también: Guía para Declarar Aportaciones Voluntarias

La lógica de control se encarga de agregar los bits de Inicio, Paridad y de Fin de transmisión. Para que pueda haber una sincronización de los datos enviados, se requiere que ambos dispositivos que usen el mismo puerto serial tengan la misma configuración. Además de la velocidad, es necesario configurar cuántos bits de parada y si habrá o no bit de paridad.

Una de las configuraciones más usadas para un puerto serial es:

  • 8 bits de datos
  • 1 bit de parada
  • Sin bit de paridad
  • 1 bit de inicio
  • Velocidad de 9600 BAUD

Protocolo Serial y Tramas de Comunicación

El protocolo serial se refiere a la forma o a la cantidad de bits que forma un paquete de datos, siendo el "dato" la información que queremos transmitir por el puerto serial. La trama de datos o bits digitales necesarios para transmitir un byte de información puede variar. Esencialmente, se tienen que agregar tres tipos de bits al byte de información: un bit de inicio, un bit de paridad y uno o dos bits de parada.

Por ejemplo, si se configura el puerto serial a una velocidad de 9600 BAUD, 8 bits de datos, 1 bit de parada y sin bit de paridad, la trama de datos sería:

Paquete de datos = Bit de inicio + 8 bits de datos + 1 bit de parada

Lea también: ¿A partir de qué ingresos debes declarar?

Es decir, esta configuración envía 10 bits para cada 8 que se quieran transmitir. Si la velocidad es 9600 bits/s, esto da como resultado una tasa real de 960 Bytes por segundo, dado que cada byte tiene agregados dos bits por parte del protocolo serial.

Existen configuraciones poco comunes, como enviar solo 6 bits de datos con dos bits de parada y sin bit de paridad a una velocidad de 115200 BAUD. Esta configuración podría utilizarse cuando no se utilizan los dos últimos bits del byte a enviar, permitiendo velocidades más altas de transferencia de bytes, en cuyo caso sería 115200/9 = 12800 Bytes/s, donde cada byte real tiene solo 6 bits de datos útiles.

Tipos de Conexiones y Adaptadores para Comunicación Serie

Cuando un puerto serial opera a un voltaje lógico distinto del de nuestro sistema embebido, se requieren ciertas modificaciones al circuito. Si comunicamos dos sistemas con el mismo voltaje lógico, la conexión es directa. Sin embargo, si uno de los dispositivos trabaja a un voltaje distinto, se requiere de una etapa intermedia que ajuste los voltajes lógicos, como un "elevador de voltaje" o "level shifter".

El estándar RS-232 establece la forma en la que se intercambian datos binarios de forma serial. El circuito integrado (IC) MAX232 es un chip que permite convertir las señales de un puerto serial RS-232 a señales TTL (Transistor-Transistor Logic) que puede entender el ATmega328P. La comunicación TTL se realiza mediante variaciones en la señal entre 0V y Vcc (donde Vcc suele ser 3.3V o 5V), mientras que los puertos RS-232 típicamente varían entre -13V y 13V. Antes de conectar dos sistemas, debemos comprobar que los voltajes empleados son compatibles para evitar dañar los dispositivos.

Las computadoras actuales, tanto de escritorio como laptops, ya no suelen contar con puertos de comunicación serial RS-232 directamente. Para lograr comunicar un sistema embebido serial con una computadora, se requiere un puerto adicional. Este elemento electrónico se conoce como convertidor USB-TTL. El convertidor está programado para convertir el protocolo de comunicación serial al protocolo de comunicación USB. En este caso, la computadora reconoce dicho circuito como un puerto Serial Virtual. Para los sistemas operativos de Windows, se le asigna un nombre que comienza con la palabra COM seguida de un número. Mientras tanto, en Linux se utilizan las letras TTYACM# o TTYUSB#, donde el # es un número que se va asignando consecutivamente a la conexión de los dispositivos.

Programación del Puerto Serie con Arduino en ATmega328P

Prácticamente todas las placas Arduino disponen al menos de una unidad UART. La placa Arduino UNO, que utiliza el microcontrolador ATmega328P, tiene un único puerto serie de hardware incorporado que opera a nivel TTL 0V / 5V, lo que la hace directamente compatible con la conexión USB. Modelos como Arduino Mega y Arduino Due disponen de múltiples unidades UART TTL.

Los puertos serie están físicamente unidos a distintos pines de la placa Arduino. Es importante recordar que, mientras usamos los puertos de serie, no podemos usar como entradas o salidas digitales los pines asociados con el puerto serie en uso.

La siguiente tabla muestra la asignación de pines para el puerto serie en diferentes placas Arduino:

Placa Arduino Puerto Serie Pin RX Pin TX
Arduino UNO Serie 0 (USB/principal) 0 (RX) 1 (TX)
Arduino Mini Pro Serie 0 0 (RX) 1 (TX)
Arduino Mega Serie 0 (USB/principal) 0 (RX) 1 (TX)
Arduino Mega Serie 1 19 (RX) 18 (TX)
Arduino Mega Serie 2 17 (RX) 16 (TX)
Arduino Mega Serie 3 15 (RX) 14 (TX)
Arduino Due Serie 0 (USB/principal) 0 (RX) 1 (TX)
Arduino Due Serie 1 19 (RX) 18 (TX)
Arduino Due Serie 2 17 (RX) 16 (TX)
Arduino Due Serie 3 15 (RX) 14 (TX)

El puerto serial USB, o el puerto serial 0, se conoce como Serial en los programas de Arduino. Para usar puertos serie adicionales en placas como la Mega o Due, el nombre cambia a Serial1, Serial2, etc. Este puerto permite cargar programas en la placa Arduino mediante un cable USB y usar el mismo puerto para comunicarse con el ordenador usando el Monitor Serie.

Funciones de Arduino para el Puerto Serie

Para utilizar el puerto serie con Arduino, lo primero que tienes que hacer es inicializarlo en la función void setup(). Para ello, debes utilizar la función Serial.begin(), cuyo único parámetro es la velocidad de transmisión de datos en bits por segundo (BAUDios).

Las funciones principales para interactuar con el puerto serie en Arduino son:

  • Serial.begin(velocidad): Inicializa el puerto serie a la velocidad especificada. Una velocidad común es 9600 bps.
  • Serial.print(dato) o Serial.println(dato): Con estas funciones, Arduino envía datos a través del puerto serie a la computadora. Dentro de los paréntesis, se escribe la variable o el dato en concreto que se quiere enviar (por ejemplo, "Hello" o un número). La diferencia entre print y println es que la segunda añade un salto de línea al final.
  • Serial.available(): Para leer el puerto serie, lo primero que se debe hacer es comprobar si hay datos disponibles. Esta función devuelve el número de bytes disponibles para leer en el búfer de entrada serie. Si devuelve 0, el puerto está ocupado o no hay datos; si devuelve un valor mayor que 0, hay datos listos para ser leídos.
  • Serial.read(): Una vez que se sabe que hay datos disponibles (usando Serial.available()), esta función lee el byte de datos entrante del puerto serie.

Ejemplos Prácticos de Comunicación Serie con Arduino

Usar el puerto serie en la placa Arduino es realmente muy fácil. La conexión con un ordenador se realiza simplemente conectando la placa Arduino mediante el mismo puerto USB que se emplea para programarla. Luego, se abre el "Monitor Serial" dentro del IDE de Arduino.

El Monitor Serie es una pequeña utilidad integrada en el IDE de Arduino que permite enviar y recibir fácilmente información a través del puerto serie. Dispone de dos zonas: una que muestra los datos recibidos y otra para enviarlos.

Envío de Datos desde Arduino al Ordenador

Con la función Serial.print() o Serial.println(), Arduino puede enviar valores de variables o mensajes de texto al ordenador. Por ejemplo, se puede crear un contador que envía su valor cada segundo. Si se sube el programa y se abre el Monitor Serie, se puede ver la cuenta.

Recepción de Datos desde el Ordenador a Arduino

Para que el ordenador envíe datos a la placa de Arduino, se utiliza el Monitor Serie. Arriba, en el Monitor Serie, hay un espacio donde se puede escribir y enviar datos. En el código de Arduino, se utiliza Serial.available() para verificar si hay datos en el búfer y Serial.read() para leer el dato. Un ejemplo clásico es encender o apagar un LED enviando caracteres específicos (ej. 'a' para apagar, 'b' para encender).

Envío de Valores Numéricos

Si se envían números desde el Monitor Serie, es importante recordar que se reciben como caracteres ASCII. Para recuperar el valor numérico enviado, se debe restar el valor ASCII del carácter '0' al dato recibido. Por ejemplo, para hacer parpadear un LED un número de veces indicado, se enviaría un número entre 1 y 9, se convertiría a entero y se usaría en un bucle.

Consideraciones Avanzadas para el ATmega328P (sin Arduino IDE)

Para aquellos con conocimientos intermedios de microcontroladores y que deseen un control más profundo, la configuración de la USART del ATmega328P se realiza directamente a través de sus Registros de Función Especial (SFRs). Es esencial consultar la hoja de datos del ATmega328P para configurar registros como UBRRH y UBRRL para la velocidad de transmisión (baud rate), UCSRC para el formato de trama (bits de datos, paridad, bits de parada), y UCSRB para habilitar la transmisión, recepción y sus interrupciones asociadas.

En el desarrollo de aplicaciones que requieran una comunicación eficiente sin desperdiciar tiempo de CPU, se pueden utilizar interrupciones asociadas a la transmisión y recepción de la USART. La idea es usar buffers circulares del tipo FIFO (First Input First Output), donde los datos entrantes se almacenan en un buffer de recepción y los datos salientes se insertan en un buffer de transmisión. La interrupción se encarga de sacar los datos del buffer y transmitirlos en segundo plano.

Es crucial gestionar el tamaño de los buffers para evitar la pérdida de información (overflow) si los datos se escriben más rápido de lo que se pueden transmitir o leer. Siempre se pueden crear mecanismos o algoritmos para solicitar que la información sea enviada nuevamente, como el uso de un checksum.

Cuando se desea reprogramar un ATmega328P en una protoboard sin necesidad de sacarlo, se puede utilizar otro Arduino UNO como programador serial. Se conecta el pin 0 del Arduino (RX) al pin 2 del ATmega y el pin 1 del Arduino (TX) al pin 3 del ATmega para el intercambio de datos. Además, se conecta el pin RESET del Arduino al pin 1 del ATmega328P. Es importante retirar el microcontrolador del Arduino programador y desconectar cualquier otra fuente de alimentación del ATmega antes de proceder.

Aplicaciones del Puerto Serie

Las aplicaciones del puerto serial son vastas y muy importantes en el diseño de sistemas embebidos. Su uso extendido se fundamenta en la facilidad de su protocolo, que solo adhiere unos pocos bits a cada paquete de datos.

  • Sensores Digitales: La mayoría de los sensores digitales utilizan un puerto de comunicación serial. Por ejemplo, el GPS NEUBLOX NEO-6M requiere de un puerto serial para poder leer su información y configurarlo apropiadamente.
  • Comunicación con Computadoras: Se utiliza en aplicaciones donde nuestro sistema embebido (Arduino, Tarjetas Freedom, ARM's) desea enviar información a una computadora para procesamiento, visualización (como graficar la posición de un GPS en Matlab), o control.
  • Módulos de Conectividad: Si queremos dotar a nuestros proyectos de conectividad (WiFi, Ethernet, RF, XBEE), es fundamental saber usar este puerto y su protocolo para comunicarse con los shields o módulos externos. Un ejemplo es enviar y recibir mensajes de texto o llamadas en un Arduino con un módulo GSM SIM900.
  • Control y Automatización: Permite mover el ratón o simular la escritura de un usuario en el teclado, enviar correos con alertas, controlar un robot realizando cálculos en el ordenador, o encender/apagar un dispositivo desde una página web o aplicación móvil.

Aunque actualmente está siendo desplazado por protocolos seriales más avanzados como I2C o SPI en ciertas aplicaciones, el puerto serie sigue siendo una herramienta fundamental y versátil en el mundo de los microcontroladores y la electrónica embebida.

tags: #como #usar #puerto #serial #en #atmega328p