Comunicación Serial con Arduino

33
78636

Arduino se caracteriza principalmente por su capacidad para comunicarse con las computadoras mediante el puerto serie, conocido como comunicación serial. Aunque el puerto serie ha sido parcialmente reemplazado por la tecnología USB, Arduino incluye un convertidor de Serial a USB, permitiendo que la placa sea reconocida como un dispositivo en un puerto COM a través de una conexión USB.

El Arduino IDE ofrece el Monitor Serial, una herramienta accesible desde el menú de herramientas bajo la opción «Monitor Serial». Esta herramienta facilita el envío y la visualización de datos a través del puerto Serie, representando el método más sencillo para establecer comunicación serial con Arduino.

monitor serial

A través de esta ventana se puede enviar o recibir información utilizando el puerto serie.

Esta ventana permite enviar o recibir información mediante el puerto serie. Es importante destacar que para acceder a esta ventana, es necesario que la placa Arduino esté conectada a la PC a través de USB.

Para comenzar la comunicación serial con Arduino usando el Monitor Serial, es necesario introducir y cargar ciertos comandos en el Arduino IDE al microcontrolador.

El código es el siguiente:

La comunicación serial se inicializa en la función setup con la instrucción Serial.begin(9600). El número 9600 representa el baud rate, definido como el número de símbolos transmitidos por segundo, ya sea en un medio analógico o digital. Para las aplicaciones comunes, se utiliza un baud rate de 9600.

Es necesario usar Serial.begin(9600) siempre que se desee establecer comunicación con Arduino a través del puerto serie.

Dentro de la función loop, encontramos el comando Serial.println(‘1’), que indica al microcontrolador imprimir el carácter ‘1’ a través del puerto serie. A diferencia de Serial.print o Serial.write, Serial.println añade automáticamente un salto de línea después de enviar el dato, lo cual es útil en ciertas situaciones, especialmente al usar el monitor serial.

Para imprimir un carácter con Serial.println, se coloca el carácter deseado entre paréntesis y comillas. En este ejemplo, se imprime el carácter ‘1’, con un retraso (delay) de 1 segundo entre impresiones, permitiendo una visualización secuencial y pausada en el Monitor Serial.

Al cargar este código en la placa Arduino, se puede observar el funcionamiento del algoritmo a través del monitor serial.

Cuando se imprime el ‘1’ en el monitor serial, como indicamos al microcontrolador, se observa que el LED marcado con «TX» en la placa Arduino parpadea con cada aparición de caracteres en el monitor serial. Este LED «TX» señala que el Arduino está transmitiendo datos a través del puerto serie.

Esta capacidad de transmisión de datos desde el microcontrolador se utiliza para recoger información de sensores o dispositivos de conmutación, entre otras aplicaciones prácticas que exploraremos en futuras publicaciones.

Con el conocimiento de cómo enviar datos desde Arduino por el puerto Serie, el próximo paso es aprender a recibir datos seriales en Arduino y procesarlos. Podemos enviar estos datos desde el monitor serial usando el teclado de la computadora, lo que abre nuevas posibilidades de interacción con dispositivos externos y sensores conectados a Arduino.

El código será el siguiente:

La función setup se mantiene sin cambios. Al inicio del código, se declara una variable de tipo int llamada input para almacenar los valores recibidos a través del puerto serie.

En la función loop se encuentra el aspecto crucial del código. La expresión Serial.available() > 0 juega un papel fundamental, ya que restringe la ejecución del código únicamente a momentos en que hay datos disponibles en el puerto serie. Esta condición se coloca dentro de una estructura condicional if. Si hay datos disponibles para leer en el puerto serie, el método Serial.available() devolverá un número mayor a cero (>0), cumpliendo así con la condición del if y permitiendo la ejecución de las instrucciones dentro de su bloque.

Al cumplirse la condición de la estructura if, se asignará a la variable input un valor leído desde el puerto serie a través del método Serial.read(). Este método se utiliza siempre que necesitamos leer datos del puerto serie.

Después de asignar un valor a input, se devuelve ese mismo valor a través del puerto serie para confirmar la recepción, utilizando el método Serial.println(input) para imprimir el valor de input.

A continuación, se explica cómo funciona el código una vez cargado en la placa Arduino.

1

Abrimos el monitor serial y en la ventana de comandos escribimos 1 y le damos clic en enviar. Luego enviamos 2, 3, 4 y 5.

Nos aparecerá lo siguiente:

49

50

51

52

53

Lo podemos apreciar en esta imagen:

2

Se preguntarán, si he tecleado el 1 y me aparece el 49, con el 2 me aparece el 50, con el 3 el 51 y así sucesivamente… ¿qué está sucediendo?. Simplemente es la forma como estamos imprimiendo los caracteres con el método Serial.println().

Cuando imprimíamos el ‘1’ en el ejemplo anterior, aparecía el 1 en el monitor serial. Ahora estamos imprimiendo un valor entero a través de la variable input. Cuando se intenta imprimir un entero (1,2,3,4,5…), el método Serial.println() imprimirá dicho entero en formato ASCII.

El ASCII es muy utilizado en programación y telecomunicaciones. Existen tablas que permiten traducir caracteres de ASCII a valores alfanuméricos y viceversa.

Tabla ASCII

En esta tabla se muestra los valores ASCII que representa cada caracter del alfabeto. A los números del 0 al 9 les corresponde los valores del 48 (0) al 57 (9).

Si se desea que los números que aparezcan en el monitor serial aparezcan tal y como lo introducimos por teclado, podemos agregar la línea

input=input-48;

Esta sentencia le quitará 48 a cualquier número ASCII, lo que hará que nos aparezcan números del 0 al 9. Es cuestión de cada persona empezar a teclear valores en el monitor serial y ver cual es el resultado.

En mi próximo post estaré explicando como aprovechar este algoritmo que les he presentado hoy para encender o apagar un LED utilizando el teclado de nuestra computadora.

5 1 vote
Article Rating
Suscríbete
Notify of
guest

33 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
José Diaz
José Diaz
2 years ago

Hola buen día, tengo un error al utilizar Serial.
Al compilar me salen errores por ejemplo, undefined referente to ‘Serial’

Daniel Ismael Rocha Santiago
Daniel Ismael Rocha Santiago
4 years ago

me gustaria amprender como le hago en mi arduino leer una targeta rfid mandar la informacion a una pc windows comparar la informacion y regresar falso o verdadero

Kevin Mosquera Lince
Kevin Mosquera Lince
4 years ago

Hola Daniel, tu pudiste lograr tu inconveniente? si es asi me podrias ayudar a mi?

diego
diego
5 years ago

hola necesitaría la forma de saber como deshacer el Serial.begin(9600); ose que después de un tiempo deje de trasmitir por el serial

martin4
martin4
5 years ago

BUENAS NOCHES…. estoy haciendo un proyecto donde utilizo a arduino como cliente web, este descarga la pagina html en el monitor serial, en donde aparece la palabra ACEPTADO, podria obtener o leer esta informacion i guardarla en una variable para hacer que posteriormente haga encender un led y si no existe esta palabra hacer que el led no encienda..

si es posible que codigo deberia utilizar..

Christian Ruiz Gonzales
Christian Ruiz Gonzales
6 years ago

Hola quiero enviar informacion desde mi ESP al Arduino , me puede guiar o darme una web donde pueda encontrar sobre eso, generalmente veo ejemplo que envian informacion o comandos AT desde el Arduino al ESP pero lo que quiero es a la inversa, me serviria tu ayuda, Muchas Gracias

Pablo Parra Piparra
6 years ago

NO ENTENDIO NADA Y ESTOY HACKEANDO

Natividad Hdez Romero
Natividad Hdez Romero
7 years ago

hola como puedo enviar datos de sensores analógicos de un arduino a otro y poder leerlos y usarlos para activar unos reveladores, me podría ayudar por favor?

