¡Domina las Entradas Analógicas y Variables en Arduino con Este Tutorial Fácil y Completo!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

En este curso aprenderás a programar diferentes prácticas utilizando las entradas analógicas de la placa de arduino. En esta entrada vamos a ver las entradas analógicas, su funcionamiento y características.

Nuestro Arduino no sólo puede enviar señales sino que también puede recibirlas con dos propósitos principales como son leer datos de sensores y recibir mensajes de otros dispositivos (shield, otro Arduino, PC, etc.).

Para cada una se explica la parte de electrónica que deberás conocer antes de programarlas. Antes de continuar con las lecciones del curso asegúrate que dispones de todos los componentes que se van a necesitar.

¿Qué es una Señal Analógica?

Las entradas analógicas trabajan con señales analógicas. Así que antes tenemos que ver qué es una señal analógica (y sus diferencias con las señales digitales). Una señal analógica es aquella que puede tomar diferentes valores. Una señal eléctrica analógica es aquella en la que los valores de la tensión o voltaje varían constantemente y pueden tomar cualquier valor.

Una señal analógica es una magnitud que puede tomar cualquier valor dentro de un intervalo -Vcc y + Vcc. Por ejemplo, una señal analógica de tensión entre 0V y 5V podría valer 2,72V, o 3.41V (o cualquier otro valor con cualquier número de decimales).

Lea también: aprende a declarar y conectar módulos Bluetooth HC-05 y HC-06

Por contra, recordemos que una señal digital de tensión teórica únicamente podía registrar dos valores, que denominamos LOW y HIGH (en el ejemplo, 0V o 5V). Las entradas digitales son las mismas que las salidas digitales, es decir, los pines que van del 1 al 13. Se diferencian de las analógicas porque éstas son capaces de “entender” sólo dos niveles de señal, LOW o valores cercanos a 0 V y HIGH o valores cercanos a 5 V.

Su forma característica es conocida como señal de onda senoidal y las representaciones se realizan en el dominio del tiempo.

Pines Analógicos en Arduino

En Arduino podemos encontrar 6 entradas analógicas (A0-A5). En arduino disponemos de 6 pines para entradas analógicas serigrafiados con los números del A0 al A5. Las entradas analógicas del modelo Uno son las correspondientes a los pines de A0 a A5. Los 6 pines correspondientes a las entradas analógicas A0..A5 del Arduino UNO corresponde al puerto C.

Los pines analógicos de Arduino también tienen todas las funcionalidades de los pines digitales. Por lo tanto, si necesitamos más pines digitales podemos usar los pines analógicos. Estos 6 pines se pueden usar como entradas y salidas digitales como cualquier otro puerto digital como hemos visto en el apartado anterior.

Es importante recordar que no podemos sobrepasar los límites de voltaje permitidos, es decir, si se aplica un voltaje mayor a 5 voltios en una entrada digital, la placa de arduino se quemará.

Lea también: aprende a usar Serial.begin() en tus proyectos Arduino

El Convertidor Analógico-Digital (ADC)

El microcontrolador solo entiende señales digitales (1’s y 0’s), por lo tanto para poder leer señales analógicas necesitamos los convertidores Analógico a Digital (ADC).

Un ADC es un dispositivo que convierte una medición analógica en una medición digital codificada con un número N de bits. Internamente, Arduino tiene un conversor analógico-digital que mapea la tensión recibida a un número entero. Los valores van desde 0V igual a 0, hasta 5V igual a 1023. En el caso de un arduino Uno, el valor de 0 voltios analógico es expresado en digital como B0000000000 (0) y el valor de 5V analógico es expresado en digital como B1111111111 (1023).

El microcontrolador de Arduino UNO contiene internamente un conversor analógico a digital de 6 canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Los microcontroladores de Arduino contienen en la placa un conversor analógico a digital de 6 canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023.

Una de las características claves del convertidor, es su número de bits, que define la resolución con la que podemos cuantificar esa conversión a digital. En el caso de Arduino, son 10 los bits que maneja en la puertas analógicas, lo que significa que su resolución es 1.024 posibles valores.

El ATMega328p, al igual que toda la gama ATMega de Atmel y otros microcontroladores, tienen un ADC integrado y no necesita ningún hardware adicional, esto nos permite simplemente conectar un sensor analógico. Aunque el ATmega328P tiene 6 pines que son capaces de ser utilizados como pines de entrada analógicos (Port C), sólo hay un ADC en el microcontrolador, pero entre el ADC y los pines hay un multiplexor analógico, esto permite que podamos elegir qué pin está conectado al ADC, es decir, aunque podemos utilizar todos los pines, sólo se puede leer el valor de uno de ellos a la vez, para casi todas las aplicaciones esto es más que suficiente, pero en algunos casos limitados que necesitan lecturas ADC de alta velocidad se podría necesitar el uso de ADC externos.

