Todos los dispositivos que se comunican a través del protocolo I2C poseen una dirección hexadecimal única, y cada mensaje y orden que transmitimos al bus, lleva anexa esta dirección, indicando cuál de los muchos posibles, es el receptor del mensaje.
Esto implica que sabemos la dirección del componente. Lo normal es comprobar la información técnica del fabricante del componente, y ahí suele decirnos cuál es la dirección por defecto. Pero es posible que tengamos un dispositivo sin documentación, para ello hay un programa para Arduino que nos informa de lo que hay en nuestro bus y con qué dirección.
Los dispositivos, a su vez permiten que los últimos tres bits de dicha dirección hexadecimal puedan ser modificados. Generalmente se encuentran como pads A0, A1 y A2, los cuales se pueden cerrar con soldadura para así expresar hasta 8 posibles direcciones distintas.
Para averiguar la dirección hexadecimal del dispositivo a revisar conectar el en arduino en los puertos SCL y SDA, cargar y ejecutar el siguiente programa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } |
Después de cargar el programa, abrimos el monitor serial y si todo está bien se empezará a mostrar el o los dispositivos seriales conectados con su dirección hexadecimal. Sin embargo se recomienda primero hacerlo con un dispositivo conectado a la vez.
Conclusión
Este pequeño programa resulta de gran utilidad para encontrar y comprobar el bus serial I2C, sobre todo con dispositivos con los que a veces no se cuenta con fichas técnicas.
Referencias (en inglés):
- Arduino Playground i2c_scanner
https://playground.arduino.cc/Main/I2cScanner - Wire Library
https://www.arduino.cc/en/Reference/Wire