PWM ou como facer que un dixital pareza analóxico

PWM:

En todos os exemplos feitos até agora, viches que fixemos cambiar os LEDs entre dous estados, HIGH e LOW, que adoitan corresponderse con aceso e apagado. Isto é así porque as saídas dixitais do Arduino só admiten eses dous estados, co cal parecería que non podemos conseguir situacións intermedias nas que, por exemplo, un LED alumee a media intensidade. Imos ver unha pequena "trampa" que nos permite acadar ese obxectivo.

Tamén imos ver unha das estructuras máis importantes en programación, que son as condicionais "if", que serven para que o programa decida facer ou non unha acción en función de que se cumpla unha condición.

Preparación e conexión:

Precisas o seguinte material:

    • Un LED vermello.

    • Unha resistencia de 220 ohmnios.

    • Unha placa de prototipado ou Breadboard.

    • Cables de conexión.

Este é o esquema de conexión do LED:

IMPORTANTE: Se tes montada a breadboard do semáforo, podes empregala directamente sen desconectar nada, funcionaráche no led que teñas conectado ao pin 9.

(Clica para ampliar)

Esvaecendo o LED.

Introduce o seguinte código no teu Arduino:

//declaramos a variable led co valor 9

int led=9;

void setup() {

//establecemos que o pin "led" sexa saida

pinMode (led,OUTPUT);

//poñemolo a un valor de 20... que pasa?

//proba con distintos valores (pista, o 256 e un numero importante)

analogWrite(led,20);

}

void loop() {

}

Que pasou? es capaz de ver algún cambio na intensidade coa que brilla o LED?

Como che indico nos comentarios, cambia o valor de analogWrite(led,20), e observa o que pasa...

Se probases moitos valores distintos, seguramente chegarías a conclusión de que o valor cero é o apagado completo e o 255 a máxima intensidade, e verías que, do 255 para arriba, a secuencia se vai repetindo en "series" de 255. Algo parecido ao que pasa cos grados dun xiro, que van de 0 a 359, e xirar 360, 720... déixache mirando cara o mesmo sitio que cando comezaches.

Aproveitando isto que acabamos de aprender, imos facer un código máis elaborado que ten un efecto molón.

Sube e baixa:

Abre o Arduino IDE e vai a Arquivo>Novo . Colle o código do recadro, copiao no novo arquivo e cárgao no Arduino, le os comentarios e observa o resultado.

/*

Esvaecer Este exemplo nos ensina a controlar o esvaecemento dun LED conectado ao pin 9. *///definimos variables: int pinLed = 9; // definimos o numero 9 como pinLed int brillo = 0; // variable onde teremos o brillo do LED // xa sabes que o setup se executa unha soa vez void setup() { // facemos que o pinLed sexa unha saida (OUTPUT) pinMode(pinLed, OUTPUT); } // xa sabes que loop se executa unha e outra vez de principio a fin void loop() { // dicimoslle canto brillo lle quero dar a pinLed: analogWrite(pinLed,brillo); // facemos que o brillo se incremente en 1: brillo=brillo+1; // esperamos 50 milisegundos para que a cousa non vaia demasiado rapido. delay(50); }

- Que fai o LED?

O PWM:

Como podes ver, temos o LED conectado a unha saída dixital. Estas só admiten dous estados, HIGH ou LOW, é dicir, ou están acesas ou están apagadas. Para conseguir o efecto de esvaecemento no LED empregamos unha técnica chamada PWM (Pulse Width Modulation ou Modulación do Ancho de Pulso), que consiste en encender e apagar moi rápidamente o LED durante un tempo (pulso) máis ou menos longo, co cal a luz parecerá que varía gradualmente de intensidade.

Para isto hai que empregar a instrucción analogWrite(numeroPin,estadoPin), onde estadoPin admite calquera valor entre 0 e 255. Con valores baixos o pulso será pequeno e a intensidade do LED baixa, con valores altos o pulso será longo e a intensidade do LED alta.

Condicionais if()

Agora imos engadir algún novo parágrafo no código para modificar o comportamento do LED e aprender de paso unha importante estructura de programación. Dentro do código anterior, engade a parte que está abaixo en morado e cárgao. (Tamén podes atopar este exemplo en inglés en Archivo > Exemplos > Basicos > Fade).

/*

Esvaecer Este exemplo nos ensina a controlar o esvaecemento dun LED conectado ao pin 9. *///definimos variables: int pinLed = 9; // definimos o numero 9 como pinLed int brillo = 0; // variable onde teremos o brillo do LED int variacion = 5; // como de rapido vai variar a intensidade do LED // xa sabes que o setup se executa unha soa vez void setup() { // facemos que o pinLed sexa unha saida (OUTPUT) pinMode(pinLed, OUTPUT); } // xa sabes que loop se executa unha e outra vez de principio a fin void loop() { // dicimoslle canto brillo lle quero dar a pinLed: analogWrite(pinLed,brillo); // facemos que o brillo se incremente segundo o que vale "variacion": brillo=brillo+variacion; //Que facemos cando chegamos a 255? if (brillo>255) { //se o brillo e maior de 255 cambiamos de sentido a variación: variacion=-variacion; }

if (brillo < 0) { //se o brillo ten o valor menor que 0 cambiamos tamén o sentido da variación: variacion=-variacion; }

// esperamos 30 milisegundos para que a cousa non vaia demasiado rapido. delay(30); }

No código te fixarás que aparece unha instrucción na que se di if(brillo > 255){variacion=-variacion;}. Isto é unha condicional, e é unha das estructuras máis importantes que hai en programación. Como seguro que sabes, en inglés if quere dicir "se", como en "se chove, saca paraugas). A estrutura das condicionais, que traballaremos moito máis, ten a seguinte sintaxe:

if (condición que se debe cumplir){o que hai que facer se a condición se cumple}

Isto emprégase en calquera programa un pouco complexo, poñemos uns exemplos en pseudocódigo:

if (vidas=0){imprimir"GAME OVER"}

if (puntos > 100000){dar "PARTIDA EXTRA"}

if (contraseña correcta){dar benvida}

No caso do noso programa, o que facemos é darlle ao programa dúas condicións, se o brillo chega a 255 ou brillo chega a cero, ten que cambiar de signo variacion, co cal o brillo comeza a decrecer ou aumentar segundo lle corresponda.

//Que facemos cando chegamos a 255? if (brillo > 255) { //se o brillo e maior de 255 cambiamos de sentido a variación: variacion=-variacion; }

if (brillo < 0) { //se o brillo ten o valor menor que 0 cambiamos tamén o sentido da variación: variacion=-variacion; }

Retos:

    1. Proba a cambiar o intervalo de aumento de brillo, para que cambie máis rapidamente.

    2. Podes facer o reto anterior sen alterar o delay(30)?

    3. Podes facer que o brillo nunca chegue ao tope, que se quede no 75%? E que tampouco chegue a estar completamente apagado?