Lea también: aprende a declarar un potenciómetro en tu código Arduino

El ADC en microcontroladores AVR utiliza una técnica conocida como aproximación sucesiva mediante la comparación de la tensión de entrada con la mitad de la tensión de referencia generada internamente. La comparación continúa dividiendo de nuevo la tensión y actualizando cada bit del registro ADC a 1 si el voltaje es HIGH en la comparación o 0 en el otro caso.

El datasheet de ATmega advierte de hacer lecturas rápidas entre pines analógicos (analogRead). Esto puede causar ruido eléctrico e introducir jitter en el sistema analógico.

Registros del ADC

Los siguientes registros son fundamentales para la configuración y control del ADC:

  • ADMUX: ADC Multiplexer Selection Register. Selector del canal del multiplexor del ADC y el voltaje de referencia.
  • ADCSRA: ADC Control and Status Register A. Control del ADC y su estado.
  • ADCL: ADC Data Register Low.
  • DIDR0: Digital Input Disable Register 0. Para deshabilitar la entrada digital de los pines analógicos.

Velocidad de Muestreo y Modos de Funcionamiento del ADC

Primero debe darse un reloj al ADC para establecer la velocidad de muestreo, pero esta tiene un máximo de 200kHz, este valor se establece mediante los prescaler. Estos son configurados por el registro ADCSRA y los bits relacionados que son ADPS2, ADPS1 and ADPS0 con valores de prescaler de 2 a 128. Tenemos que tener cuidado de la frecuencia máxima de trabajo del ADC, este valor se especifica en la ficha técnica y es de 200 kHz, este es el valor del reloj interno de la circuitería del ADC y se genera dividiendo el reloj principal ATmega, que en el caso del UNO es 16 MHz, este divisor del reloj se realiza mediante pre-escaladores y sólo hay un rango limitado de valores, por lo que la frecuencia máxima que podemos utilizar y estar dentro de la frecuencia máxima de trabajo es 125 kHz.

El siguiente pre-escalador supone usar el ADC a 250 kHz, en este caso no se puede garantizar la resolución de 10 bits, pero si una resolución de 8 bits. El ADC interno también se puede utilizar en un modo de 8 bits, donde sólo se utilizan los 8 bits más significativos de la resolución de 10 bits completa, esto podría ser útil cuando se trabaja en ambientes ruidosos y sólo necesita 8 bits de resolución, el uso de este modo es un plus debido a que no es necesario dedicar más tiempo de CPU calculando los 10 bits completos.

El ADC puede trabajar en dos modos: single conversion mode y free running mode. En el ejemplo anterior usamos ADATE para activar el auto trigger y el modo free running porque solo estamos leyendo de un pin analógico. En caso que se vaya a leer diferentes pines, no tiene sentido usar el modo free running porque existe una limitación que al cambiar de pin debemos esperar dos conversiones para hacerlo, porque es el tiempo que le cuesta al multiplexor cambiar de un pin a otro. Al usar el modo de conversión simple (single conversion) debemos comprobar el bit ADSC hasta que vuelve a 0 (cleared) y la conversión está hecha.

Precisión y Referencia de Tensión (AREF)

Para entender la precisión de una entrada analógica es necesario entender cómo funciona un conversor analógico digital (ADC), que es su componente fundamental. Se caracterizan por leer valores de tensión de 0 a 5 Voltios con una resolución de 1024 (10 bits). En el caso de Arduino Uno, Mini Pro, y Mega, las entradas analógicas disponen de 10 bits de resolución, lo que proporciona 1024 niveles digitales, lo que a 5V supone una precisión de la medición de +-2,44mV. Arduino Due tiene una resolución de 12bits, 4096 niveles digitales, lo que supone una precisión de 0,61 mV.

Un ADC no proporciona valores absolutos, sino que proporciona una comparación cuantificada con relación a un valor de referencia. Como las señales que normalmente manejamos en Arduino están alrededor de los 5V, comparar contra 5V es lo razonable, porque además la industria tiene una gama completa de sensores cuyo valor máximo devuelve 5V.

El ancho de este intervalo medido en mV es la precisión de la señal. Cuanto mayor sea el número de bits, mayor será el número de intervalos, menor será el ancho del intervalo, y por tanto mejor la precisión de la medición.

Precisión Relativa y `analogReference()`

Hasta ahora hemos supuesto un autómata alimentado entre 0V y 5V, que mide una señal analógica de tensión entre 0V a 5V. En este caso, con un ADC de 10 bit tenemos una precisión de 4,88mV, lo que supone una precisión relativa respecto a la señal de entrada de 0,1% (1/1024). Sin embargo, supongamos que medimos una señal que varía entre 0V y 1V. En este caso, con el mismo ADC de 10 bit tendríamos la misma precisión absoluta de 4,88mV, pero una menor precisión relativa respecto a la señal, que caería hasta 0,5%.

