Muito provavelmente você já reparou que na placa do Arduino existe o desenho de um til (~) ao lado de alguns pinos. Mas você sabe o que eles significam? Esse ~ indica que aquele pino é capaz de realizar PWM. Mas o PWM não é exclusivo do Arduino, ele pode ser encontrado em praticamente todos os microcontroladores além do atmega328p (presente no Arduino UNO).

Caso você não faça ideia do que é PWM, recomendo ler o post a respeito para entender esse tutorial. Esse tutorial irá controlar um LED igual a um dimmer (aquelas lâmpadas que variam a intensidade), porém o dimmer é voltado para circuitos de maior potência e também ele não necessita de microcontrolador.

Na aula anterior, vimos como fazer a leitura das portas digitais.


Circuito

Vamos controlar o brilho de um LED variando a tensão média em cima dele (aplicando o PWM). E o que determinará o brilho será um potenciômetro. A tensão no pino do meio do potenciômetro será lida no pino A0. E mandaremos um sinal de PWM de acordo com o valor de tensão: caso o valor lido seja 5v, o PWM terá um duty cycle de 100%, e, caso o valor lido seja 0v, o duty cycle será de 0%.

Arduino controlando LED por PWM

O circuito é composto por 1 LED e um potenciômetro. As extremidades do potenciômetro são ligadas no GND e no 5v e o terminal central é ligado no pino A0. O LED é ligado em um resistor pelo cátodo e o ânodo é ligado no pino digital 3 (que possui o ~).


Programação

Explicação detalhada

A primeira coisa a ser feita é declarar uma variável com o valor do pino do LED.

1
int led = 3;

E temos que configurar o pino 3 como saída e o A0 como entrada no void setup.

1
2
3
4
void setup() {
  pinMode(led, OUTPUT);
  pinMode(A0, INPUT);
}

Agora, no loop, nós devemos fazer a leitura do pino A0. Para isso eu resolvi gravar essa leitura em uma variável chamada leitura que pega o valor “bruto” do pino A0.

1
int leitura = analogRead(A0);

E para controlar nosso LED por PWM, o comando que precisamos utilizar é o:

analogWrite(pino, valor);

Onde pino se refere ao pino que receberá o sinal e valor se refere ao duty cycle. O parâmetro valor funciona numa escala de 0 a 255, sendo 0 um duty cycle de 0% e 255 um de 100%.

Observe que, como nossa leitura analógica retorna um valor de 0 a 1023, nós precisamos fazer algo para encaixar ela dentro da escala de 0 a 255. Afinal, nós queremos usar a leitura analógica para controlar o PWM. E para isso, vamos remapear nossos valores para a escala de 0 a 255 usando o comando map, que de certa forma faz uma regra de 3 com os valores limites.

1
int pwm = map(leitura,0,1023,0,255);

Veja, “0,1023” é a escala que quero converter e “0,255” é a outra escala a qual eu quero passar. Sendo assim, agora é só passar essa variável pwm para o comando analogWrite:

1
analogWrite(led, pwm);

Pronto, agora basta testar o código.

Código completo

1
2
3
4
5
6
7
8
9
10
11
12
int led = 3;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(A0, INPUT);
}

void loop() {
  int leitura = analogRead(A0); //Armazena a leitura do pino A0 na variavel leitura
  int pwm = map(leitura,0,1023,0,255);
  analogWrite(led, pwm);
}

Usando o monitor serial do Arduino – Aula 7 – AI