Framework Arduino Básico Aula 03: Saídas PWM

Imagem meramente ilustrativa


Relembrando

    Na aula anterior aprendemos a conectar um Led a uma placa Arduino Uno através de um de seus pinos digitais. Também vimos que a função pinMode() permitia ajustar um pino como saída. Vimos também que a função digitalWrite() permitia ligar esse Led fazendo o estado do pino passar para HIGH e que era possível desligar esse Led com a mesma função passando o estado para LOW .

    Também vimos a função delay() que permite uma pausa no processamento causando um intervalo de tempo em milissegundos. Lembrou?

    Para te ajudar vamos postar o último código visto na aula passada, a imagem da última montagem e oferecer o nosso link, a partir do qual iremos fazer o exercício de hoje:

  1. int led=2; 
  2. void setup() {
  3.   pinMode(ledOUTPUT);
  4. }

  5. void loop() {
  6.   digitalWrite(ledHIGH);
  7.   delay(1000);
  8.   digitalWrite(ledLOW);
  9.   delay(1000);
  10. }
Montagem da última aula
Montagem da última aula

    Link do projeto da última aula  no Wokwi: https://wokwi.com/projects/411763019232562177


Recordando sobre os pinos PWM

    Na aula passada eu também comentei que existem situações onde os estados HIGH e LOW não vão atender as nossas necessidades porque vamos querer valores diversos. É o caso, por exemplo, quando um Led precisa ser aceso com diferentes intensidades de iluminação.

    Para isso é necessário fazer uso dos pinos digitais PWM, que permitem trabalhar com diferentes durações de pulso para o sinal digital. Esses pinos do Arduino Uno são assinalados com um ~ ao lado do seu número.

Nova montagem

    Para fazer nossa nova montagem, se você abriu o meu link da última aula, vou pedir que clique no botão de seta azul para baixo "v" ao lado do botão Save, peça Save a Copy e salve com outro nome esse projeto, por exemplo, Framework Arduino Básico Aula 03: Saídas PWM.

Sequência para salvar o projeto com outro nome no Wokwi
Sequência para salvar o projeto com outro nome no Wokwi

Renomeando o projeto
Renomeando o projeto


    Feito isso clique na conexão que liga o terminal do resistor até o pino 2 para selecioná-la. Repare que aparece uma janela com as opções disponíveis para esse elemento. Clique no botão na forma de lixeira para eliminá-la. 

Eliminando uma conexão indesejada
Eliminando uma conexão indesejada


    Em seguida clique na ponta desse terminal e crie uma nova conexão até o pino 3 que está assinalado com o ~, indicando que é um pino PWM.

Nova conexão entre resistor e o pino ~3
Nova conexão entre resistor e o pino ~3

    Aproveite para clicar no Led para selecioná-lo e altere a sua cor para amarelo, que ao meu ver, parece ser a cor que melhor apresenta o efeito visual que buscamos nesse simulador.

Tela de seleção da cor do Led
Tela de seleção da cor do Led

    Apesar de ser recomendável diminuir o valor da resistência do resistor para algo como 330 Ω, eu vou manter ele com 1 KΩ pela mesma razão da mudança da cor do Led, isto é, obter o efeito visual desejado nesse simulador, mas em projetos físicos não faria isso.

