Projeto 78 - Como realizar interrupção externa no Arduino usando sensor de toque

Básico - Projeto 78

Interrupção externa no Arduino - liga e desliga com sensor touch TP223B

Objetivo

Neste projeto vou mostrar como realizar interrupções externas no Arduino através do sensor de toque capacitivo TTP2233B. Desta forma, ao tocarmos no sensor, um led irá ligar ou desligar sem que atrapalhe a rotina dos demais comandos do projeto.

Sensor Touch Capacitivo TTP223B: Sensor baseado no CI TTP223B que foi desenvolvido para detectar toques. Seu funcionamento é bem simples: ao tocar a região indicada, a saída do sensor é ativada (HIGH).

Obs.: Os sensores de toque, assim como os botões de pressão (push button ou chaves tácteis) apenas mudam seu estado enquanto estamos pressionando ou tocando, voltando ao seu estado original quando liberados. Neste projeto, teremos uma rotina para atribuir a um só sensor duas funções: ligar e desligar um componente eletrônico qualquer através de uma interrupção externa.

Conceitos sobre interrupção externa

Interrupção externa: É quando o programa do Arduino está instruído para reagir à mudança de um sinal externo, por exemplo,  mudança do nível lógico de um sinal gerado por um botão ou por um sensor qualquer (Referência Arduino).

  • A ideia de utilizar a interrupção externa no Arduino em certos projetos, é quando precisamos realizar duas ou mais tarefas ao mesmo tempo.
  • Uma interrupção no Arduino tem 2 pontos fundamentais:

a) A condição da interrupção: É o ato que indica a interrupção. Por exemplo, o toque em um botão indica que o Arduino deverá executar uma função extraordinária.

b) Função a ser executada: Após o ato da interrupção, o Arduino irá executar uma função pré determinada que poderá ser chamada de Rotina de Serviço de Interrupções (ISR)

Rotina de Serviço de Interrupções (ISR - Interrupt Service Routine): Como já mencionamos acima, ISR são funções a serem executadas simultaneamente após uma interrupção externa. Entretanto, estas funções são especiais e possuem algumas limitações, sendo:

  • Uma ISR não recebe argumentos e não retorna nada.
  • Uma ISR deverá ser a mais curta e rápida possível. Se o seu programa utiliza múltiplas ISRs, apenas uma poderá ser executada de cada vez.
  • A função delay() não funcionara em uma ISR.
  • A função millis() não poderá ser incrementada dentro de uma ISR.
  • A função delayMicroseconds() ao não utilizar nenhum contador, funcionará normalmente em uma ISR.

Aplicação

Para fins didáticos e projetos gerais.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 400 pontos

Jumpers Kit cabos ligação macho / macho 1  
Sensor de toque capacitivo Sensor touch TP223B 1

Tensão de Operação: 2 a 5V

Saída estado Alto (HIGH): 0,8V

Saída estado Baixo (LOW): 0,3V

Tempo de resposta: 220ms (LOW) e 60ms (HIGH)

(datasheet)

Led Difuso 5mm LEDs 5mm 3

3 LEDs alto brilho ou difuso (qualquer cor)

Você poderá utilizar também LEDs de 3 mm na cor que desejar.

Resistor

Resistor

 3

3 Resistores 150Ω

Se precisar usar outros valores, calcule o resistor apropriado para o led utilizado

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

1. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

1.1. Portanto, faça a conexão do Arduino no terminal positivo do led (anodo) e o GND no terminal negativo (catodo).

1.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.

2. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Como calcular o resistor adequado para o led e Leds ligados em série e em paralelo.

2.1. Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω

3. Antes de montarmos o nosso sensor, temos que observar que que os microcontroladores Arduino possuem pinos específicos para desempenhar a função de entrada de sinal para a interrupção externa. No Arduino UNO, por exemplo, as portas digitais 2 e 3 têm esta função, sendo nomeadas como int = 0 e int = 1, respectivamente. Veja a tabela a seguir que mostra os pinos das principais placas Arduino que possuem esta função:

Board int.0 int.1 int.2 int.3 int.4 int.5
 Uno, Nano, Mini, other 328-based pino 2 pino 3        
 Mega, Mega2560, MegaADK pino 2 pino 3 pino 21 pino 20 pino 19 pino 18
 Micro, Leonardo, other 32u4-based pino 3 pino 2 pino 0 pino 1 pino 7  
 Due número da interrupção = todos pinos digitais = número do pino
 Zero todos pinos digitais, exceto 4 = número do pino

 Veja abaixo a configuração dos pinos do Arduino Uno R3:

4. Conforme vimos na tabela anterior, definiremos o pino digital 2 do Arduino UNO para conectarmos o pino do sensor de toque e obtermos a funcionalidade da interrupção externa no nosso projeto.

Obs.: Se desejar, você também pode utilizar o pino 3 do Arduino para obter a mesma funcionalidade da interrupção externa, lembrando de nomeá-lo como int = 1.

5. Monte o sensor touch TP223B conforme imagem abaixo.

5.1. Montando o componente desta forma, quando o sensor for tocado, o Arduino retornará "HIGH" ou "1".


5.2. Lembre-se, para obtermos a funcionalidade da interrupção externa, devemos ligar o pino do sensor na porta digital 2 ou 3 do Arduino. No nosso projeto, conectamos no pino digital 2.

6. Veja abaixo como realizamos a montagem do nosso projeto utilizando dois protoboard de 430 pontos.

Usando o comando de interrupção no Arduino

1. Para que o Arduino leia uma interrupção externa, é necessário utilizarmos a função attachInterrupt() - Leia Referência Arduino - attachInterrupt().

2. Esta função irá verificar se a condição aconteceu e qual função especial (ISR) será executada caso a interrupção ocorra. Veja a sintaxe abaixo:

Obs.: Como já explicamos acima, ISR (Interrupt Service Routine, ou Rotina de Serviço de Interrupções em português) nada mais é do que uma função especial executada quando ocorre uma interrupção externa:

Sintaxe

attachInterrupt(INT,IRS,MODO); //Configurando a interrupção

Onde:

INT: Número da porta usada para a interrupção. No Arduino UNO podemos utilizar INT = 0 que corresponde à porta digital 2 e INT = 1 corresponde à porta digital 3.

Obs.: Podemos utilizar no lugar de INT o comando digitalPinToInterrupt(pino). Portanto, para o Arduino UNO podemos utilizar digitalPinToInterrupt(2) ou digitalPinToInterrupt(3) ao invés de 0 ou 1.

IRS: Nome da função especial que será chamada e executada quando ocorrer a interrupção.

Atenção: A função ISR tem algumas limitações importantes conforme mencionamos no início deste tutorial.

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 o estado no pino (2 ou 3) for LOW.
  • HIGH: Dispara a interrupção quando o estado no pino for HIGH (Apenas as Placas Due, UNO, Zero e MKR1000 suportam este modo)
  • 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)

Obs.: É importante que você teste todos os modos para entender bem a funcionalidade de cada um.

Código do projeto (Sketch)

1. Faça o dowload e abra o arquivo projeto78.ino no IDE do Arduino:  DOWNLOAD - projeto78.ino

1.1. No nosso programa vamos utilizar os modos RISING E CHANGE. Para isto, teste primeiro o modo RISING.

1.2. Depois, na linha 28 substitua RISING por CHANGE e faça o upload para o Arduino novamente.

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
**                
*               Projeto 78 - Interrupção excterna com sensor de toque
*               Autor: Angelo Luis Ferreira
*               Data: 13/02/2020 (dd/mm/AA)
*                  http://squids.com.br/arduino
*
*******************************************************************************/
// --- Mapeamento de Hardware ---
const byte sensorTouch = 2;    //conexão do sinal do sensor capacitivo
const byte pinOrange = 4;      //led de saída (larranja)
const byte pinGreen = 11;      //led de saída (verde)
const byte pinRed = 12;        //led de saída (vermelho)

// --- Variáveis Globais ---
boolean state = 0;

// --- Configurações Iniciais ---
void setup() {
  
  pinMode(sensorTouch, INPUT);    //configura entrada digital para o sensor
  pinMode(pinOrange, OUTPUT);    //saída para o led onboard
  pinMode(pinGreen, OUTPUT);    //saída para o led onboard
  pinMode(pinRed, OUTPUT);    //saída para o led onboard

  // -- Configura Interrupção Externa int 0 -- pino 2 Arduino
  // Chama função "extInt", quando houver o toque no sensor
  attachInterrupt(0, extInt, CHANGE);  
  
} //end setup

// --- Loop Infinito ---
void loop() {
   // liga ou desliga o led laranja  
   if(state){
       digitalWrite(pinOrange,HIGH); //inverte o estado do LEP
       delay(10);
   } else digitalWrite(pinOrange, LOW);

   // pisca leds verde e vermelho
   digitalWrite(pinGreen, !digitalRead(pinGreen));
   delay(50);
   digitalWrite(pinRed, !digitalRead(pinRed));
   delay(50);
     
} //end loop

// --- função a ser executada quando houver interrupção ---
void extInt() {
  state = !state;
}

Vídeo - Modo RISING

Vídeo - Modo CHANGE

Como o projeto deve funcionar

1. Ao iniciar o programa, os leds verde e vermelho ficarão piscando alternadamente.

MODO RISING (dispara a função na borda de subida de 0V para 5V)

2. Ao tocar o sensor o led laranja se acenderá e os demais leds continuarão piscando normalmente.

3. Ao tocar novamente o sensor o led se apagará, invertendo-se assim o seu estado.

MODO CHANGE (Dispara sempre que o sinal digital muda de estado)

2. Ao tocar o sensor o led laranja se acenderá e os demais leds se manterão piscando normalmente.

3. Ao tirarmos o dedo do sensor o led se apagará novamente sem afetar as demais rotinas do projeto.

Desafios

Com base neste projeto, resolva o seguinte desafio:  Desafio 66

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores