I2C (2da Parte)

Standard

Hola a todos y espero les haya ido muy bien, en esta ocasión seguimos con la segunda parte del tutorial de I2C, anteriormente habíamos estado entendiendo como funciona este grandioso protocolo (aunque para algunos puede ser una tortura), porque es tan útil cuando se manejan demasiados periféricos y evitarnos un marañero de cables a diferencia de otros protocolos.
Muchos de los sensores que se manejan actualmente ya contienen una gran cantidad de registros ( que muchas veces no se utilizan, pero igual entre más mejor :S ), esto dificulta un poco el poder obtener los datos que necesitamos y si a esto le sumamos que sea algún nuevo sensor, del cual no se encuentre información útil por eso San arduino es tan amado en el prototipado XD, Supongamos que no ahí alguna librería valida para el sensor TMP007, y necesitamos utilizarlo.
En lo personal para el prototipado les recomiendo arduino pues es intuitivo, da rápido entendimiento y la comunidad es grande, abierta y les encanta ayudar Win!!
Suponinedo el ambiente anterior nos encontraremos con 3 cosas:

  1.  Un programa nuevo listo para atendernos y divertirnos06.1
  2. Una gran taza de café, y mente abierta                           06.2
  3. Y un datasheet y/o mapa de registros en ingles ( si el 99% están en ingles si tienes mala suerte     estará en alemán o chino)

Sin títulso

Ahora comienza lo divertido, puesto que comenzamos a crear nuestro propio programa, lo primero es identificar los registros necesarios, en caso de que no tengamos ni idea de cuales vamos a utilizar, y para no confundirnos, recomiendo decláralos todos, con lo cual nos quedaría algo así:

#include 
 
#define TMP007_VOBJ       0x00
#define TMP007_TDIE       0x01
#define TMP007_CONFIG     0x02
#define TMP007_TOBJ       0x03
#define TMP007_STATUS     0x04
#define TMP007_STATMASK   0x05
 
#define TMP007_CFG_RESET    0x8000
#define TMP007_CFG_MODEON   0x1000
#define TMP007_CFG_1SAMPLE  0x0000
#define TMP007_CFG_2SAMPLE  0x0200
#define TMP007_CFG_4SAMPLE  0x0400
#define TMP007_CFG_8SAMPLE  0x0600
#define TMP007_CFG_16SAMPLE 0x0800
#define TMP007_CFG_ALERTEN  0x0100
#define TMP007_CFG_ALERTF   0x0080
#define TMP007_CFG_TRANSC   0x0040
 
#define TMP007_STAT_ALERTEN 0x8000
#define TMP007_STAT_CRTEN   0x4000
 
#define TMP007_I2CADDR 0x40
#define TMP007_DEVID 0x1F

 
Ya lo siguiente que tenemos que hacer es irnos al data correspondiente y buscar como inicializarlos, casi siempre los fabricantes te anexas un seudocódigo, diagrama de flujo o por lo menos una explicación de cómo se debe inicializar correctamente, en el caso de este sensor, desde la pagina 15 nos explica lo que necesitamos para su correcto funcionamiento, aquí ya no solo dependemos de la programación que tengamos, sino que también de su configuración física, para el tmp007 podemos configurarlo desde la dirección 0x40 a la 0x47 como dirección I2C de dispositivo

Sin título

En este caso dejamos la dirección 0x40 esto quiere decir que los pines de ADR1 Y ADR0 están a tierra.

Ya después de aclarado esto seguimos con la iniciación:

Lo primero que haremos será “despertar “ al sensor y decirle “¡¡Hey tú, Si tú, te hablo a ti!!””

 

void setup() {
Wire.begin();
 
}
 
