La velocidad de la comunicación serial en Arduino

9
53539

La comunicación serial basada en el protocolo RS-232 es la principal forma de comunicación que posee Arduino para intercambiar información con otros dispositivos. A través del puerto serie es como los usuarios podemos enviarle información desde la computadora. El Arduino IDE utiliza comunicación serial para cargar el código en el Arduino.

La mayoría de las personas que tienen un poco de experiencia con Arduino es capaz de reconocer la siguiente instrucción:

Esta instrucción le indica al Arduino que inicie comunicación con la computadora (o cualquier dispositivo conectado a los pines RX y TX) con una velocidad de comunicación serial de 9600 bits por segundo (baudios). Existen otras velocidades de transmisión de datos, tales como 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200. Estos son los valores predeterminados para comunicación entre Arduino y una computadora, los cuales pueden verse en el Monitor Serie del Arduino IDE.

Pero, ¿cual es el efecto de utilizar una velocidad u otra? Para observar este tipo de fenómenos he diseñado un pequeño código a modo de experimento que nos permitirá entender de una manera más simple el efecto de la velocidad de la comunicación serial serie sobre la ejecución de nuestros programas en Arduino. Para los efectos de este post se considerará un Arduino Nano (Atmega328P).
Código de pruebas

Para llevar a cabo las pruebas, le pediré al Arduino que me genere los valores de una onda senoidal y me los imprima en el Monitor Serie. Una onda senoidal posee determinadas características como amplitud, periodo, frecuencia y frecuencia angular.

Le pediré a Arduino que me genere los valores de una onda senoidal con un periodo de 5 segundos. De esta forma, la frecuencia será 0.2 Hz, y la frecuencia angular ω = 0.2·2·π. Voy a indicarle al Arduino que empiece a generar valores de la función seno a partir de 5000 milisegundos, hasta 10000 milisegundos. De esta forma, el resultado debe ser una onda senoidal de un solo periodo. Se considerará una amplitud de 1000 y una velocidad comunicación serial de 9600 baudios.

Este código genera valores entre 5 y 10 segundos de iniciada la ejecución. En el monitor serie se ven los siguientes resultados:

Este algoritmo generó un total de 585 valores. Estos 585 valores graficados en Excel describen una gráfica de una onda senoidal, tal como muestra la siguiente imagen.

Si se repite este algoritmo varias veces, siempre se generan 585 valores. Ahora, ¿que tal si variamos la velocidad del puerto? Al correr el algoritmo utilizando una velocidad de 4800 baudios, se obtienen 297 valores, es decir, un poco menos de la mitad de los valores obtenidos cuando se utiliza 9600 baudios.

Cuando se utiliza 19200 baudios, es decir, el doble de 9600, se obtienen 1158 valores. Esto es un poco menos del doble de los valores que se obtienen cuando se utiliza 9600 baudios de velocidad. La siguiente gráfica muestra la cantidad de valores generados en función de las velocidades del puerto serie.

velocidad de la comunicación seria

Un comportamiento más o menos lineal. Aumentar la velocidad la comunicación serial permite aprovechar más ciclos de trabajo del Arduino y, a su vez, generar más datos. Lo mismo sucede cuando se envían datos al Arduino, tal como alguna vez lo expliqué en este post.

El algoritmo generado producirá un valor de la onda senoidal con cada ciclo en el que Arduino repite la ejecución de la instrucción. Esto sucede a una velocidad más alta de la que el Arduino puede imprimir los datos en el Puerto Serie. Si se aumenta la velocidad al máximo (115200 baudios) se obtiene la mayor cantidad de datos impresos generados, aunque en realidad el Arduino es capaz de producir más de 7022 datos en 5 segundos.

El problema es que almacenar estos datos requiere de espacio de memoria, por lo cual no será posible que se almacenen todos los datos generados para su posterior impresión. Imprimir en «tiempo real» es más lento, pero no consume mucho espacio de memoria. Básicamente el Arduino libera el espacio de memoria asignado al cálculo del valor de la onda en cada ciclo de la estructura while, lo cual mantiene la memoria SRAM con bastante espacio disponible.

Dicho esto, espero que la información presentada sea de utilidad para ustedes. No duden en hacerme llegar sus dudas o comentarios acerca de este tema. Saludos.

5 3 votes
Article Rating
Suscríbete
Notify of
guest

9 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
Francisco Garay
Francisco Garay
2 years ago

Hola Antony
Si quisiera usar un ADC de 24 bits y muestrear 4 señales a 200 muestras por segundo. Digamos Señal1+»bandera»+Señal2+»bandera»+Señal3+»bandera»+Señal4, significan 3 bytes por señal + 1 byte por «bandera» equivaldrían 96bitsx200M/bit=19200 bits por segundo. Esto lo podría grabar en una memoria SD SPI en tiempo real???

Sergio
Sergio
2 years ago

Hola, soy nuevo en esto y ando un poco perdido. Estoy haciendo un proyecto con un AN33IoT. Quiero recoger información de sensores, uno de ellos es un KY-039 por infrarrojo para obtener el ritmo cardiaco, y enviarlos a un servidor.

Para el proyecto me piden que especifique la velocidad de lectura del arduino y su capacidad de acumulación de datos para su posterior envío al servidor (cuántas señales puede recoger).

Respecto a la velocidad, entiendo que además de lo que ha publicado en este post tendrá que variar en funcion del modelo de arduino, no ?

Un saludo.

Joel A.
Joel A.
2 years ago

Buenas tengo una duda,
Que pasa si hay distintas velocidades entre la comunicación serial _ USB ¿que efecto se produce?

jose
jose
4 years ago

como configurarlo mi gps arduino para que me de datos en 1200 bps, o se configura el arduino??

Mannuel Rodriguez
Mannuel Rodriguez
4 years ago

Qué tal como vas ssluda Manuel, buena explicación, buen reporte

Andres Perez
5 years ago

Muy claro y conciso, me ahorraste hacer el experimento estaba pensando en hacer algo parecido. Muchas gracias.