Ajustando o brilho de um LED por PWM com Arduino 2

Neste pequeno tutorial iremos mostrar como controlar o brilho de um LED utilizando a técnica de PWM com Arduino. Além de controle de LEDs também é possível utilizar essa mesma técnica para controle de rotação de motores, servos e etc.

Montagem do circuito

O circuito do PWM (Pulse Width Modulation) com Arduino é bem simples e requer apenas um LED, resistor limitador de corrente, jumpers macho/macho e protoboard.

O circuito deve ficar da seguinte maneira:

Circuito LED com PWM com Arduino

Programação Arduino

// Projeto MakerHero - Brilho LED PWM

int ledPin = 11;
float sinVal;
int ledVal;

void setup() 
{
  pinMode(ledPin, OUTPUT);
}

void loop() 
{
  for (int x=0; x<180; x++) 
  {
    // converte graus para radianos e então obtém o valor do seno
    sinVal = (sin(x*(3.1412/180)));
    ledVal = int(sinVal*255);
    analogWrite(ledPin, ledVal);
    delay(25);
  }
}

Compile o código e grave em seu Arduino. Note que o LED começa com um brilho bem fraco, vai aumentando seu brilho suavemente até alcançar seu brilho máximo. O olho humano não vê, mas o que está acontecendo é um processo de ligar/desligar o LED rapidamente variando assim a tensão e consequentemente o brilho. A seguir faremos uma explicação mais detalhada do código.

Código PWM com Arduino em detalhes

Primeiramente foram setadas as variáveis do ledPin, um float (floating point data type) para a onda seno, e um ledVal que será o valor inteiro a ser enviado para saída digital PWM Pin 11.

O conceito aqui é que estamos criando uma onda seno em que o brilho do LED a está seguindo em parte da onda, fazendo com que o valor do brilho seja alterado mais vagarosamente do que simplesmente brilho máximo e mínimo.

Como a função seno é somente positiva até 180 graus o laço for limita os valores entre 0 e 179, logo não haverá resultados negativos e o valor para o brilho somente poderá variar entre 0 e 255. Vale ressaltar que a função seno recebe valores apenas em radianos, logo é necessário converter de graus para radianos como mostra o código abaixo.

sinVal = (sin(x*(3.1412/180)));

Os valores do seno serão multiplicados por 255 e o resultado será transformado em inteiro, trancando assim a casa decimal para que seja possível enviar para a saída digital PWM Pin 11.

analogWrite(ledPin, ledVal);

Este trancamento significa que você converteu o ponto flutuante float em um inteiro, eliminando assim possíveis casas decimais. Mas como posso enviar um sinal analógico por uma porta digital?

Se você olhar o Arduino verá que em alguns pinos digitais está escrito PWM, este pinos são diferentes dos outros pois são capazes de enviar um sinal PWM, que é uma técnica usada para digitalizar sinais analógicos.  Nestes pinos, o Arduino envia uma onda quadrada alternando o pino em ON/OFF rapidamente. A sequência destes ON/OFFs podem simular a variação de tensão entre 0 a 5v. Isto é feito trocando-se a quantidade de tempo que a saída fica em 1 (on) ou em 0 (off). A duração deste tempo é conhecida como pulse widht (largura de pulso).

Por exemplo, caso você envie o valor 0 pela saída digital PWM Pin 11 usando analogWrite(), o período em ON será zero, ou terá 0% de duty cycle (ciclo de trabalho). Se enviar o valor 64 (25% do valor máximo 255) o pino ficará em ON por 25% do tempo e 75% em OFF, logo duty cicle de 25%. O valor 191 terá o teu duty cicle de 75% e o valor 255 de 100%. Veja a figura a seguir exemplificando este processo:

PWM

Logo, basta escolher a intensidade do brilho que se encaixa melhor em seu projeto e enviar via PWM conforme explicamos acima.

Veja também mais algumas informações sobre a função analogWrite() e PWM no site do Arduino.

Gostou do post do PWM com Arduino? Deixe seu comentário logo abaixo. 

Faça seu comentário

Acesse sua conta e participe

2 Comentários

  1. Bom dia, como calcular o filtro do PWM para ter uma tensão DC na saida? estou utilizando TRES TIP122, em uma fita de LED RGB, queria fazer o desmaecimento da luz sem oscilações.

  2. A variação do brilho do LED ocorre por variação de corrente e não pela variação da tensão sobre o LED.