Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Entradas Analógicas en Arduino

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 15

12/3/2018 Entradas analógicas en Arduino

       

LUIS LLAMAS
Ingeniería, informática y diseño

T UT OR I ALES AR D UI N O T UT OR I ALES AR D UI N O B ASI C OS

ENTRADAS ANALÓGICAS EN ARDUINO

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

¿QUÉ ES UNA ENTRADA ANALÓGICA?


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 cualquier otro valor con cualquier número de decimales. Por contra, recordemos
que una señal digital de tensión teórica únicamente podía registrar dos valores (en el ejemplo,
0V o 5V).

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.

Es importante entender que en el mundo real cualquier señal de tensión es siempre


analógica. Un valor digital es un concepto, una abstracción. Sin embargo conviene señalar que
la medición que proporciona una entrada analógica también es un valor digital, por lo
que igualmente es una abstracción. Esto nos lleva al concepto de precisión de la medición.

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.

Existen muchas formas de construir un ADC, pero lo importante es entender que en


realidad no medimos el valor analógico con todos sus decimales, sino que lo “clasi camos”
dentro de 2^N niveles, que de nen 2^N-1 intervalos. 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.

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.

REFERENCIA DE TENSIÓN ANALÓGICA (AREF)


Para resolver esta situación Arduino permite cambiar la tensión tomada como referencia
por el conversor analógico digital. El valor de la referencia se cambia con la función AnalogRef,
y los valores posibles son:

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 y INTERNAL2V56, correspondientes a 1.1V y 2.56V (sólo en Mega)

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.

Si modi camos la tensión de referencia, debemos de nir el modo mediante la función


 AnalogRef antes de realizar cualquier lectura analógica.

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

 en las entradas analógico. 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.

CONEXIÓN DE ENTRADAS ANALÓGICAS EN


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

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.

1 const int sensorPin = A0; // seleccionar la entrada para el sensor


2 int sensorValue; // variable que almacena el valor raw (0 a 1023)
3
4 void setup()
5 {
6 Serial.begin(9600);
7 }

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:

1 const int sensorPin = A0; // seleccionar la entrada para el sensor


2 int sensorValue; // variable que almacena el valor raw (0 a 1023)
3 float value; // variable que almacena el voltaje (0.0 a 5.0)
4
5 void setup()
6 {
7 Serial.begin(9600);
8 }
9
10 void loop()
11 {
12 sensorValue = analogRead(sensorPin); // realizar la lectura
13 value = fmap(sensorValue, 0, 1023, 0.0, 5.0); // cambiar escala a 0.0 - 5.0
14
15 Serial.println(value); // mostrar el valor por serial
16 delay(1000);
17 }
18
19 // cambio de escala entre floats
20 float fmap(float x, float in_min, float in_max, float out_min, float out_max)
21 {
22 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
23 }

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.

LECTURA DE VALORES MAYORES DE 5V


En caso de necesitar leer una entrada de nivel de tensión superior, por ejemplo de 12V,
debemos realizar una adaptación de tensión. La forma mejor de realizar la adaptación es
emplear un simple divisor de tensión.

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:

Deben convertir la señal en un rango inferior pero similar a la tensión de alimentación.

Deben ser muy superiores a la impedancia equivalente del dispositivo a medir.

Deben despreciables respecto a la impedancia de la entrada Arduino.

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.

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

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

¡CUMPLIMOS TRES AÑOS!

NEXT

CÓMO DESCARGAR DESDE YOUTUBE

TAMBIÉN TE PUEDE GUSTAR

https://www.luisllamas.es/entradas-analogicas-en-arduino/ 7/22
12/3/2018 Entradas analógicas en Arduino

IMPLEMENTAR UNA RED DE PETRI EN ARDUINO

LIBRERÍA DE ARDUINO PETRINET

https://www.luisllamas.es/entradas-analogicas-en-arduino/ 8/22
12/3/2018 Entradas analógicas en Arduino

