Arduino I2C

Introducción

I2C (Inter-Integrated Circuit) es un bus de comunicación en serie que se utiliza para conectar periféricos a un microcontrolador, como Arduino. Creado por Philips Semiconductor en la década de 1980, I2C permite conectar múltiples periféricos con solo dos cables: uno para datos (SDA) y otro para reloj (SCL).

Cada dispositivo en el bus I2C tiene una dirección única, lo que permite que el maestro se comunique individualmente con cada esclavo.

Cómo funciona

El enlace I2C es semidúplex, es decir, no se pueden escuchar y enviar datos simultáneamente. El enlace I2C tiene una velocidad de datos promedio de 100 kilohercios a 1 megahercio.

Como se muestra en el diagrama a continuación, el enlace I2C no es exclusivo, lo que significa que un maestro puede comunicarse con varios esclavos.

A wide range of electronic components can communicate with each other using just 2 wires:

  • Data signal: SDA
  • Clock signal: SCL

Pin I2C en la placa Arduino

Para usar I2C con una placa Arduino, necesitas saber qué pines están dedicados a la comunicación I2C. Los pines varían ligeramente según el modelo de Arduino, pero generalmente son:

Arduino Uno: A4 (SDA) y A5 (SCL).
Arduino Mega: 20 (SDA) y 21 (SCL).
Arduino Leonardo: 2 (SDA) y 3 (SCL).

Para la placa Arduino Uno, estos pines se pueden encontrar en la siguiente imagen:

Escribiendo en el I2C

Para escribir un mensaje en el I2C, primero necesitas saber la dirección I2C a la que quieres enviarlo. Aquí está el programa para enviar datos por I2C:

#include <Wire.h>

void setup() {
  Wire.begin(); // Initialize as master
}

void loop() {
  Wire.beginTransmission(0x3C); // Start transmission with device at address 0x3C
  Wire.write(“Hello”); // Send data
  Wire.endTransmission(); // End transmission
  delay(500);
}

Leyendo en el I2C

A continuación se muestra un ejemplo de cómo leer el I2C de la placa Arduino en la dirección 0X3C:

#include <Wire.h>

void setup() {
  Wire.begin(0x3C); // Initialize as slave with address 0x3C
  Wire.onReceive(receiveEvent); // Register a receive function
  Serial.begin(9600);
}

void loop() {
  delay(100); // Leave time for other tasks
}

void receiveEvent() {
  while (Wire.available()) {
    char c = Wire.read(); // Read data sent by master
    Serial.print(c); // Display received data
  }
}

Conclusión

Si quieres ver un ejemplo de un proyecto Arduino con I2C, consulta nuestro curso sobre el módulo RTC.

Si quieres aprender sobre otros buses de comunicación, tienes UART y SPI.