10. LOS PINES CUASI ANALÓGICOS

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í:
serie de bits
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:

Analogico
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.
MOdulacion por anchura de pulsos

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:
detalle pines

·         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:
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