El bus I2C está disponible en todos los modelos de Raspberry PLC y es compatible con una gran cantidad de sensores y circuitos integrados periféricos. Antes de usar un dispositivo I2C conectado, necesitas conocer su dirección en el bus. Este artículo muestra cómo escribir un escaner de direcciones I2C en Python usando la librería Adafruit Blinka, que funciona directamente en el Raspberry PLC sin configuración adicional de hardware.
Requisitos
- Raspberry PLC con un dispositivo I2C conectado a los pines SDA y SCL
- Cable Ethernet o monitor y teclado para acceder al PLC
- Conexión a internet para instalar la librería
El protocolo de comunicación I2C
Inter-Integrated Circuit (I2C) es un protocolo serie de dos hilos desarrollado por Philips en los años 80 y ampliamente utilizado en sistemas embebidos, robótica y automatización industrial. Usa una línea de datos serie (SDA) y una línea de reloj serie (SCL). Varios dispositivos comparten los mismos dos hilos en una topología de bus, y cada uno tiene una dirección de 7 bits única que el maestro usa para dirigirse a él individualmente.
I2C admite los roles de maestro y esclavo. El maestro inicia todas las transferencias y controla el reloj. El esclavo responde cuando se le dirige. Tras cada byte, el dispositivo receptor envía una señal de reconocimiento (ACK). Las velocidades habituales son 100 kHz (modo estándar) y 400 kHz (modo rápido), con 3,4 MHz disponible en modo de alta velocidad.
Una ventaja práctica del I2C es que solo necesita dos pines GPIO y dos resistencias de pull-up, lo que facilita la conexión de varios sensores al mismo bus. La principal limitación es el rendimiento: para flujos de datos de alta velocidad, SPI o UART son mejores opciones.
Instalación de la librería Adafruit Blinka
Adafruit Blinka proporciona una capa de abstracción de hardware compatible con CircuitPython para ordenadores de placa única como la Raspberry Pi. Instálala con:
pip3 install adafruit-blinka
Asegúrate de tener conexión a internet en el PLC. Si necesitas configurarla primero, consulta la guía de Wi-Fi del Raspberry PLC.
Para usar dispositivos I2C específicos, instala la librería Adafruit CircuitPython correspondiente. Por ejemplo, para el acelerómetro MMA8451:
git clone https://github.com/adafruit/Adafruit_CircuitPython_MMA8451.git
Nota: si al copiar el comando desde esta página obtienes algún error, escríbelo manualmente.
Funciones I2C en Blinka
Las funciones I2C principales disponibles a través de la librería Adafruit Blinka son:
i2c = board.I2C() # Crea un objeto I2C usando board.SCL y board.SDA i2c.try_lock() # Intenta adquirir el control exclusivo del bus i2c.scan() # Devuelve una lista de direcciones que respondieron i2c.writeto_then_readfrom(addr, write_buff, read_buff) # Escritura y lectura en una sola transacción # write_buff y read_buff deben ser de tipo bytes o bytearray.
En la práctica, la mayoría de librerías de sensores construidas sobre Blinka encapsulan estas llamadas de bajo nivel, por lo que rara vez se usan directamente. Usa i2c.scan() cuando necesites descubrir qué hay conectado al bus.
Ejemplo de escaner de direcciones I2C
El script siguiente escanea continuamente el bus I2C e imprime la dirección hexadecimal de cada dispositivo que responde, con un intervalo de 5 segundos entre escaneos.
import board
import time
i2c = board.I2C() # Usa board.SCL y board.SDA
try:
i2c.unlock() # Desbloquea si el bus quedó bloqueado por un programa anterior
except ValueError:
print("I2C not locked, proceeding to lock")
while not i2c.try_lock():
pass
try:
while True:
print("I2C addresses found:",
[hex(device_address) for device_address in i2c.scan()])
time.sleep(5)
except KeyboardInterrupt:
print("Unlocking I2C bus and exiting...")
i2c.unlock()Ejecuta el script con python3 scanner.py. Cada 5 segundos imprimirá la lista de direcciones detectadas. Usa esas direcciones al inicializar la librería del dispositivo o al llamar a las funciones I2C directamente.

Cómo probar el protocolo de comunicación I2C con Raspberry PLC