Cómo Utilizar el Puerto Serie del Arduino en 5 minutos

Una de las maneras que nuestra placa Arduino puede comunicarse, es mediante sus puertos de entradas y salidas. Hasta este momento has aprendido a enviar y recibir información mediante entradas/salidas digitales y analógicas. Sin embargo, las placas Arduino poseen otro puerto de comunicación llamado Puerto Serie.

¿Qué es y para qué sirve el Puerto Serie?

El microcontrolador que contiene nuestra placa Arduino, posee un módulo receptor/transmisor Serie de tipo TTL-UART, por el cual podemos comunicarnos con otro Arduino, una placa Raspberry Pi, o cualquier sistema que posea un módulo similar, como nuestra computadora. El protocolo de comunicación UART (Universal Asynchronous Receiver-Transmitter), cuenta con dos puertos, uno para emitir información (Tx) y uno para recibir información (Rx).

Conexión de puertos UART.
Conexión de puertos UART.

El protocolo básicamente envía datos de manera serial. Por ejemplo, un caracter (símbolo o número), lo traduce a su equivalente en binario (ceros y unos) y lo envía por el puerto Tx bit por bit.

Para que los dos dispositivos comunicándose por puerto Serie se entiendan, necesitan estar configurados de manera similar, para que puedan codificar y descodificar los datos transmitidos, es por esto que los parámetros de configuración son:

  • Bits de datos
  • Bits de parada
  • Bit de paridad
  • Bit de inicio
  • Velocidad en baudios por segundo

Utilizar el puerto Serie es una de las maneras más fáciles de enviar información de un dispositivo a otro, ya que podemos mandar desde un simple símbolo, hasta una frase completa.

Si quieres aprender más sobre el protocolo de comunicación UART, déjame tu comentario.

Caracteres y Cadenas

Para enviar y recibir información es necesario conocer cómo deben de ser los datos a enviar. En el mundo de la programación, existen otros tipos de variables distintas a int que utilizamos para definir variables del tipo entero (número).

Las variables de tipo char las utilizamos para definir caracteres. Un caracter puede ser una letra, un número, signo de puntuación o incluso caracteres de control, los cuales no representan un símbolo si no una acción como un “enter”, “retorno de carro” o un “tabulador».

Cabe resaltar que para asignar un caracter es necesario indicarlo entre comillas simples: ' '.

Las variables de tipo string representan una cadena (o secuencia) de caracteres. Con esto podremos formar palabras o frases, almacenando en una variable más contenido de información que solo números o símbolos por separado.

Para asignar un valor o valores a un String, es necesario indicarlo entre comillas dobles: " ".

Con estas variables es posible realizar entre ellas algunas operaciones, las más comunes son:

  • Asignación: Asignar una cadena a otra
  • Concatenación: Unir dos cadenas de caracteres (dos strings).
  • Longitud: Obtener el número de caracteres de una cadena.

Tabla de caracteres ASCII

La tabla conocida como ASCII (siglas en ingles para American Standard Code for Information Interchange), es un conjunto de 256 caracteres (8 bits), que incluye los caracteres compuestos por los números del 0 al 9, las letras en minúscula y mayúscula, signos y símbolos, así como caracteres de control.

Si quieres conocer la tabla completa, da click aquí.

Sin embargo, en nuestro Arduino solamente podremos visualizar del código ASCII 33 hasta el 126. Los cuales representan caracteres imprimibles (visibles).

Como Utilizar el Puerto Serie en Arduino

En nuestro Arduino podemos tener varios puertos Serie; para el caso de que estés utilizando la placa Arduino UNO, solo tenemos un puerto Serie, donde el pin 0 es Rx y el pin 1 es Tx.

Pines del Puerto Serie.
Pines del Puerto Serie.

En nuestra placa Arduino UNO, los pines Tx y Rx estarán internamente conectados al puerto USB, por lo que podremos utilizar el puerto Serie a través del conector USB directamente a nuestra computadora, por ejemplo.

Comunicación Serie entre Arduino y Computadora

Para realizar una comunicación serial entre nuestro Arduino y la computadora, es necesario conectar la placa como normalmente lo hacemos para cargar algún código. El IDE de programación cuenta además con un Monitor Serie, que vamos a utilizar para visualizar los datos enviados y recibidos. Para abrirlo, solo basta con darle click al ícono mostrado en la siguiente imagen, o click en Herramientas>Monitor Serie.

