sexta-feira, 24 de fevereiro de 2012

Trabalhando com Botões

Arduino by my Self

Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Esta experiência, têm como objetivo, mostrar o uso e como fazer a leitura de dados provenientes de botões.Ou seja:
Os modos de ligação de um botão no Arduino; como identificar se um botão foi pressionado; como usar essa informação para interagir em seu programa.
Vamos também aprender como monitorar a informação através da comunicação USB entre o Arduino e o computador, ou seja, fazer a leitura do botão e mostrar no PC os dados obtidos.

O Hardware Requerido:

Uma placa Arduino UNO, ou equivalente;
Um botão de contato momentâneo, o chamado "botão datilar";
Um Resistor de 10K ohm;
Uma Matriz de Contatos "Breadboard";
Fios.

O circuito:
Circuito 1: Caso o botão esteja pressionado, o pino de controle do Arduino terá nível baixo;
                 Caso o botão não esteja pressionado, o pino de controle do Arduino terá nível alto.


Ligar uma ponta do Botão ao negativo da alimentação, a outra ponta a um resistor de 10K ohm; o outro terminal do resistor, ligar ao positivo da alimentação.  O pino 2 de controle no Arduino deve ser ligado no terminal de junção do botão com o resistor.


Circuito 2: Caso o botão esteja pressionado, o pino de controle do Arduino terá nível alto;
                 Caso o botão não esteja pressionado, o pino de controle do Arduino terá nível baixo.




Ligar uma ponta do Botão ao positivo da alimentação, a outra ponta a um resistor de 10K ohm; o outro terminal do resistor, ligar ao negativo da alimentação.  O pino 2 de controle no Arduino deve ser ligado no terminal de junção do botão com o resistor.


O Código:

Primeiramente, deve-se inicializar a comunicação serial a 9600 bps, entre o arduino e computador;

Serial.begin(9600);

Em seguida inicialize o pino 2 do Arduino, que fará a leitura da informação do botão, como sendo um pino de entrada de informação.

pinMode(2, INPUT);

Este é um pino digital e irá variar de 0V (LOW) a 5V (HIGH) somente, sem nenhum estado intermediário.
A leitura no programa será então "0" ou "1", "Desligado" ou "Ligado", "não Pressionado" ou "Pressionado", etc...

Definir uma variável para conter o valor lido no botão.  Efetuando a leitura digital deste botão que foi definido no pino 2.

int sensorValue = digitalRead(2);

Uma vez lido e armazenado o valor, é possível enviar esse dado para a porta serial e imprimir no PC (em decimal).

Serial.println(sensorValue, DEC);

Agora sim vejamos o código completo:



Conclusão:
Nenhuma dificuldade com esta experiência de nível básico
Como observação vale lembrar que existe o problema de instabilidade no pressionamento de botões, ou seja, quando pressionado e tem um período de variação de transições entre "0" e "1" (o chamado "Bouncing", que ocorre durante um pequeno intervalo de tempo antes de estabilizar) um ruído que pode fazer o Arduino entender errado um pressionamento do botão ou entender que o botão foi pressionado mais de uma vez quando não o foi.



O "Debouncing" pode ser feito por hardware, colocando-se um capacitor em paralelo com o botão, ou pode ser feito por software, esperando 20 ms depois de pressionado o botão para certificar que o botão foi realmente pressionado e passar o período de transições "Bouncing".



...

if(botao = 1)
 {
   delay(20);
     if(botão = 1)
       {
          // Rotina para botão acionado.
        }
    else if(botão = 1)
        {
          // não esperou tempo suficiente
         }
  }

...


Isto tudo será estudado mais detalhadamente em um outro post.




Vídeo:

Agora, vejamos o vídeo desta experiência.



Visite, para maiores informações:

http://arduino.cc/en/Tutorial/DigitalReadSerial




Até o próximo Post.

3 comentários:

  1. ola
    como faço para que o botão ligue e desligue uma carga e durante um intervalo de tempo?
    exemplo no programa eu pretendo fazer assim:
    quando o botão for pressionado ele liga o led por 30 segundos mas durante esses 30 segundos se eu pressionar o botão ele desliga o led.

    ResponderExcluir
  2. Olá, Abaixo um programa de Liga/Desliga de um LED com um único botão de acionamento.

    Facilmente modificável para o seu propósito.
    Você tem que fazer uma rotina para ficar contando os 30 segundos com a função millis() e ficar checando a cada vez que o programa inicia o loop principal, se passou 30000 ms e o estado não alterou, então altera devido ao estouro do tempo.

    Tente fazer, e me diga o resultado

    O Programa abaixo é o esqueleto, nele você pode montar sua rotina.


    Divulgue o blog, divulgue o conhecimento, Hardware e Software Livre é nosso objetivo!



    /*
    #####################################################################################
    # Arquivo: Botao_liga_Desliga_Debounce_OK.pde
    # Micro-processador: Arduino UNO ou Teensy++ 2.0
    # Linguagem: Wiring / C /Processing /Fritzing / Arduino IDE
    #
    # Objetivo: Botão Liga/Desliga
    #
    # Funcionamento: Um LED conectado ao pino 8 pode ser ligado e desligado
    # com um toque em um único botão
    # Com Debounce para evitar que ruídos acionem o sistema
    # repique durante o acionamento normal
    #
    #
    #
    # Autor: Marcelo Moraes
    # Data: 25/09/12
    # Local: Sorocaba - SP
    #
    #####################################################################################

    Este projeto contém código de domínio público.
    A modificação é premitida sem aviso prévio.
    */





    int pinBotao = 7; // pino do botão
    int pinLED = 8; // pino do LED

    int estado = HIGH; // estado corrente do pino de saída
    int leitura; // a leitura corrente no pino do botão
    int anterior = LOW; // estado anterior do pino do botão

    // variáveis tipo long pois vai guardar milisegundos
    long tempo = 0; // o último momento que a saída foi mudada
    long debounce = 200; // tempo de Debounce


    // executado na inicilaização do Arduino
    void setup()
    {
    pinMode(pinBotao, INPUT); // pino do botão como entrada
    pinMode(pinLED, OUTPUT); // pino do LED como saída
    }

    // loop principal do programa
    void loop()
    {
    leitura = digitalRead(pinBotao);

    // se a entrada foi para LOW e HIGH e foi esperado tempo suficiente apertado
    // para ignorar ruídos no circuito, muda o pino de saída e guarda o tempo
    if (leitura == HIGH && anterior == LOW && millis() - tempo > debounce) {
    if (estado == HIGH)
    estado = LOW; // se estado alto, então muda para baixo
    else
    estado = HIGH; // se estado baixo, então muda para alto

    tempo = millis(); // tempo atual
    }
    digitalWrite(pinLED, estado); // escreve estado no LED

    anterior = leitura; // faz estado anterior igual ao estado corrente
    }
    // FIM DA COMPILAÇÃO

    ResponderExcluir
    Respostas
    1. Nessas linhas:
      ...
      int estado = HIGH; // estado corrente do pino de saída
      int leitura; // a leitura corrente no pino do botão
      int anterior = LOW; // estado anterior do pino do botão
      ...
      Poderia declarar as 3 variaveis como bool né?

      Excluir