Comprender las diferencias entre analógico y digital. Conocer las salidas cuasi analógicas de Arduino y qué es la modulación por pulsos (PWM).
Imagen | Descripción |
---|---|
![]() |
Arduino Uno o compatible |
![]() |
Una protoboard |
![]() |
Cables de conexión |
![]() |
Un diodo led |
![]() |
Una resistencia 330 Ohms |
Todas las señales que hemos trabajado hasta ahora con nuestro Arduino, de entrada o de salida, tienen una característica común: son digitales, es decir que pueden tomar un valor ALTO o BAJO, pero no valores intermedios.
Si representamos 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 suspensos, enciendes la luz o la apagas, pero muchas otras son variables medibles continuas y pueden tener cualquier valor que imaginemos, como el ángulo de las agujas del reloj o la temperatura, que 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 así:
No es raro que queramos controlar algo del mundo exterior con una señal analógica de manera 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 lección aprenderemos a enviar señales analógicas a los pines de salida de Arduino.
Hasta ahora hemos visto cómo activar las salidas digitales de Arduino, para encender y apagar un LED por ejemplo. Pero no hemos visto cómo modificar la intensidad del brillo de ese LED. Para esto, 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 debemos 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 usar un truco, para que con una salida digital pudiéramos 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 manera que el valor eficaz de la señal de salida sea equivalente a una señal analógica de menor tensión.
Lo sorprendente es que el truco funciona.
Fíjate en el ancho del pulso cuadrado de arriba. Cuanto más ancho es, más tensión media 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 analógica del 50% de 5V, es decir 2,5V. 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 esta manera 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. Fíjate en la numeración de los pines de la imagen:
Haremos el típico montaje de una resistencia y un diodo LED, similar al de la lección 2, 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 similar a esto:
//Código: ARD_06_01
void setup()
{
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:
//Código: ARD_06_02
void setup()
{
pinMode( 9, OUTPUT) ;
}
void loop()
{
for ( int i= -255 ; i<255 ; i++)
{
analogWrite (9, abs(i)) ;
delay( 10);
}
}
Hemos hecho el ciclo de subir y bajar el brillo del LED con un único bucle. La función abs(num), retorna 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 vuelve a subir a 255.