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 }
Aucun commentaire:
Enregistrer un commentaire