Es decir, si realizamos una medición a una señal que varía en un límite inferior a Vcc estamos perdiendo precisión relativa. Esto es la consecuencia de no aprovechar todo el rango de la medición, por lo que en realidad el ADC se comporta como si tuviera un número inferior de bits.

Para resolver esta situación Arduino permite cambiar la tensión tomada como referencia por el conversor analógico digital. La tensión de comparación contra la que realizamos la conversión de analógico a digital, debería ser el valor máximo posible de la señal de entrada. Porque es cuándo tendremos la mejor resolución posible.

También se puede cambiar la tensión máxima (siempre por debajo de Vcc) que utiliza el ADC como referencia, es la llamada tensión de referencia y es la tensión contra la que todas las entradas analógicas hacen las conversiones. Esta tensión de referencia se toma del pin AREF. Reducir el voltaje máximo del ADC tiene sentido para mejorar la resolución del ADC. El siguiente paso es configurar el voltaje de referencia usado por el ADC, este este caso es 5V. El voltaje de referencia es configurado en el registro ADMUX con los bits REFS1 y REFS0.

Si modificamos la tensión de referencia, debemos definir el modo mediante la función AnalogRef antes de realizar cualquier lectura analógica. En el caso de usar la referencia de tensión externa (EXTERNAL), si sabemos con total seguridad que una señal no va a superar de un cierto valor de tensión, por ejemplo 0.7V, podemos proporcionar este valor como referencia a través del Pin Aref. La medición se realizará tomando esta tensión como referencia en lugar de Vcc, por lo que recuperamos toda la precisión relativa.

En caso de introducir un valor de tensión en el pin Aref no debemos superar este valor en las entradas analógicas. Además, en ningún caso superaremos la tensión de alimentación de Arduino. De lo contrario podríamos dañar los pines analógicos.

Opciones de Referencia Analógica (`analogReference()`)

La función `analogReference()` configura la referencia de voltaje usada para la entrada analógica. El valor de la referencia se cambia con la función AnalogRef, y los valores posibles son:

Opción de Referencia Descripción
DEFAULT Valor por defecto, correspondiente con Vcc (5V o 3.3V, según modelos)
INTERNAL Corresponde a 1.1V (en Atmega 168 y 328)
EXTERNAL Voltaje aplicado de forma externa en el pin Vref (siempre entre 0 y Vcc)
INTERNAL1V1 Corresponde a 1.1V (sólo en Mega)
INTERNAL2V56 Corresponde a 2.56V (sólo en Mega)

Funciones Básicas para Entradas Analógicas

La función `analogRead()`, utilizada normalmente en la función `loop()`, sirve para leer un valor de un pin de entrada analógico. Los valores están comprendidos entre 0 y 1023. Esta función nos devolverá un valor que va de 0 a 1023 en proporción al nivel de la señal de entrada. El valor devuelto por la función `AnalogRead()` se codifica como un número entero 0 a 1023.

En Visualino disponemos de las funciones para leer de entradas analógicas y escribir en salidas analógicas en la agrupación de bloques “Pin Functions”.

El código para realizar la lectura es realmente sencillo, y similar al que vimos para las entradas digitales. Simplemente realizamos la lectura mediante `AnalogRead()` y almacenamos el valor devuelto.

Conexión de Sensores Analógicos

Supongamos que dispongamos un sensor analógico que proporciona una señal analógica entre 0V a 5V. El esquema de conexión es similar al que empleamos para realizar la lectura digital.

Uso del Divisor de Tensión

La forma mejor de realizar la adaptación es emplear un simple divisor de tensión. Con esta configuración el pin digital de Arduino recibirá una tensión que varía entre 0 a 3,84V por lo que, como hemos explicado, estaríamos perdiendo precisión relativa. Una opción sería ajustar las resistencias para que los límites estén lo más cercanos posible a 0 y 5V, o usar otro divisor de tensión para alimentar el pin Aref.

Los valores de las resistencias a emplear dependen del voltaje que queremos leer, y de la impedancia del sensor. En general, deben cumplir las siguientes condiciones:

  1. Convertir la señal en un rango inferior pero similar a la tensión de alimentación.
  2. Ser muy superiores a la impedancia equivalente del dispositivo a medir.
  3. Despreciables respecto a la impedancia de la entrada Arduino.
  4. Limitar la corriente que circula por ellas para minimizar pérdidas.
  5. Ser capaces de disipar la potencia que van a soportar.

