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:
1 |
Serial.begin(9600); |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int amplitud = 1000; //Amplitud de la onda senoidal double w = 2 * 0.2 * 3.141593; //Frecuencia angular void setup() { Serial.begin(9600); //Se inicia comunicacion serial } void loop() { //Mientras millis() sea mayor a 5000 milisegundos while (millis() >= 5000) { //Mientras millis() sea menor a 10000 segundos while (millis() <= 10000) { //Funcion millis transformada a tiempo double t = millis() * 0.001; //Calculo del valor puntual de la onda senoidal double num = amplitud * sin(w * t); //Se imprime el valor calculado Serial.println(num); } } } |
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.
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.
Muy claro y conciso, me ahorraste hacer el experimento estaba pensando en hacer algo parecido. Muchas gracias.
Qué tal como vas ssluda Manuel, buena explicación, buen reporte
como configurarlo mi gps arduino para que me de datos en 1200 bps, o se configura el arduino??
El Arduino puede comunicarse a 1200 bps, pero el GPS tambien debe estar configurado para dicha velocidad. Tambien debes verificar los niveles de voltaje de un dispositivo y otro para evitar problemas entre ambos circuitos
Buenas tengo una duda,
Que pasa si hay distintas velocidades entre la comunicación serial _ USB ¿que efecto se produce?
Algunos caracteres no llegarán bien y el mensaje se corromperá
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.
La velocidad de la que se habla aquí es la de envío de datos a la computadora, no la velocidad de muestreo
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???