Monitor Serie.
Monitor Serie.

Una vez abierto el monitor tendremos dos espacios. En el primero podremos escribir mensajes a enviar desde la computadora hacia el Arduino; y el segundo, es un espacio dónde se irán mostrando los mensajes recibidos desde el Arduino. También encontramos un menú desplegable donde podremos seleccionar los baudios por segundo, recordando que todos los dispositivos dentro del protocolo de comunicación Serie deberán estar sincronizados.

Ventana del Monitor Serie.
Ventana del Monitor Serie.

La configuración por defecto del puerto Serie en la placa Arduino es: 8 bits de datos, un bit de parada y sin bit de paridad. La velocidad en baudios será seleccionada al inicializar el puerto.

Las funciones principales a utilizar con el puerto Serie son:

  • Serial.begin(velocidad) Donde velocidad serán los baudios por segundo a los que vamos a operar el protocolo.
  • Serial.print(Mensaje) Utilizado para enviar datos como texto ASCII. Si insertamos como mensaje un número, será enviado en su equivalente ASCII para representar el mismo número; si queremos enviar como texto, se utilizarán comillas simples para caracteres, y comillas dobles para cadena de texto.
  • Serial.println(mensaje) Imprime en el puerto Serie el texto ASCII, agregándole al final el caracter no imprimible retorno de carro (ASCII 13, o ‘\r’); y el caracter de nueva línea o enter (ASCII 10, o ‘\n’).

El puerto Serie en Arduino incluye más funciones implementadas; sin embargo, las iremos viendo conforme las utilicemos.

Ejemplo: Recibir datos en PC por el Puerto Serie

Para el primer ejemplo utilizaremos solamente nuestra placa Arduino, la conectamos a nuestra computadora y listo. El código a utilizar es el siguiente:

Configuraremos nuestra comunicación Serial a 9600 baudios por segundo, misma velocidad que deberemos configurar en la ventana del monitor Serie. Cabe destacar que estamos utilizando dos funciones Serial.print(); y Serial.println();.

Este ejemplo solamente mostrará un mensaje, cada dos segundos como se puede observar a continuación:

Ejemplo: Escribir desde PC y Arduino Contesta

Si deseamos una comunicación bilateral; es decir, enviar y recibir datos, tenemos que realizar una secuencia donde el Arduino identifique el comando deseado y conteste con lo que le hayamos programado.

Para ejemplificar, implementaremos un programa donde la computadora envíe un comando y el Arduino conteste con un mensaje. Los comandos serán dos:

  • Hola
  • Adios

Cuando el Arduino reciba la palabra Hola el Arduino deberá contestar con Hola que tal!. Cuando reciba la palabra Adios, deberá contestar con un Hasta luego!. Veamos el programa.

Creamos una variable de tipo String llamada entradaSerial que utilizaremos para guardar el dato recibido desde la computadora. También creamos una variable de tipo bool llamada entradaCompleta, donde se almacenará el estado de false cuando aún no se recibe algo por el puerto Serie, y se almacenará con el estado de true cuando haya recibido algo por el puerto.

Crearemos una función llamada SerialEvent(), donde cada vez que se detecte alguna recepción por el puerto Serie, la variable llamada entradaCompleta pasará a valer true. Este será el momento adecuado para verificar qué fue lo que llegó por el puerto. Esta función se activa cada vez que el Arduino ejecuta la función principal loop, por lo que hay que cuidar los retardos que agreguemos a la misma, de lo contrario nuestro programa puede verse algo lento. Por otro lado, esta función detecta caracter a caracter lo recibido por el puerto Rx y lo va acomodando en la variable entradaSerial en tipo String. Una vez que se recibe el caracter no imprimible \n, se dará por terminada la recepción.

Si quieres aprender a crear tus propias funciones, déjame un comentario y le dedicaré un capítulo completo.

Para verificar qué fue lo que llegó por el puerto Serie, en la función principal (loop), deberemos verificar primeramente si la variable entradaCompleta es true, esto lo realizamos con la función if(entradaCompleta). Los bloques de comparación if, se ejecutan siempre y cuando el resultado de la comparación, o variable de tipo bool es true. Posteriormente verificamos el contenido de la variable entradaSerial, comparándola con las opciones que nosotros elegimos anteriormente. El funcionamiento que queremos, a manera de pseudocódigo (esquema no necesariamente código) deberá ser como sigue:

