ARD04 – PWM

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Lo de las salidas digitales está muy bien, y es muy claro de entender: las “cosas” (un LED o lo que sea) están activadas o no lo están. Así de simple. Sin embargo, en ocasiones es necesario obtener salidas analógicas. Por ejemplo, suponte que queremos un LED que esté encendido, pero no del todo, tan brillante. Solo queremos que se encienda con la mitad de su intensidad (o una tercera parte, una cuarta parte, un 80 %….) Esto puede venirnos bien como indicador de otra cosa. Las salidas de Arduino son todas digitales: o están activadas o no lo están. Arduino recurre, para conseguir emular salidas analógicas, a una técnica llamada PWM (Pulse Width Modulation, Modulación de Anchura de Pulso). Observa los pines de salida de tu placa Arduino. Verás que hay varios (en concreto el 3, el 5, el 6, el 9, el 10 y el 11) que tienen el símbolo ~ grabado. Estas salidas se pueden programar, mediante PWM, para comportarse como si fueran analógicas. La técnica de PWM consiste en lo siguiente. Si tu tienes un valor digital 0 (LOW) fijo, la salida de señal en el tiempo es a 0 permanente, como ves en la figura 4.1.

Figura 4.1. Señal 0 (LOW) permanente en el tiempo.

Figura 4.1. Señal 0 (LOW) permanente en el tiempo.

Si tienes una salida HIGH, obtendrás una señal de valor permanente 1 (en el caso de Arduino, esto significa 5 voltios). Puedes verla representada en la figura 4.2.

Figura 4.2. Señal 1 (HIGH) permanente en el tiempo.

Figura 4.2. Señal 1 (HIGH) permanente en el tiempo.

Ahora supongamos que tenemos una señal que cambia en el tiempo. A ratos es valor HIGH y, el resto es valor LOW, como vemos en la figura 4.3.

Figura 4.3. Una señal que cambia de LOW a HIGH y viceversa, en periodos iguales. Por lo tanto, es HIGH el 50% del tiempo.

Figura 4.3. Una señal que cambia de LOW a HIGH y viceversa, en periodos iguales. Por lo tanto, es HIGH el 50% del tiempo.

Si le aplicamos una señal así a un LED lo veríamos apagarse y encenderse intermitentemente. Sin embargo, si los cambios se producen con la suficiente velocidad (en milisegundos, por ejemplo) el ojo humano no es capaz de percibir los dos estados. Recuerda que la vista (al igual que que el oído y los demás sentidos físicos) tiene “memoria”. Así pues, si la frecuencia de los cambios es lo suficientemente rápida, lo que percibiremos será el LED encendido con la mitad de su intensidad. Así, aprovechando una característica de nuestros sentidos, estamos emulando un valor analógico con una señal digital. Ahora supongamos que la señal que aplicamos es similar a la de la figura 4.4.

Figura 4.4. Una señal que cambia de LOW a HIGH y viceversa, siendo HIGH el 25% del tiempo.

Figura 4.4. Una señal que cambia de LOW a HIGH y viceversa, siendo HIGH el 25% del tiempo.

Como vemos, esta señal está activada el 25 % del tiempo. Si se la aplicamos a un LED con la suficiente velocidad de cambio como para no poder percibir visualmente los estados de encendido y apagado, lo que veremos es un LED encendido con al cuarta parte de su potencia luminosa real. Esto es lo que se conoce como Modulación de Anchura de Pulso, y es la técnica que emplea Arduino para imitar una salida analógica a partir de una señal digital. En este capítulo vamos a usar casi el mismo circuito electrónico que en el anterior, pero el led, cuando se encienda, solo lo hará con una parte de su intensidad (se encenderá, pero más “flojito”).

EL SKETCH

El sketch, aunque es parecido al anterior, presenta varios cambios. El primero es que la salida para darle señal al LED ya no puede ser la 8. Debemos escoger alguna de las salidas que Arduino tiene que permiten el PWM y que, como hemos dicho, están marcadas. Emplearemos la 9, así:

Como ves, en la primera sección solo cambiamos la primera línea. Acuérdate de cambiar, en el circuito, el cable que da señal al LED, que está en el pin 8, al pin 9. Este es el único cambio físico. La sección setup no cambia. Es la misma que en el ejercicio anterior. Pero veamos la sección loop, reproducida a continuación.

Fíjate que, en lugar de la instrucción digitalWrite empleamos la instrucción analogWrite. Esta recibe, igual que aquella, dos argumentos. El primero es el número de pin (o una variable o constante que lo representa) en el que vamos a escribir. El segundo es el valor de la señal que vamos a mandar a ese pin. En el caso de las señales PWM este valor puede ir de 0 a 255 (es importante que tengas presente estos límites). El valor 0 equivaldría al 0 digital, y el 255 equivaldría al 1 digital. Con el valor 30 que hemos puesto en nuestro sketch se aprecia claramente que el led se ilumina, pero con poca intansidad. Una vez más, podemos optimizar el código, así:

Si ya has programado antes, no deberías tener problemas para entender lo que hemos hecho. Si no, mira el articulo relativo la referencia del lenguaje Arduino, en la parte que habla de los condicionales y el operador ternario para comprender esta última versión.

     

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *