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

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

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

4 commenti

1 ping

Vai al modulo dei commenti

    • danilo il 21 Aprile 2018 alle 10:30
    • Rispondi

    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. 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

    • Giuiseppe il 21 Giugno 2018 alle 13:34
    • Rispondi

    Buongiorno Mauro sto uscendo pazzo per la scrittura di uno sketch che faccia le seguenti operazioni:
    1) legge dei parametri i quali vengono trasmessi tramite Bluetooth;
    2) imposta il passo di rotazione di un motore passo passo in base al parametro passato precedentemente con Bluetooth;
    3) lancia un una stringa ad una periferica seriale;
    4) legge la risposta dalla periferica digitale;
    5) scrive il dato su scheda sd;
    6) trasmette il dato su Bluetooth.
    Mi puoi aiutare sono disposto anche a ricompensati

    1. Ciao Giuseppe,
      quale di queste periferiche utilizza I2C ? il bluetooth ?
      Non conosco la tua conoscenza di arduino e programmazione ma mi sembra che il progetto sia alquanto semplice nel concetto ma complesso per il numero ed il tipo delle componenti in gioco.
      Se vuoi io eseguo progetti su commissione come descritto nella sezione “Collabora al Blog” scrivendomi sulla casella info del blog stesso.

  1. […] che attesti su quale indirizzo è stato configurato ho provveduto ad utilizzare lo sketch: I2c Scanner di Arduino ed ho ottenuto come risposta sul monitor […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.