Para lograr esto, utilizamos la secuencia if, else if, else. Dentro de los bloques if, podemos agregar distintos símbolos de comparación. Para indicarle que compare exactamente la variable entradaSerial con el String "Hola\n", utilizaremos ==. De manera similar, agregamos el código para comparar la segunda opción. Por último, agregaremos un mensaje para que cuando el Arduino reciba cualquier otra cosa distinta a las dos opciones anteriores, nos avise con un El dato recibido es inválido!!. Toma en cuenta que cuando el Arduino contesta, agregamos siempre al final un enter (\n), para que en nuestro monitor Serie se agregue y no se nos junten todos los mensajes recibidos. Si queremos evitar el uso de un enter, podemos utilizar la función println();, como se puede observar en el código de ejemplo mostrado a continuación.

El código que finalmente obtendremos será el siguiente:

Al ejecutar el código anterior, deberás ver algo similar a esto:

¿Quieres aprender más sobre los bloques de comparación if ?, déjame un comentario.

Es importante mencionar, que antes de salir de la función loop, debemos de reiniciar las dos variables para que estén listas para recibir un nuevo comando, como se muestra a continuación:

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

Ejemplo: Encender y Apagar LED desde la PC Mediante el Puerto Serie

¿Qué te parecería poder enviarle un comando desde la computadora a un Arduino para encender y apagar un LED? ¡Vamos a hacerlo!

Necesitaremos un LED y una resistencia para nuestro circuito, justo como lo hicimos en el primer capítulo. Vamos a seguir este código como ejemplo:

Si te fijas bien, hemos tomado el código anterior y lo adaptamos. Ahora los comandos son:

  • encender: manda a encender el LED conectado al puerto No. 2.
  • apagar: manda a apagar el LED conectado al puerto No. 2.

Deberás ver algo así:

Ejemplo: Encender y apagar una Secuencia de LEDs

Ahora veremos un ejemplo más completo. Desde la computadora le enviaremos comandos al Arduino para que ejecute cuatro distintas secuencias para encender y apagar cuatro LEDs de forma divertida.

El diagrama de conexiones es el siguiente:

Diagrama de conexiones de 4 LEDs.
Diagrama de conexiones de 4 LEDs.

Crearemos tres funciones personalizadas donde cada una contendrá el código necesario para realizar la secuencia. Cada función realizará cuatro veces la secuencia seleccionada. Observa el código:

Como observaste en el código, cada función realiza de manera repetitiva, encender y apagar LEDs con distintas secuencias. Las secuencias las realicé “a mano”, eligiendo quien enciende y quien se apaga cada vez. Te invito a que realices tus secuencias personalizadas. El resultado es el siguiente:


Este ha sido el tutorial de hoy, ¿te ha gustado? Déjame tus comentarios y tus dudas. También te recomiendo visitar el video al inicio de este post, donde podrás observar a mayor resolución los videos y encontrarás algunos detalles extra.

Recuerda visitar nuestras redes sociales