Podéis ayudaros de la calculadora de divisores de tensión para calcular valores de resistencia que cumplan estos requisitos. No empleéis este sistema para leer tensiones superiores a 35V, o para dispositivos de corriente alterna sin estar muy seguros de lo que estáis haciendo. Es muy posible que las resistencias no aguanten.

Salidas Analógicas (PWM y DAC)

Arduino Uno no posee salidas analógicas puras, sin embargo el Arduino Due sí tiene salidas analógicas puras mediante dos DAC. El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Las salidas analógicas puras necesitan de un conversor digital analógico (DAC). Los DAC se usan para los altavoces, amplificadores para producir sonido.

Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Al contrario que las señales analógicas, las señales digitales se pueden almacenar y transmitir sin degradación.

La función `analogWrite()` escribe un valor analógico (onda PWM) al pin especificado. No en todos los pines digitales se puede aplicar PWM. En Arduino la frecuencia de PWM es de 500Hz. El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período.

Para generar la señal PWM se utiliza los timers configurándose varias formas de trabajo. El registro del contador se pone en marcha desde cero y cuenta de modo ascendente. Cuando el valor de este registro se iguala al de otro registro de comparación se conmuta el pin de salida. Cuando el valor del registro del contador llega al final (TOP) vuelve a comenzar (BOTTOM).

Los microcontroladores usan varios modos de PWM, uno de ellos el el Fast PWM que puede ser generado 8 (256), 9 (512) y 10 (1024) bits, una resolución mayor de 8 bits solo es posible usando un timer de 16 bits. Otro modo de PWM es Phase Correct PWM que es el que debería usarse para el control de motores. En los microcontroladores AVR, el PWM está disponible con todos los timers. Timer 0 y timer 2 dan una resolución de 8 bit mientras que el timer 1 ofrece una resolución de 16 bits. El modo PWM en los microcontroladores AVR se controla por hardware. Esto significa que todo se lleva a cabo por la CPU AVR. Todo lo que se necesita hacer es inicializar e iniciar el temporizador y establecer el ciclo de trabajo. El ATmega328p tiene 3 timers y cada timer maneja dos salidas A y B, en total tenemos 6 salidas PWM.

Estos temporizadores generan interrupciones cuando alcanzan el overflow o cuando alcanzan el registro de comparación. Waveform Generation Mode bits (WGM): these control the overall mode of the timer. Los registros de comparación de salida OCRnA y OCRnB establece los niveles en los que las salidas A y B se verán afectados.

Debemos tener en cuenta los efectos que supone la rápida conexión y desconexión de la señal pulsada puede suponer en el dispositivo alimentado. En cuanto a transistores, en general, los de tipo BJT resultan apropiados para funcionar como amplificación de señales PWM.

El uso de los Timer no es exclusivo de las salidas PWM, si no que es compartido con otras funciones. La librería servo hace un uso intensivo de temporizadores por lo que, mientras la estemos usando, no podremos usar algunas de las salidas PWM. En Arduino Uno, Mini y Nano, el pin 11 se emplea también para la función MOSI de la comunicación SPI. Changes on pins 3, 5, 6, or 11 may cause the delay() and millis() functions to stop working.

El siguiente código incrementa progresivamente el valor de una señal analógica desde 0 a 255. Al alcanzar el valor máximo el contador pasará a 0, por lo que el ciclo volverá a iniciarse.

Ejemplos Prácticos de Programación en Arduino

Todo programa para Arduino consta de 2 funciones; la función `setup()` y la función `loop()`. La función `loop()` se ejecuta repetidamente después de la función `setup()`. Las instrucciones que comienzan por el símbolo de doble barra "//" se tomará como comentario para el programa.

Lo siguiente es abrir el puerto serial en la función `setup`. Si nos muestras caracteres extraños es que la configuración del monitor serial está comunicándose con una tasa bps distinta a los 9600 con los que hemos configurado nuestro puerto serial. En el programa o boceto que se proporciona a continuación, lo primero que debe hacer en la función de configuración es comenzar las comunicaciones en serie, a 9600 bits por segundo, entre su placa y su computadora con la línea: Serial.begin (9600);

Lectura de un Potenciómetro

En esta sesión comenzamos a trabajar las entradas analógicas con potenciómetros. El funcionamiento básico de un potenciómetro es el de una resistencia variable, de tal forma que a medida que giramos su palanca variamos el valor de la resistencia interna.

Un potenciómetro (o pote) es un transductor electromecánico simple. Convierte el movimiento rotativo o lineal del operador de entrada en un cambio de resistencia. Este cambio se usa (o puede usarse) para controlar cualquier cosa, desde el volumen de un sistema de alta fidelidad hasta la dirección de un gran barco de contenedores.

tags: #arduino #declaracion #variables #analogicas #tutorial