Saltar al contenido
GEEKnodes

Electrónica

Resistencias pull-up y pull-down: qué son y cómo usarlas en Arduino

Qué son las resistencias pull-up y pull-down, por qué un pin flota, qué valor elegir y cómo usar INPUT_PULLUP en Arduino y ESP32 con un pulsador.

Si alguna vez has conectado un pulsador a un Arduino y el pin cambiaba solo entre HIGH y LOW sin tocar nada, el culpable era un pin flotante. En esta guía verás qué es una resistencia pull-up o pull-down, qué valor elegir y cómo resolverlo con una sola línea de código gracias a INPUT_PULLUP.

En resumen

  • Un pin de entrada sin nada conectado flota: lee ruido y cambia al azar.
  • Una pull-up lo fija a HIGH en reposo; una pull-down, a LOW.
  • El valor típico es 10 kΩ; en buses I2C se usan valores menores, como 4,7 kΩ.
  • pinMode(pin, INPUT_PULLUP) activa la pull-up interna del Arduino: no necesitas resistencia externa, pero la lógica queda invertida.

Por qué un pin «flota»

Un pin configurado como entrada tiene una impedancia altísima: apenas consume corriente. Eso es bueno para leer señales, pero tiene un efecto secundario.

Un pin flotante puede leer ruido; una resistencia pull-down lo fija a LOW hasta pulsar el botón.
Sin una resistencia, la entrada queda indefinida; la pull-down fija LOW en reposo.

Si el pin no está conectado ni a VCC ni a GND, su tensión queda indefinida. Cualquier cosa la mueve: el campo eléctrico de tu mano, un cable cercano o la propia red eléctrica. El microcontrolador lee entonces valores aleatorios.

El caso típico es un pulsador conectado entre el pin y 5 V:

  • Pulsado: el pin está a 5 V y lee HIGH. Correcto.
  • Suelto: el pin no está conectado a nada y flota. Puede leer cualquier cosa.

La solución es dar al pin un estado por defecto con una resistencia.

Pull-up y pull-down: las dos opciones

Comparación de conexiones pull-up y pull-down y de sus lecturas al soltar o pulsar el botón.
La pull-up invierte la lógica; con pull-down, al pulsar se obtiene HIGH.
Pull-upPull-down
Resistencia entrePin y VCCPin y GND
Pulsador entrePin y GNDPin y VCC
Lectura en reposoHIGHLOW
Lectura al pulsarLOWHIGH
LógicaInvertida (activo a nivel bajo)Directa (activo a nivel alto)
Interna en Arduino AVRSí (INPUT_PULLUP)No

Cómo funciona una pull-up

Con el pulsador suelto, la resistencia «tira» del pin hacia VCC. Como la entrada casi no consume corriente, apenas cae tensión en la resistencia y el pin ve prácticamente 5 V.

Al pulsar, el pin queda conectado directamente a GND. La resistencia limita la corriente que circula de VCC a GND; sin ella, pulsar el botón sería un cortocircuito.

Cómo funciona una pull-down

Es el mismo principio al revés: la resistencia mantiene el pin en GND y el pulsador lo lleva a VCC. Es más intuitiva (pulsado = HIGH), pero en un Arduino Uno necesita una resistencia externa.

Qué valor elegir

La resistencia debe ser lo bastante baja para fijar el pin con firmeza frente al ruido, y lo bastante alta para no desperdiciar corriente cuando el pulsador está cerrado.

La corriente con el pulsador pulsado sale de la ley de Ohm, I = V / R:

ResistenciaCorriente a 5 VCorriente a 3,3 VComentario
1 kΩ5 mA3,3 mAMuy firme, pero gasta bastante
4,7 kΩ~1,1 mA~0,7 mAHabitual en buses I2C
10 kΩ0,5 mA0,33 mAEl valor por defecto para pulsadores
47 kΩ~0,1 mA~0,07 mABajo consumo, más sensible al ruido
100 kΩ o más0,05 mA0,03 mASolo en proyectos a pilas y cables cortos

Reglas prácticas:

  • Pulsadores e interruptores: 10 kΩ.
  • Cables largos o entornos ruidosos: baja a 4,7 kΩ o 2,2 kΩ.
  • Bus I2C: 4,7 kΩ es el valor más habitual; muchos módulos ya los llevan soldados. Más detalles en I2C, SPI y UART.
  • Proyectos con batería: valores altos (47–100 kΩ) si el pulsador puede quedar cerrado mucho tiempo.

Si no sabes leer el valor de una resistencia, tienes el código de colores de resistencias.

INPUT_PULLUP en Arduino

Los microcontroladores AVR (Uno, Nano, Mega) llevan una resistencia pull-up interna en cada pin digital. Según la documentación de Arduino, en la mayoría de placas AVR su valor está entre 20 kΩ y 50 kΩ.

Pull-up interna entre 5 V y el pin 2, con el pulsador conectado entre pin y GND.
Con INPUT_PULLUP, el pulsador suelto lee HIGH y pulsado lee LOW.

Se activa así:

pinMode(2, INPUT_PULLUP);

Con eso basta con conectar el pulsador entre el pin y GND. Sin resistencias externas.

Ejemplo: pulsador que enciende el LED integrado

Montaje:

  • Una pata del pulsador al pin 2.
  • La otra pata a GND.
const int PULSADOR = 2;
const int LED = LED_BUILTIN;

void setup() {
  pinMode(PULSADOR, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}

void loop() {
  // Con pull-up, pulsado = LOW
  if (digitalRead(PULSADOR) == LOW) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

Fíjate en la comparación con LOW: es la lógica invertida típica de las pull-up.

Ejemplo: pull-down externa

Si prefieres que pulsado sea HIGH:

  • Pulsador entre el pin 2 y 5 V.
  • Resistencia de 10 kΩ entre el pin 2 y GND.
const int PULSADOR = 2;

void setup() {
  pinMode(PULSADOR, INPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(PULSADOR) == HIGH) {
    Serial.println("Pulsado");
  }
  delay(50);
}

Pull-up y pull-down en el ESP32

El ESP32 tiene resistencias internas de pull-up y de pull-down en la mayoría de sus pines:

pinMode(4, INPUT_PULLUP);    // pull-up interna
pinMode(5, INPUT_PULLDOWN);  // pull-down interna

Ojo con una excepción importante: según la documentación de Espressif, los pines GPIO34 a GPIO39 del ESP32 original solo funcionan como entrada y no tienen pull-up ni pull-down internas. Si conectas un pulsador ahí, necesitas una resistencia externa.

Recuerda también que el ESP32 trabaja a 3,3 V: la pull-up externa debe ir a 3,3 V, nunca a 5 V.

Errores habituales

ErrorSíntomaSolución
Pulsador sin resistencia ni INPUT_PULLUPLecturas aleatorias, el LED parpadea soloActiva INPUT_PULLUP o añade 10 kΩ
Usar INPUT_PULLUP y comparar con HIGHFunciona al revésCon pull-up, pulsado es LOW
Pulsador entre pin y VCC con INPUT_PULLUPEl pin lee siempre HIGHCon pull-up, el pulsador va a GND
Pull-up interna en el pin 13 del UnoEl pin se queda a unos 1,7 VEl LED de la placa tira del pin hacia abajo; usa otro pin
Pull-up a 5 V en un ESP32Riesgo de dañar el pinUsa siempre 3,3 V
Leer varias pulsaciones con un solo toqueRebotes mecánicosAñade un retardo (debounce) por software o un condensador

Un apunte sobre los rebotes

Los contactos de un pulsador rebotan durante unos milisegundos al cerrarse, generando varios cambios rápidos. Las resistencias pull-up no lo evitan. La solución más sencilla es ignorar los cambios durante 20–50 ms después de detectar uno, o usar una librería como Bounce2.

Preguntas frecuentes

¿Es mejor la pull-up interna o una externa?

Para pulsadores con cables cortos, la interna es suficiente y te ahorra componentes. Con cables largos o ruido eléctrico, una externa de 4,7–10 kΩ es más fiable porque su valor es más bajo y conocido.

¿Puedo poner pull-up y pull-down a la vez?

No tiene sentido: formarían un divisor de tensión y el pin quedaría a una tensión intermedia, que puede no leerse ni como HIGH ni como LOW.

¿Las salidas también necesitan pull-up?

Las salidas normales no, porque fijan su nivel ellas mismas. Sí las necesitan las salidas en drenador abierto (como el bus I2C), que solo pueden tirar hacia GND.

Relacionados

Preferencias de accesibilidad

Perfiles rápidos

Texto y lectura

Tamaño del texto
Por defecto
Altura de línea
Por defecto
Espaciado entre letras
Por defecto
Espaciado entre palabras
Por defecto

Color

Movimiento y orientación

Cursor