Pplware

Arduino: Como ligar botões de uma forma “profissional

Por Samuel Carreira  para o Pplware

Uma das formas mais comuns de controlar o Arduino é utilizar interruptores ou botões de pressão. Neste pequeno tutorial, vou explicar como utilizar botões de uma forma fácil, “profissional” e recorrendo a poucas linhas de código.

No âmbito deste tutorial, vão ainda introduzidos os seguintes conceitos básicos:

Para introduzir este tutorial, imaginemos uma situação prática em que pretendemos controlar o brilho de um LED através de dois botões (um botão para aumentar o brilho e outro para o diminuir). Os botões devem controlar o aumento de uma forma precisa (aumentar o valor do brilho em incrementos de uma unidade) e possibilitar um aumento mais rápido do valor caso se mantenha o botão premido.

Parte I – Hardware

Para se variar o brilho do LED é necessário utilizar uma porta com saída PWM. O que acontece de uma forma simples numa saída PWM é que o LED é ligado e desligado muito rapidamente (até aproximadamente 490 vezes por segundo). Variando o os valores deste pulso é possível “obter a sensação” que o LED não está com o brilho máximo (mais informações sobre PWM aqui).

O pino escolhido para ligar o LED poderá ser qualquer um dos pinos do Arduino que suportem PWM, como por exemplo, o número 11. Visto que na saída dos pinos do Arduino a corrente máxima é de 40 mA a 5 V, deverá utilizar-se uma resistência ligada em série com o LED para o proteger (tipicamente utiliza-se uma resistência de 220 Ohms).

A ligação dos dois botões poderá ser realizada em qualquer uma das portas digitais do Arduino (neste caso vamos escolher os pinos 7 e 8). Na maioria dos tutoriais são utilizadas resistências de proteção em conjunto com os botões (chamadas de resistências pull-down), no entanto, para simplificar as ligações e o número de componentes usados, vamos utilizar as resistências internas do Arduino (chamadas de resistências de pull-up), e por isso a ligação será realizada diretamente entre a massa (ground ou GND) e o botão.

As nossas ligações ficariam assim:

Ou o esquema eléctrico:

NOTA: no esquema é utiliza um botão de pressão simples de dois terminais, os botões de 4 terminais que devem ser ligados da seguinte forma

Parte II – Software

Algo que pode passar despercebido ao principiante na eletrónica é que os interruptores mecânicos não funcionam de uma forma totalmente “limpa”. De uma forma simples, quando se pressiona um botão, os contactos metálicos não fecham o circuito imediatamente devido às condições microscópicas das superfícies de contacto e ocorre um ligeiro oscilar (Bounce) entre estados durante breves microssegundos entre. A figura abaixo esquematiza este pormenor ao representar a variação de estado de um botão ao longo do tempo:

