Usando a interrupção externa no seu Arduino

394 Flares Twitter 0 Facebook 394 Google+ 0 394 Flares ×

Imagine que você esteja fazendo seu bolo e no meio da receita seu telefone toque. Possivelmente você irá parar o que está fazendo e irá atender o telefone, assim que encerrar a chamada você irá retornar ao ponto que parou em sua receita.

Quando estamos executando um tarefa muitas vezes temos que a interromper para resolver outra tarefa importante para só depois retornar do ponto que se parou. Isso se chama interrupção e é usada com frequência na programação de microcontroladores.

Uma interrupção tem dois pontos chaves, são eles:

  •   Condição de interrupção: É a condição que indica uma interrupção. Ela avisa ao programa que é a hora de executar uma tarefa extraordinária. No nosso exemplo, essa condição é o toque do telefone.
  •   Função a ser executada: Quando algo indica a interrupção, temos que executar uma lista de instruções referentes a essa interrupção. No exemplo dado, temos que parar de fazer o bolo e ir atender ao telefone. A função atender telefone é uma função extraordinária que só é executada pelo fato de ter ocorrido a condição de interrupção, o toque do telefone.

Para aprender como implementar uma interrupção, vamos fazer uma experiência simples para depois explica-lá. Nela você poderá entender melhor esse conceito de interrupção em um microcontrolador.

Experiência – Implementando uma interrupção

Ingredientes

  • Botão de pressão
  • LED 5mm
  • Resistor 1kΩ
  • Resistor 470Ω
  • Fios Jumper’s
  • Protoboard

Misturando os ingredientes

Agora vamos conectar os componentes do projeto. Para isso, monte seu circuito conforme a figura a seguir.

Garanta que seu Arduino esteja desligado durante a montagem e que o seu LED esteja conectado corretamente, com a perna mais longa (Anodo) conectado ao resistor e a perna menor (catodo) ao GND.

interrupção Arduino

Levando ao forno

Conecte seu Arduino ao computador e abra a IDE Arduino. No menu Tools, certifique-se que a porta serial (serial port) está selecionada e que a placa configurada é a que você está usando (board).

Preparando a cobertura

Crie um programa (sketch) e salve com o nome de “programa_interrupcao_externa”.

Com o seu programa salvo, escreva nele o código conforme escrito abaixo.

// Daremos um nome ao pino que ficara o LED:
int led = 13;

void interrupção(){
  digitalWrite(led, HIGH); // Liga o LED (HIGH = nível lógico alto)
  delay(5000);
}

// Esta função "setup" roda uma vez quando a placa e ligada ou resetada
void setup() {
  pinMode(led, OUTPUT); // Configura o pino do led (digital) como saída
  attachInterrupt(0,interrupcao,RISING); //Configurando a interrupção
}

// Função que se repete infinitamente quando a placa é ligada
void loop() {
  digitalWrite(led, HIGH); // Liga o LED (HIGH = nível lógico alto)
  delay(1000);             // Espera um segundo
  digitalWrite(led, LOW);  // Desliga o LED (LOW = nível lógico baixo)
  delay(1000);             // Espera um segundo
}

Depois de escrever o código, clique em Upload para que o programa seja transferido para seu Arduino.

Experimentando o prato

Caso tenha ocorrido tudo como esperado, o LED deve piscar intermitentemente. Quando você apertar o botão, o LED da protoboard permanecerá aceso por 5 segundos. Caso você não pressione o botão novamente, ele voltará a piscar.

Entendendo o Hardware

As placas Arduino possuem pinos que podem desempenhar a função de entrada de sinal para interrupção externa. No Arduino UNO são as portas digitais 2 e 3, que para tal função são nomeadas de INT0 e INT1, respectivamente. Veja a tabela a seguir com os pinos de cada placa Arduino que possuem essa qualidade.

Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7

Dessa forma, para que seja possível o uso da interrupção externa, escolhemos o pino digital 2 (INT0), no qual conectamos o botão.

Obs.:  Caso você precise de mais portas você pode trabalhar com as interrupções do próprio micontrolador Atmega trabalhando com registradores, isso é um pouco avançado mas temos um tutorial explicando como você pode trabalhar com eles. Introdução a Interrupções e PCINT

Entendendo o programa

Considerando que você já sabe o básico , você já pode entender a maioria dos programas. Dessa forma, iremos nos ater às novidades.

Configurando a interrupção externa no Arduino

Para que o Arduino leia uma interrupção, devemos configurá-lo. Para tal usaremos o comando attachInterrupt().

attachInterrupt(INT,FUNÇÂO,MODO); //Configurando a interrupção


INT
: Número da porta usada para a interrupção. No Arduino UNO INT 0 corresponde à porta digital 2 e INT 1 corresponde à porta digital 3; Como explicado anteriormente, numa interrupção temos dois pontos chaves: a condição da interrupção e a função que será executada. Dessa forma, o comando attachInterrupt é usado para informar ao programa esses dados. São eles:

FUNÇÃO: Nome da função que será chamada e executada quando ocorrer a interrupção;

MODO: Define em qual tipo de variação do sinal a interrupção será disparada. As opções são:

  • LOW: Dispara a interrupção quando a tensão no pino está em 0V
  • CHANGE: Dispara sempre que o sinal no pino muda de estado, borda 0V (0) para 5V(1) ou vice-versa;
  • RISING: Dispara somente borda de subida, 0v (0) para 5V ( 1);
  • FALLING: Dispara somente borda de descida, 5V (1) para 0V (0)

Em nosso programa, usaremos esse comando da seguinte forma:

attachInterrupt(0,interrupcao,RISING); //Configurando a interrupção

Portanto, temos como condição de interrupção a mudança de estado de 0V (0) para 5V(1)  no pino digital 2 (INT 0) e a função a ser executa se chama interrupção.

Função interrupcao()

Função é um bloco de tarefas a serem executadas pelo programa quando solicitada.

void interrupcao(){ //Função executada quando ocorre a interrupção externa
 digitalWrite(led, HIGH); // Liga o LED (HIGH = nível lógico alto)
 delay(5000);
}

 

No nosso caso, a função será solicitada quando ocorrer a interrupção. As tarefas a serem executadas serão: acender o LED e esperar 5 segundos.

Caso você queira saber mais sobre interrupção externa no Arduino, você pode ler sobre ela no site oficial da Arduino. Link

Apostila Arduino 800px

394 Flares Twitter 0 Facebook 394 Google+ 0 394 Flares ×

Allan Mota

Estudante de Engenharia Elétrica da UFES, integrante da ERUS - Equipe de Robótica da UFES e Fundador do Vida de Silício. Sonhador com uma única pretensão, fazer a diferença.

You may also like...

  • João Vitor S. Santos

    Eu já até tinha usado nos meus projetos mas nunca tinha entendido direito para que serve e com esse tutorial ficou muito bem explicado, parabéns, continue sempre assim, só material de qualidade, abraços!

    • Allan Mota

      Obrigado João, fico feliz que tenha gostado e aprendido!! =D

  • Ray Silva

    Ficou muito bom mesmo, estou usando para controle de potência AC e consegui entender bem viu, ótimo trabalho.

  • Junho Montes

    quando eu coloco este código de erro em void interrupção(){

    • Lucas Uchiha

      tente interrupcao, sem acento e sem Ç

  • Gustavo Lenhardt Steffen

    Olá, no meu projeto tenho uma temporização, e gostaria que quando eu apertasse um botão, pausasse este tempo, esta função é indicada para isso?
    Caso não seja, que função devo usar?

  • Marcus Vinicius Nogueira

    E se eu precisar utilizar as DUAS interrupções do UNO.
    Como fazer para que dentro de uma eu não aceite a outra? Seria com interrupts() e noInterrupts()?

  • Jhonata Cristopher Minatti

    o timer não funciona dentro da função anexada a interrupção.

  • Lucas hc

    INterrupcao esta ativando com qualquer interferencia eletrica, mesmo quando abro a geladeira, ele interfere e aciona o meu motor de passo. O que posso fazer ? Ja usei capacitor eletrolitico na entrada da alimentacao do motor no driver A4988 e nada. Por favor!!

    • Nicodemos Jonatas

      vc poderia tentar usar um amplificador de instrumentação pra filtrar ruidos externos em função da alta inpedancia que ele possui

  • Excelente artigo! Facilitou bastante o entendimento da documentação oficial.

    Gostaria, além de agradecer, de sugerir que atualize a tabela “Entendendo o Hardware” com os valores das placas novas.
    Eu já estava ciente da minha Nano, mas pode ajudar algum desavisado.

    Novamente, muito obrigado pelo artigo! Excelente!
    Abração