Skip to main content

I2C

El protocolo I2C se desarrolló originalmente en 1982 para receptores de TV, y su característica principal son dos líneas (aparte de la alimentación 3.3V-5V y masa):

  • SDA  que son datos bidireccionales
  • SCL que es la señal de reloj

Un dispositivo hace de Master y proporciona la señal de reloj. (Puede haber extraordinariamente más de un master) y los otros dispositivos, (en plural, con los mismos cables, aquí esta la ventaja) hacen de Slave y cada uno tiene asociado una dirección.

Ejemplos de I2C con Arduino:
- Conexión con pantalla LCD https://libros.catedu.es/books/programa-arduino-mediante-codigo/page/lcd
- Comunicación entre dos Arduinos https://dronebotworkshop.com/i2c-arduino-arduino/

En Arduino Alvik, los pines SDA y SCL están conectados en los pines 11 y 12 y de ahí salen por los conectores QWIIC y Grove :
datasheet_connectors.png

Podemos escanear los dispositivos I2C que estén conectados y averiguar la dirección que tienen asociada :

from machine import I2C
from machine import Pin

i2c = I2C(0, scl=Pin(12, Pin.OUT), sda=Pin(11, Pin.OUT))

print()
print('Scan i2c bus...')
print()

devices = i2c.scan()

if len(devices) == 0:
    print("No i2c device !")
else:
    print('i2c devices found:',len(devices))
print()

for device in devices:
    print("Decimal address: ",device," | Hexa address: ",hex(device))

print()

Fuente : https://docs.arduino.cc/tutorials/alvik/user-manual/#grove-connectors

He conectado un OLED en el conector Grove

2025-05-07 13_24_53-WhatsApp.png

Y me ha salido que tenía dos dispositivos, el primero es interno del Alvik, que tiene dirección 43 y el segundo es el OLED conectado con la dirección 60 en decimal o 0x3c en hexadecimal que es la dirección por defecto en el OLED ssd1306:

2025-05-07 13_29_41-Arduino Lab for MicroPython.png

Si ejecutamos el siguiente script, vemos que necesita importar la librería ssd1306 (se puede ver en su repositorio, que es compatible con el display ssd1306 128x64 I2C y con ESP32 de Arduino).. Esta librería tiene las funciones necesarias para visualizar lo que uno quiera en el OLED. Funciones de esta librería

from machine import I2C
from machine import Pin
import ssd1306

i2c = I2C(0, scl=Pin(12, Pin.OUT), sda=Pin(11, Pin.OUT))

# dirección por defecto 0x3c
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

while True:
  oled.text('HOLA CATEDU !', 10, 10)      
  oled.show()

Y el resultado es :

2025-05-07 13_35_08-WhatsApp.png