Los pines GPIO (General Purpose Input/Output) de la Raspberry Pi son conexiones físicas que permiten a la placa interactuar con el mundo exterior. Funcionan como interruptores programables para leer entradas (como pulsar un botón o los datos de un sensor) y controlar salidas (encender un LED o un motor) enviando o recibiendo señales de 3.3 V.
GPIO de Raspberry Pi 4 y Raspberry Pi 5
La Raspberry Pi 4 Model B y la Raspberry Pi 5 utilizan el mismo conector GPIO de 40 pines (J8), por lo que son completamente compatibles con la mayoría de HATs y accesorios diseñados para Raspberry Pi. Todos los GPIO funcionan con lógica de 3.3 V (no son tolerantes a 5 V). La Raspberry Pi 5 incorpora un nuevo controlador GPIO (RP1), pero mantiene el mismo pinout físico que la Raspberry Pi 4.
¿Hay diferencias entre Raspberry Pi 4 y Raspberry Pi 5?
En cuanto al conector GPIO, no existen diferencias físicas. El encabezado de 40 pines es exactamente el mismo, por lo que el cableado y los proyectos electrónicos son compatibles entre ambos modelos.
La principal diferencia es interna:
- Raspberry Pi 4 utiliza el controlador GPIO integrado en el SoC BCM2711.
- Raspberry Pi 5 utiliza el chip RP1, que gestiona los GPIO y las interfaces de entrada/salida, ofreciendo mejor rendimiento y menor latencia.
- Los niveles eléctricos siguen siendo de 3.3 V.
- Los HAT y accesorios compatibles con Raspberry Pi 4 funcionan, en la gran mayoría de los casos, también en Raspberry Pi 5.
A continuación, localizamos cada pin
| Nombre | # | # | Nombre | ||||||
| 3v3 | 1 | 2 | 5v | ||||||
| SDA I2C1 | GPIO 2 | 3 | 4 | 5v | |||||
| SCL I2C1 | GPIO 3 | 5 | 6 | GND | |||||
| GPCLK0 | GPIO 4 | 7 | 8 | GPIO 14 | TX UART0 | ||||
| GND | 9 | 10 | GPIO 15 | RX UART0 | |||||
| CE1 SPI1 | GPIO 17 | 11 | 12 | GPIO 18 | PCM CLK | PWM0 | CE0 SPI1 | ||
| GPIO 27 | 13 | 14 | GND | ||||||
| GPIO 22 | 15 | 16 | GPIO 23 | ||||||
| 3v3 | 17 | 18 | GPIO 24 | ||||||
| MOSI SPI0 | GPIO 10 | 19 | 20 | GND | |||||
| MISO SPI0 | GPIO 9 | 21 | 22 | GPIO 25 | |||||
| SCLK SPI0 | GPIO 11 | 23 | 24 | GPIO 8 | CE0 SPI0 | ||||
| GND | 25 | 26 | GPIO 7 | CD1SPI0 | |||||
| SDA EEPROM | GPIO 0 | 27 | 28 | GPIO 1 | SCL EEPROM | ||||
| GPLCLK1 | GPIO 5 | 29 | 30 | GND | |||||
| GPLCLK2 | GPIO 6 | 31 | 32 | GPIO 12 | PWM0 | ||||
| PWM1 | GPIO 13 | 33 | 34 | GND | |||||
| MISO SPI1 | PWM1 | PCM FS | GPIO 19 | 35 | 36 | GPIO 16 | CE2 SPI1 | ||
| GPIO 26 | 37 | 38 | GPIO 20 | PCM DIN | MOSI SPI1 | ||||
| GND | 39 | 40 | GPIO 21 | PCM DOUT | SCLK SPI1 |
Interfaces disponibles
| Interfaz | GPIO utilizados |
|---|---|
| I²C | GPIO2 (SDA), GPIO3 (SCL) |
| UART | GPIO14 (TX), GPIO15 (RX) |
| SPI0 | GPIO7, GPIO8, GPIO9, GPIO10, GPIO11 |
| PWM | GPIO12, GPIO13, GPIO18, GPIO19 |
| PCM / I2S | GPIO18, GPIO19, GPIO20, GPIO21 |
GPIO de Raspberry Pi 3 Model B y Raspberry Pi 3 Model B+
La Raspberry Pi 3 Model B y la Raspberry Pi 3 Model B+ incorporan un conector GPIO (J8) de 40 pines. Este conector es compatible con las Raspberry Pi 2, Raspberry Pi 4 y Raspberry Pi 5, por lo que la mayoría de los módulos HAT y accesorios pueden utilizarse sin modificaciones.
Todos los GPIO trabajan con un nivel lógico de 3.3 V. Ningún pin GPIO admite señales de 5 V, ya que esto podría dañar permanentemente el procesador Broadcom BCM2837.
Compatibilidad con otras Raspberry Pi
La Raspberry Pi 3 Model B y Raspberry Pi 3 Model B+ utilizan exactamente el mismo pinout GPIO que la Raspberry Pi 2, Raspberry Pi 4 y Raspberry Pi 5. Esto significa que los programas desarrollados utilizando la numeración BCM y los accesorios HAT compatibles con el conector de 40 pines pueden utilizarse indistintamente en estos modelos.
La diferencia principal entre estos modelos no está en el conector GPIO, sino en el procesador, la memoria, el rendimiento y el controlador interno encargado de gestionar los GPIO. Mientras la Raspberry Pi 3 utiliza el SoC Broadcom BCM2837 para controlar directamente los GPIO, la Raspberry Pi 5 emplea el chip RP1 como controlador de entrada/salida, aunque mantiene la misma distribución física de los pines.
Lenguajes para usar con GPIO
¿Qué librerías son las recomendadas actualmente?
| Lenguaje | Librería recomendada | Estado |
|---|---|---|
| Python | GPIO Zero + lgpio | ⭐ Muy recomendada |
| C | libgpiod | ⭐ Oficial en Linux moderno |
| C++ | libgpiod | ⭐ Recomendada |
| Java | Pi4J | ⭐ Muy madura |
| Node.js | onoff | ⭐ Muy utilizada |
| Go | periph.io | ⭐ Recomendada |
| Rust | rppal | ⭐ Excelente |
| C# | System.Device.Gpio | ⭐ Oficial de .NET |
| Bash | gpiod (gpioset, gpioget) |
⭐ Oficial |
Python (Recomendado para comenzar)
Es el lenguaje más utilizado en Raspberry Pi.
GPIO Zero
Es la librería oficial de alto nivel.
Instalación
sudo apt install python3-gpiozero
Ejemplo
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
lgpio (Nueva recomendación)
Las versiones recientes de Raspberry Pi OS utilizan lgpio como backend.
sudo apt install python3-lgpio
Ejemplo:
import lgpio
import time
h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_output(h, 17)
while True:
lgpio.gpio_write(h, 17, 1)
time.sleep(1)
lgpio.gpio_write(h, 17, 0)
time.sleep(1)
C
Ideal para aplicaciones donde el rendimiento es importante.
libgpiod
Actualmente es la librería recomendada en Linux moderno.
Instalación
sudo apt install libgpiod-dev gpiod
Ejemplo
#include <gpiod.h>
struct gpiod_chip *chip;
struct gpiod_line *line;
chip = gpiod_chip_open("/dev/gpiochip0");
line = gpiod_chip_get_line(chip, 17);
gpiod_line_request_output(line, "app", 0);
gpiod_line_set_value(line, 1);
C++
Puede utilizar exactamente libgpiod.
También existen wrappers como:
- gpiod C++ API
- pigpio C++ (proyectos antiguos)
Java
Muy buena opción si ya trabajas con Java y Micronaut.
Pi4J
Es la librería más conocida para Raspberry Pi.
Características
- GPIO
- I2C
- SPI
- UART
- PWM
Ejemplo
Context pi4j = Pi4J.newAutoContext();
DigitalOutput led = pi4j.create(
DigitalOutput.newConfigBuilder(pi4j)
.address(17)
.build()
);
led.high();
led.low();
Node.js / JavaScript / TypeScript
Muy utilizado para proyectos IoT.
onoff
npm install onoff
Ejemplo
const Gpio = require('onoff').Gpio;
const led = new Gpio(17, 'out');
led.writeSync(1);
rpi-gpio
npm install rpi-gpio
pigpio
Muy buena para PWM.
npm install pigpio
Go
Cada vez más popular para servidores IoT.
Bibliotecas
- periph.io
- go-rpio
Ejemplo
rpio.Open()
pin := rpio.Pin(17)
pin.Output()
pin.High()
Rust
Muy rápida y segura.
Bibliotecas
- rppal
- gpio-cdev
Ejemplo
use rppal::gpio::Gpio;
let gpio = Gpio::new()?;
let mut pin = gpio.get(17)?.into_output();
pin.set_high();
C#
Con .NET
Biblioteca
System.Device.Gpio
Ejemplo
using System.Device.Gpio;
var controller = new GpioController();
controller.OpenPin(17, PinMode.Output);
controller.Write(17, PinValue.High);
Shell (Bash)
Con herramientas de gpiod.
gpioset gpiochip0 17=1
gpioget gpiochip0 17