Qual ' é a diferença entre INPUT e INPUT_PULLUP?

Em Arduinos mais recentes, pode-se definir pinMode para um dos três estados: OUTPUT, INPUT e INPUT_PULLUP.

Esta página diz:

O chip Atmega no Arduino tem resistores pull-up internos (resistores que se conectam à alimentação internamente) que você pode acessar. Se você preferir usar estes ao invés de resistores pull-down externos, você pode usar o argumento INPUT_PULLUP em pinMode (). Isso efetivamente inverte o comportamento, onde HIGH significa que o sensor está desligado e LOW significa que o sensor está ligado.

Tenho certeza de que inverter o comportamento não é a única coisa que faz, no entanto.

O que INPUT_PULLUP faz? O que o torna diferente de INPUT e como alguém decide qual usar?

Comentários

  • INPUT_PULLUP foi adicionado com IDE 1.0.1. É irrelevante qual placa Arduino você usa, todas elas suportam PULLUPs.

Resposta

O padrão é INPUT que configura o pino como um INPUT. Se o pino estiver totalmente desconectado, ele lerá aleatoriamente HIGH e LOW. Se você ligá-lo a + 5 V ou 0 V, obviamente será HIGH ou LOW.

Interno ao Arduino, o chip Atmega possui resistores pullup internos com um valor em torno de 20k ohm. (Consulte a documentação da DigitalPins para obter mais detalhes). Esses resistores podem ser opcionalmente conectados internamente usando INPUT_PULLUP. Isso é funcionalmente (e eletricamente) equivalente a conectar um resistor de ~ 20k ohm entre o pino e + 5V, a única diferença é que não requer componentes externos e você pode ligá-lo e desligá-lo no software durante a execução de seu programa.

Então, por que pull-ups e não pull-downs? Provavelmente existem várias razões para isso, mas ao conectar botões ou interruptores ou qualquer coisa “normalmente aberta”, você só precisa prendê-los ao aterramento, não é necessário passar + 5V para eles. Já que a maioria das placas será projetado com grandes vazamentos de aterramento por razões de blindagem de qualquer maneira, amarrar ao aterramento é praticamente um motivo.

Alguns CIs mais caracterizados, como chips ARM, têm pull ups e pull downs, mas a linha AVR de 8 bits só vem com pull -ups. Você só precisa se lembrar que HIGH é “aberto” e LOW é “fechado”.

Comentários

  • Votos positivos. Para sua informação, de acordo com a documentação, os pull-ups internos são de 20K, não que faça muita diferença de 50K. arduino.cc/en/Tutorial/DigitalPins

Resposta

Observe que anterior para 1.0.1, você poderia ativar pullups usando digitalWrite(). E você ainda pode.

O código:

Esta é uma distinção importante porque INPUT_PULLUP obviamente liga o resistor pull-up. No entanto, menos óbvio é que a partir de 1.0.1, simplesmente chamar INPUT força o pull-up a ser desativado. (Anteriormente, o estado do pull-up permanecia o mesmo).

Para ver como um pino funciona com e sem pull-ups, assista aos vídeos a seguir.

Pino flutuante em um osciloscópio: http://www.youtube.com/watch?v=dBIBFLYCjMM

Com pull-up ativado: http://www.youtube.com/watch?v=SAIw7LLVl-U

Vídeo tutorial completo sobre pull-Ups (observe que fiz isso antes de INPUT_PULLUP ser adicionado à biblioteca do Arduino): http://www.youtube.com/watch?&v=jJnD6LdGmUo

Comentários

  • Muito inteligente. Obrigado por escrever isto. Votos positivos.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *