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%.
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
o que mudaria se tivessemos o arduino due?
Olá, Rafael. Não tenho certeza, pois nunca usei um Arduino Due, mas acredito que o código seria o mesmo. A diferença está nos pinos, pois o Due suporta PWM nos pinos 2 ao 13. Além disso, a frequência do PWM no Due é diferente (1000 Hz). Uma informação curiosa relacionada, é que você também pode usar o comando analogWrite passando o pino DAC0 ou DAC1 para gerar um sinal analógico na saída deles.