Olá pessoal, tudo certo? no artigo de hoje vamos aprender a ler entradas digitais do Arduino (botões, etc) sem interromper nosso código por muito tempo, através de interrupção externa. Utilizaremos a função attachInterrupt().

   Existem pelo menos três formas de se fazer exatamente a mesma coisa (ler botões) utilizando Arduino (e qualquer microcontrolador):

  • Utilizando a função delay() e literalmente parando o programa para esperar o botão ser pressionado,
  • Utilizando um código pseudo-interrompível através das funções micros() ou millis(); já escrevi sobre esta forma neste link,
  • Através de interrupções externas de hardware.

   Das três formas acima citadas, as interrupções são a forma mais segura de controlar tarefas em qualquer sistema, pois o programa não é parado e as suas diferentes partes tornam-se independentes.

   Neste artigo vou implementar a função attachinterrupt(), disponível originalmente na página oficial do Arduino; utilizaremos um Arduino UNO, um botão e um LED (pino 13 do Arduino) para demonstrar o conceito. O diagrama esquemático do experimento está na imagem abaixo:

diagrama esquemático debounce Arduino

Clique na imagem para ampliar

E também uma imagem da montagem:

circuito de teste - interrupçãoClique na imagem para ampliar

   Observer que a chave (botão) não está sozinha no protoboard; isto porque adicionei um circuito RC série, afim de executar o debounce da chave. Já falei bastante sobre debounce de chaves neste artigo, mas aí vai uma rápida explicação: nenhum contato seco (chave) vai do estado “desligado” para “ligado” instantaneamente.

   Sempre há uma incerteza por alguns milésimos de segundo, então se o microcontrolador ler a chave neste exato momento pode interpretar um ligado como desligado e vice-versa. O circuito RC proposto serve para atrasar e estabilizar a forma de onda da tensão, e consequentemente possibilitar mais certeza na leitura do estado pelo microcontrolador. A imagem abaixo ilustra bem o conceito:

Sinal de debouncing

   O código que vamos implementar tem a função de alterar o estado do LED (ligado ou desligado) a cada vez que pressionamos o botão na protoboard. Pressionando uma vez ligamos o LED e pressionando o botão novamente desligamos o LED.

Abaixo está disponível o código completo para este teste, adaptado do original disponível no site do Arduino.

O código funciona da seguinte maneira:

  • Utilizamos o LED disponível no pino 13 da placa do Arduino e um botão (chave) conectado ao pino 2 (uma das duas portas do Arduino UNO que aceita interrupções;
  • A função attachInterrupt fica dentro do setup() do sketch, aguardando uma mudança de estado no interruptPinRISING que dizer na subida do sinal de 0 para 5V;
  • Ao detectar esta subida de sinal (pressionar do botão) a função blink() é acionada; ela contém apenas um mudança de estado, state = !state. O estado anterior sempre é diferente do atual (operador ! no arduino);
  • Dentro do loop() do programa fica apenas a função digitalWrite, que aplica ao ledPin (pino 13) o estado recebido na variável state. Isso significa que você pode executar qualquer outro código dentro do loop(), pois a única coisa a mais sendo executada ali é o digitarWrite!!!.

Abaixo deixo um vídeo do teste funcionando:

Conforme já comentei, você pode sempre obter mais informações e exemplos na página oficial do Arduino (em Inglês).

 


   Lembrando sempre que você pode comprar componentes eletrônicos e Arduinos (para suas experiências) nestes links, pois tem material à preço bom (e eu ainda ganho créditos em materiais para poder melhorar o blog!!).

Interrupção externa no Arduino UNO – attachInterrupt()

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *