Il peut être pratique, notamment dans les projets domotiques, de communiquer entre plusieurs appareils. L’une des techniques couramment utilisées est le protocole I2C (ou TWI). Le protocole I2C est une méthode qui permet de connecter plusieurs cartes « Maître » et plusieurs cartes « Esclave » et de faire communiquer jusqu’à 128 dispositifs. Il permet des connexions asynchrones entre plusieurs composants pour partager des informations via un « bus commun ». Nous avions vu la communication via le port série (appelé UART) qui est utilisé pour envoyer le code à l’Arduino par un ordinateur ou pour connecter deux appareils notamment en Bluetooth.
Équipement
- Ordinateur
- Arduino UNO x2 ou plus
- Câble cavalier M / M x3 fois le nombre de cartes
Schéma de connexion du bus I2C entre cartes Arduino
Avec le protocole I2C, il est également possible de communiquer entre différents systèmes (capteurs, écran LCD, Raspberry Pi, etc.). Un exemple intéressant est la communication entre plusieurs cartes Arduino. Pour cela, il faut écrire au moins deux programmes, l’un pour la carte » Mistress » (maître) et l’autre pour les cartes » Slaves « .
Une communication I2C est définie par un bus à deux fils (parfois appelé TWI, Two Wire Interface) et une adresse. Les broches utilisées par la communication I2C sont généralement fixes pour chaque appareil. L’une sur laquelle les données sont envoyées (SDA Serial Data Line) et sur l’autre l’horloge de synchronisation (SLC Serial Clock Line).
Les broches I2C / TWI :
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
Dans cet exemple, nous utilisons une carte Arduino Uno, donc les broches A4 et A5.
Pour que les deux cartes puissent communiquer entre elles, elles doivent être connectées correctement (A4 avec A4 et A5 avec A5) et ne pas oublier de connecter les masses (GND) comme indiqué sur le schéma suivant.
Attention : Si les broches A4 et A5 sont connectées aux broches d’une carte non alimentée, le code se fige au moment de la transmission.
En règle générale, une carte envoie des informations (Writer) et une autre les reçoit (Reader).
Code de configuration du bus I2C
La bibliothèque Wire.h permet de définir facilement la communication série sur le bus I2C. Les fonctions sont similaires à celles de la bibliothèque Serial.
- Wire.begin () initialise l’adresse du périphérique. Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Code of the « Master » card
« Slave » card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the « Master » card:
In the serial monitor of the « Slave 1 » card:
We can see that the two cards are exchanging information. Il est très facile d’étendre cet exemple à plusieurs cartes Arduino (Leonardo, Mini, etc.) en adaptant le câblage et l’adresse des composants dans le code « Esclave ».
Code pour identifier les appareils connectés au bus I2C
Un bon test pour savoir si vos appareils communiquent bien entre eux est d’utiliser le code ci-dessous (I2CScanner) ) qui renvoie toutes les adresses des appareils connectés à la carte Master.