Lectura de un valor de tensión en un pin analógico y escritura en puerto serie
Vamos a continuar con la serie de tutoriales de Arduino dedicados a tomar contacto con los comandos más básicos, así como con los distintos tipos de pines de los que disponemos. A partir de este y el siguiente tutorial, nos centraremos más en el uso de determinados shields, la conexión de algunos componentes concretos, etc, pero sin dejar de lado algunas de las particularidades/curiosidades de Arduino.
Introducción al tutorial
En este típico tutorial de iniciación a Arduino combinaremos el uso de los pines analógicos con la impresión de datos por el puerto serie.
Colocaremos un potenciómetro para variar la tensión en un pin analógico, imprimiendo por el puerto serie el valor que nos proporciona Arduino, observando así la escala empleada para cuantificar este valor de tensión. El siguiente vídeo muestra el resultado final que debemos conseguir.
Lista de componentes
- 1x Arduino Mega (podemos emplear cualquier Arduino que funcione a 5v).
- 1x Potenciómetro lineal de 10 kΩ.
- 1x Protoboard.
- 1x Juego de cables.
Montaje del diseño
El montaje es tremendamente simple. Tan sólo debemos conectar un pin del potenciómetro a una fuente de tensión positiva, otro pin a uno de los pines analógicos de arduino, y el último pin lo conectaremos a masa:
Podemos apreciar que la entrada analógica utilizada es la etiquetada como A0, y que se emplean los pines de 5v y gnd del propio arduino como fuente y referencia de tensión, respectivamente.
Escribiendo el programa
En una primera aproximación, podemos crear un sketch simple y totalmente funcional, como el siguiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* *********************************************************** **** rDuinoStar.com - Comunidad Arduino en Español **** *********************************************************** Tutorial 3.- Estradas analógicas Lectura de un valor de tensión en un pin analógico y escritura en puerto serie del valor recogido. Uso público citando el autor o procedencia, bajo licencia: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0) Éste y más ejemplos en rDuinoStar.com, tu comunidad Arduino en Español */ // Pin analógico que utilizaremos como entrada de datos int entradaDatos = A0; // Variable que recogerá las lecturas de A0 int valorDatos = 0; void setup() { // Establecemos la velocidad para transmitir datos en serie a // 9600 baudios Serial.begin(9600); } void loop() { // Leemos el valor en la entrada analógica A0 y se lo asignamos a // valorDatos valorDatos = analogRead(entradaDatos); // Imprimimos el valor por el puerto serie Serial.println(valorDatos); } |
El programa es muy sencillo, aunque detengámonos en algunas lineas.
– En primer lugar, tal y como observamos en la línea int entradaDatos = A0; los pines analógicos se enumeran como los digitales, anteponiéndolos la letra A. En este caso, nos referimos al pin analógico 0 (A0). Observad cómo después, en el bucle setup, no es necesario establecer estos pines como entradas tal y como lo hacíamos con los digitales. Aunque los pines analógicos se pueden emplear como pines de propósito general en caso de ser necesario, por defecto actuarán como entradas.
– La linea Serial.begin(9600); activa las comunicaciones poner el puesto serie, y establece la velocidad de transmisión a 9600 baudios. En el vídeo podemos apreciar cómo en el monitor serial del ordenador (donde vemos imprimidos los valores disponibles en A0) la velocidad ha de coincidir con la establecida en el programa para que los valores sean visibles.
– La función analogRead(entradaDatos) va a devolver un número entero comprendido en el rango de valores 0-1023, ambos inclusive. En nuestro caso, 1023 se corresponderá con el valor máximo de tensión (5v) suministrado al pin A0, y 0 con el valor mínimo de tensión (0v).
– Por último, el comando empleado para escribir una nueva línea y mandarlo por el puerto serie es la última linea destacada, es decir, Serial.println(valorDatos); .
Últimas consideraciones
Hasta aquí hemos visto tanto el rango de valores que vamos a tener en una entrada analógica, como el uso del puerto serie para enviar datos al ordenador y visualizarlos.
En el vídeo sobre el resultado final del tutorial podéis ver cómo en la primera tanda de valores, aunque la rueda del potenciómetro no gire, los valores van cambiando constantemente. Esto es debido a factores tales como el ruido.
Sin embargo, si pensamos en una aplicación en la que se genere un nuevo registro cada vez que un valor en una entrada analógica varíe, estaremos creando nuevas líneas de registro cuando en realidad esas variaciones no se están produciendo.
Una solución rápida y sencilla es la inclusión de una condición. Por ejemplo, vamos a establecer un umbral de tal forma que, hasta que el valor a la entrada del pin A0 no varíe en más de 2 unidades, no se registre ese dato (en nuestro caso que no se imprima por el puerto serie). El código sería el siguiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* *********************************************************** **** rDuinoStar.com - Comunidad Arduino en Español **** *********************************************************** Tutorial 3.- Estradas analógicas Lectura de un valor de tensión en un pin analógico y escritura en puerto serie del valor recogido. Uso público citando el autor o procedencia, bajo licencia: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0) Éste y más ejemplos en rDuinoStar.com, tu comunidad Arduino en Español */ // Pin analógico que utilizaremos como entrada de datos int entradaDatos = A0; // Variable que recogerá las lecturas de A0 int valorDatos = 0; // Variable que almacenaá el valor anterior en A0 int valorAnterior = -1; void setup() { // Establecemos la velocidad para transmitir datos en serie a // 9600 baudios Serial.begin(9600); } void loop() { // Leemos el valor en la entrada analógica A0 y se lo asignamos a // valorDatos valorDatos = analogRead(entradaDatos); // Comprobamos si el valor es distinto al anterior +-2 para no imprimir // varias veces el mismo valor if (abs(valorDatos - valorAnterior) > 2) { // Imprimirmos el valor por el puerto serie Serial.println(valorDatos); // Actualizamos el valor anterior al actual valorAnterior = valorDatos; } } |
Tan sólo hay que destacar 3 aspectos de este sketch:
– Incluimos una nueva variable que servirá como referencia para comprobar cuánto ha variado A0. Es necesario inicializar esta variable a un valor distinto de pues que si no noe
– abs(valorDatos - valorAnterior) va a proporcionarnos el valor absoluto de la resta del valor de referencia con respecto al valor actual en A0.
– Si el resultado de la resta es mayor que dos, if (abs(valorDatos - valorAnterior) > 2) , es entonces cuando imprimimos el valor y actualizamos el valor de referencia al valor actual.
Como siempre, esperamos que el tutorial os sirva de ayuda. Hasta otra!
Que buen Aporte a la comunidad, corto y muy bien explicado, gracias por el aporte me justo lo que necesito para mi proyecto de DImmer.