IMPLEMENTAR UNA MÁQUINA DE ESTADOS FINITOS EN ARDUINO

LIBRERÍA DE ARDUINO STATEMACHINE

https://www.luisllamas.es/entradas-analogicas-en-arduino/ 9/22
12/3/2018 Entradas analógicas en Arduino

COCHE ROBOT 2WD BARATO CON ARDUINO: ESQUEMA ELÉCTRICO

DETECTAR GESTOS CON ARDUINO Y SENSOR APDS-9960

¡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

Reply  3 years ago 

luisllamas 

Muestrear audio está en el límite de la capacidad de Arduino. El audio alcanza


Guest
normalmente se muestrea a frecuencias de 44kHz, En un Arduino de 16MHz, la
función AnalogWrite funciona a frecuencias de unos 10kHZ. Si necesitas mejor
calidad de muestreo puedes usar directamente las lectura desde puerto, sin
usar la función AnalogWrite. Con esto deberías ser capaz de muestrear a 44kHZ,
pero repito que está al límite de lo que puedes hacer (tendrás casi todo el
procesador dedicado a eso) En un futuro quiero hacer algún tutorial de lectura
digital o analógica directamente a través del puerto, pero es… Read more »

Reply  3 years ago

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 »

Reply  1 year ago 

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 »

Reply  1 year ago

Pablo Razo Infante 

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

Reply  1 year ago 

luisllamas 

Multiplexedas, se dispone de un único ADC y los 6 canales (en Uno, en Nano 8,


Guest
en mega 16,etc) se consiguen por un multiplexor ——– Mensaje original ——–
De: Disqus Fecha:10/05/2016 19:31 (GMT+01:00) Para: info@luisllamas.es
Asunto: Re: Comment on Entradas analógicas en Arduino Settings A new
comment was posted on Luis Llamas This comment is awaiting moderator
approval. Pablo Razo Infante Hola Luis, esta muy interesante tu post lo he leído
completamente solo que no 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 1:31 p.m.,… Read more »

Reply  1 year ago

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)

Reply  1 year ago

https://www.luisllamas.es/entradas-analogicas-en-arduino/ 12/22
12/3/2018 Entradas analógicas en Arduino

luisllamas 

Gracias a ti por tu comentario

Guest
Reply  1 year ago

luisllamas 

No, en ningún caso


Guest
Reply  1 year ago

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/

Reply  1 year ago

Ricardo Esteban González 

Hola Luis! Gracias por el post!


Guest Quería preguntarte sobre un caso más particular. En el caso en el que mi sensor
analógico trabaje desde -10 a +10V, si yo quiero introducir la información en el
Arduino, con entrada entre 0 y 5V, ¿Cómo lo puedo hacer?

Gracias

Reply  1 year ago

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

Reply  1 year ago

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

Reply  1 year ago

luisllamas 

Hola. Respecto a tu pregunta de si puede funcionar con 3.7 voltios en raw, la


Guest respuesta es no. De hecho me sorprende (mucho) que arranque. En cualquier
caso, te estás jugando mucho o que se apague, o que incluso se rompa (con un
voltaje bajo, lo normal es q se apague), porque en el pin raw espera un voltaje
regulado con una alta precisión. Ese pin va directamente al procesador, y tiene
un rango de alimentación muy estrecho. Respecto a tu esquema… bueno dentro
de lo que puedo ver así de un vistazo, y aparte de lo de la alimentación… Read
more »

Reply  1 year ago

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

Reply  1 year ago

Antonio 

Hola Luis, muy buena entrada.


Guest Te consulto. Tengo un sensor de 4 a 20mA donde por medio de una r250
convierto la señal de 1 a 5v. El problema que tengo es que pude suceder que la

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

Reply  2 months ago

https://www.luisllamas.es/entradas-analogicas-en-arduino/ 15/22

También podría gustarte