Framework Arduino Básico Aula 05: Entradas Digitais

Imagem meramente ilustrativa


O que vimos até agora?

    Até agora vimos saídas digitais, saídas pwm e entradas analógicas. Falta falar sobre as entradas digitais. Na maioria dos cursos é um assunto abordado logo na segunda aula, mas eu preferi deixar para depois para poder explorar bem essa questão. Mas o que é um entrada digital?

   O exemplo mais simples para ilustrar uma entrada digital é o uso de um botão. O que faz um botão? Ele serve para ligar e desligar alguma coisa, correto? Porém, pensando em Arduino, um botão muda o estado de um pino de LOW para HIGH e vice-versa.

    Na aula hoje vamos explorar esse componente e ver como a framework Arduino faz leituras de entradas digitais.

Conhecendo o push-button

    Como o próprio nome diz, push-button é um botão de empurrar ou apertar. Isto quer dizer que ao pressionar o botão você fecha um circuito e deixa a corrente passar. Ao soltar ele volta para sua posição original, abre o circuito e interrompe a corrente. Para isso ele conta com quatro terminais: 

Diagrama de funcionamento de um push-button
Diagrama de funcionamento de um push-button


    Repare que a ligação AB e CD é direta, portando, para fechar um circuito é necessário uma ligação cruzada AD ou CB. Isso significa, por exemplo, que se o terminal A for conectado ao negativo o D será conectado ao positivo. 

    Em simuladores como Wokwi ou TinkerCad, os terminais são identificados como 1L, 1R, 2L e 2R ou 1a, 1b, 2a e 2c. Nesse caso se o negativo estiver no 1 o positivo deverá estar no 2, não importa a letra.

Diagrama do push-button do Wokwi
Diagrama do push-button do Wokwi


    Na prática, ao pegar um push-button o estudante pode ter dúvidas na hora de identificar esses lados, mas é só observar suas distâncias: a distância entre A e C é menor que distância entre A e B. Na dúvida pode se usar um multímetro.

    Mesmo que pareça um componente simples, a escolha de um push-button merece cuidados porque ele tem uma tensão e corrente máxima de trabalho que precisam ser respeitadas. Além disso sua conexão direta ao um pino sem o uso de um resistor, pode gerar instabilidades por interferências eletromagnéticas quando o circuito estiver aberto.

    Por essa razão utilizamos o push-button juntamente com um resistor externo, geralmente de 10 KΩ, que dependendo de seu posicionamento e conexão é chamado de:

  • Resistor Pull-down: quando conectado entre um terminal do botão e o GND (terra)
  • Resistor Pull-up: quando conectado entre um terminal do botão e o 5V

    Além disso temos o chamado Pull-up interno, quando não há um resistor externo e se faz uso dos recursos internos do Arduino para fazer um Pull-up através de código. Nesse caso somente um terminal será ligado ao GND, sem conexão direta ao 5V. Mas afinal: O que é Pull-up e Pull-down?

Pull-up e Pull-down

    Quando ajustamos um pino para trabalhar em Pull-up ele estará normalmente com o circuito fechado indicando o estado HIGH, por tanto estará ligado. Isto significa que ao pressionar o push-button conectado a ele o circuito se abre, passando para LOW. Portanto, enquanto estiver pressionando, ele estará desligado.

    Já quando ajustado para Pull-down é o contrário. Ele estará normalmente com o circuito aberto, indicando o estado LOW, por tanto estará desligado. Ao pressionar o push-button ele fecha o circuito, passando para HIGH, portanto enquanto estiver pressionando ele estará ligado. Na maioria das vezes vamos trabalhar com Pull-down.

E os outros terminais?

    Enquanto dois terminais estiverem ligados ao GND e ao 5V, um dos outros dois terminais do push-button estará ligado ao pino da placa que ele vai controlar. A escolha desse terminal depende do posicionamento do resistor externo, pois ele deve estar no mesmo par de ligação direta do resistor. 

    Vamos exemplificar: Se vou trabalhar em Pull-down, com o resistor ligado ao terminal 1L do push-button do Wokwi, o terminal que conectará o pino será o 1R que é o seu par. No mundo físico, se o resistor está conectado ao terminal A, o terminal B fará a conexão com o pino da placa.

    No caso do Pull-up interno utilizamos apenas dois terminais: um ligado ao GND e o seu oposto ao pino da placa.

Montagem

    Para fazer nossa nova montagem eu vou utilizar o nosso primeiro projeto com led para economizar tempo e ser mais prático. Por isso peço que você clique no link abaixo:

    https://wokwi.com/projects/411763019232562177

  Agora vou pedir que você clique no botão de seta azul para baixo "v" ao lado do botão Save, peça Save a Copy e salve com outro nome esse projeto, por exemplo, Framework Arduino Básico Aula 05: Resistor Pull-Up.

Botão para salvar o projeto com outro nome no Wokwi
Botão para salvar o projeto com outro nome no Wokwi

    Precisamos de um push-button e de um resistor. Por isso preciso que você clique no botão + para adicionar esses componentes no Wokwi. Você já sabe como faz, não é?

Botão para adicionar componentes no Wokwi
Botão para adicionar componentes no Wokwi

    Feito isso preciso que você ajuste esse novo resistores para de 10 KΩ. Aproveite e ajuste o resistor do led para 330 Ω. Basta clicar no resistor para ajustá-lo. Está lembrado?

Ajustando o resistor no Wokwi
Ajustando o resistor no Wokwi

    Agora um recurso novo: clique no push-button e use o botão girar para deixá-lo com uma orientação mais conveniente para o nosso projeto. Faça o mesmo para deixar o resistor de 10 k em pé.

Botão para girar um componente
Botão para girar um componente

    

    Oriente-se pela figura abaixo, para posicionar o resistor e o push-button, fazendo as conexões até os pinos necessários. Veja que o resistor 10 k vai para o 5V e o seu par na parte de cima do push-button vai para o pino 11:

Layout da montagem para resistor pull-up
Layout da montagem para resistor pull-up

Fazendo o Sketch

    Não teremos muitas novidades por aqui. Eu vou precisar de uma variável inteiro para ser o pino do push-button e vou precisar de uma variável para armazenar os estados do pino. A única novidade é a função digitalRead() que faz a leitura do estado de um pino digital. Como parâmetro ela precisa do pino.

       Vamos ao código que você poderá copiar e colar no seu Sketch ou pegar direto indo ao nosso link:

  1. int led=2;
  2. int botao=11;
  3. int estado=0;
  4. void setup() {
  5.   pinMode(led, OUTPUT);
  6.   pinMode(botao, INPUT);
  7.   Serial.begin(9600);
  8. }

  9. void loop() {
  10.   Serial.print("estado: ");
  11.   Serial.println(estado);
  12.   delay(100);
  13.   estado=digitalRead(botao);
  14.   if (estado==HIGH){
  15.     digitalWrite(led, HIGH);
  16.   }
  17.   else{
  18.     digitalWrite(led, LOW);
  19.   }
  20. }

    Para executar esse código basta clicar no botão start simulation. Para pará-lo clique no botão Stop, Durante a simulação clique no botão e veja as mudanças no monitor serial.

Botão Start e Stop Simulation, respectivamente
Botão Start e Stop Simulation, respectivamente

Explicando o Sketch      

    Após criar as variáveis nas linhas 1 a 3 eu configurei na função setup() o pino do led para saída e o pino do botão para entrada. Além disso iniciei o monitor serial apenas para você acompanhar as mudanças na variável estado quando clicarmos no push-button durante a simulação.

    No loop() ele está escrevendo no monitor serial a situação da variável estado, dá uma pausa com delay que eu vou explicar depois e atribui a variável estado o valor que eu leu para o pino do botão. Como a configuração está como resistor pull-up, esse pino está sempre em HIGH, por isso ele passa a imprimir no monitor o valor 1.

    Depois ele testa com o if se o valor da variável estado é HIGH. Se for, ele acende o led. Como estado está o tempo todo HIGH, o led está o tempo todo acesso. Só apaga quando eu clico no botão e ele passa a executar o que está no else.

Porque o Delay()

    Existe um efeito nos botões físicos conhecido como bounce ou bouncing que é quando o botão assume que foi clicado várias vezes, sem o operador fazer isso. O Wokwi simula esse efeito. O delay() causa uma pausa de processamento que diminui esse problema, além de facilitar a captura do clique no simulador.

Trabalhando com Pull-down

    Como eu disse anteriormente, na maior parte das vezes vamos trabalhar com o push-button em pull-down, isto é, vou utilizá-lo para ligar algo. Podemos aproveitar o nosso projeto atual para mostrar como faz isso. É bem rápido.

    Para não estragar o projeto atual, salve um cópia com outro nome. Já mostramos como se faz isso e salve com o nome Framework Arduino Básico Aula 05: Resistor em Pull-down.

Modificando o layout

    A única coisa que precisaremos é modificar as conexões do resistor e botão. Para isso vamos apagar as conexões atuais que vão da placa até o resistor e o botão, dando um clique nelas e depois uma tecla DELETE.

    Feito isso crie uma conexão do resistor até o GND e depois do terminal inferior do pus-button para o 5V. Não esqueça de salvar novamente o seu projeto com o botão Save. Seu projeto ficará como a figura abaixo. Agora basta iniciar a simulação. 

Layout da montagem em pull-down
Layout da montagem em pull-down

Link para o projeto: https://wokwi.com/projects/411938098293675009

O que mudou?

    Agora o pino estará sempre em LOW, por isso o led começa apagado e a variável estado permanece em zero. Quando eu clico no botão, ele passa para o estado HIGH, acende o led e a variável estado torna-se um. Lembrando que é um push-button. Quando eu solto volta ao normal.

Por ultimo o pull-up interno

    Como dito anteriormente, temos também um modo de trabalho sem resistor externo. Nesse caso usa-se o resistor do próprio Arduino, sendo necessário uma mudança no código atual, além da alteração do layout.

    Para não prejudicar seu projeto atual, salve uma copia com outro nome, por exemplo, Framework Arduino Básico Aula 05: Pull-up interno.

Mudança no Sketch

    Vamos começar pela mudança no código que exigirá que o pino seja configurado de forma diferente pela função pinMode() e ao invés de usar a palavra reservada INPUT usaremos a instrução INPUT_PULLUP. Essa será a única alteração do código.

  1. int led=2;
  2. int botao=11;
  3. int estado=0;
  4. void setup() {
  5.   pinMode(led, OUTPUT);
  6.   pinMode(botao, INPUT_PULLUP);
  7.   Serial.begin(9600);
  8. }

  9. void loop() {
  10.   Serial.print("estado: ");
  11.   Serial.println(estado);
  12.   delay(100);
  13.   estado=digitalRead(botao);
  14.   if (estado==HIGH){
  15.     digitalWrite(led, HIGH);
  16.   }
  17.   else{
  18.     digitalWrite(led, LOW);
  19.   }
  20. }

Mudança no layout

    Agora preciso que você apague o resistor de 10k e a conexão do botão até o 5V. Substitua essa conexão ligando o botão até o GND e está pronto para os testes. Não esqueça de salvar novamente o projeto. Lembrando que ele é um pull-up, logo vai estar com o led o tempo todo acesso, apagando com o clique no botão.

Layout para pull-up interno
Layout para pull-up interno

    link do projeto: https://wokwi.com/projects/411939030691722241

    Na próxima aula melhoraremos nossas montagens com uso de protoboards, algo muito interessante para projetos básicos.


Próxima Aula                                                                                                                        Aula Anterior

Referências

ARDUINO DOCS. Arduino Documentation. Disponível em: <https://docs.arduino.cc/> Acesso em 05 ago. 2024.

OLIVEIRA, Cláudio Luis Vieira et al. Aprenda Arduino: Uma abordagem prática. Duque de Caixas: Katzen Editora, 2018. 181p. Disponível em: <https://www.fatecjd.edu.br/fatecino/material/ebook-aprenda-arduino.pdf> Acesso em 05 ago. 2024.

OLIVEIRA, Cláudio Luis Vieira. Arduino Descomplicado - Como Elaborar Projetos de Eletrônica. São Paulo: Editora Érica, 2015. 287p. 

TINKERCAD. Centro de Aprendizagem. Disponível em: <https://www.tinkercad.com/learn> Acesso em 05 ago. 2024.

WOKWI. Referência do wokwi-arduino-uno. Disponível em: <https://docs.arduino.cc/> Acesso em 05 ago. 2024.