¡Descubre Cómo Declarar y Usar Puertos Analógicos en Arduino Fácil y Rápido!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

Medir señales analógicas es una de las técnicas más usadas en electrónica. Señales analógicas son representadas por voltaje o tensión eléctrica e indican un nivel de una medición. Muchos fenómenos físicos son captados o medidos como niveles de una magnitud o rango.

Por ejemplo, la temperatura nos indica si algo está frío o caliente; más si queremos saber la medida exacta de temperatura, debemos usar un sensor y leer o medir su salida para conocer la temperatura. Una vez que el sensor nos da una tensión o voltaje análogo a la magnitud que se desea medir, es necesario conectarlo algún circuito que convierta esta medida en un valor digital.

Los microcontroladores, como el de Arduino, no son capaces de leer directamente las señales analógicas, ya que solamente manejan señales digitales, así que es necesario convertirlas. Esto es hecho normalmente por conversores análogos para digital (ADC).

La tarjeta Arduino Uno contiene un microcontrolador ATmega328P, el cual posee 6 canales analógicos que pueden ser leídos a través de un conversor Análogo para Digital o ADC con resolución de 10 bits. Las entradas analógicas del modelo Uno son las correspondientes a los pines de A0 a A5.

En este artículo, aprenderemos a conectar potenciómetros, resistencias dependientes de luz o LDR y sensores de temperatura para entender y usar el ADC de la tarjeta Arduino, lo cual es muy fácil. Para esto, vamos a usar potenciómetros, resistencias dependientes de luz o LDR y el sensor de temperatura LM35.

Lea también: IVA 21% Excel

Fundamentos de las Entradas Analógicas

Las entradas analógicas trabajan con señales analógicas. 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).

Por contra, 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).

Una entrada analógica proporciona una medición codificada en forma de un número digital (por ejemplo, de 0 a 255). 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. 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.

En el caso de Arduino, son 10 los bits que maneja en las puertas analógicas, lo que significa que su resolución es 1.024 posibles valores. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Se caracterizan por leer valores de tensión de 0 a 5 Voltios con una resolución de 1024 (10 bits).

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. La función usada para esto es `analogRead` la cual recibe un solo parámetro, indicando el canal de entrada a leer y retorna su valor entero.

Lea también: Guía IVA reducido

En Arduino, disponemos de 6 pines para entradas analógicas serigrafiados con los números del A0 al A5. 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, la placa de Arduino se quemará.

Configuración Avanzada del ADC

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. 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.

El ADC no proporciona valores absolutos, sino que proporciona una comparación cuantificada con relación a un valor de referencia. 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. 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.

Para resolver situaciones donde la señal a medir varía en un límite inferior a Vcc y se está perdiendo precisión relativa, Arduino permite cambiar la tensión tomada como referencia por el conversor analógico digital.

Referencia de Tensión Analógica (AREF)

El valor de la referencia se cambia con la función `AnalogRef()`, y los valores posibles son:

Lea también: ¿Cómo localizar tus XML del SAT?

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).

Si modificamos la tensión de referencia, debemos definir el modo mediante la función `AnalogRef()` antes de realizar cualquier lectura analógica. 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.

Reducir el voltaje máximo del ADC tiene sentido para mejorar la resolución del ADC. Si introducimos 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.

Registros del ADC

El ADC se controla a través de varios registros:

  • 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.

Para establecer la velocidad de muestreo del ADC, primero debe darse un reloj al ADC, pero esta tiene un máximo de 200kHz. Este valor se establece mediante los prescalers, los cuales son configurados por el registro ADCSRA y los bits relacionados que son ADPS2, ADPS1 y ADPS0 con valores de prescaler de 2 a 128.

El ADC puede trabajar en dos modos: single conversion mode y free running mode. En 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.

Ejemplos Prácticos de Conexión y Lectura

Lectura de Potenciómetro

En esta práctica conectaremos un potenciómetro a la placa Arduino Uno y leeremos su nivel de tensión. Para que comprendas mejor las conexiones y el funcionamiento del circuito electrónico que vas a crear, primero explicaremos cómo funciona un potenciómetro. Es una resistencia variable de accionamiento angular que se comporta como un divisor de voltaje.

