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

Aprende a programar un escaner de direcciones I2C para el Raspberry PLC
15 de junio de 2026 por
Cómo probar el protocolo de comunicación I2C con Raspberry PLC
Boot & Work Corp. S.L, Joan Vilardaga Castro

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.

Buscar en nuestro blog

Cómo probar el protocolo de comunicación I2C con Raspberry PLC
Boot & Work Corp. S.L, Joan Vilardaga Castro 15 de junio de 2026
Compartir esta publicación

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs