Liste des adresses I2C les plus courantes
Nano: A4 (SDA), A5 (SCL)
Uno: A4 (SDA), A5 (SCL)
Méga2650: 20 (SDA), 21 (SCL)
. ____ ___ ____ ____
/ ___| ___ __ _ _ __ |_ _| |___ \ / ___|
\___ \ / __| / _` | | '_ \ | | __) | | |
___) | | (__ | (_| | | | | | | | / __/ | |___
|____/ \___| \__,_| |_| |_| |___| |_____| \____|
Debut du scan
Address:0x00> MMMM .... .... .... .... .... .... ....
Address:0x08> .... .... .... .... .... .... .... ....
Address:0x10> .... .... .... .... .... .... .... ....
Address:0x18> .... .... .... .... .... .... .... ....
Address:0x20> .... .... .... .... .... .... .... 0x27
Address:0x28> .... .... .... .... .... .... .... ....
Address:0x30> .... .... .... .... .... .... .... ....
Address:0x38> .... .... .... .... 0x3C .... .... ....
Address:0x40> .... .... .... .... .... .... .... ....
Address:0x48> .... .... .... .... .... .... .... ....
Address:0x50> .... .... .... .... .... .... .... ....
Address:0x58> .... .... .... .... .... .... .... ....
Address:0x60> .... .... .... .... .... .... .... ....
Address:0x68> 0x68 .... .... .... .... .... .... ....
Address:0x70> .... .... .... .... .... .... 0x76 ....
Address:0x78> .... .... .... .... .... .... .... ....
Fin du Scan
4 peripheriques reconnus.
Appuyez sur le bouton Reset de l'Arduino pour recommencer.
/* SCANNER I2C Version 2.01 --------------------------------------------
Scan le bus i2c a la recherche de peripheriques.
Scan des adresses 1 (0x01) a 127 (0x7F)
L'adresse 0 (reservee) est simulee et non lue.
Affichage du resultat en grille de 16 lignes de 8 colonnes (16x8=128).
L'affichage de chaque adresse est signalee par :
- son adresse en hexadecimale (0x00) si elle est occupee,
- 4 dieses (####) si elle est occupee par un peripherique en defaut
- 4 points (....) si elle est inoccupee,
Un resume indique, en fin de programme, le nombre de peripheriques trouves
et, eventuellement, le nombre de peripheriques en defaut.
Pour refaire un scan, il suffit d'appuyer sur le bouton Reset car :
- tout le code est dans la fonction setup()
- la fonction loop() n'est pas utilisee
Ameliorations possibles :
- Affichage en hexadecimal des adresses en defaut
- Affichage des adresses en hexadecimmal et des valeurs de retour
de la fonction Wire.endTransmission()
- Affichage du type de peripherique detecte
- ...
----------------------------------------------------------------------*/
#include <Wire.h> /* Indispensable pour la gestion de l'I2C */
void setup()
{
/* Les variables du programme */
byte adresse; /* variables de gestion des adresses */
byte resultat; /* Variable de retour d'interrogation d'une adresse */
byte nb_existe = 0; /* compteur de peripheriques trouves */
byte nb_defaut = 0; /* compteur de peripheriques en defaut */
Wire.begin(); /* Initialise le bus i2C */
Serial.begin(57600); /* Initialise le port serie */
/* Petite banniere en ASII... juste pour le fun
Veuillez bien recopier les lignes ci-dessous pour un affichage correct
PS: n'oubliez pas que le \ doit etre precede d'un \ pour son affichage */
Serial.println(" ____ ___ ____ ____ ");
Serial.println(" / ___| ___ __ _ _ __ |_ _| |___ \\ / ___|");
Serial.println(" \\___ \\ / __| / _` | | '_ \\ | | __) | | | ");
Serial.println(" ___) | | (__ | (_| | | | | | | | / __/ | |___ ");
Serial.println(" |____/ \\___| \\__,_| |_| |_| |___| |_____| \\____|");
Serial.println();
Serial.println("\nDebut du scan"); /* Affiche un saut de ligne puis le debut du scan */
/* Debut de la grille d'affichage ou on simule l'adresse 0 par 4 points (.... )
car elle est reservee par les fabriquants pour des fonctions speciales.
PS: le tableau est decale d'une tabulation pour une meilleure lisibilite */
Serial.print("Address:0x00> \tMMMM ");
/* Demarre le scan */
for (adresse = 1; adresse < 128; adresse++ )
/* Il y a 128 adresses disponibles au maximun (de 0 a 127)
rappel : on ne teste pas l'adresse 0 (voir ci-dessus) */
{
Wire.beginTransmission(adresse); /* Commence une transmission a l'adresse indiquee */
resultat = Wire.endTransmission();
/* resultat = statut de la transmission :
0 : succès (peripherique OK)
1 : donnée trop longue pour le buffer d'émission (erreur)
2 : NACK reçu sur l'adresse de transmission (pas de peripherique)
3 : NACK reçu sur la transmission de donnée (pas de peripherique)
4 : autre erreur (erreur donc...) */
/* POUR TEST UNIQUEMENT : (on a pas forcement de peripherique en defaut sous la main)
* Decommenter une ou les lignes ci-dessous pour simuler un ou plusieurs peripherique en defaut
* Adaptez les adresses (de 1 a 127) en fonction de votre configuration
* Adapter les resultats en fonction du traitement que vous envisagez */
//if (adresse == 17) resultat = 4; /* simule une erreur autre que 1,2 ou 3 */
//if (adresse == 93) resultat = 1; /* simule une erreur de données */
/* Traitement du resultat */
if (resultat == 0) /* Il y a un peripherique OK a cette adresse */
{
/* Mise en forme et affichage de l'adresse du peripherique en Hexadecimal */
if (adresse < 16)Serial.print("0x0");
else Serial.print("0x");
Serial.print(adresse, HEX);
Serial.print(" ");
nb_existe++; /* Increment le nombre de peripheriques trouves */
}
else if ((resultat == 4) || (resultat == 1)) /* Indication d'un peripherique en defaut */
{
Serial.print("#### ");
nb_existe++; /* Increment le nombre de peripheriques trouves */
nb_defaut++; /* Incremente le nombre de peripheriques en defaut */
}
else Serial.print(".... ");/* adresse inoccupee */
/* resultat = 2 ou 3 (NAK) -> pas de reponse d'un peripherique*/
/* Decommentez la ligne ci-dessous si vous avez des erreurs de lecture */
//delay(25); /* temps d'attente pour ne pas generer d'erreur de lecture */
if (((adresse + 1) % 8) == 0) /* Pour formatage de l'affichage en 8 colonnes */
/* le +1 c'est parce que l'on part de l'adresse 1 et non de l'adresse 0 */
{
Serial.println(); /* Passage a la ligne apres avoir affiche 8 adresses */
if (adresse < 127) {
Serial.print("Address:");
Serial.print(adresse+1 < 16 ? "0x0" : "0x");
Serial.print(adresse+1, HEX);
Serial.print("> ");
Serial.print("\t");
}
/* tabulation pour la mise en forme de l'affichage sauf apres la derniere adresse */
}
/* Fin du traitement du resultat et passage a l'adresse suivante */
}
/* Fin du scan */
Serial.println("Fin du Scan\n");
/* Affichage des resultats complementaires **/
if (nb_existe == 0)Serial.println("Aucun peripherique I2C !"); /* Pas de peripherique I2c */
else
{
/* Affichage d'un resume sous la forme :
X peripherique(s) reconnu(s).
ou
X peripherique(s) reconnu(s) dont X peripherique(s) en defaut.
avec gestion des pluriels et du point terminal */
Serial.print(nb_existe); /* nombre de peripheriques I2c reconnus */
if (nb_existe < 2)Serial.print(" peripherique reconnu"); /* affichage pour un seul */
else Serial.print(" peripheriques reconnus"); /* affichage pour plusieurs */
if (nb_defaut != 0) /* S'il y a des peripheriques en defaut */
{
Serial.print(" dont "); /* poursuit la phrase de resume */
Serial.print(nb_defaut); /* Nombre de peripheriques en defaut */
if (nb_defaut < 2)Serial.println(" peripherique en defaut."); /* affichage pour un seul */
else Serial.println(" peripheriques en defaut."); /* affichage pour plusieurs */
}
else Serial.println("."); /* Termine la phrase par un point s'il n'y a pas de peripherique en defaut */
}
/* Message de fin de scan */
Serial.println("\nAppuyez sur le bouton Reset de l'Arduino pour recommencer.\n");
Serial.println(); /* Saut de ligne supplémentaire */
}
void loop()
{
/* Rien ici car tout s'execute dans le setup ! */
}