Arduino 5: Resistores de pull-up

Há situações em que um programa precisa saber o estado da chave também quando ela não estiver sendo apertada. Nesses casos, é preciso conectar um resistor de pull-up ou pull-down entre o pino e o estado desejado (oposto ao estado quando a chave estiver acionada) para que o estado inicial seja definido. Este resistor liga o pino a um estado inicial. Se o pino for depois ligado diretamente ou através de uma resistência menor, a 5V ou GND, haverá um caminho mais curto para a corrente e seu estado será invertido.

Ligar o pino a 5V ou GND é irrelevante, pois o programa poderá escolher o que fazer em cada caso. Por exemplo, se escolhermos ligar uma chave a 5V, o valor no pino será HIGH quando a chave for pressionada, mas indefinido quando ela estiver aberta (veja ilustração abaixo). Usando um resistor de pull-down (tipicamente de 10k) ligando o pino inicialmente a GND, garantirá ao pino um estado inicial LOW que mudará para HIGH quando a chave for pressionada.

Se usarmos a lógica oposta (conectar com GND/LOW em vez de 5V/HIGH) não precisaremos dos resistores, pois o Arduino possui internamente resistores de pull-up (ligados em 5V) para cada pino. Esta opção pode ser ativado configurando o pinMode() com INPUT_PULLUP:

pinMode(CHAVE, INPUT_PULLUP);

Nessa configuração, o pino terá sempre como estado inicial o nível lógico HIGH. No fechamento da chave, o estado mudará para o nível lógico oposto (LOW). O diagrama abaixo ilustra as duas formas de configurar entradas digitais em Arduino:

Experimento 26 – Entrada com resistores pull-up

Material necessário:

  • Arduino Nano + cabo USB + computador
  • Um LED de qualquer cor
  • Resistor de 220 Ω
  • 2 chaves tácteis de pressão
  • Protoboard, fios e jumpers

 

Construa o circuito abaixo. Ele apenas acrescenta mais uma chave ao circuito anterior.

Usaremos um programa que depende dos dois estados (ligado e desligado) de cada chave para decidir quando acender o LED.

#define PINO_LIGAR   3
#define PINO_DESLIGAR 4
#define LED 8

void setup() {
    pinMode(LED, OUTPUT);
    pinMode(PINO_LIGAR, INPUT_PULLUP);
    pinMode(PINO_DESLIGAR, INPUT_PULLUP);
}

void loop() {
    int acender = digitalRead(PINO_LIGAR);
    int apagar = digitalRead(PINO_DESLIGAR);

    if(acender == LOW) {
        digitalWrite(LED, HIGH);
    }
    if(apagar == LOW) {
        digitalWrite(LED, LOW);
    }
}

O loop() é executado repetidas vezes e cada vez: 1) o estado de cada pino é lido, e 2) dois blocos condicionais if são executados. Se a condição testada for verdadeira, o conteúdo é executado. Se não for, o conteúdo é ignorado.

Os blocos condicionais apenas testam se cada botão está em estado LOW, se não estiver, eles são ignorados. Mas os botões raramente estão no estado LOW. Isto acontece apenas quando forem apertados. O estado normal de cada botão é HIGH, já que estão conectados via pull-up. Se por uma fração de segundo você apertar qualquer um dos botões, seu estado será momentaneamente LOW e o bloco será executado. O primeiro if acende o LED, o segundo if apaga. Enquanto nenhum botão está pressionado, o estado anterior é mantido.

O circuito, portanto, tem uma memória que representa o estado do último botão apertado no acendimento ou apagamento do LED. Funciona como um alternador de estado (faz o mesmo que o 555 bi-estável do capítulo anterior, mas sem precisar calcular capacitores nem resistores). Se você trocar a chave por um sensor que baixe a tensão no pino 3 a um nível abaixo de 3V, você pode fazer o LED acender com um evento externo, por exemplo, apagar ou acender uma luz, ou bater palmas. O botão em D4 seria usado apenas para apagar o LED. Isto é proposto nas alterações abaixo.

Alteração 26.1 – Substituindo uma chave por um sensor de luz

Material adicional:

  • Um fototransistor (TIL 78) ou LDR

Troque a chave em D3 por um LDR ou um fototransistor (esquema abaixo), que se comporta como uma chave fechada quando recebe luz. Um pulso curto de luz é suficiente para acender o LED.

Alteração 26.2 – Substituindo uma chave por um sensor de som

Material adicional:

  • 1 microfone de eletreto
  • 1 transistor BC549 ou equivalente
  • 1 capacitor de 1µF
  • 1 resistor de 2k2 Ω

O circuito sensor de som abaixo irá gerar pulsos altos e baixos. Um pulso que faça o transistor conduzir por um instante fará o LED acender. O microfone pode ser alimentado através da saída 5V.