======== Multiplexeur TCA9548A ======== [[https://youtu.be/0AqFjDy3Z-A?si=lCjIe75S5MCzvaf7| Multiplexeur TCA9548A VideoYT ]] ►Fiche technique du TCA9548A https://cdn-shop.adafruit.com/datasheets/tca9548a.pdf ►ADA2717 Module multiplexeur I2C basé sur un TCA9548A https://www.gotronic.fr/art-module-multiplexeur-i2c-ada2717-26051.htm Information de chez Adafruit https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/overview ►DFR0576 Module multiplexeur I2C basé sur un TCA9548A https://www.gotronic.fr/art-module-multiplexeur-i2c-dfr0576-28706.htm Fiche technique https://wiki.dfrobot.com/Gravity__Digital_1-to-8_I2C_Multiplexer_SKU_DFR0576 Librairie Arduino https://github.com/DFRobot/DFRobot_I2C_Multiplexer ► Le module générique TCA9548A Global Shuntong Store / === Module multiplexeur basé sur un TCA9548A === {{ :start:arduino:i2c:capture_d_ecran_du_2024-04-15_13-06-59.png?direct&200 |}} permettant de raccorder jusqu'à 8 modules I2C avec la même adresse sur le même bus I2C d'un microcontrôleur. Il est possible de raccorder 8 multiplexeurs sur un seul microcontrôleur grâce à des adresses sélectionnables via pontets à souder ou via des niveaux logiques sur les broches dédiées. Un guide d'utilisation en anglais est disponible en fiche technique. Remarque: ce module est livré avec deux connecteurs latéraux à souder soi-même pour une utilisation sur une plaque de montage rapide. Caractéristiques: Alimentation: 3 à 5 Vcc Interface: I2C Adresses I2C sélectionnables: 0x70 à 0x77 Dimensions: 31 x 18 x 3 mm Poids: 1,8 g Référence Adafruit: ADA2717 http://www.adafruit.com/datasheets/tca9548a.pdf Son utilisation est assez simple : le multiplexeur lui-même est sur l'adresse I2C 0x70 (mais peut être ajusté de 0x70 à 0x77) et vous écrivez simplement un seul octet avec le numéro de sortie multiplexé souhaité sur ce port, et bam - tous les futurs paquets I2C. sera envoyé à ce port. En théorie, vous pourriez avoir 8 de ces multiplexeurs sur chacune des adresses 0x70-0x77 afin de contrôler 64 de la même partie adressée I2C. La puce elle-même est compatible 1,8 V - 5 V, vous pouvez donc l'utiliser avec n'importe quel niveau logique. ===Broches d'alimentation : === * Vin - c'est la broche d'alimentation. Puisque la puce du capteur utilise 3 à 5 VDC. Pour alimenter la carte, donnez-lui la même puissance que le niveau logique de votre microcontrôleur - par exemple pour un micro 5V comme Arduino, utilisez 5V * GND - terrain d'entente pour la puissance et la logique ===Broches côté contrôle I2C :=== * SCL - il s'agit de la broche d'horloge I2C pour la puce elle-même, connectez-vous à la ligne d'horloge I2C de vos microcontrôleurs. * SDA - il s'agit de la broche de données I2C pour la puce elle-même, connectez-vous à la ligne de données I2C de votre microcontrôleur. * RST - c'est la broche de réinitialisation, pour réinitialiser la puce du multiplexeur. Tiré haut par défaut, connectez-vous à la terre pour réinitialiser * A0 A1 A2 - ce sont les broches de sélection d'adresse pour le multiplexeur . Par défaut, le multiplexeur est à l'adresse 0x70 et ces trois broches sont tirées vers le bas. Connectez-les à Vin pour définir l'adresse sur 0x71 - 0x77 . * A0 est le bit de poids le plus faible (s'il est élevé, il augmentera l'adresse de 1). * A1 est le deuxième bit de poids le plus faible (s'il est élevé, il augmentera l'adresse de 2). * A2 est le troisième bit de poids le plus faible (s'il est élevé, il augmentera l'adresse de 4). ===Broches côté multiplexé I2C :=== * SDx et SCx : Il existe 8 jeux de broches SDx et SCx , de SD0/SC0 à SD7/SC7 . Ce sont les broches multiplexées. Chacun est un ensemble de bus I2C complètement séparé. Vous pouvez donc avoir 8 appareils I2C avec des adresses identiques, à condition qu'ils soient chacun sur un bus I2C. * Aucun pullup n'est installé sur ces broches, donc si vous utilisez une puce ou un breakout sans pullups i2c, assurez-vous de les ajouter ! Eh bien, vous pouvez avoir Vin à 3,3 V et faire tirer ces broches jusqu'à 5 V (c'est-à-dire qu'elles sont conformes à 5 V) ===Câblage et test Arduino=== Le multiplexeur TCA9548A est intéressant dans la mesure où il possède une adresse I2C (0x70 par défaut) - et vous lui envoyez essentiellement une commande pour lui indiquer à quelle sortie multiplexée I2C vous souhaitez parler, vous pouvez ensuite adresser la carte à laquelle vous souhaitez adresser. Nous vous suggérons d'utiliser ce petit assistant pour vous aider à sélectionner le port #définir TCAADDR 0x70 void tcaselect(uint8_t i) { if (i > 7) return; Wire.beginTransmission(TCAADDR); Wire.write(1 << i); Wire.endTransmission(); } Vous pouvez ensuite appeler tcaselect(0) via tcaselect(7) pour configurer le multiplexeur. Notez que si vous possédez des appareils I2C avec l'adresse I2C 0x70, vous devrez court-circuiter l'une des broches Addr de la dérivation TCA9548 vers Vin afin d'éviter tout conflit. Étant donné que vous pouvez avoir 0x70 à 0x77, /** * TCA9548 I2CScanner.ino -- I2C bus scanner for Arduino * * Based on https://playground.arduino.cc/Main/I2cScanner/ * */ #include "Wire.h" #define TCAADDR 0x70 void tcaselect(uint8_t i) { if (i > 7) return; Wire.beginTransmission(TCAADDR); Wire.write(1 << i); Wire.endTransmission(); } // standard Arduino setup() void setup() { while (!Serial); delay(1000); Wire.begin(); Serial.begin(115200); Serial.println("\nTCAScanner ready!"); for (uint8_t t=0; t<8; t++) { tcaselect(t); Serial.print("TCA Port #"); Serial.println(t); for (uint8_t addr = 0; addr<=127; addr++) { if (addr == TCAADDR) continue; Wire.beginTransmission(addr); if (!Wire.endTransmission()) { Serial.print("Found I2C 0x"); Serial.println(addr,HEX); } } } Serial.println("\ndone"); } void loop() { } Par exemple, l'exécuter sur la configuration ci-dessus vous donnera : {{ :start:arduino:i2c:adafruit_products_untitled.png?direct&400 |}} Ensuite, vous devrez ajuster le code dont vous disposez pour sélectionner le bon port multiplexé ! Assurez-vous avant d'interroger le capteur que vous appelez tcaselect pour obtenir le bon #include #include #include #define TCAADDR 0x70 /* Assign a unique ID to this sensor at the same time */ Adafruit_HMC5883_Unified mag1 = Adafruit_HMC5883_Unified(1); Adafruit_HMC5883_Unified mag2 = Adafruit_HMC5883_Unified(2); void displaySensorDetails(Adafruit_HMC5883_Unified *mag) { sensor_t sensor; mag->getSensor(&sensor); Serial.println("------------------------------------"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT"); Serial.println("------------------------------------"); Serial.println(""); delay(500); } void tcaselect(uint8_t i) { if (i > 7) return; Wire.beginTransmission(TCAADDR); Wire.write(1 << i); Wire.endTransmission(); } void setup(void) { Serial.begin(9600); Serial.println("HMC5883 Magnetometer Test"); Serial.println(""); /* Initialise the 1st sensor */ tcaselect(2); if(!mag1.begin()) { /* There was a problem detecting the HMC5883 ... check your connections */ Serial.println("Ooops, no HMC5883 detected ... Check your wiring!"); while(1); } /* Initialise the 2nd sensor */ tcaselect(6); if(!mag2.begin()) { /* There was a problem detecting the HMC5883 ... check your connections */ Serial.println("Ooops, no HMC5883 detected ... Check your wiring!"); while(1); } /* Display some basic information on this sensor */ tcaselect(2); displaySensorDetails(&mag1); tcaselect(6); displaySensorDetails(&mag2); } void loop(void) { /* Get a new sensor event */ sensors_event_t event; tcaselect(2); mag1.getEvent(&event); /* Display the results (magnetic vector values are in micro-Tesla (uT)) */ Serial.print("Sensor #1 - "); Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT"); tcaselect(6); mag2.getEvent(&event); /* Display the results (magnetic vector values are in micro-Tesla (uT)) */ Serial.print("Sensor #2 - "); Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT"); delay(500); }