In questo tutorial vedremo come ricavare gli indirizzi degli slave i2c da usare nei vari sketch.
Gli indirizzi i2c solitamente vengono stabiliti dal costruttore, ma alcuni componenti ci danno la possibilità di modificare l’indirizzo tramite dei ponticelli destinati appunto alla codifica dell’indirizzo.
Quando i componenti non hanno modo di modificare il loro indirizzo o il datasheet non fornisce abbastanza informazioni, possiamo ricavare l’indirizzo tramite uno sketch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/*HOBBYEIDDE Trovare l’indirizzo I2C hobbyeidee.altervista.org */ #include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); Serial.println(" Scanner I2C"); } void loop(){ byte error, address; int nDevices; Serial.println("Scansione in corso...."); nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("L'inirizzo del dispositivo è: 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Errore sconosciuto all'indirizzo: 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("Nessun dispositivo I2C trovato "); else Serial.println("Fatto"); delay(5000); } |
Analizziamo lo sketch, per capire il funzionamento.
1 2 3 4 5 6 7 8 9 10 |
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println(" Scanner I2C"); } |
Includiamo la libreria Wire, per le comunicazioni i2c.
All’interno del setup, inizializziamo la comunicazione i2c, tramite comando Wire.begin().
Inizializziamo il monitor seriale per poter leggere i risultati sul display virtuale dell’Ide di Arduino e stampiamo la dicitura “Scanner I2C”.
1 2 3 4 5 6 7 8 9 10 11 12 |
void loop(){ byte error, address; int nDevices; Serial.println("Scansione in corso...."); nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); |
All’interno del loop, definiamo le variabili che serviranno per la scansione, inseriamo un avviso di inizio scansione “Scansione in corso….”.
Impostiamo a 0 il numero dei Device prima di iniziare la scansione.
Inseriamo un ciclo for da 1 a 127, cioè gli effettivi indirizzi previsti dal protocollo i2c.
Attiviamo la trasmissione per ciascun indirizzo che crea il ciclo for.
Chiudiamo la trasmissione allo stesso indirizzo.
1 2 3 4 5 6 7 8 9 10 |
if (error == 0) { Serial.print("L'inirizzo del dispositivo è: 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } |
Creiamo un if, questo riporterà sul monitor seriale l’indirizzo del dispositivo, se a fine trasmissione avremo un codice di ritorno uguale a 0.
Inoltre incrementa di 1 la variabile nDevice, per continuare il controllo.
1 2 3 4 5 6 7 8 |
else if (error==4) { Serial.print("Errore sconosciuto all'indirizzo: 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } |
Se il codice di errore è uguale a 4, viene riportato a video “Errore sconosciuto all’indirizzo: 0x”, oltre all’indirizzo corrente.
1 2 3 4 5 6 7 |
if (nDevices == 0) Serial.println("Nessun dispositivo I2C trovato "); else Serial.println("Fatto"); delay(5000); } |
Aggiungiamo un secondo if, questo verrà utilizzato nel caso in cui nDevice sarà 0, questo indica che lo scanner non ha trovato alcuna periferica slave connessa negli indirizzi da 1 a 127.
Inseriamo una pausa di 5 secondi prima del nuovo ciclo.