void loop() {
// paso 1
Wire.beginTransmission(TMP007_I2CADDR); // Comenzamos la comunicacion con el dispositivo
 
Wire.write(TMP007_CONFIG); // Enviamos la direccion de degistro que nos intereza manejar (en este caso la configuracion)
Wire.write(TMP007_CFG_MODEON | TMP007_CFG_ALERTEN | TMP007_CFG_TRANSC|TMP007_CFG_16SAMPLE>>8);  // escribimos los valores que vamos a  configurar y los recorremos (devido a que manejamos16 bits
Wire.write(TMP007_CFG_MODEON | TMP007_CFG_ALERTEN |
TMP007_CFG_TRANSC|TMP007_CFG_16SAMPLE);  // enviamos la otra parte de informacion
 
// ´paso 1.1
Wire.beginTransmission(TMP007_I2CADDR);
Wire.write(TMP007_STATMASK); // Enviamos la direccion de degistro que nos intereza manejar (en este caso la la mascara)
Wire.write(TMP007_STAT_ALERTEN |TMP007_STAT_CRTEN>>8);
Wire.write(TMP007_STAT_ALERTEN |TMP007_STAT_CRTEN);

 

Después de habar inicializado nuestro sensor, ahora viene lo que nos interesa, aunque cabe aclarar, que no todos los sensores inician igual, así que les recomiendo leer muy detenidamente el data de cada sensor.

Ya seguimos con la segunda parte y la que más nos interesa, como leer los datos del sensor:

//paso 2
// aqui leemos el temperatura objeto
Wire.beginTransmission(TMP007_I2CADDR);           // Nos comunicamos con el dispositivo ya configurado
Wire.write(TMP007_TOBJ);                           // Accedemos al regitro que queremos leer
Wire.endTransmission();
Wire.beginTransmission(TMP007_I2CADDR);
Wire.requestFrom(TMP007_I2CADDR, (uint8_t)2);    // nos comunicamos y le decimos al sensor que esperaremos 1 dato de 2 bits
ret = Wire.read();                               // recibo data 1
ret <<= 8;                                      // se hace corrimiento
ret |= Wire.read(); // receive DATA             // se recibe el 2 dato
Wire.endTransmission(); // end transmission     // termina transmision
 
// paso 2.1
// Lemos la raw de temperatura
Wire.beginTransmission(TMP007_I2CADDR);           // Nos comunicamos con el dispositivo ya configurado
Wire.write(TMP007_TDIE);                           // Accedemos al regitro que queremos leer
Wire.endTransmission();
Wire.beginTransmission(TMP007_I2CADDR);
Wire.requestFrom(TMP007_I2CADDR, (uint8_t)2);    // nos comunicamos y le decimos al sensor que esperaremos 1 dato de 2 bits
ret2 = Wire.read();                               // recibo data 1
ret2 <<= 8;                                      // se hace corrimiento
ret2 |= Wire.read(); // receive DATA             // se recibe el 2 dato
Wire.endTransmission(); // end transmission     // termina transmision

Leemos los 2 datos que suelen interesarnos más,

Ya con esto tenemos nuestros datos, ahora como estamos prototipando ocupamos saber que estamos leyendo, para eso utilizamos nuestro puerto serial, como también volvemos al data, para saber cómo convertir los datos RAW en datos entendibles y al hacer eso nuestro código quedaría algo así:

// paso 3
ret  *= 0.03125;  //para convertir a celcius
ret2 *= 0.03125;
 
Serial.print("Tobj = "); Serial.print(ret); Serial.println(" C");
Serial.print("TDIe = "); Serial.print(ret2); Serial.println(" C");
 
}

Ya al notar que hemos logrado configurar el sensor, y hemos aprendido a manejarlos ya podemos gritar ¡¡ ÉXITO!! Hemos sobrevivido a un sensor desconocido

Ahora solo queda organizar el código y muy recomendable; crear una biblioteca propia, para poder acceder más fácil a nuestro nuevo sensor ya configurado 🙂

les anexo el link de el datasheet del sensor tmp007

la biblioteca del Tmp 007 hecha por adfruit

Éxitos y saludos a todos

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *