Qual é a diferença entre INPUT e INPUT_PULLUP?

24

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 possui resistores pull-up internos (resistores que se conectam à energia internamente) que você pode acessar. Se você preferir usá-los em vez de resistores pull-down externos, poderá usar o argumento INPUT_PULLUP em pinMode (). Isso inverte efetivamente o comportamento, onde ALTO significa que o sensor está desligado e BAIXO significa que o sensor está ligado.

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

O que INPUT_PULLUPfaz? O que o torna diferente INPUTe como alguém decide qual usar?

Manishearth
fonte
INPUT_PULLUP foi adicionado com o IDE 1.0.1. É irrelevante qual placa Arduino você usa, todas elas suportam PULLUPs.
precisa saber é o seguinte

Respostas:

23

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

Internos ao Arduino estão os resistores pullup com um valor em torno de 50k-ohm. Esses resistores podem ser conectados opcionalmente internamente usando INPUT_PULLUP. Isso é funcional (e eletricamente) equivalente à conexão de um resistor de 50k ohm entre o pino e + 5V, a única diferença é que ele não requer componentes externos e você pode ativá-lo e desativá-lo no software durante a execução do 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 amarrá-los ao terra, não precisa executar + 5V neles. Como a maioria das pranchas será projetada com grandes derramamentos de terra por razões de blindagem, amarrar na terra é praticamente uma razão.

Alguns ICs mais destacados, como os chips ARM, têm pull-ups e pull-downs, mas a linha AVR de 8 bits vem apenas com pull-ups. Você só precisa se lembrar de que HIGHestá "aberto" e LOW"fechado".


fonte
Voto a favor. Para sua informação, de acordo com a documentação, os pull-ups internos são de 20K, não que isso faça muita diferença de 50K. arduino.cc/en/Tutorial/DigitalPins
SDsolar 26/02
9

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

O código:

pinMode(13, INPUT);
digitalWrite(13, HIGH); // Turns internal pull-up on
digitalWrite(13, LOW);  // Turns internal pull-up off

Esta é uma distinção importante porque INPUT_PULLUPobviamente liga o resistor de pull-up. No entanto, menos óbvio, é que, a partir do 1.0.1, simplesmente chamar INPUTforça o pull-up a ser desativado. (Anteriormente, o estado da flexão continuava o mesmo).

Para ver como um alfinete opera com e sem pull-ups, assista aos seguintes vídeos.

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

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

Vídeo tutorial completo sobre pull-ups (observe que eu fiz isso antes da inclusão do INPUT_PULLUP na biblioteca do Arduino): http://www.youtube.com/watch?&v=jJnD6LdGmUo

baldengineer
fonte
Muito esperto. Obrigado por escrever isto. Voto a favor.
SDsolar 26/02