"Ciencia y Tecnología" por Manolo: Multiplexor I2C TCA9548A .

Marquesina

"AQUÍ NO NOS DETENEMOS A MIRAR EL PASADO POR MUCHO TIEMPO SIGUE SIEMPRE ADELANTE, ABRIENDO NUEVAS PUERTAS Y HACIENDO COSAS NUEVAS. SÉ CURIOSO" Walt Disney.

domingo, 19 de septiembre de 2021

Multiplexor I2C TCA9548A .

 Esta nueva entrada es para comentar cómo he usado el multiplexor para poder utilizar dos sensores iguales a la vez,  sin tener que estar modificando las direcciones I2C. 

El que yo uso es el multiplexor TCA9548A.

Una vez soldados los pines, podemos empezar a trabajar con él. 

Toda la información la he sacado de la web de Adafruit.

Yo aquí me dispongo a usarlo con dos sensores de distancia Vl53l0x  . 

Para ver cómo usar uno de ellos remito a la entrada mía de este blog en la que explico cómo lo hice. 

Averiguo la dirección I2C que usa. Parece ser que usa desde la 0x70 hasta la 0x77.  Utilizo el EscanerI2C  y obtengo la 0x70.

Conexiones:


Programa para calcular la distacia con los sensores . Cada vez que quiero usar uno de los sensores lo único que tengo que hacer es poner previamente la función  void tcaselect(uint8_t i) donde "abro" y "cierro" la conexión con el sensor



 /***   Included libraries  ***/
#include "Adafruit_VL53L0X.h"
#include <Adafruit_Sensor.h>

#define TCAADDR 0x70

Adafruit_VL53L0X loxA = Adafruit_VL53L0X();
Adafruit_VL53L0X loxB = Adafruit_VL53L0X();

/***   Setup  ***/
void setup() {
  Serial.begin(9600);
   // wait until serial port opens for native USB devices
  while (! Serial) {
    delay(1);
   
  }
   Wire.begin();
     

   /* Ini. 1er sensor */
  tcaselect(0);
  Serial.println("Haciendo test sensores");
  if (!loxA.begin()) {
    Serial.println(F("Failed to boot 1 VL53L0X"));
    while(1);
  }
  
  /* Ini. 2nd sensor */
tcaselect(1);
if(!loxB.begin())
  {
    /* There was a problem detecting the HMC5883 ... check your connections */  
    Serial.println(F("Failed to boot 2 VL53L0X"));
    while(1);
  }
  

  
}

/***   Loop  ***/
void loop() {
 
   tcaselect(0);  
   Serial.println("Reading a measurement... 1");
   VL53L0X_RangingMeasurementData_t measureA;
      loxA.rangingTest(&measureA, false); // pass in 'true' to get debug data printout!

            if (measureA.RangeStatus != 4) 
            {  // phase failures have incorrect data
             Serial.print("Distance 1 (mm): "); 
             Serial.println(measureA.RangeMilliMeter);
            } 
            else {
             Serial.println(" out of range ");
                 }
                  delay(100);
   tcaselect(1);  
   Serial.println("Reading a measurement...2 ");
   VL53L0X_RangingMeasurementData_t measureB;
      loxB.rangingTest(&measureB, false); // pass in 'true' to get debug data printout!

            if (measureB.RangeStatus != 4) 
            {  // phase failures have incorrect data
            Serial.print("Distance 2(mm): "); 
            Serial.println(measureB.RangeMilliMeter);
            } 
            else {
              Serial.println(" out of range ");
                 }
                 delay(3000);
                 }
                 

void tcaselect(uint8_t i) {
  if (i > 7) return;
 
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
   //Serial.println(i);   
  Wire.endTransmission();  
}

Es muy útil este multiplexor para varios sensores I2C iguales.