Alexis
Alexis
8 years ago

como puedo yo hacer para mandar una cadena String de java a un LCD conectado a Arduino??

Mike Fonzalida
Mike Fonzalida
8 years ago

gracias por compartir tus conocimientos, saludos desde Argentina!!!

mariamazu
mariamazu
8 years ago

y si lo que necesito es obtener un numero decimal. Que función debería utilizar? muchas gracias

PanamaHitek
8 years ago
Reply to  mariamazu

Existen varias maneras de hacerlo, actualmente no existe un método que permita imprimir números decimales. Sin embargo en esta entrada: http://sheepdogguides.com/arduino/aht2printfloat.htm puedes encontrar una solución.

Básicamente creas tu propia función que te permite establecer cuántos decimales utilizar después del punto. En la función lo que haces es obtener primeramente el valor entero del número en decimal y obtener el número decimal restando el valor entero menos el número ingresado y concatenar el resultado para así retornarlo.

Saludos,

mariamazu
mariamazu
8 years ago
Reply to  PanamaHitek

Muchas gracias!! 🙂

Jorge Rossen
9 years ago

Quisiera saber si es posible y en ese caso cómo debería hacer para imprimir una o dos tablas de valores con una sola fila de títulos en cada una y que los valores de cada ciclo de operación aparezcan encolumnados en celdas abajo de los títulos. Actualmente cuando trato de imprimir sin usar tablas, los títulos se repiten cada vez que imprime y los valores se desplazan fuera de sus títulos respectivos en función de la cantidad de dígitos que pueden ir aumentando sucesivamente (cuando se trata de contar «millis») y se complica el seguimiento de los datos. Agradeceré alguna… Read more »

PanamaHitek
8 years ago
Reply to  Jorge Rossen

Sería más fácil que pudiese mostrarnos una imagen de cómo queda los datos y cómo quiere visualizarlos.

Saludos,

Joel Hernandez
Joel Hernandez
9 years ago

Muchas Gracias, este dato es muy interesante, no hallaba el como hacer para que el monitor serial me reflejara el número que yo le ingresaba y no su código ASCII….
ya que estuve varios días buscando solución alguna y no hallaba nada.
Muy bien explicado, Saludos desde El salvador.

PanamaHitek
8 years ago
Reply to  Joel Hernandez

Me alegra.

Gobe
Gobe
10 years ago

Mi duda es cómo (o si hay forma de) utilizar una interrupción por puerto serie en la plataforma Arduino. He utilizado una rutina basada en una condición con Serial.available pero en lo personal no me agrada utilizar polling para este tipo de comunicación.

Gobe
Gobe
10 years ago

Mi duda es cómo (o si hay forma de) utilizar una interrupción por puerto serie en la plataforma Arduino. He utilizado una rutina basada en una condición con Serial.available pero en lo personal no me agrada utilizar polling para este tipo de comunicación.

josue|
josue|
10 years ago

funciona, y ahora si quiero leer e imprimir del 10 en adelante….

antonygarciagonzalez
10 years ago
Reply to  josue|

Tienes que leer dos datos, Primero la decena y luego la unidad

CarŁoko Sanchez
10 years ago

Hola, es un sensor de humedad ahh y era 57600 jejeje es este http://www.elecfreaks.com/wiki/index.php?title=Octopus_Soil_Moisture_Sensor_Brick#Introduction y gracias por la pronta respuesta.. yo lo hice correr y que muestra la salida por el monitor serial, pero configurandolo en 57600 baudios, por eso preguntaba si se podia tener uno en 9600 y otro en 57600 :D..Saludos

CarŁoko Sanchez
10 years ago

Excelente, pero tengo una duda, si yo tengo un sensor que trabaja en 5700 baudios y otro en 9600 ¿Como podria hacer que arduino trabaje con ambos e imprima sus valores ?

antonygarciagonzalez
10 years ago

Que sensor tienes que utiliza 5600 baudios?