Em praticamente todo projeto, é necessário que alguma leitura digital seja feita. E é extremamente ruim ler valores errados, e isso pode ocorrer por causa do pino não estar conectado a nada em determinado momento. Portanto, é necessário usar um resistor pull-up ou pull-down para resolver o problema.

O que é

O resistor pull-up ou pull-down é basicamente um resistor que fica ligado junto ao sinal que você deseja ler. Ele serve para garantir que este sinal (a tensão dele), fique em um valor conhecido enquanto o pino não recebe nenhuma tensão.

Um conceito importante é o de “pino flutuando”, que é o estado que o pino fica sem receber nada. Isso ocorre, pois o pino não está ligado a nada e não há como saber qual sinal ele está recebendo, se é sinal de nível alto (2~5v) ou sinal de nível baixo (0~1v).

Veja o circuito abaixo para entender.

esquema sem pull-up

Observe que, enquanto a chave está aberta, não tem como sabe qual valor está sendo lido no pino D2.

Pull-up

O resistor pull-up garante que o sinal lido seja de nível alto (5v) enquanto o botão ou a chave não forem pressionados. Ele faz isso da seguinte forma:

resistor de pull-up

Enquanto a chave está aberta, a tensão em cima do pino é a tensão de 5V menos a tensão em cima do resistor. E a tensão em cima do resistor é próxima de zero, pois a corrente que circula nele é bem pequena. Então, o pino recebe praticamente 5V e reconhece sinal de nível alto.

Porém, quando a chave se fecha, o terra (GND) fica ligado diretamente no pino, e isso faz com que D2 leia sinal de nível baixo. Nesse caso, haverá uma corrente fluindo do 5V para o terra por meio do resistor.

Pull-down

O funcionamento é igual ao resistor pull-up, porém o que muda é a forma como a chave e o resistor são alimentados. Assim, o resistor pull-down garante que o sinal lido seja de nível baixo (GND) enquanto o botão ou a chave não forem pressionados.

resistor de pull-down

A ideia é a mesma: enquanto a chave está aberta, a tensão em cima do pino será 0 (GND). E, dessa forma, o pino reconhece  sinal de nível baixo. Mas quando a chave se fecha, o 5v fica ligado diretamente no pino, e isso faz com que D2 leia sinal de nível alto.

Com a chave fechada, assim como antes, existe uma corrente fluindo do 5v para o terra por meio do resistor.

Valores das resistências

Por questões práticas, os valores comuns (tanto para pull-up, quanto para pull-down) que podem ser usados estão na faixa de 1k~10kΩ. Mas, para calcular, basta usar a lei de Ohm:

R = \frac{V}{I}

V é a tensão que você está alimentando o resistor ou a chave (5v) e I a corrente limite que circula quando a chave é fechada. Por exemplo: estipulando uma corrente limite de 1mA, e como estamos usando 5v, a nossa resistência seria:

R = \frac{5}{0,001} = 5000 \Omega

Arduino

O Arduino possui uma forma de ativar as resistências pull-up que existem dentro dele. Ele não possui pull-down. Enfim, para ativá-las, basta usar o comando INPUT_PULLUP na hora de configurar o pino como entrada. E isso é feito da seguinte forma:

pinMode(pino,  INPUT_PULLUP);

Veja o tutorial explicando como ler um botão.

Aplicações

As resistências pull-up e pull-down podem ser usadas em quaisquer circunstancia em que seja necessário garantir uma leitura sem erros.

Um outro exemplo, além da leitura de botões ou chaves em pinos digitais, é a comunicação I2C. Nesse tipo de comunicação, os dispositivos comunicam entre si com sinais digitais (0 ou 1).

Dessa forma, quando não houver nenhum sinal sendo mandado, algum dispositivo pode interpretar um sinal de maneira errada. Então, é preciso usar resistores pull-up no clock e na linha de dados desse tipo de comunicação.

A imagem abaixo mostra como a ligação é feita e os resistores Rp são os resistores pull-up.

Diagrama da comunicação I2c
Fonte: Wikipedia