Como os microcontroladores são muito rápidos a processar os sinais, conseguem detetar esta oscilação no estado do botão e em determinadas aplicações tal facto pode ser problemático. Existem diversas formas de contornar este problema. A mais comum é utilizar algumas linhas de código que recorrem à função millis() do Arduino ( http://arduino.cc/en/Tutorial/Debounce ). No entanto, vamos aprender a utilizar a biblioteca Bounce que foi escrita para este efeito e que adiciona algumas funcionalidades interessantes de uma forma muito simples e sem ser necessário escrever muitas linhas de código.

Instalar a biblioteca automaticamente

1- Fazer download da biblioteca (comprimida em zip) aqui

2- Na IDE do Arduino, navegar até ao menu Sketch -> Importar Biblioteca… -> Adicionar Bibliotecae escolher o ficheiro descarregado anteriormente

NOTA: caso deseje instalar a biblioteca manualmente poderá utilizar as instruções disponíveis aqui

Análise do código

O código inicia com a chamada da biblioteca e a definição dos pinos de ligação. Definir os pinos utilizados é uma boa prática que simplifica a alteração das ligações eléctricas sem ser necessário rever todo o código escrito.

#include  // biblioteca utilizada
// definição dos pinos de ligação
#define LED_PIN 11
#define AUMENTAR_PIN 8
#define DIMINUIR_PIN 7

É criada uma variável do tipo byte (valores entre 0 e 255) que irá armazenar o valor do brilho do LED.

byte brilho = 0; // valor do brilho do LED entre 0 e 255

Os dois botões utilizados são declarados como objetos da seguinte forma Bounce(byte pin, unsigned long debounce_interval) sendo que o intervalo de debouce é definido em milissegundos (5 milissegundos é um valor tipicamente utilizado).

#define DEBOUNCE_TIME 5 // tempo em ms
Bounce aumentar = Bounce(AUMENTAR_PIN, DEBOUNCE_TIME); 
Bounce diminuir = Bounce(DIMINUIR_PIN, DEBOUNCE_TIME);

O pino do LED é definido como pino de saída e os pinos dos botões são definidos como entrada com o argumento INPUT_PULLUP que possibilita o uso das resistências internas de pull-up. Esta definição inverte o comportamento do pino no sentido que um valor HIGH ou ligado significa que o sensor está desligado e vice-versa.

De forma a monitorizar o valor da variável que define o brilho do LED é iniciada uma comunicação série que pode ser controlada através do Monitor Série integrado na IDE Arduino (Menu Ferramentas -> Monitor Série).

void setup()  { 
  pinMode(LED_PIN, OUTPUT)
  pinMode(AUMENTAR_PIN, INPUT_PULLUP);
  pinMode(DIMINUIR_PIN, INPUT_PULLUP);

  Serial.begin(9600);
  Serial.println("Tutorial Botao");
}

O código da função principal do programa começa com a escrita do valor da variável brilho (um valor de 0 corresponde a sempre desligado e um valor de 255 corresponde a sempre ligado). O estado dos botões é detetado através da função update, caso este valor seja verdadeiro (o que corresponde a uma mudança de estado do botão), é verificado se o botão encontra-se premido (devido à utilização da resistência interna de pull-up corresponde a um estado inverso, ou seja, 0 ou LOW).

A função rebounce força o sinal do estado do botão a alterar mesmo que o estado físico não altere. Neste caso é utilizado para repetir o estado do botão a cada 250 milissegundos enquanto o botão estiver a ser premido (útil para alterar rapidamente o valor). O valor da variável brilho pode ser lido no monitor série de forma a se comprovar o correto funcionamento do programa (a função Serial.println(valor) escreve o valor da variável seguido de uma quebra de linha ou “parágrafo”).

void loop()  { 
  analogWrite(LED_PIN, brilho);

  if (aumentar.update() ) {
    if (aumentar.read() == LOW ) {
      aumentar.rebounce(250);

      if (brilho < 255)         
             brilho ++;                

      Serial.print("Aumentar o brilho do LED: ");       
      Serial.println(brilho);     
          }   
     }      
if (diminuir.update() ) { 
    if (diminuir.read()== LOW ) 
            {       
             diminuir.rebounce(250);              

          if (brilho > 0)
          brilho --;     
      Serial.print("Diminuir o brilho do LED: ");
      Serial.println(brilho);
    }
  }
}

Aconselhamos a uma revisão cuidada do código e das ligações elétricas antes de fazer o upload do código. Uma configuração errada dos pinos de entrada pode danificar permanente o Arduino. Caso o upload seja realizado com sucesso poderão utilizar o Monitor Série (atalho: CTRL+SHIFT+M) para observar a alteração do valor da variável que controla o brilho e comprovar o correto funcionamento do programa.

Video de Demonstração

Com este pequeno tutorial foi possível aprender alguns conceitos básicos mas bastante úteis para todos aqueles que se desejam iniciar no fantástico mundo do Arduino. Download Código fonte: aqui

Referências

Esquemas desenhados no Fritzing: ver aqui

Exit mobile version