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.
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 :
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 :
Pour la carte Arduino Uno on peut les retrouver sur l’image ci-dessous :
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);
}
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
}
}
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.