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:
- PWM
- Constante INPUT_PULLUP
- “Bounce” de um botão
- Instalação automática de uma biblioteca externa no Arduino
- Utilização da biblioteca Bounce
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 Biblioteca… e 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
Referências
Esquemas desenhados no Fritzing: ver aqui