¿Cuál es la diferencia entre INPUT e INPUT_PULLUP?

24

En los nuevos Arduino, se puede establecer pinMode a uno de tres estados: OUTPUT, INPUT, y INPUT_PULLUP.

Esta página dice:

El chip Atmega del Arduino tiene resistencias pull-up internas (resistencias que se conectan a la alimentación interna) a las que puede acceder. Si prefiere usar estos en lugar de resistencias desplegables externas, puede usar el argumento INPUT_PULLUP en pinMode (). Esto invierte efectivamente el comportamiento, donde ALTO significa que el sensor está apagado y BAJO significa que el sensor está encendido.

Sin embargo, estoy bastante seguro de que invertir el comportamiento no es lo único que hace.

¿Qué INPUT_PULLUPhacer? ¿Qué lo hace diferente INPUTy cómo se decide cuál usar?

Manishearth
fuente
INPUT_PULLUP se agregó con IDE 1.0.1. Es irrelevante qué placa Arduino utilizas, todas admiten PULLUP.
baldengineer

Respuestas:

23

El valor predeterminado es el INPUTque configura el pin como an INPUT. Si el pin está totalmente desconectado, se leerá al azar HIGHy LOW. Si lo vincula a + 5V o 0V, obviamente leerá HIGHo LOW.

Interno al Arduino hay resistencias pullup con un valor de alrededor de 50k-ohm. Estas resistencias pueden conectarse opcionalmente internamente usando INPUT_PULLUP. Esto es funcionalmente (y eléctricamente) equivalente a conectar una resistencia de 50k-ohmios entre el pin y + 5V, la única diferencia es que no requiere componentes externos y puede encenderlo y apagarlo en el software durante la ejecución de su programa.

Entonces, ¿por qué pull-ups y no pull-down? Probablemente hay varias razones para ello, pero cuando se conectan los botones o interruptores o cualquier cosa "normalmente abierta", solo tiene que atarlos a tierra, no necesita ejecutar + 5V hacia ellos. Dado que la mayoría de las tablas se diseñarán con grandes vertidos de tierra por razones de blindaje de todos modos, atarlas al suelo es prácticamente una razón.

Algunos circuitos integrados más destacados, como los chips ARM, tienen pull-ups y pull-ups, pero la línea AVR de 8 bits solo viene con pull-ups. Solo tiene que recordar que HIGHestá "abierto" y LOWestá "cerrado".


fuente
Voto a favor. Para su información, de acuerdo con la documentación, los pull-ups internos son 20K, no es que haga mucha diferencia de 50K. arduino.cc/en/Tutorial/DigitalPins
SDsolar
9

Tenga en cuenta que antes de 1.0.1, podría activar pullups usando digitalWrite(). Y aún puedes.

El código:

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

Esta es una distinción importante porque INPUT_PULLUPobviamente enciende la resistencia pull-up. Sin embargo, menos obvio es que a partir de 1.0.1, simplemente llamar INPUTobliga a que se apague el pull-up. (Anteriormente, el estado del pull-up se mantuvo igual).

Para ver cómo funciona un pin con y sin pull-ups, mira los siguientes videos.

Pin flotante en un osciloscopio: http://www.youtube.com/watch?v=dBIBFLYCjMM

Con Pull-Up habilitado: http://www.youtube.com/watch?v=SAIw7LLVl-U

Video tutorial completo sobre Pull-Ups (tenga en cuenta que hice esto antes de que INPUT_PULLUP se agregara a la biblioteca Arduino): http://www.youtube.com/watch?&v=jJnD6LdGmUo

Baldengineer
fuente
Muy inteligente. Gracias por escribir esto. Voto a favor.
SDsolar