Tutoriais

Entendendo os Resistores de Pull-Up e Pull-Down

Eletrogate 24 de agosto de 2021

Introdução

Muitas vezes, na realização de projetos, os makers se deparam com a necessidade do microcontrolador compreender o mundo externo. Esta necessidade é suprida tanto pelo uso de sensores, quanto pelo uso de botões mecânicos. 

Entretanto, a falta de atenção na montagem de circuitos elétricos pode abrir brechas para que interferências indesejadas sejam interpretadas, por exemplo, pelo Arduino, ocasionando em erros durante a execução de um programa. Nesse sentido, será explorado o fenômeno da flutuação no uso de botões, conceituando-a e identificando meios para evitá-la.


O Problema

Pela perspectiva do ser humano, um botão pode assumir duas posições: não apertado e apertado. De forma análoga, para o microcontrolador, as duas possíveis posições se traduzem em nível lógico: Low/High → 0/1 → Gnd/Vcc. Por consequência, seja pelo lado humano, seja pelo lado eletrônico, o click de botão é visto como uma mudança de posição/estado. 

Seguindo o raciocínio apresentado, visando detectar o estado do botão e apresentar o fenômeno da flutuação, partiremos para a atividade prática. 

Materiais necessários para o projeto de exemplo

Esquema de ligação

Figura 1

Código

#define Pino_botao 3 //Define que o botão encontra-se no pino 3 do Arduino 

void setup() {
  pinMode(Pino_botao, INPUT); //Declara o pino como entrada 
  Serial.begin(9600); //Inicializa a Serial Monitor com baudrate de 9600
}

void loop() { 
  //Lê a porta digital e printa a leitura (0/1) na Serial Monitor 
  //ou no Plotter Serial
  Serial.println(digitalRead(Pino_botao)); 
}

Funcionamento

Com o suporte das ilustrações acima podemos analisar a montagem. Na teoria, quando o botão fosse apertado, haveria Vcc na porta digital, culminando no nível lógico 1. Porém, quando o botão fosse solto, nenhuma tensão, oriunda da fonte principal de energia, estaria presente na porta digital. Neste ponto encontra-se o problema: a ausência de tensão confiável deixa o pino à mercê de interferências. 

No vídeo, podemos perceber tais perturbações. Quando o botão encontra-se solto — ausência de tensão —, as interferências eletromagnéticas deixam o pino em nível lógico alto/High. Também podemos identificar que simples toques no fio levam o microcontrolador detectar ora nível lógico 1, ora nível lógico 0. 

Esse cenário configura a flutuação.

A documentação do Arduino já alertava para o problema explorado: Se o pino não está conectado a nada, DigitalRead() pode retornar tanto HIGH como LOW (e isso pode mudar aleatoriamente).

A grande questão é que não conseguimos detectar um mero estado de botão com confiabilidade. Logo, como seremos capazes de detectar um click, já que este depende diretamente do estado do botão ?


Como Resolver o Problema

Para contornar o problema, utilizaremos resistores nas configurações Pull-up/Pull-down.

Pull-up

O esquema de ligação padrão para esta configuração é ilustrado pela Figura 2. Quando o botão estiver solto, o Vcc fluirá pelo resistor R1 chegando na porta digital (Figura 3.1). Quando o botão for pressionado, o Gnd fluirá pelo contato da chave — sem maiores resistências — alcançando o pino do microcontrolador (Figura 3.2).

Na prática, quando o botão estiver solto, o microcontrolador reconhecerá nível lógico 1, por isso a nomenclatura pull-up (puxar para cima): normalmente para cima/nível lógico High. Todavia, enquanto a chave for pressionada, o microcontrolador reconhecerá nível lógico 0.

Figura 2

Figura 3.1

Figura 3.2

 

 

 

 

 

 

Pull-down

A Figura 4 ilustra o esquema de ligação padrão para esta configuração. Quando o botão estiver solto, o Gnd fluirá pelo resistor R1 chegando na porta digital (Figura 5.1). Quando o botão for pressionado, o Vcc fluirá pelo contato da chave — sem maiores resistências — alcançando o pino do microcontrolador (Figura 5.2). 

Na prática, quando o botão estiver solto, o microcontrolador reconhecerá nível lógico 0 (Gnd), por essa razão a nomenclatura pull-down (puxar para baixo): normalmente para baixo/nível lógico 0. Contudo, enquanto a chave for pressionada, o microcontrolador identificará nível lógico 1 .

Figura 4

Figura 5.1

Figura 5.2

Podemos perceber que fazendo uso dos resistores de pull-up/pull-down o problema da flutuação é resolvido. Ao aplicar tais configurações no circuito, em nenhum momento a porta digital deixa de receber tensões confiáveis, estando o botão apertado ou não.


Economizando com hardware

Um bom maker deve conhecer as funcionalidades e peculiaridades do hardware que trabalha. Nesse sentido, uma característica bem interessante acerca do ATmega328p, microcontrolador presente no Arduino, são os resistores internos de pull-up associados a todos os pinos de I/O dos ports B, C e D (acesse aqui para mais detalhes acerca dos ports).

Figura 6 – Resistor interno de pull-up destacado.  Fonte: ATmega328p Datasheet

** O resistor interno de pull-up funciona nos mesmos moldes da configuração explicada anteriormente e dispensa o uso de um resistor externo. 

Para os curiosos e desbravadores do baixo nível, fica o convite para acessarem o datasheet do ATmega328p e conhecerem o modo de acionamento do resistor interno de pull-up. Por enquanto, é importante saber que a ativação ou não do resistor dá-se por uma série de portas lógicas, cujos comportamentos são configurados nos registradores do microcontrolador. A Arduino IDE abstrai bastante todas as manipulações para ativação do resistor em questão, bastando inserir a flag INPUT_PULLUP na função pinMode(). 

pinMode(pino, INPUT_PULLUP);

Portanto, é importante dominar os recursos que o microcontrolador oferece, visto que o altos custos de se produzir hardware no Brasil pode inviabilizar alguns projetos. Nesse ponto, entra o conhecimento, como o resistor interno de pull-up apresentado, visando reduzir os custos.


Conclusão

Neste post aprendemos como é importante ter atenção na montagem dos seus circuitos eletrônicos, onde uma flutuação na tensão pode levar a sérios problemas na captação do sinal.

Gostou do post? Deixe um comentário abaixo para que possamos trazer mais conteúdos como este. Caso queira ficar por dentro de nossas novidades, siga nosso instagram @eletrogate.

Até a próxima!

Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.


Sobre o Autor


João Senirio
 

Amante da tecnologia e apaixonado por desenvolvimento de software e hardware.


Eletrogate

24 de agosto de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!