Logotipo de sheen.bot

Ideas y reflexiones

Por qué añadir un segundo sensor bloquea tu micro:bit o tu Arduino

29 ago 2026·Sheen Robotics
Por qué añadir un segundo sensor bloquea tu micro:bit o tu Arduino

Cuando añadir un sensor más detiene por completo tu proyecto con micro:bit o Arduino, el culpable es casi con toda seguridad un bloqueo del bus I2C provocado por colisiones de direcciones, problemas con las resistencias de pull-up o choques de tensión.

Si tu proyecto funcionaba a la perfección con una pantalla OLED o un sensor ambiental, pero se ha quedado congelado en el momento exacto en que has conectado un segundo sensor, tu código no se ha topado con un simple fallo de lógica: tu bus de comunicación se ha bloqueado físicamente. La placa se detiene porque el microcontrolador está atrapado en un bucle infinito esperando una confirmación eléctrica que nunca va a llegar.

En plataformas como la BBC micro:bit, la Arduino Uno y la ESP32, los montajes con varios sensores se comunican casi siempre por I2C (Inter-Integrated Circuit). Aunque el I2C es popular porque solo necesita dos cables de datos (SDA y SCL) sin importar cuántos dispositivos conectes, es célebre por su vulnerabilidad a los bloqueos de hardware en un único punto.

Por qué el I2C se cuelga en lugar de fallar con elegancia

A diferencia de la comunicación serie estándar o de los pines de lectura digital, el I2C emplea un esquema de cableado en drenador abierto. Ni el microcontrolador ni los sensores llevan las líneas a nivel alto por sí mismos; unas resistencias de pull-up externas o internas elevan suavemente SDA (datos) y SCL (reloj) hasta la tensión de trabajo. Cualquier dispositivo del bus puede señalizar tirando de la línea hacia masa.

Cuando tu código llama a una función como Wire.endTransmission() o pide datos mediante una extensión de MakeCode, el microcontrolador envía una trama de dirección y espera un bit de confirmación (ACK). Si un fallo de hardware mantiene SDA o SCL a nivel bajo, o si dos dispositivos revuelven la señal, la biblioteca de firmware síncrona espera indefinidamente. Para un profesor o un alumno, la placa parece sencillamente muerta.

Los tres culpables del bloqueo

Tres situaciones de hardware habituales explican casi todos los bloqueos de I2C con varios sensores en el aula:

1. Direcciones por defecto duplicadas

Todo sensor I2C tiene una dirección hexadecimal fija de 7 bits grabada en su silicio. Si conectas dos sensores idénticos (por ejemplo, dos acelerómetros MPU6050 o dos pantallas OLED estándar de 0,96 pulgadas), ambos dispositivos comparten exactamente la misma dirección (como 0x68 o 0x3C).

Cuando el microcontrolador difunde esa dirección, los dos chips intentan hablar en el mismo instante. Sus líneas de datos chocan, emborronan los pulsos de reloj y bloquean el estado del bus.

Tipo de sensorDirección por defecto habitualDirección secundaria (pin conmutado)
MPU-6050 (giroscopio/acelerómetro)0x680x69 (AD0 a 3,3 V)
OLED SSD1306 (128x64)0x3C0x3D (puente de soldadura)
BME280 (temperatura/presión)0x760x77 (SDO a VCC o GND)
DS3231 (reloj en tiempo real)0x57 / 0x68Fija / puente de soldadura

2. Resistencias de pull-up ausentes o flotantes

Como el I2C depende de las resistencias de pull-up para devolver las líneas a nivel alto, no tener ninguna hace que las líneas de reloj y de datos floten de forma impredecible. A la inversa, encadenar cuatro o cinco placas de expansión —cada una con sus propias resistencias de pull-up internas de 4,7 kΩ o 10 kΩ— pone esas resistencias en paralelo. Eso reduce tanto la resistencia total del bus que los débiles transistores del interior de los sensores estándar no consiguen llevar la línea hasta los 0 V, lo que provoca fallos de transmisión.

3. Niveles lógicos incompatibles de 3,3 V y 5 V

La BBC micro:bit y los microcontroladores ESP32 modernos trabajan con lógica de 3,3 V, mientras que una Arduino Uno clásica o una placa de sensor antigua funcionan a 5 V. Si conectas un sensor de 5 V con resistencias de pull-up integradas a un bus compartido junto a un sensor de 3,3 V, la línea de 5 V llevará las líneas de datos de la micro:bit hasta los 5 V. En el mejor de los casos, esto corrompe el bus; en el peor, daña el sensor de 3,3 V o el periférico I2C del microcontrolador.

Una rutina de diagnóstico en 4 pasos para el aula

Cuando el montaje multisensor de un alumno congela la placa, recorre esta secuencia de diagnóstico paso a paso para localizar rápido el fallo eléctrico:

Paso 1: aísla y escanea

Desconecta el sensor nuevo y comprueba que el circuito original sigue arrancando. Después, carga en la placa un script de escaneo I2C (los hay a mano en los ejemplos estándar de Arduino o en extensiones básicas de MakeCode). El escáner sondea las direcciones de 0x01 a 0x7F e informa por el puerto serie de cada dispositivo que responde. Conecta el segundo sensor a solas y escanéalo. Si ambos sensores declaran exactamente la misma dirección hexadecimal, ya has encontrado la colisión.

Paso 2: cambia el pin de dirección por hardware

La mayoría de las placas de expansión ofrecen un pin de selección de dirección (a menudo etiquetado ADDR, AD0 o SDO) o un pequeño puente de soldadura en la parte trasera del PCB. Llevar ese pin a 3,3 V o a GND cambia el bit menos significativo de la dirección del dispositivo. Una vez reasignado el pin, actualiza el código de inicialización de esa instancia concreta del sensor para que use la dirección secundaria.

Paso 3: audita la tensión del bus y la longitud de las líneas

Asegúrate de que todos los sensores del bus funcionan con la misma tensión lógica. Si tienes que combinar módulos de 5 V con una micro:bit de 3,3 V, pasa las señales por un conversor de nivel lógico bidireccional específico en lugar de cablearlos en paralelo. Además, usa cables puente cortos: un cableado largo y enmarañado en la protoboard añade capacidad parásita, redondea los pulsos cuadrados de reloj y provoca pérdidas de paquetes.

Paso 4: activa los tiempos de espera del controlador

El código antiguo de Arduino se apoya en funciones bloqueantes. En el IDE de Arduino puedes evitar que el microcontrolador se congele para siempre añadiendo un tiempo de espera del bus después de Wire.begin():

Wire.begin();
Wire.setWireTimeout(3000, true); // tiempo de espera de 3 ms, reinicia el bus si se cuelga

Si el bus se bloquea por un cable suelto o un pico eléctrico, el controlador reinicia automáticamente el periférico de hardware y sigue ejecutando el resto del bucle en lugar de detener todo el sistema.

Construir circuitos robustos para el aula

Enseñar a los alumnos cómo funciona el I2C por dentro convierte un bloqueo silencioso y frustrante en una lección concreta sobre protocolos de comunicación. Si estás diseñando kits de robótica multisensor para clubes o para impartir un currículo, puedes explorar placas de expansión modulares y kits de hardware educativo en la tienda de Sheen Robotics, o planificar itinerarios de aprendizaje completos con nuestras lecciones estructuradas en Sheen Canvas.

Si impones tiradas de cable cortas, verificas las direcciones de hardware antes de montar los proyectos y enseñas a los alumnos a leer direcciones hexadecimales en un escáner I2C, podrás eliminar el temido bloqueo multisensor antes de que te fastidie la clase.

#microbit#arduino#i2c#electrónica#resolución de problemas

Más de Ideas y reflexiones