Arduino 6: PWM

O Arduino Nano não produz sinal analógico verdadeiro, mas apenas os simula através de PWM (Pulse Width Modulation – veja capítulo anterior) através dos pinos digitais 3, 5, 6, 9, 10 e 11. PWM permite simular valores médios de tensão que variam entre os níveis lógicos LOW e HIGH. Esses valores são representados por número entre 0 a 255 retornado pela instrução analogWrite().

analogWrite(5, 64); // envia 5V 25% do tempo 5V para a saída digital 5

Experimento 27 – Piscando suavemente

Material necessário:

  • Arduino Nano + cabo USB + computador
  • LED
  • Resistor de 220 ohms
  • Protoboard, fios e jumpers

Este é uma variação do primeiro experimento que pisca um LED. O circuito é praticamente o mesmo, mas como o pino 8 usado no programa anterior não suporta PWM, transferimos o LED para o pino digital 3 (que é um dos seis pinos que suporta saída analógica).

O programa também mudou. Em vez de piscar em dois estados digitais, este pisca suavemente, variando entre o totalmente aceso e totalmente apagado.

int LED = 3;
int brilho = 255; // inicia com brilho máximo
int direcao = -1; // 1 = aumentando, -1 = diminuindo

void setup() {
    pinMode(LED, OUTPUT); // opcional com analogWrite (mas é boa prática)
}
void loop() {
    analogWrite(LED, brilho);
    delay(2);
    brilho = brilho + direcao;
    if(brilho <= 0 || brilho >= 255) {
        direcao = -direcao;
    }
}

O programa define duas variáveis (além do pino): brilho, que guarda o valor do brilho do LED (entre 0 e 255) e direcao, que contém o número 1 ou -1, que será somado ao brilho cada vez que loop() for executado, fazendo com que o brilho aumente ou diminua lentamente.

Assim que loop() inicia, o pino onde está o LED recebe o valor analógico 255 (correspondente a 5V). Depois espera 10 milissegundos e executa a instrução

brilho = brilho + direcao;

Uma expressão de atribuição primeiro executa a expressão do lado direito do “=”, substituindo as variáveis por seus valores. Portanto, a expressão executada será calculada da seguinte forma:

brilho = 255 + (-1)

que irá gravar o valor 254 na variável brilho.

No bloco seguinte temos uma expressão condicional if que testa se brilho é maior ou igual a zero OU se é maior ou igual a 255. O símbolo || conecta duas expressões através de uma proposição lógica OU. Isto significa que a condição do if será verdadeira se uma ou ambas as expressões forem verdadeiras. A condição é testada para os valores limite 0 e 255. Quando o valor de brilho chegar a um desses valores, o sinal da variável direcao é trocado (se era 1, passa a ser -1; se era -1 passa a ser 1). Assim o brilho que estava diminuindo, passa a gradualmente aumentar, e vice-versa.