«

»

Lug 13

Stampa Articolo

I2C scanner

Scopri quale indirizzo ha il tuo componente con l’I2C scanner. Se ti è capitato di acquistare prodotti e shield funzionanti in I2C ti sarai trovato difronte a questo dilemma: qual’è l’indirizzo con cui posso scambiare informazioni ?

I2C scanner

Il protocollo I2C è usato per il controllo di periferiche multiple grazie alla sua caratteristica di connettività semplice, bifilare, che consente di connettere con soli 2 fili ( oltre all’alimentazione ) fino a 112 periferiche slave ( leggi wikipedia )

In pratica ciascuna periferica connessa al bus I2C ha un proprio indirizzo definito dal costruttore o da te se la shield ti consente di farlo, ad esempio alcune shield per arduino presentano una serie di ponticelli destinati alla codifica dell’indirizzo su cui la stessa periferica deve rispondere.

Il problema dell’indirizzo e l’I2C scanner

Se la tua periferica o sensore I2C non presenta la possibilità di essere configurata e/o il produttore della shield non ha rilasciato documentazione sufficiente a trovarlo o dedurlo il problema è che non puoi utilizzare la periferica o devi provare tutti gli indirizzi dei, 112 non riservati, alla ricerca di quello corretto del tuo dispositivo.

Oppure puoi usare lo sketch che ho trovato nel playgroung arduino, che si rivela sempre una fonte di informazioni utilissime.

Lo riporto per descriverlo nel dettaglio:

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  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("Unknow 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
}

alla linea 28: includi la libreria Wire per la comunicazione I2C;

linea 33: inizializza la comunicazione I2C con il metodo begin della Wire;

linee 35-36: inizializza la comunicazione seriale e scrivi a video il messaggio “I2C Scanner”;

linee 42-43: definisci le variabili che ti serviranno nella scanzione delle periferiche;

linea 45: scrivi sul monitor seriale;

linea 47: imposta a 0 il numero di device prima di iniziare la scansione delle periferiche;

linea 48: imposta un ciclo da 1 a 127, gli effettivi indirizzi previsti dal protocollo I2C, di cui 14 riservati, estremi esclusi;

linea 53: per ciascun indirizzo del ciclo for definito alla linea 48 inizia una trasmissione sull’indirizzo corrispondente;

linea 54: chiudi la comunicazione sul medesimo indirizzo assegnando il return code in fase di chiusura alla variabile error, su cui eseguirai il test per comprendere se la comunicazione è andata a buon fine;

linee 56-65: se il codice di ritorno in fase di endTransmission() è 0 l’I2C scanner ha trovato la tua periferica e ti scrive a video l’indirizzo corrente e corrispondente alla periferica stessa. Infine incrementa la variabile nDevices per il controllo alle linee successive;

linee 66-72: se il codice di errore è 4 ti scrive a video “Unknow error at address 0x” + l’indirizzo corrente come non riconosciuto dalla periferica a cui lo ha inviato mediante I2C scanner;

nota che manca un else in quanto non è necessario compiere alcuna operazione per tutti quegli indirizzi, corretti dal punto di vista i2C ma su cui non risponde alcuna periferica slave;

linee 74-77: se al termine del ciclo for il numero di periferiche è uguale a 0 (  nDevices == 0 ) vuol dire che I2C scanner non ha trovato alcuna periferica slave connessa all’I2C nel range di indirizzi da 1 a 127;

linea 79: tra un ciclo ed il successivo di loop() attendi 5 secondi.

Se la tua periferica è connessa ed ha uno o più indirizzi validi dovresti leggere sul monitor seriale un messaggio simile a questo:

I2C scanner serial monitor

Nel mio epserimento ho connesso ad arduino un 10DOF ( accellerometro, giroscopio, magnetometro e altimetro ) che presenta 3 chip differenti già cablati in i2C sui seguenti indirizzi ( riporto dal sito del produttore ):

I2C scanner address

in cui come vedi corrispondono perfettamente a quelli individuati dall’I2C scanner infatti:

decimale 105 -> hex 69

decimale 119 -> hex 77

decimale 30 -> hex 1E

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/i2c-scanner.html

2 comments

  1. danilo

    ciao bell’articolo, una informazione, provo questo sketch su arduino nano e quando collego su a4 e a5 il display i2c mi resta bloccato, non restituisce ne errori ne indirizzo… che può essere? grazie

    1. Mauro Alfieri

      Ciao Danilo,
      se hai provato ad invertire i collegamenti tra A4 ed A5 e provato altre periferiche I2C con Arduino Nano potrebbe essere danneggiato il display o non avere uno standard IIC

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>