domingo, 1 de abril de 2018

Arduino - Resistores de pull up e pull down


 

Esses dois resistores são de extrema importância quando se trata de circuitos digitais, principalmente em projetos que utilizam microcontroladores, a exemplo do Arduino. Por conta da não utilização do pull up ou pull down vários erros podem sem cometidos, comprometendo o projeto. Esse artigo tentará esclarecer de uma vez as principais dúvidas sobre esse assunto.


Pra começarmos é preciso que o leitor tenha em mente a definição básica do que é um circuito digital (ou Circuito Lógico), e fazendo um resumo bem simples é um tipo de circuito eletrônico que emprega a utilização de sinais elétricos em apenas dois níveis de tensão, ou seja, é um circuito de atuação binária que varia apenas entre o nível baixo e o nível alto (também chamados de ''0'' e ''1'' ou "low'' e "high").



No Arduino, a tensão que determina o nível alto vai depender do modelo da placa, por exemplo, no UNO essa tensão será de 5V, já no Arduino Gemma será de 3,3V. Em contrapartida o nível baixo independe do modelo e sempre será 0V, ou seja, sempre será o terra (ground) do circuito.

Esse tipo de circuito apresenta o que chamamos de portas digitais, que tanto podem ser para entrada quanto para saída de sinais.

Os circuitos digitais apresentam uma particularidade: se uma porta for de entrada ela sempre tem que estar conectada a algum nível de referência, seja o nível alto ou o baixo, vai depender do projeto. Se isso não for feito essa porta entrará em um estado de indefinição digital, que também é chamado de estado de flutuação onde ela vai estar sujeita a leituras aleatórias devido a ruídos eletrostáticos do ambiente.



Para mostrar na prática esse estado de flutuação podemos implementar um código bem simples que fará a leitura de uma determinada porta sem referência em um Arduino. O código é o seguinte:

int entrada = A0

void setup() {
    pinMode(entrada, INPUT); 
    Serial.begin(9600);
}

void loop() {
    Serial.println(analogRead(entrada));
    delay(250);
}

Observe que a porta utilizada para esse exemplo será uma analógica (A0), mas por quê? Não deveria ser uma porta digital?

Acontece que, no Arduino, as portas de entrada analógicas também são portas digitais, mas com um funcionamento um pouco diferente. A leitura nesse tipo de porta é dividida em 1024 partes, sendo que o valor 1024 representa 5V. Esse assunto será mais bem abordado em outro artigo.

Veja na imagem a seguir que vários valores aleatórios são mostrados no monitor serial, esses valores representam o estado de flutuação que foi dito anteriormente. Se colocarmos um fio solto na porta que está sendo lida, manusearmos o Arduino ou simplesmente aproximarmos as mãos essa flutuação piora.



Então... Como será que se resolve esse problema?

A solução que temos é usar os resistores de pull up ou pull down. Vamos começar pelo ultimo!

O que é um resistor de pull down?

Como foi dito anteriormente, uma porta de leitura digital sempre tem que estar conectada a algum nível de referência e o resistor de pull down é uma maneira de fazer isso, ele irá conectar a porta em questão diretamente ao terra que é o nível lógico baixo.

Vejam na imagem a seguir que a porta digital de um circuito qualquer está conectada ao terra através de um resistor.



Quando aterramos uma porta estamos colocando-a em nível lógico baixo e é daí que vem a expressão pull down, que em inglês significa “puxar para baixo” e se fizermos a leitura dessa mesma entrada verificaremos que ela estará estável no nível baixo. Veja na imagem a seguir, utilizando o mesmo código anterior, mas aterrando a porta com um resistor de pull down conseguimos estabilizar a leitura em 0 (zero).



Em resumo, essa é a definição de resistor de pull down: é um resistor colocado de maneira que aterre uma entrada digital garantindo que ela fique livre de interferências e estabilizando-a no nível lógico baixo.

O que é um resistor de pull up?

Traduzindo do inglês, pull up significa “puxar para cima”, então, podemos deduzir que será o contrário do pull down? Exato! Os dois resistores tem a mesma função de eliminar a flutuação em uma porta de entrada digital, porém, o resistor de pull up irá deixar essa porta estável no nível lógico alto, para isso o resistor terá que conectar a entrada direto ao VCC do circuito, que no caso do Arduino pode ser 5V ou 3,3V, depende do modelo da placa. Veja na imagem a seguir.



Utilizando o mesmo código dos exemplos anteriores podemos observar que, ao colocarmos um resistor de pull up, a leitura da porta analógica A0 fica estável em 1023, isso significa que ela está estável no nível lógico alto.



Simplificando, podemos dizer que resistores de pull up são aqueles usados de forma a eliminar o ruído em uma porta de entrada digital colocando a mesma em nível lógico alto.

Uma coisa importante que precisamos saber é que o Arduino possui internamente resistores de Pull Up que podem ser ativados através da programação. Esses resistores internos funcionam exatamente como os externos que colocamos, mas dão a vantagem de ser um componente a menos no projeto.

Pra ativar esses resistores de Pull Up internos é muito simples, basta acrescentarmos uma pequena sintaxe na função pinMode. Fica assim:

int entrada = A0

void setup() {
    pinMode(entrada, INPUT_PULLUP); 
    Serial.begin(9600);
}

void loop() {
     Serial.println(analogRead(entrada));
     delay(250);
}

Observe que na função pinMode(entrada, INPUT_PULLUP) foi acrescentada a sintaxe _PULLUP, e dessa forma ativamos o resistor de pull up interno do Arduino referente àquela porta. Com isso dispensamos o resistor que colocamos e mesmo assim a porta continuará estável em nível alto e livre de ruídos.

Mas qual devo usar, pull up ou pull down?

O Arduino possui resistores de Pull Up internos, mas não possui de Pull Down. Por que isso?

Bom, o Pull Up é mais comumente usado, pois é melhor no quesito de imunidade a ruídos. Se a potência de um ruído for suficientemente elevada pode causar uma interferência na configuração Pull Down, levando a uma mudança no estado lógico da porta, coisa que não acontece no Pull Up.

A decisão de qual configuração usar vai depender do seu projeto. A seguir mostraremos dois exemplos práticos para melhorar o entendimento sobre esses dois conceitos

Exemplo prático utilizando resistor de pull down

O exemplo que iremos mostrar agora é bem simples: utilizaremos um botão para mudar o estado lógico de uma porta que estará sendo aterrada por um resistor de pull down. O circuito relativo ao exemplo está logo a seguir.



Veja nesse circuito que, ao pressionarmos o botão, a porta D7 estará sendo conectada aos 5V do Arduino passando a ficar em nível alto, sendo que antes estava em nível baixo devido ao resistor de pull down. O led é somente para efeito de visualização. O código para fazer esse exemplo dar certo é o seguinte:

int entrada = 7;
int led = 8;

void setup() {
    pinMode(entrada, INPUT);
    pinMode(led, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    if(digitalRead(entrada)== HIGH){
    Serial.println("1");
    digitalWrite(led, HIGH); 
  }else{
    Serial.println("0");
    digitalWrite(led, LOW); 
    }
}

Basicamente esse código irá ler a entrada digital D7 e verificar se houve mudança em seu estado lógico, se ela saiu do nível baixo para o alto. Caso esta mudança tenha ocorrido o led irá acender e o Arduino escreverá o número ‘1’ no monitor serial, caso contrário o led não acenderá e veremos ‘0’ no monitor serial.  

Exemplo prático utilizando resistor de pull up

Para o exemplo do resistor de pull up iremos usar o mesmo código anterior, mas com outro circuito, é claro.



Analisando esse circuito podemos ver que, no momento em que o botão for pressionado a corrente que vem do resistor de pull up (conectado em 5V) estará sendo drenada direto para o terra, fazendo com que a porta D7 saia do nível lógico alto para o baixo.

Esse exemplo prático inverte a lógica do exemplo anterior (usando o mesmo código), pois a porta estará normalmente em nível alto, fazendo com que o Led já esteja aceso e que seja impresso ‘1’ no monitor serial. Ao mudar o estado da porta usando o botão o led irá se apagar, e o Arduino imprimirá ‘0’ no monitor serial.

Considerações finais

O uso de resistores de pull up e pull down é de extrema importância em circuitos digitais, e a diferença entre os dois está basicamente na lógica invertida de um em relação ao outro e na melhor blindagem contra ruídos eletrostáticos na configuração de pull up.

Assista ao nosso vídeo sobre esse mesmo assunto.


2 comentários: