jeudi 21 janvier 2021

[I2C] Scanner d'adresses

 Lors de l'ajout d'un module I2C, il est nécessaire de connaitre l'adresse de ce dernier. La majeure partie du temps, cette adresse est fournie dans la datasheet constructeur. Toutefois, cela peut arriver quelle soit manquante.

L'idée est de pouvoir scanner les 128 adresses possibles sur le bus pour trouver celle de notre module.

Il existe de nombreux documents expliquant le principe. 

Principe du scanner I2C

Afin de trouver l'adresse de notre module, nous allons le connecter, seul, à l'Arduino comme suit.


Le programme sera le suivant (celui ci fonctionne plutôt bien).
Attention, il fait appel à la librairie "Wire.h".
/ ---------------------------------------------------------------- /
// Arduino I2C Scanner
// Re-writed by Arbi Abdul Jabbaar
// Using Arduino IDE 1.8.7
// Using GY-87 module for the target
// Tested on 10 September 2019
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
/ ---------------------------------------------------------------- /

#include <Wire.h> //include Wire.h library

void setup()
{
  Wire.begin(); // Wire communication begin
  Serial.begin(9600); // The baudrate of Serial monitor is set in 9600
  while (!Serial); // Waiting for Serial Monitor
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address; //variable for error and I2C 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 the next I2C scan
}

Le résultat des adresses détectées sur le ou les module(s) raccordés l’Arduino seront affichées dans le moniteur série de l’IDE.

Aucun commentaire:

Enregistrer un commentaire