01 outubro 2015

Arduino - Programa 07: Interrupção (Parte 1)

No tutorial de hoje vou falar sobre a interrupção do arduino. Esta função permite interromper uma tarefa que esteja sendo executada pelo arduino a qualquer momento. Uma situação do tipo pode parecer sem lógica, mas em determinado problema pode ser muito útil.

Iremos montar um efeito sequencial de LEDs e interromper o programa de dois modos. Devido a isso este tutorial estará dividido em duas partes (Parte 1 e 2). No primeiro programa a interrupção retornará sempre ao inicio do loop, ou seja, a sequência dos LEDs sempre será reiniciada quando o botão for pressionado novamente.



// 07 Programa Arduino Interrupção parte 1

volatile int state = HIGH;

int ledArray[] = {8, 9, 10, 11, 12};

int count = 0;

int timer = 75;

int pause = 500;

void setup(){

for(count=0; count<5; count++){

pinMode(ledArray[count], OUTPUT);

}

attachInterrupt(0, ledOnOff, FALLING);

}

void loop(){

if(state){

for(count=0; count<5; count++){

digitalWrite(ledArray[count], HIGH);

delay(timer);

}

delay(pause);

for(count=0; count<5; count++){

digitalWrite(ledArray[count], LOW);

delay(timer);

}

delay(pause);

}

}

void ledOnOff(){

static unsigned long lastMillis = 0;

unsigned long newMillis = millis();

if(newMillis - lastMillis<50){

}

else{

state = !state;

lastMillis = newMillis;

}

}

Este programa inicia-se declarando a variável state como sendo volatile. Declarar uma variável volatile significa que a variável pode ser alterada ao longo do programa. A aplicação mais comum desta variável é em interrupções como no nosso caso.

No arduino uno, há duas interrupções, uma interrupção feita através da porta digital 2 chamada de interrupção 0 e na porta 3 chamada de interrupção 1, diferente do uno o arduino mega, tem quatro interrupções adicionais: a interrupção 2 ligada ao pino digital 21, a interrupção 3 ligada ao pino 20, a interrupção 4 é ligada ao pino digital 19 e a interrupção 5 é ligada ao pino 18.


Em seguida temos a função attachInterrupt(0, ledOnOff, RISING), ela utiliza três argumentos, 0 significa a interrupção que estamos utilizando, no nosso caso a interrupção 0 ligada a porta 2, podemos também utilizar a interrupção 1, bastando alterá-la na função e a conexão no hardware para a porta 3. Depois chamamos a função ledOnOff que não retorna nenhum dado, ela evita um erro chamado de bounce (ou flutuação), que provoca o falso acionamento do botão. Logo após temos o modo de interrupção, que pode ser de quatro tipos, LOW que interrompe sempre que o pino estiver em baixo; CHANGE interrompe sempre que o pino muda de valor; RISING interrompe sempre que o pino muda de LOW para HIGH; e FALLING interrompe sempre que o pino altera de HIGH para LOW. Atente-se ao modo de interrupção deste programa.


A função void ledOnOff() como comentei anteriormente evita o falso acionamento do botão, a variável lastMillis é declarada como sendo uma variável do tipo static, essa forma faz com que a variável mantenha seu valor durante a chamada da função. A função millis() armazena o tempo transcorrido desde o inicio do programa. Observe a comparação da diferença do tempo em lastMillis e newMillis que caso seja menor do que 50 ms não acontece nada, evitando o bounce. Mas se a diferença for maior, a variável state que armazena LOW muda para HIGH, isso porque temos uma operação lógica sendo efetuada, ou seja, o comando ! significa inversão, ou seja, o inverso de HIGH é LOW e vice-versa.


Quando o botão for pressionado e o tempo de acionamento for maior do que 50 ms o programa instantaneamente será interrompido. Se o botão for pressionado outra vez o programa reinicia e volta a funcionar.

Uma interrupção é considerado por muitos uma técnica avançada, mas se for programada de forma correta não proporcionará possíveis erros inesperados. Outra constatação é que não é possível utilizar a função delay() dentro de uma rotina de interupção.


Por fim, acredito que temos base teórica o suficiente desde os tutoriais passados para fazermos análises mais rápidas dos códigos que aqui apresento.


Para montar este programa necessitamos dos seguintes componentes:

  • Arduino Uno;
  • 5 LEDs;
  • 5 resistores de 150 Ohm;
  • 1 botão de pressão;
  • Fios ou jumpers.
As conexões que devemos fazer estão na imagem abaixo.
Figura 1 - Esquema elaborado com Fritzing
O esquema ainda está meio confuso, mas já estou pegando jeito com o Fritzing (depois escrevo um artigo apresentando-o). Continuando, abaixo apresento algumas imagens da minha montagem.
Figura 2 - Minha montagem
Figura 3 - Minha montagem
Figura 4 - Minha montagem
Depois de feito a montagem do hardware, não pode faltar o vídeo.


Os programas também podem ser baixados, basta clicar aqui e escolher.

Se você gostou, ajude o blog Eletrônica de Garagem compartilhando em suas redes sociais ou curtindo nossa fan page !

Até o próximo !


EmoticonEmoticon