En el inicio del programa configuramos `sensorPin` para estar en la entrada analógica '0'. La variable `sensorValue` la usamos para almacenar el valor de nivel de tensión leído desde el potenciómetro. En la función `loop()`, primero leemos la entrada analógica '0' a través de la instrucción `analogRead(sensorPin);` y el resultado lo almacenamos en la variable `sensorValue`.

Lectura de Fotorresistencia (LDR)

Una fotorresistencia o fotorresistor es un componente electrónico que varía su resistencia eléctrica en función del nivel de luz que recibe. En una fotorresistencia, cuanto mayor es la cantidad de luz recibida, su resistencia interna disminuye. Este componente es útil para medir el nivel de luz en un ambiente o lugar.

En el inicio del programa, definimos la variable `sensorValue` para almacenar la cantidad de luminosidad recibida en la entrada '0' (A0) del conversor análogo para digital. En la función `loop()`, primero leemos el canal '0' (A0) del ADC y almacenamos este valor en la variable `sensorValue`. Después, el código evalúa la variable `sensorValue` para determinar el nivel de luz o luminosidad que hay en el ambiente. Dependiendo del nivel de luz, enviamos al monitor serie un texto que lo indica.

Lectura de Sensor de Temperatura LM35

El LM35 es un circuito integrado sensor de temperatura. Su salida es analógica y por cada 0.1 grado centígrado su salida analógica se incrementa 1 milivolts, es decir, que a cada 1 grado centígrado, el voltaje se incrementa en 10 milivolts. El circuito está calibrado para grados centígrados. La pata +Vs va al pin 5V, la pata Vout al pin que utilicemos para la lectura, en este caso el 0, y la restante GND al pin GND.

En el inicio del programa encontramos la función `setup()`, la cual se encarga de inicializar la comunicación del puerto serial para 9600 bauds. Después encontramos la función `loop()`, la cual lee la entrada '0' (A0) del conversor análogo para digital y lo almacena en la variable `temperature` y envía su valor para el monitor serial. Luego, calculamos el valor de grados centígrados en función de los milivolts leídos y enviamos el resultado para el monitor serial.

Consideraciones al Programar y Conectar

Todo programa para Arduino consta de 2 funciones; la función `setup()` y la función `loop()`. La función `setup()` se ejecuta una vez al inicio del programa. Las entradas analógicas por defecto están configuradas como entradas analógicas, por ese motivo no es necesario declarar que el pin `sensorPin` es una entrada. La función `loop()` se ejecuta repetidamente después de la función `setup()`.

El compilador de Arduino posee una función llamada `map`, la cual puede ser usada para mapear o escalar los valores adquiridos en ADC, para cualquier otro rango de valores. Por ejemplo, queremos representar el porcentaje en el cual se encuentra un potenciómetro. El valor retornado es el resultado de la conversión de escalas que debe ser un valor proporcional de 0 hasta 100.

Es importante recordar que no podemos sobrepasar los límites de voltaje permitidos. 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.

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.

Señales PWM (Modulación por Ancho de Pulso)

Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. 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. En Arduino la frecuencia de PWM es de 500Hz.

Para generar la señal PWM se utilizan los timers configurándose de varias formas de trabajo. Los microcontroladores usan varios modos de PWM, uno de ellos es el Fast PWM que puede ser generado en 8 (256), 9 (512) y 10 (1024) bits. Otro modo de PWM es Phase Correct PWM que es el que debería usarse para el control de motores.

El ATmega328p tiene 3 timers y cada timer maneja dos salidas A y B, en total tenemos 6 salidas PWM. Los registros de comparación de salida OCRnA y OCRnB establecen los niveles en los que las salidas A y B se verán afectados. 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. Cambios en los pines 3, 5, 6, o 11 pueden causar que las funciones `delay()` y `millis()` dejen de funcionar.

tags: #como #declarar #un #puerto #analogico #en