Logotipo de sheen.bot

← Ideas y reflexiones

Por qué el pin de tu Arduino lee HIGH cuando no hay nada conectado (y cómo solucionarlo)

14 oct 2026·Sheen Robotics
Por qué el pin de tu Arduino lee HIGH cuando no hay nada conectado (y cómo solucionarlo)

Un pin de entrada de Arduino desconectado no pasa por defecto a cero voltios; queda flotando en un estado de alta impedancia, actuando como una antena que capta el ruido electrostático residual.

Un pin de entrada de Arduino sin conectar lee HIGH —o parpadea de forma impredecible entre HIGH y LOW— porque se encuentra en un estado de alta impedancia conocido como pin flotante (floating pin). No está conectado a un voltaje de referencia, lo que significa que actúa como una diminuta antena que capta campos electromagnéticos ambientales, electricidad estática de las manos y el zumbido de 50 Hz de la red eléctrica cercana.

Para obtener una lectura predecible, cada pin de entrada digital debe estar conectado de forma limpia al carril de voltaje positivo (HIGH) o a masa (LOW) en todo momento. No es necesario soldar resistencias externas ni abarrotar la placa de prototipos (breadboard) de los alumnos para lograrlo: casi todos los microcontroladores modernos incluyen resistencias pull-up internas que pueden activarse con una sola línea de código.

El problema de la alta impedancia

Al configurar un pin mediante pinMode(pin, INPUT), el microcontrolador sitúa la circuitería interna de dicho pin en un estado de alta impedancia. En un ATmega328P (el microcontrolador que incorporan las placas clásicas de Arduino Uno y Nano), la resistencia de entrada de un pin GPIO estándar ronda los 100 megaohmios (100 000 000 Ω). El pin apenas consume corriente: menos de un solo microamperio.

Esto es deliberado: permite al microcontrolador medir un circuito externo sin sobrecargarlo ni distorsionar la señal. Sin embargo, esa sensibilidad acarrea una consecuencia física directa. Dado que prácticamente no se requiere corriente para alterar el voltaje de puerta dentro del chip, minúsculas cargas electrostáticas en la superficie del pin o en un cable de conexión corto bastan para elevar el voltaje del pin por encima del umbral digital.

En una placa de 5V, cualquier valor superior a aproximadamente 3,0V se registra como HIGH, mientras que todo lo que esté por debajo de unos 1,5V se registra como LOW. Cuando un pin no está conectado a nada, su voltaje oscila sin rumbo fijo en esa franja intermedia. En el momento en que pasas una mano, arrastras los pies por una moqueta sintética del aula o aproximas la fuente de alimentación de un portátil, el acoplamiento capacitivo empuja el voltaje por encima del umbral y digitalRead() devuelve 1 (HIGH).

El patrón de fallo clásico en el aula

En las aulas escolares y en los clubes de robótica, este fenómeno provoca una serie predecible de quebraderos de cabeza durante la depuración:

  • Pulsaciones fantasma de botones: Un alumno escribe código para encender un LED cuando se pulsa un botón. En el momento en que carga el programa (sketch), el LED se enciende de inmediato, aunque nadie haya tocado el botón.
  • El efecto de proximidad: El sensor del robot se activa simplemente porque la mano de un estudiante se acerca a diez centímetros de la placa, lo que lleva a la clase a pensar que su cable de conexión se ha transformado en un sensor de proximidad involuntario.
  • Comportamiento errático en la placa de prototipos: Un proyecto funciona con total fiabilidad en la mesa del docente, pero falla al colocarlo en un pupitre con estructura metálica bajo tubos fluorescentes.

El remedio habitual de los libros de texto consiste en añadir una resistencia pull-down o pull-up externa de 10kΩ en la placa de prototipos. No obstante, para una clase de iniciación, las resistencias externas introducen fricción innecesaria: los estudiantes las pinchan en el carril equivocado, confunden las bandas de color o provocan cortocircuitos directos entre 5V y GND al accionar los pulsadores.

La solución limpia: INPUT_PULLUP

Los diseñadores de microcontroladores anticiparon este problema hace décadas. Microcontroladores como el ATmega328P, el RP2040 y el ESP32 incorporan resistencias internas integradas directamente en el silicio junto a cada pin GPIO. En un Arduino Uno o Nano, estas resistencias internas ofrecen una resistencia efectiva de entre 20kΩ y 50kΩ.

Puedes activar esta resistencia directamente dentro de tu función setup() pasando una única constante a pinMode():

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

Cuando se invoca INPUT_PULLUP, el microcontrolador conecta internamente el pin 2 a su alimentación de 5V a través de una resistencia de 20kΩ–50kΩ. Esta conexión débil eleva suavemente el pin a 5V siempre que permanezca en circuito abierto. Al estar firmemente anclado a una fuente de tensión, el ruido electrostático residual ya no puede alterar su estado. Si no se toca, el pin leerá HIGH de forma fiable y estable.

El cambio de lógica: cableado con lógica activa a nivel bajo (Active-LOW)

El uso de INPUT_PULLUP requiere un pequeño ajuste mental por parte del alumnado: el circuito debe emplear lógica de nivel bajo activo (active-LOW).

Dado que el pin se mantiene en HIGH por defecto, un pulsador no debe conectar el pin a 5V. En su lugar, el botón debe conectar el pin directamente a GND:

  • Botón sin pulsar (circuito abierto): La resistencia pull-up interna mantiene el pin a 5V. digitalRead(pin) devuelve HIGH.
  • Botón pulsado (circuito cerrado): El pin se conecta directamente a masa (0V). La mínima corriente que atraviesa la resistencia pull-up interna se deriva de forma segura a GND. digitalRead(pin) devuelve LOW.

El montaje del hardware se simplifica: solo hacen falta dos cables para el interruptor: uno hacia el pin digital y otro hacia cualquier pin de masa (GND) de la placa. Se prescinde por completo de la conexión al carril de 5V y de las resistencias externas.

En el software, simplemente se invierte la condición:

void loop() {
  int buttonState = digitalRead(2);

  // Con INPUT_PULLUP, LOW indica que el botón está pulsado
  if (buttonState == LOW) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Cuándo recurrir a resistencias externas

Aunque INPUT_PULLUP debería ser la opción predeterminada para interruptores digitales en el aula, presenta limitaciones basadas en la física fundamental:

EscenarioPull-up interna (20k–50kΩ)Resistencia externa (1k–10kΩ)
Pulsador estándar en placa de prototiposIdeal (sin componentes adicionales)Complejidad innecesaria
Tiradas largas de cable (> 1 metro)Propensa a retardos capacitivos y ruidoNecesaria (usar una pull-up fuerte de 1kΩ o 4,7kΩ)
Líneas de comunicación I2C (SDA/SCL)Demasiado débil para velocidades de bus altasNecesaria (habitualmente de 2,2kΩ a 4,7kΩ)
Requisitos de salida de sensor con nivel alto activo (Active-HIGH)No se puede invertir el carril interno de hardwareNecesaria (usar una pull-down externa a GND)

Para adquirir hardware STEM modular y plataformas de prototipado para el aula que ayuden a minimizar errores de conexión, explora la selección de componentes y sensores para microcontroladores disponible en Sheen Robotics Store.

Guía rápida de referencia para docentes

  1. Nunca dejes una entrada flotante: Si un pin de entrada se configura solo con INPUT, debe conectarse de forma continua a una tensión definida mediante un circuito externo.
  2. Usa INPUT_PULLUP por defecto: Adapta tus plantillas de clase habituales para inicializar los pines con pinMode(pin, INPUT_PULLUP).
  3. Conecta los botones a GND, no a 5V: Esto reduce el número de componentes en la placa de prototipos, elimina el riesgo de cortocircuitos y reproduce las convenciones de cableado industrial estándar.
  4. Enseña la lógica activa a nivel bajo desde el principio: Explicar por qué LOW significa «encendido» introduce a los alumnos en la lógica electrónica del mundo real, donde derivar un circuito activo a masa resulta más seguro y robusto que guiar carriles positivos a través de interruptores externos.
#arduino#electrónica#programación#docencia#robótica

Más de Ideas y reflexiones