Saturday, March 9, 2013

Escaneando o barramento I2C do Arduino

Prototipar circuitos I2c não é uma das tarefas mais fáceis para usuários do Arduino. As vezes estamos quebrando a cabeça tentando fazer nossos programas funcionarem sem ao menos termos certeza se o dispositivo está funcionando corretamente ou devidamente conectado no barramento. Outra situação ruim é quando não temos certeza do endereço do dispositivo.

Article's English version: Scanning Arduino's I2C Bus.

Tentando me ver livre desses problemas eu escrevi uma ferramenta para me dizer todos os dispositivos que estão devidamente conectados no barramento I2C. Dê uma olhada no cógido a seguir:

#include <Wire.h>

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  
  byte Return;
  
  Serial.println("Scanning I2C bus...");
  for(byte I2CAddress = 1; I2CAddress <= 127; I2CAddress++)
  {
    Serial.print("0x");
    if (I2CAddress<16)
      Serial.print("0");
    Serial.print(I2CAddress, HEX);
    Serial.print(" (");
    if (I2CAddress<10)
      Serial.print("  ");
    else if (I2CAddress<100)
      Serial.print(" ");
    Serial.print(I2CAddress);
    Serial.print("): ");
    
    Wire.beginTransmission(I2CAddress);
    Return = Wire.endTransmission();
    
    if (Return == 0)
      Serial.print("OK!");
    else
      Serial.print("   ");
      
    if (I2CAddress % 5)
      Serial.print("    ");
    else
      Serial.println();
  }
}

void loop() { }

Esse código é simples e usa a biblioteca Wire padrão do Arduino. As únicas coisas a fazer são: copiar e coligar o código em um novo projeto, enviar para a placa Arduino e finalmente ver o que o serial monitor te mostra (não se esqueça de definir a mesma velocidade da porta do código fonte). Veja o exemplo abaixo:


Esse exemplo mostra dois dispositivos conectados no barramento:
  • 0x38: O endereço de um dispositivo do tipo smart battery (OpenUPS), o que o fabricante disse que seria 0x70. Eu suponho que essa diferença seja devido ao fabricante estar considerando o bit TWGCE no seu endereço master.;
  • 0x68: Um dispositivo RTC DS1307.
Espero que isso seja útil! ;)

2 comments:

  1. Muito bom. Extremamente útil. Estava com problemas pra identificar o enderenço de um RTC. Vlww

    ReplyDelete