Aller au contenu principal

TCA9548A - Connecter plusieurs périphériques I2C à Arduino

Introduction

Comment connecter plusieurs périphériques I2C (SDA/SCL) à un Arduino, alors que la plupart des cartes ne disposent que d'une seule interface I2C ? Si tu veux ajouter une pile RTC, plusieurs écrans LCD/OLED, ou des capteurs de luminosité, tu vas vite être limité.

Pour répondre à ce besoin, il existe des multiplexeurs comme le TCA9548A, qui permettent d'étendre le nombre de modules I2C connectés à un seul microcontrôleur.


Rappel sur le multiplexeur

Un multiplexeur est un circuit logique qui permet de sélectionner, via des entrées de commande, une sortie parmi plusieurs. Le TCA9548A possède 3 entrées de commande (A0, A1, A2) et 8 sorties I2C. En connectant A0, A1, A2 à la masse, l'adresse du module sera 0x70.


Schéma : 2 TCA9548A (2 écrans chacun) connectés à une Arduino Nano
Schéma : deux TCA9548A (chacun avec deux écrans OLED) connectés à une Arduino Nano.

Fonctionnement du TCA9548A

Ce module permet de sélectionner l'une des 8 sorties I2C pour communiquer avec un périphérique spécifique. Chaque sortie peut être activée indépendamment en envoyant la commande appropriée à l'adresse du TCA9548A.

Exemple de broches :

A0A1A2RSTSCLSDAGNDVIN
S0S1S2S3S4S5S6S7

Si tu connectes plusieurs modules TCA9548A en série, tu peux adresser jusqu'à 64 périphériques I2C (8 modules x 8 sorties).


Table de vérité des adresses

A2A1A0AdresseTCA N°Périphériques max
0000x7018
0010x7128
0100x7238
0110x7348
1000x7458
1010x7568
1100x7678
1110x7788

Exemple d'utilisation

Supposons que tu utilises deux modules TCA9548A :

  • A0, A1, A2 à la masse : adresse 0x70
  • A0, A1 à la masse, A2 au 5V : adresse 0x74

Chaque module peut connecter 8 périphériques I2C. Pour contrôler un périphérique, il suffit de sélectionner le canal correspondant.


Code Arduino

Les méthodes principales pour utiliser le TCA9548A :

// Sélectionner un canal
byte Element::selectChannel() const {
Wire.beginTransmission(this->address); // 0x70 ou 0x74
Wire.write(1 << this->channel); // canal 0 à 7
Wire.endTransmission();
return this->channel;
}

// Désactiver le TCA
void Element::disableTCA() const {
Wire.beginTransmission(this->address);
Wire.write(0);
Wire.endTransmission();
}

// Initialiser un écran OLED sur un canal
void Element::setupOled() {
this->selectChannel();
this->oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
this->oled.display();
this->disableTCA();
}

Bonus

Retrouvez tout le code sur le repo GitHub pabios/many-mux : https://github.com/pabios/many-mux

Ressources