Casi todos los sensores, pantallas y módulos que conectas a un Arduino, un ESP32 o una Raspberry Pi hablan uno de estos tres idiomas: I2C, SPI o UART. Saber cómo funciona cada uno te ahorra horas de depuración y te ayuda a elegir módulos que no te den problemas al combinarlos.
Resumen
| I2C | SPI | UART | |
|---|---|---|---|
| Cables de señal | 2 (SDA, SCL) | 4 (MOSI, MISO, SCK, CS) + 1 CS por dispositivo | 2 (TX, RX) |
| Dispositivos por bus | Muchos (hasta 127 direcciones de 7 bits) | Varios, cada uno con su línea CS | 2 (punto a punto) |
| Velocidad típica | 100 kHz, 400 kHz (1 MHz en Fast-mode Plus) | De 1 a decenas de MHz | 9600–115200 baudios habituales (hasta Mb/s) |
| Reloj | Compartido (lo genera el maestro) | Compartido (lo genera el maestro) | Ninguno: ambos acuerdan la velocidad |
| Dúplex | Semidúplex | Dúplex completo | Dúplex completo |
| Ideal para | Sensores, pantallas pequeñas, RTC, expansores | Pantallas TFT, tarjetas SD, ADC rápidos, memorias | GPS, módulos Bluetooth/LoRa, consola de depuración |
I2C: dos cables para muchos dispositivos
I2C (Inter-Integrated Circuit) usa dos líneas compartidas por todos los dispositivos:
- SDA: datos.
- SCL: reloj.

Cada dispositivo tiene una dirección (por ejemplo, 0x27 o 0x3F en los adaptadores de LCD, 0x76 en el sensor BME280). El maestro llama a una dirección y solo responde ese dispositivo.
Las dos líneas necesitan resistencias pull-up a la tensión del bus (normalmente entre 4,7 kΩ y 10 kΩ). La mayoría de módulos ya las llevan; si conectas muchos módulos con pull-up, el valor total baja y puede dar problemas.
Ventajas: muy pocos cables, fácil añadir dispositivos. Inconvenientes: lento comparado con SPI, sensible a cables largos y a direcciones repetidas (dos módulos iguales con la misma dirección no pueden ir en el mismo bus sin cambiarla).
Un ejemplo práctico lo tienes en configurar un display LCD con I2C y un sensor de temperatura.
SPI: rápido y sencillo
SPI (Serial Peripheral Interface) usa cuatro líneas:
- SCK: reloj, generado por el maestro.
- MOSI (o COPI): datos del maestro al periférico.
- MISO (o CIPO): datos del periférico al maestro.
- CS (o SS): selección de chip, una por dispositivo.

Las líneas SCK, MOSI y MISO se comparten; el maestro activa la línea CS del dispositivo con el que quiere hablar. No hay direcciones.
Ventajas: mucha velocidad (ideal para pantallas y tarjetas SD), protocolo simple. Inconvenientes: más cables y un pin extra por cada dispositivo. Hay que configurar el modo SPI (0–3) correcto para cada chip.
UART: el puerto serie de toda la vida
UART (Universal Asynchronous Receiver-Transmitter) conecta dos dispositivos con dos líneas cruzadas:
- TX de uno → RX del otro.
- RX de uno ← TX del otro.
- GND común.

No hay reloj: los dos lados tienen que usar la misma velocidad (baudios), por ejemplo 9600 o 115200, y el mismo formato (habitualmente 8N1: 8 bits, sin paridad, 1 bit de parada).
Ventajas: universal, ideal para depurar (el Monitor Serie de Arduino va por UART) y para módulos como GPS o Bluetooth. Inconvenientes: solo dos dispositivos por puerto y, si las velocidades no coinciden, solo recibes basura.
Pines en las placas más comunes
| Placa | I2C (SDA / SCL) | SPI (MOSI / MISO / SCK) | UART (TX / RX) |
|---|---|---|---|
| Arduino Uno / Nano (ATmega328P) | A4 / A5 | D11 / D12 / D13 | D1 / D0 (compartido con el USB) |
| ESP32 (DevKit) | GPIO 21 / 22 por defecto, configurables | GPIO 23 / 19 / 18 (VSPI) por defecto | UART0 en GPIO 1 / 3 (USB); UART2 en GPIO 17 / 16 |
| Raspberry Pi (40 pines) | GPIO 2 / 3 (pines 3 y 5) | GPIO 10 / 9 / 11 (pines 19, 21, 23) | GPIO 14 / 15 (pines 8 y 10) |
En la Raspberry Pi, I2C, SPI y el puerto serie vienen desactivados. Se activan con sudo raspi-config → Interface Options.
Niveles de tensión: el error que quema placas
- Arduino Uno trabaja a 5 V.
- ESP32 y Raspberry Pi trabajan a 3,3 V y no toleran 5 V en sus pines.
Si conectas un módulo de 5 V a un ESP32 o una Raspberry Pi, usa un convertidor de niveles lógicos (en I2C, uno bidireccional) o un módulo que admita 3,3 V.
Problemas habituales
- I2C: el dispositivo no responde. Ejecuta un escáner I2C para ver qué direcciones hay en el bus: en Arduino, el sketch i2c_scanner; en Raspberry Pi,
i2cdetect -y 1. Si no aparece nada, revisa SDA/SCL (¿están cruzados?), la alimentación y las pull-up. - I2C: dos módulos con la misma dirección. Muchos módulos permiten cambiarla con puentes de soldadura (A0, A1, A2). Si no, usa un multiplexor I2C como el TCA9548A.
- SPI: la pantalla se queda en blanco. Revisa la línea CS y el pin DC/RS (las pantallas TFT tienen uno extra), y el modo SPI.
- UART: caracteres raros. Velocidad distinta en cada lado o TX/RX sin cruzar. Y no olvides el GND común.
- Arduino Uno: no puedo subir el sketch. Si tienes algo conectado a D0/D1, interfiere con el USB. Desconéctalo al programar o usa SoftwareSerial en otros pines.



