O Fade (Desvanecer) é um efeito suave de transição que podemos utilizar em diversas aplicações, como por exemplo em edições de som, vídeo e controle de luminosidade. O intuito desde tutorial é realizar o controle de brilho de um LED utilizando a plataforma Arduino e seus recursos, para isso é necessário entender alguns conceitos básicos como sinal PWM, escrita e leitura de dados e as diferenças entre porta analógica e digital do microcontrolador.
Entendendo o conceito
Os conceitos básicos do sinal PWM (Pulse Width Modulation) foram explicados detalhadamente no artigo Utilizando PWM para controlar LED no Raspberry Pi com Guizero, é uma leitura recomendada para entender o funcionamento das funções do Arduino. Para trabalhar com o sinal PWM no Arduino Uno é necessário utilizar os pinos que possuem a marcação "~" que são os pinos 3, 5, 6, 9, 10 e 11, além disso precisamos acionar este sinal no código aplicando a função analogWrite(pino, valor), onde o valor será a porcentagem de duty cycle, variando de 0% a 100% e refletindo no pino digital de 0 a 255.
Podemos realizar um teste para visualizar o sinal PWM agindo na luminosidade de um LED com o efeito de Fade In e Out automático. Para isso separe os seguintes materiais necessários e veja o diagrama esquemático abaixo.
- Arduino Uno R3 com cabo USB
- 1 Protoboard
- 1 LED
- 1 Resistor de 220R
- Fios
Abra a IDE oficial do Arduino e cole este código, configure a porta COM e placa conforme o seu Arduino. Compile e envie este Sketch para ver o resultado final.
/*
* Efeito de Fade In e Out em LED.
*
* Autor: tecdicas
* https://tecdicas.com/
*
* 09/05/2019
*/
// Pino PWM
#define led 9
// Valor máximo = 255
int valor = 255;
int tempo = 10;
void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop()
{
// Utilize o Monitor serial
for(int x = 0; x < valor; x++)
{
analogWrite(led, x);
Serial.print("Aumentando..");
Serial.println(x);
delay(tempo);
}
for(int y = valor; y > 0; y--)
{
analogWrite(led, y);
Serial.print("Diminuindo..");
Serial.println(y);
delay(tempo);
}
}
Este código faz o efeito de forma automática utilizando duas estruturas de repetição FOR, a primeira estrutura compara se a variável local x (0) é menor que o valor (255), se x é igual a 255 o incremento e a estrutura são finalizados pela condição. A segunda estrutura entra em ação, onde a variável local y recebe o valor (255) e compara se y é maior que 0, se y é igual a 0, o decremento e a segunda estrutura são finalizados pela condição, repetindo este processo infinitamente pelo void loop().
Você pode testar modificando a variável valor, utilizando valores como 100 ou 50, deixando o efeito mais rápido e menos luminoso, pois o duty cycle e a tensão do pino não estão em seu 100%! No artigo recomendado anteriormente possui um cálculo para a tensão média, utilizando o valor de duty cycle e tensão do pino. Também é interessante visualizar esta tensão utilizando um multímetro em DC Volts.
Controle manual
Entendendo o funcionamento do PWM no Arduino Uno, podemos adicionar um controle manual para variar o duty cycle, como um potenciômetro. O potenciômetro é um resistor variável, ele tem a capacidade de alternar sua resistência até o limite especificado pelo componente, sendo os mais comuns de 10KOhms e 100KOhms. Utilizando a mesma montagem anterior adicione um potenciômetro de 100K, onde seu pino central será conectado no pino analógico A0 e os demais no 5V e GND.
Abra um novo projeto na IDE Arduino e cole este código, compile e envie para o microcontrolador.
/*
* Efeito de Fade In e Out em LED com potenciômetro.
*
* Autor: tecdicas
* https://tecdicas.com/
*
* 09/05/2019
*/
#define led 9
#define potenciometro A0
int valor = 0;
void setup()
{
pinMode(led, OUTPUT);
pinMode(potenciometro, INPUT);
}
void loop()
{
valor = analogRead(potenciometro); // Ler o potenciometro e colocar na variável "valor"
analogWrite(led, valor / 4); // Max pino analógico 1023 - Max pino digital 255.
}
Com o pino analógico do potenciômetro configurado como INPUT, podemos ler o seu valor utilizando a função analogRead(pino) e armazenando na variável valor. Utilizando a função analogWrite(pino, valor) podemos modificar a luminosidade do LED com o valor recebido do potenciômetro dividido por 4, esta divisão é uma compatibilidade necessária para o pino digital, onde 1023 / 4 = 225,75.