Analizador de bus I2C para Arduino, busca y lista que dispositivos I2C están conectados al bus.

Cuando utilizamos nuevos dispositivos con bus I2C  en nuestro Arduino, muchas veces no tenemos los datos de la dirección del dispositivo, otras veces un mismo dispositivo, por ejemplo el display 1602 (2 líneas de 16 caracteres), podemos encontrarlo con dos direcciones diferentes, dependiendo  del fabricante y además otros dispositivos las direcciones son configurables por el mismo usuario.

Con este sencillo sketch para Arduino, puedes comprobar todos los dispositivos activos conectados al bus I2C, esto es de gran ayuda, sobre todo, porque ademas de saber las direcciones de los dispositivos I2C conectados, nos podemos asegurar que están funcionando correctamente.

El funcionamiento es muy sencillo, basta cargar el código en nuestro Arduino y ejecutarlo, en nuestro monitor serie obtendremos un listado con todas las direcciones utilizadas y activas.

Analiza el bus I2C entre las direcciones from_addr y to_addr, en cada dirección, llama a la función de devolución de llamada con la dirección y el resultado. Si el resultado == 0, no se encontró la dirección, de lo contrario, se encontró un dispositivo en la dirección.

/**
* I2CScanner.pde -- I2C bus scanner for Arduino
*
* 2009, Tod E. Kurt, http://todbot.com/blog/
* 2013, km82.com modified
*/

#include "Wire.h"
extern "C" {
#include "utility/twi.h" // from Wire library, so we can do bus scanning
}

// Analiza el bus I2C entre las direcciones from_addr y to_addr.
// En cada dirección, llama a la función de devolución de llamada con la dirección y el resultado.
// Si el resultado == 0, no se encontró la dirección, de lo contrario, se encontró la dirección
// (Se puede utilizar potencialmente para obtener resultados cualquier otra condición en el bus I2C, ver twi.c)
// Asume que Wire.begin() ya ha sido llamado
void scanI2CBus(byte from_addr, byte to_addr,
void(*callback)(byte address, byte result) )
{
byte rc;
byte data = 0; // not used, just an address to feed to twi_writeTo()
for( byte addr = from_addr; addr <= to_addr; addr++ ) {
rc = twi_writeTo(addr, &data, 0, 1,0);
callback( addr, rc );
}
}

// Se llama cuando la dirección se encuentra en scanI2CBus()
// No dude en cambiar esto como sea necesario
// (Por ejemplo la adición de código de comunicación I2C para averiguar qué tipo de dispositivo I2C es)
void scanFunc( byte addr, byte result ) {
Serial.print("addr: ");
Serial.print(addr,HEX);
Serial.print( (result==0) ? " found!":" ");
Serial.print( (addr%4) ? "\t":"\n");
}
byte start_address = 1;
byte end_address = 100;

// standard Arduino setup()
void setup()
{
Wire.begin();

Serial.begin(9600);
Serial.println("\nI2CScanner ready!");

Serial.print("starting scanning of I2C bus from ");
Serial.print(start_address,DEC);
Serial.print(" to ");
Serial.print(end_address,DEC);
Serial.println("...");

// Inicia el análisis, se llama a "scanFunc()" con el resultado de cada dirección
scanI2CBus( start_address, end_address, scanFunc );

Serial.println("\ndone");
}

// standard Arduino loop()
void loop()
{
// No hay nada que hacer aquí, así que sólo veremos el parpadeo del LED integrado
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}

Una página imprescindible

2 pensamientos en “Analizador de bus I2C para Arduino, busca y lista que dispositivos I2C están conectados al bus.”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Eres humano? pon el resultado * Time limit is exhausted. Please reload CAPTCHA.