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.
Excelente explicação!
ResponderExcluirMuito bem explicado prof: parabéns pelo vídeo
ResponderExcluir