Olá pessoal.

Nesta aula prática vamos fazer algumas experiências utilizando a função PWM da placa Arduino. Sugiro que o aluno leia a aula teórica 5 sobre a função PWM para entender e aproveitar melhor esta aula.

Em nosso experimento vamos colocar para funcionar a função PWM em nossa placa Arduino e ver o efeito quando ligamos LEDs nas saídas PWM.

Vamos utilizar a mesma montagem que fizemos na última aula prática, quando montamos 13 LEDs nos 13 pinos de IO de nossa placa Arduino UNO. Para esta aula só utilizaremos 6 saídas já que a função PWM está disponível apenas nestas saídas. Você pode fazer uma montagem nova ou utilizar a mesma montagem anterior. Não há problema de deixar os LEDs ligados em todas as saídas.

Primeiramente vamos abrir a IDE do Arduino e abrir o programa exemplo Fade. Veja o caminho na imagem abaixo:

fade1

Observando o arquivo aberto, podemos ver logo após as linhas de comentário do programa que há algumas definições de variáveis:

int led = 9;

int brightness = 0;

int fadeAmount = 5;

A primeira definição led é o número da saída que será utilizada. Está inicializada em 9 e não se altera durante a execução do programa.

A segunda definição brightness define o brilho do led. É inicializado com valor 0 e vai ser alterado durante a execução do programa para fazer o efeito de “fade” ou gradualmente mudar o brilho.

A terceira definição fadeAmount é inicializado em 5 e não se altera durante a execução do programa. Pode ser definido como o passo de graduação do efeito de “fade”.

Na rotina de setup temos a instrução que define o modo de trabalho do pino led (9):

void setup() {

pinMode(led, OUTPUT);

}

Nesta instrução estamos simplesmente definindo o pino 9 como saída (OUTPUT). Como já vimos antes, esta rotina setup() é chamada e roda apenas no inicio do programa e não mais durante a execução.

A parte mais interessante está na rotina loop, que é a rotina que fica rodando indefinidamente durante a execução do programa. Nela temos as seguintes instruções:

 

void loop() {

analogWrite(led, brightness);

brightness = brightness + fadeAmount;

if (brightness == 0 || brightness == 255) {

fadeAmount = -fadeAmount ;

}

delay(30);

}

A primeira instrução (analogWrite) vai escrever um valor (brightness) na saída definida pela variável “led”. No inicio do programa definimos as variáveis “led=9” e “brightness=0”. Portanto na primeira execução desta instrução estaremos escrevendo o valor 0 na saída 9 da placa Arduino. Se o aluno voltar a aula teórica sobre PWM verá que a forma que o Arduino escreve um valor analógico em uma saída digital é através da função PWM, conforme figura abaixo:

pwm1

Quando escrevemos o valor 0, o sinal permanece o tempo inteiro em nível lógico 0 e o valor analógico correspondente é o mais baixo possível. Mas se o aluno recordar o modo que fizemos a ligação do LED na montagem da aula prática anterior, entenderá que quando temos o valor mais baixo na saída, teremos o brilho máximo no LED. Isso porque estamos utilizando o anodo LED conectado diretamente ao positivo e o catodo conectado ao pino do Arduino.

A próxima instrução é de incremento da variável brightness.

brightness= brightness+ fadeAmount;

Após a execução desta instrução o valor da variável brightness é 5, Porque o valor de fadeAmount é 5. Assim a cada looping do programa estaremos escrevendo um valor analógico diferente na saída led: 0, 5, 10, 15, 20…

Isso fará com que nosso LED inicie com brilho máximo e vai gradativamente diminuindo o brilho até ficar apagado quando atingirmos o valor 255.

A próxima instrução vai fazer o controle do sentido do efeito “fade”. Quando a variável brightness atingir o valor 255, a condição da instrução “if” será satisfeita e o valor da variável fadeAmount passará para -5 por causa da instrução:

fadeAmout= -fadeAmount;

Quando a variável fadeAmount está com valor negativo o valor analógico na saída vai diminuindo a cada looping do programa, até chegar no valor 0. Então na mesma instrução “if” o valor de fadeAmount passa para positivo novamente e o ciclo recomeça.

No final do looping temos uma instrução de delay que serve apenas para que possamos observar o brilho do LED sendo alterado. Quando maior o valor definido na instrução delay, mais lento será o efeito de “fade” no brilho do LED.

Agora o que temos que fazer é compilar e carregar o programa em nossa placa Arduino.

Lembre-se de conferir o número da porta serial COM conectada a sua placa.

fade2

Muitas vezes ao ligar o computador e abrir a IDE do Arduino, esta porta não vem conectada corretamente. Então você pode selecionar a porta COM correta. Normalmente a porta COM utilizada é a de maior número.

Se tudo der certo você verá o LED aumentando e diminuindo o brilho conforme o programa roda no Arduino.

Você agora pode alterar o programa para ver o que acontece se, por exemplo o valor da instrução delay é alterado.

Agora uma dica muito importante. Ao alterar o valor da variável fadeAmount, o aluno deve tomar um certo cuidado. Alterando o valor de 5 para 1, não haverá muito problema. O que vai acontecer é que a mudança de brilho será mais gradual e vai demorar mias para atingir o brilho máximo e mínimo. Isso pode ser até corrigido diminuindo o valor da instrução delay.

O problema vai acontecer ao colocar um valor diferente na variável fadeAmount, por exemplo 6. Você pode fazer este teste e verá que o comportamento será bem diferente do esperado.

Isso acontece por causa do jeito que a instrução condicional “if” esta construída. Nela o valor da variável brightness é comparada com 0 e com 255 e somente faz alguma coisa quando o valor é igual a estes números 0 e 255. Quando somamos o valor original 5 a variável brightness em algum momento ela fica igual a 255 ou 0. Mas se ao invés de somarmos 5 somarmos outro número, por exemplo 6, o variável brightness pode não ficar nunca igual a 255 ou 0 e por isso o programa não funciona corretamente.

Para corrigir isso e fazer o programa funcionar corretamente com qualquer valor de fadeAmount,  temos que fazer algumas alterações na instrução “if”. Vamos continuar comparando a variável brightness com 0 e 255. Mas agora vamos aceitar as condições em que a variável é maior que 255 e menor que 0. Desta forma, mesmo que a variável não fique igual aos valores de comparação, iremos inverter o sentido do “fade” quando ela ultrapassar os limites impostos pelo programa.

Teremos ainda que dividir o “if” em dois para que possamos corrigir o valor em 0 ou 255 quando ultrapassar os limites.

if (brightness <0)

{

brightness=0;

fadeAmount=-fadeAmount;

}

if ( brightness >255)

{

brightness=255;

fadeAmount = -fadeAmount ;

}

Isso corrige de forma satisfatória a deficiência do programa original.

Deixo agora para o aluno fazer novas experiências com o PWM atuando LEDs. Podemos tentar acionar até 6 LEDs ao mesmo tempo com a placa Arduino. Lembrando que as saídas que possuem a função PWM estão anotadas com um ~ no conector da placa.

Fiquem a vontade para fazer perguntas e sugestões pelo email ou nos comentários.

Abraços,