ANALÓGICO Y DIGITAL
Todas las señales que hemos manejado hasta ahora con nuestro
Arduino , de entrada o de salida, comparten una característica común: Son
digitales, es decir que pueden tomar un valor HIGH o LOW pero no valores
intermedios.
Si representamos
una el valor de una señal digital a lo largo del tiempo
veríamos algo así:
En la vida muchas cosas son así, apruebas o suspendes,
enciendes la luz o la apagas, pero muchas otras son variables mensurables
continuas y pueden tomar cualquier valor que imaginemos, como el ángulo del
reloj o la temperatura, que aun dentro de valores finitos pueden tomar tantos
valores intermedios como podamos imaginar,
A esta clase de variables las llamamos analógicas y
una representación por contraposición a lo digital, sería algo como esto:
No es raro que queramos controlar algo del mundo exterior
con una señal analógica de forma que el comportamiento del sistema siga esa
señal. Podemos por ejemplo querer variar la luminosidad de un diodo LED y no
simplemente apagarlo o encenderlo
En esta sesión aprenderemos a enviar señales analógicas a
los pines de salida de Arduino.
SALIDAS CUASI ANALÓGICAS
.
Hasta ahora hemos visto como activar las salidas digitales
de Arduino, para encender y apagar un LED por ejemplo. Pero no hemos visto como
modificar la intensidad del brillo de ese LED. Para ello, tenemos que
modificar la tensión de salida de nuestro Arduino, o en otras palabras tenemos
que poder presentar un valor analógico de salida.
Para empezar tenemos que dejar claro que los Arduino
carecen de salidas analógicas puras que puedan hacer esto (con la notable
excepción del Arduino DUE).
Pero como los chicos de Arduino son listos, decidieron
emplear un truco, para que con una salida digital podamos conseguir que casi parezca
una salida analógica.
A este truco se le llama PWM, siglas de Pulse Width
Modulation, o modulación de ancho de pulsos. La idea básica es poner salidas
digitales que varían de forma muy rápida de modo que el valor eficaz de
la señal de salida sea equivalente a una señal analógica de menor voltaje.
Lo sorprendente es que el truco funciona.
Fijaros en la anchura del pulso cuadrado de arriba. Cuanto
mas ancho es, mas tensión promedio hay presente entre los pines,
y esto en el mundo exterior es equivalente a un valor analógico de
tensión comprendido entre 0 y 5V. Al 50% es equivalente a una señal
analogica del 50% de 5V, es decir 2,5. Si mantenemos los 5V un 75% del
tiempo, será el equivalente a una señal analógica de 75% de 5V = 3,75 V.
Para poder usar un pin digital de Arduino como salida
analógica, lo declaramos en el Setup() igual que si fuera digital:
pinMode( 9, OUTPUT) ;
La diferencia viene
a la hora de escribir en el pin:
digitalWrite(9, HIGH);
//Pone 5V en la salida
digitalWrite(9, LOW);
//Pone 0V en la salida
analogWrite( 9, V) ;
analogWrite escribe en el pin de salida un valor entre 0 y 5V,
dependiendo de V (que debe estar entre 0 y 255).
De este modo si conectamos un LED a una de estas salidas PWM
podemos modificar su brillo sin más que variar el valor que escribimos en el
pin.
Pero hay una restricción. No todos los pines digitales de
Arduino aceptan poner valores PWM en la salida. Solamente aquellos que tienen
un símbolo ~ delante del número. Fijaros en la numeración de los pines de
la imagen:
·
Solamente los pines 3, 5, 6, 9, 10 y 11 pueden
hacer PWM y simular un valor analógico en su salida.
·
Si intentas hacer esto con un pin diferente,
Arduino acepta la orden tranquilamente, sin error, pero para valores de 0 a 127
entiende que es LOW y para el resto pone HIGH y sigue con su vida satisfecho
con el deber cumplido.
MODIFICANDO EL BRILLO DE UN LED
Vamos a hacer el típico montaje de una resistencia y un
diodo LED, similar al de la sesión 3, pero asegurándonos de usar uno de los
pines digitales que pueden dar señales PWM. En la imagen he usado el pin 9.
Podemos escribir un programa parecido a esto:
Podemos escribir un programa parecido a esto:
void
setup() //Prog_10_1
{
pinMode( 9, OUTPUT) ;
}
void loop()
{
for ( int i= 0 ; i<255 ; i++)
{
analogWrite (9, i) ;
delay( 10);
}
}
El LED va aumentando el brillo hasta un máximo y vuelve a
empezar bruscamente. Podemos modificar un poco el programa para que
la transición sea menos violenta:
void
setup()
// Prog 10_2
{
pinMode( 9, OUTPUT) ;
}
void loop()
{
for ( int i= -255 ; i<255 ; i++)
{
analogWrite (9, abs(i)) ;
delay( 10);
}
}
Aquí aprovecho ( por pura vagancia) para hacer el ciclo de
subir y bajar el brillo del LED con un único bucle. La función abs(num),
devuelve el valor absoluto o sin signo de un número num, y por eso mientras que
i viaja de -255 a 255, abs(i) va de 255 a 0 y vuelta a subir a 255. ¿Que os
parece el truco?
Comentarios
Publicar un comentario