23 pensamientos sobre “Cómo Utilizar el Puerto Serie del Arduino en 5 minutos”

  1. Hola, por el Ejemplo: Encender y apagar una Secuencia de LEDs, como puedo interrumpir en cualquier momento la secuencia de leds por el puerto serie enviando la palabra Stop ?
    Gracias

    1. Qué tal Luis,
      Para interrumpir en cualquier momento del código, se utilizan unas funciones llamadas «interrupciones»; sin embargo, podrías hacerlo de la manera más amigable que es mandar llamar a la función que revisa lo que llega por el puerto serie:

      if (entradaSerial == "Stop\n")
      break;

      Este pedazo de código lo tendrías que insertar en el punto donde quieras «revisar» o «interrumpir»… por ejemplo:

      void serieLED1() {
      for(int inicio = 0; inicio < 4; inicio++) {
      digitalWrite(pinLED1,HIGH);
      delay(100);
      digitalWrite(pinLED2,HIGH);
      delay(100);
      digitalWrite(pinLED3,HIGH);
      delay(100);

      if (entradaSerial == "Stop\n")
      break;

      digitalWrite(pinLED4,HIGH);
      delay(100);
      digitalWrite(pinLED1,LOW);
      delay(100);
      digitalWrite(pinLED2,LOW);
      delay(100);
      digitalWrite(pinLED3,LOW);
      delay(100);
      digitalWrite(pinLED4,LOW);
      delay(100);
      }
      }

      El «break» lo que hace es detener la secuencia actual y saltarse el resto del ciclo en el que se encuentre, en este caso del «for«.

      Cualquier duda sigo al pendiente, próximamente continuaré subiendo más capítulos, agregaré uno sobre interrupciones.

  2. Buenos días, lo e probado y el comando me lo ejecuta después de acabar la secuencia entera, en algunas ocasiones forma parte de la secuencia, como lo podría resolver ? hay algún comando de reset o algo parecido para parar completamente todo ?
    Saludos y Gracias

    1. Hola Luis, con Arduino hacer interrupciones por software es complicado y no es la mejor plataforma para esto; sin embargo, puedes realizarla con una interrupción por hardware con un botón pulsador, para este ejemplo agregué uno en el pin 2 con configuración pull-down. Se utiliza la función attachInterrupt, fíjate en este código de ejemplo, solo modifiqué el código de la secuencia1, pero puedes agregarle lo mismo para el resto:

      Descarga el código de ejemplo acá: InterrupcionesLED

      Quedo en espera de tus comentarios!

  3. Buenos días, Entonces para mí es mejor llevar el pulsador al negativo y al pin de reset, será mas fácil, no sabrás que plataforma es la mejor de programación fácil ! , y la más fiable para programar ?
    Saludos y Muchas Gracias

    1. Hola Luis, te recomiendo darle una investigada a RaspberriPi es báicamente un sistema operativo, todo es en software además de poder utilizar interfaces en hardware, revísalo y me comentas. ¿Qué proyecto te interesa desarrollar?

  4. Hola Abrahamg, voy a estudia el RaspberriPi, pero primero me gustara hacer un pequeño prototipo con el Arduino que será mas rápido, e probado el ejemplo de tu código y funciona bien dese Monitor Serie, lo que no consigo es que funcione enviando desde Nextion, ( el botón táctil de Nextion envía imprime: serie1 (print serie1)) pero no lo procesa bien el Arduino, no sabrás por que puede pasar eso ?
    Garcías por todo.

    1. En teoría debería funcionar igual, ya que lo único que cambiaría es la palabra a comparar, asegúrate de revisar bien cuál es la serie de caracteres (con todo y espacios y símbolos especiales), muchas veces se envía al final un salto de línea \n otras no, probablemente pueda ser por esto.

  5. Hola, ya e conseguido que funcione con la plantilla Nextion, Una pregunta: Cómo puedo hacer que se bloquee o no procese ninguna señal del puerto serie asta que cumpla la secuencia ? y luego me deje escoger la secuencia que quiero poner de nuevo.
    Saludos y Gracias

    1. Hola me alegra que hayas solucionado tu problema. Respondiéndote, como estamos hablando de código, tu debes elegir cuando «revisar» el estatus de tus señales de entrada… Por lo que el código dentro de la secuencia deberá ignorar cualquier otra señal. Para esto no necesitarías las interrupciones, simplemente tendrías el código como al principio. Sería un caso específico y dependerá de tu código… No se si me expliqué, ayudaría un poco más si nos compartes un poco del código o un pseudocódigo, para entender la dinámica que buscas conseguir. Saludos!

    1. Hola qué tal. Muy buena idea, igual hago un video/artículo de esa aplicación. Pero sería muy simple, vas a implementar en cada Arduino el código que quieres recibir y con el cual realizar la acción. Por ejemplo:
      Arduino 1 envía: Hola!
      Arduino 2 if(Hola!){Encender un LED y responder Listo!}
      Arduino 1 if(Listo!){Enviar OK}

      Espero haberme explicado, cada arduino deberá tener un listado de posibles palabras de recepción para realizar la acción que tu desees. La conexión será directa:
      Arduino 1 TX —-> RX Arduino 2
      RX <---- TX Arduino 2 Saludos!

  6. Hola AbrahamG
    Me ha sido de mucha utilidad tu tutorial, pero ahora ertoy buscando la forma de controlar un proyector u otros dispositivos ya sea por puerto serial o por ethernet, podrias hacer un ejemplo de esto u orientarme hacia la información?
    De antemano muchas gracias por tu aportación

    1. Hola Arturo, muchas gracias por tu comentario!
      Podrías explicarme un poco más de detalle de lo que quieres conseguir?, quieres enviar imágenes… o solamente información, que tipo de información? Agregaré tus recomendaciones para hacer algún ejemplo con ethernet en un futuro, pero para irte recomendando algo de información, de favor trata de especificarme un poco más lo que te gustaría lograr.
      Saludos!

  7. Sabéis si se pueden poner tabuladores en el monitor serie y que en vez de que empiece a escribir ajustado a la derecha escriba en un poco mas centrado? Es para poner los datos de más de una variable en una misma linea del monitor.

    1. Hola Álvaro, claro que se puede, puedes utilizar un \t para representar un tabulador. Puede enviar varios tabs en una misma línea para acomodar a tu gusto el texto. También puedes utilizar \n para un «enter».
      Quedo en espera de tus comentarios.
      Saludos!

  8. Hola, tengo un magnetómetro(sensor), el cual envía datos por puerto rs232 como podría hacer para poder aceptar estos datos con mi arduino uno…???

    1. Hola Andrés,
      Lo que se tiene que utilizar es un convertidor de niveles RS232-TTL, ya que un protocolo RS232 maneja niveles lógicos distintos a los que es capaz de interpretar el Arduino, una vez que son convertidos, tienes que insertarlos en dos pines digitales que tienes que declarar como Serial, estos entrarán al Arduino, y podrías imprimirlos al puerto Serie que comúnmente utilizamos (pines 0 y 1) para que puedas visualizar lo que llega en el monitor serie de la computadora. Para poder declarar un nuevo puerto Serie, por ejemplo para los pines 2 y 3 (que irían al convertidor RS232-TTL) tienes que utilizar la librería:

      #include

      Y crear un objeto:

      SoftwareSerial SerialNuevo(2,3);

      El resto del código se utilizaría como lo has visto en este capítulo, solo que ahora manejarías 2 puertos serie: SerialNuevo y Serial

      No sé si me he dado a entender, de cualquier manera quedo al pendiente de tus comentarios.

      Saludos!

  9. Hola..excelente tus explicaciones… necesitaría aprender a tomar un valor del sensor de temperatura y luego q muestre en un display de 7 segmentos con 3 dígitos..

  10. Hola buenas tardes, desde colombia. estoy usando arduino para comunicar me con una celda de carga de una balanza, uso el HX711 Y EL ARDUINO, cada vez que inicia el puerto sin desconectar el arduino me envia los mensajes iniciales y eso me perjudica dado a que deseo mostrar el peso para que un sistema de facturación lo muestre, lo siguiente en el puerto serial

    -0.005 Kg
    -0.005 Kg
    -0.005 Kg
    -0.005 Kg
    -0.004 Kg
    -0.004 Kg
    -0.004 Kg
    -0.004 Kg
    -0.004 Kg
    -0.004 Kg
    -0.004 Kg
    -0.004 Kg

    y cuando el sistema agrego el pero del producto me reinicia el arduino y ejemplo agrego 0.500 Kg y el sistema me toma el promer valor que seria -0.005 Kg o -0.004 Kg

    1. Hola Jonathan, el Arduino trae una opción para que cada vez que se conecte el puerto serie (por el puerto USB), el programa se reinicie y se recargue, esto para que cuando vayas a cargar un nuevo programa desde la PC, la placa se reinicie en el momento adecuado de manera automática. Puede quitar esta opción de manera física (en la placa), el detalle será que cada vez que vayas a cargar un nuevo programa, deberás presionar el botón de reset de manera manual. Para desactivar el autoreset, deberás cortar una pista de la placa. Te dejo un link del foro oficial de Arduino donde lo explican. Si tienes alguna duda sobre esto, me lo comunicas y te ayudo en el proceso.

      La otra opción sería mejorar un poco el código para evitar estos datos iniciales. Tú me avisas por cuál te decides.

      Saludos!

Deja un comentario