Entradas Analógicas en Arduino
Entradas Analógicas en Arduino
Entradas Analógicas en Arduino
LUIS LLAMAS
Ingeniería, informática y diseño
23 SEPTIEMBRE, 2014
En entradas anteriores hemos visto cómo emplear las entradas digitales de nuestro
Arduino. También hemos usado estas entradas para leer el estado de un pulsador. En esta
entrada vamos a ver las entradas analógicas, su funcionamiento y características.
Las entradas analógicas funcionan de una forma similar a las entradas digitales, por lo que
en la práctica el montaje y código nal son muy similares. Por tanto, es de aplicación la
mayoría de lo que vimos en esta entrada. Sin embargo en ciertos aspectos son
radicalmente distintos, por lo que para entender correctamente su uso y funcionalidad es
necesario veamos un mínimo de teoría.
É Ó
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 1/22
12/3/2018 Entradas analógicas en Arduino
Por norma general en los autómatas las entradas analógicas son más escasas, más
lentas y más caras que las entradas digitales. En el caso de Arduino uno disponemos de un
número variable de entradas analógicas, que en el caso de Arduino Uno y Mini Pro son 6, y en
el Arduino Mega son 16. Este es un número más que respetable de entradas analógicas, que
rivaliza o supera a autómatas tradicionales de coste muy superior.
Como vimos al explicar las entradas digitales, una entrada digital supone un proceso de
transformación de una señal en un valor digital, atribuyendo un valor HIGH a las medidas que
superen un valor umbral, y LOW a lo que quedan por debajo. Por el contrario, una entrada
analógica proporciona una medición codi cada en forma de un valor digital con un
número N de bits.
PRECISIÓN DE LA MEDICIÓN
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 codi cada
con un número N de 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
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 2/22
12/3/2018 Entradas analógicas en Arduino
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.
PRECISIÓN RELATIVA
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.
DEFAULT: Valor por defecto, correspondiente con Vcc (5V o 3.3V, según modelos)
EXTERNAL: Voltaje aplicado de forma externa en el pin Vref (siempre entre 0 y Vcc
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 3/22
12/3/2018 Entradas analógicas en Arduino
En caso de introducir un valor de tensión en el pin Aref no debemos superar este valor
CÓDIGO EN ARDUINO
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.
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 4/22
12/3/2018 Entradas analógicas en Arduino
8
9 void loop()
10 {
11 sensorValue = analogRead(sensorPin); // realizar la lectura
12
13 //mandar mensaje a puerto serie en función del valor leido
14 if (sensorValue > 512)
15 {
16 Serial.println("Mayor que 2,5V");
17 }
18 else
19 {
20 Serial.println("Menor que 2,5V");
21 }
22 delay(1000);
23 }
El valor devuelto por la función AnalogRead() se codi ca como un número entero 0 a 1023.
En caso de querer convertir este valor en un valor de tensión podemos usar la siguiente
variación:
Sin embargo tener en cuenta que las operaciones en coma otante (con decimales) son
mucho más lentas que con enteros por lo que intentar evitar tener que realizar esta
conversión y trabajar siempre que sea posible con números enteros.
FRECUENCIA DE MUESTREO
Con el código empleado la frecuencia de muestreo es aproximadamente 9600 Hz, es
decir, unos 100 micro segundos para la medición. En comparación, la función digitalRead tiene
una frecuencia de 15000Hz, unos 66 micro segundos por medición, levemente más rápido.
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 5/22
12/3/2018 Entradas analógicas en Arduino
Sin embargo, mediante otros códigos la lectura analógica puede aumentarse hasta
aproximádamente 1,5 Mhz, o 660 nano segundos por entrada. Por contra, las entradas
digitales pueden acelerarse hasta casi 15 Mhz, 66 nano segundos, leyendo todas las entradas
de forma simultánea. Por lo tanto, vemos que realmente las entradas digitales pueden ser
mucho más rápidas que las analógicas.
Con esta con guració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:
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 6/22
12/3/2018 Entradas analógicas en Arduino
Deben limitar la corriente que circula por ellas para minimizar pérdidas.
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.
En la siguiente entrada veremos cómo emplear las entradas analógicas para leer el estado
de un potenciómetro o el valor de una resistencia variable, algo habitual a la hora de leer
sensores cuya lectura se realiza a través de la medición de su resistencia.
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la
sección Tutoriales de Arduino
Analogicas,Arduino,Arduino basico,Entradas,I/O
PREVIOUS
NEXT
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 7/22
12/3/2018 Entradas analógicas en Arduino
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 8/22
12/3/2018 Entradas analógicas en Arduino
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 9/22
12/3/2018 Entradas analógicas en Arduino
¡DEJA UN COMENTARIO!...
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 10/22
12/3/2018 Entradas analógicas en Arduino
Únete a la conversación
newest oldest
Jhoan Espitia
Buenas noches que tipos de codigos puedo usar para mejorar la frecuencia de
Guest muestreo de mi arduino les agradeceria si me pueden ayudar con esto, en
estemomento estoy intentando muestrear una señal de audio y otra pregunta
que me recomiendan para no saturar la memoria del microcontrolador de
antemano gracias
luisllamas
arlaor
Buenos días Luis, Tengo una situación con los pines analógicos y es que estos no
Guest me están dando valores coherentes entre uno y otro. He subido al arduino un
simple código para leer cada puerto analógico (analogRead(Ax)), sin ninguna
conexión a ellos para observar que lecturas me arroja y encontré lo siguiente:
A0: 233 A1: 5 A2: 118 A3: 193 A4: 239 A5: 275 Al realizar mediciones con un
multimetro en estos puertos me arroja hasta 1V sin tener conectado nada (valor
que supongo debería ser cero) Estoy intentando leer las variaciones de corriente
generadas en un modulo ACS-712, pero… Read more »
luisllamas
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 11/22
12/3/2018 Entradas analógicas en Arduino
Guest Hola Arlaor. Lo que te está pasando es totalmente normal, y no es nada malo.
Cuando un Pin (analógico o digital) no está conectado al aire, debes asumir que
su estado es indeterminado. Al estar el Pin “al aire”, las mediciones que tomas
son tensiones residuales, ruido, etc… (esto es así en todos los procesadores, no
solo en Arduino) Pero no pasa nada. Si estás leyendo un dispositivo que da una
tensión, al conectar el Pin la medición estará “ jada” por el valor de tensión. De
forma similar, si estás leyendo la resistencia de un dispositivo (o un
potenciómetro, por… Read more »
Hola Luis, esta muy interesante tu post lo he leído completamente solo que no
Guest encontré una parte donde dijera si las entradas digitales están multiplexadas o
en paralelo y me gustaría saber si puedes proporcionarme esa información.
saludos
luisllamas
luisllamas
Sin ningún problema. Al de nir un pin como entrada, lo pones en estado de alta
Guest impedancia (es decir, que se comporta como si fura una resistencia muy grande,
y apenas circula corriente por el mismo)
De hecho, lo que quieres hacer es igual que leer un pulsador (en tu caso el rele
hace las veces de pulsador) https://www.luisllamas.es/leer-un-pulsador-con-
arduino/
Pero necesitarás una resitencia de Pull Down. Sería mejor si conectas el rele
entre el Pin Digital y GND, y así puedes usar las resistencias de PullUP internas
de Arduino (te simpli ca el montaje)
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 12/22
12/3/2018 Entradas analógicas en Arduino
luisllamas
Guest
Reply 1 year ago
luisllamas
luisllamas
Para eso necesitarás emplear una interrupción. Mira esta entrada donde vemos
Guest su uso https://www.luisllamas.es/que-son-y-como-usar-interrupciones-en-
arduino/
Gracias
Jose Luis
Para leer una tension que varia entre +10 y -10v, solo necesitas tomar como
Guest referencia una tensión media de 2.5v (con un zener por ejemplo) y hacer un
divisor de tensión respecto a los 2.5v.
Las resistencias que he puesto en el divisor son de 2K5 y 10K (justo al limite.
mejor con 3K3 y 10K
Una vez hecha la lectura debes restar la tensión del Zener ( Es decir, con una
entrada de 0v vas a leer 2.5v si le restas 2.5 obtienes el 0V)
Saludos
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 13/22
12/3/2018 Entradas analógicas en Arduino
Jose Luis
DIOS que fallo!! Nada mas dar al OK he visto que las resistencias están mal. Si
Guest pones 3K3 la tensión de lectura variará entre -1 y +6v (mas o menos) es
necesario bajar R2 a 1K8 de esta forma la tensión de entrada al microprocesador
varia entre 0.7v y 4.3v.
Mis felicitaciones a Luis Llamas por el gran trabajo y esfuerzo que supone este
Blog
Saludos de nuevo
luisllamas
albert
hola
Guest sr. Luis pagina muy buena.
tengo la necesidad de saber que voltaje estoy trabajando para crear un
watimetro. y tengo una tensión continua que varia , y su valor máximo será de
200 voltios ,
seria correcto trabajar con un divisor de tensión 100K y 2k2
puedo encontrarme con algún problema?
doy por supuesto que la precisión solo la será de 1024 bits..
Antonio
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 14/22
12/3/2018 Entradas analógicas en Arduino
señal (por algún motivo), pueda superar los 20mA., de hecho el sensor puede
leer hasta el 150% del fondo de escala.
En este caso la señal sera mucho mayor a 5v. Como hago para proteger la
entrada analógica si supera esta tensión?.
De antemnano muchas gracias
https://www.luisllamas.es/entradas-analogicas-en-arduino/ 15/22