Modificando o Sketch

    Dessa vez precisamos configurar o pino 3 como saída, por isso vamos modificar a variável led que será utilizada pela função pinMode() para 3. Também não vamos mais utilizar a função digitalWrite() porque  ela só trabalho com dois estados: HIGH e LOW.

  No seu lugar utilizaremos a função analogWrite() porque agora o pino terá um comportamento emulando uma saída analógica com a sua modulação de pulso e ao invés de trabalhar apenas com ZERO ou UM, aceitará uma variação de 0 a 255. 

    Então a função analogWrite() receberá como parâmetro o pino passado pela variável led e essa variação de 0 a 255 que poderá ser passada também por uma variável chamada pwm. Como ela tem que variar poderia funcionar como um contador em um laço do tipo for(){} que vimos no curso de linguagem C.

    Para visualizar melhor o efeito do aumento do brilho no led, vamos também utilizar a função delay() vista na aula passada com uma pausa de processamento de uns 10 milissegundos. Seria interessante usar dois laços do tipo for: um aumentando o valor de pwm e outro diminuindo, assim o led aumentaria de brilho e depois diminuiria.

    Para ver essa variável pwm podemos inicializar o monitor serial que vimos na aula1 com o Serial.beigin() e escrever o seu valor no monitor com Serial.print()Serial.println().

       Vamos ao código que você poderá copiar e colar no seu Sketch ou pegar direto indo ao nosso link:

  1. int led=3; //alterei a variável
  2. int pwm;
  3. void setup() {
  4.   pinMode(led, OUTPUT); //configurando o pino como saída
  5.   Serial.begin(9600) ;//iniciando o monitor serial
  6. }

  7. void loop() {
  8.   //laço aumentando o valor de pwm
  9.   //pwm variando de 0 a 255
  10.   //incrementando o valor de 5 em 5
  11.   for(pwm=0;pwm<=255;pwm+=5){
  12.     analogWrite(led, pwm);
  13.     Serial.print(("pwm:"));//escrevendo uma string
  14.     Serial.println(pwm);//escrevendo a variável
  15.     delay(10);// pausa de 10 milissegundos
  16.   }
  17.   //laço diminuindo o valor de pwm
  18.   //pwm variando de 255 a 0
  19.   //diminuindo o valor de 5 em 5  
  20.   for(pwm=255;pwm>=0;pwm-=5){
  21.     analogWrite(led, pwm);
  22.     Serial.print(("pwm:"));
  23.     Serial.println(pwm);
  24.     delay(10);
  25.   }  
  26. }

    Para executar esse código basta clicar no botão start simulation. Para pará-lo clique no botão Stop:

Botão Start e Stop Simulation, respectivamente
Botão Start e Stop Simulation, respectivamente

    Se tudo der certo, ao iniciar a simulação você verá uma tênue variação no brilho do led que pode ser mais ou menos perceptível dependendo do seu computador. Na parte inferior da tela teremos o monitor serial mostrando a variação do valor de pwm. Caso esteja muito rápida, aumente o valor de delay de 10 para 30 milissegundos.


Saída do monitor serial mostrando a variável pwm
Saída do monitor serial mostrando a variável pwm

    Lembrando que o laço for(){} esta pegando um valor inicial de pwm, mudando o seu valor de 5 em 5 unidades a cada passagem pelo laço, sendo que o número de repetições dependerá do limite pré-estabelecido para pwm. No primeiro laço esse limite é 255 porque pwm está sofrendo um incremento. No segundo laço o limite é 0 porque a variável está sendo diminuída.

     Não cabe aqui repetir toda as explicações sobre laços, uma vez que isso já foi visto nos três primeiros cursos desse site. Caso o aluno tenha dificuldade recomendo dar uma olhadinha nas seguintes aulas:

    É por isso que a gente recomendava seguir os cursos em uma sequência, para que ao chegar nesse ponto o aluno já tivesse uma certa base e pudéssemos nos concentrar apenas nas novas implementações da framework. Na próxima aula falaremos sobre entradas analógicas. Não esqueça de salvar o seu projeto com o botão Save. 


Próxima Aula                                                                                                                        Aula Anterior

Referências

ARDUINO DOCS. Arduino Documentation. Disponível em: <https://docs.arduino.cc/> Acesso em 05 ago. 2024.

OLIVEIRA, Cláudio Luis Vieira et al. Aprenda Arduino: Uma abordagem prática. Duque de Caixas: Katzen Editora, 2018. 181p. Disponível em: <https://www.fatecjd.edu.br/fatecino/material/ebook-aprenda-arduino.pdf> Acesso em 05 ago. 2024.

OLIVEIRA, Cláudio Luis Vieira. Arduino Descomplicado - Como Elaborar Projetos de Eletrônica. São Paulo: Editora Érica, 2015. 287p. 

TINKERCAD. Centro de Aprendizagem. Disponível em: <https://www.tinkercad.com/learn> Acesso em 05 ago. 2024.

WOKWI. Referência do wokwi-arduino-uno. Disponível em: <https://docs.arduino.cc/> Acesso em 05 ago. 2024.