Introduction

L’I2C (Inter-Integrated Circuit), est un bus de communication série utilisé pour connecter des périphériques à un microcontrôleur, comme l’Arduino. Créé par Philips Semiconductor  dans les années 1980, l’I2C permet de connecter plusieurs périphériques avec seulement deux fils : un pour les données (SDA) et un pour l’horloge (SCL).

Chaque périphérique sur le bus I2C a une adresse unique, permettant au maître de communiquer individuellement avec chaque esclave.

liaison I2C

Fonctionnement bus I2C

La liaison I2C est une liaison half duplex, c’est à dire que l’on ne peut pas écouter et envoyer des données en même temps. La liaison I2C possède un débit moyen de 100 kilo-hertz à 1 Méga-hertz.

Comme on peut voir sur le schéma ci-dessous la liaison I2C n’est pas exclusive, cela veut dire qu’un maitre peut parler à plusieurs esclaves.

On peut faire communiquer entre eux des composants électronique très divers grâce à seulement 2 fils :

  • Signal de donnée : SDA
  • Signal d’horloge : SCL

Broche I2C sur la carte Arduino

Pour utiliser l’I2C avec une carte Arduino, vous devez connaître les broches dédiées à la communication I2C. Les broches varient légèrement selon le modèle d’Arduino, mais généralement, elles sont :

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

Pour la carte Arduino Uno on peut les retrouver sur l’image ci-dessous :

Ecriture sur l’I2C

Pour écrire un message sur l’I2C vous devez d’abord connaître l’adresse I2C sur lequel vous souhaitez envoyer le message. Voici le programme pour envoyer des données sur l’I2C :

#include <Wire.h>

void setup() {
  Wire.begin(); // Initialisation en tant que maître
}

void loop() {
  Wire.beginTransmission(0x3C); // Commencer une transmission avec le périphérique à l'adresse 0x3C
  Wire.write("Hello"); // Envoyer des données
  Wire.endTransmission(); // Terminer la transmission
  delay(500);
}

Lecture sur l’I2C

Voic un exemple qui permet de lire sur l’I2C de la carte Arduino sur l’adresse 0X3C :

#include <Wire.h>

void setup() {
  Wire.begin(0x3C); // Initialisation en tant qu'esclave avec l'adresse 0x3C
  Wire.onReceive(receiveEvent); // Registre une fonction de réception
  Serial.begin(9600);
}

void loop() {
  delay(100); // Laisser du temps pour les autres tâches
}

void receiveEvent() {
  while (Wire.available()) {
    char c = Wire.read(); // Lire les données envoyées par le maître
    Serial.print(c); // Afficher les données reçues
  }
}

Conclusion

Si vous souhaitez un exemple de projet sur Arduino utilisant l’I2C, vous pouvez voir notre cours sur le module RTC.

Si vous souhaitez connaître d’autre bus de communication, vous avez l’UART et le SPI.