(le scritte in verde permettono di attivare un link di contesto se vi si clikka sopra)        04 Giugno 2021
Pagina ecologica no pubblicità no scherzetti no virus no messaggi subliminali


Mi è capitato, acquistando dei dispositivi con protocollo di comunicazione del tipo I2C, che apparentemente non funzionavano.
Dopo verifiche e ricerche ho scoperto che erano dei cloni cinesi con il chip leggermente diverso, indirizzi di rete I2C diverso e
registi coi dati in posizione di memoria diversi. Me ne sono accorto perché osservando con una lente d'ingrandimento la sigla
dell'integrato cambiava di una lettera rispetto l'originale.

Ora vi propongo questo semplice programma per Arduino e Wemos, in grado di testare i vostri dispositivi I2C indicandovi
l'indirizzo di rete a cui rispondono. Ovviamente la rete I2C è stata ideata per poter mettere in parallelo più dispositivi, si realizza
con soli due fili, uno per la sincronizzazione e uno per i dati, più l'alimentazione che di norma è consigliata a 3,3 volt.
I problemi li ho avuti con dei sensori per il campo magnetico  HMC5883L il cui clone è QMC5883L poi ho testato il GY273
il Mag3110 il MPU6050 per poi decidermi sul MPU9250 e il modello con anche gli accelerometri MPU92/65.
Di seguito lo schematico del collegamento tra Arduino e il sensore MPU9250

La linea di sincronismo SCL è collegata al pin A5 mentre quella dei dati SDA al pin A4.
Nella configurazione Wemos D1, che integra il WIFI è più veloce ed ha più memoria, SCL si collega a D3 e SDA al pin D4.
 

Quando si usano più dispositive in parallelo alla linea I2C potrebbero servire delle resistenze di Pull-down.

 

Dopo aver cablato la  parte Hardware serve caricare la parte Software.
Ora colleghiamo la scheda Arduino o Wemos al PC tramite un cavetto USB.
Per prima cosa avviamo il programma Arduino e controlliamo il numero della porta com assegnata alla scheda dal menù
Strumenti->porta, per caricare il programma ScannerI2C.ino serve averlo precedentemente scaricato da questo link.
Sconpattate il file .zip compresa la directory che ha lo stesso nome e dal menù File->apri selezionate il file ScannerI2C.ino
verrà visualizzato il programma nella finestra, caricatelo sulla scheda clikkando il menù, tondo con freccia a destra di Arduino.
Nel dubbio rivedetevi le indicazioni già date per l'uso del sistema di sviluppo per caricare il programma su Arduino.
Di seguito il listato.

 // --------------------------------------
// 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.
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
// Su Arduino UNO le linee di comnicazione I2C sono:
// SCL su A5 e SDA su A4
// Su Wemos D1 SCL su D3 e SDA su D4
//

#include <Wire.h>


void setup()
{
Wire.begin();

Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
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.print(" !");
Serial.println(address);

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 next scan
}

Una volta caricato il programma, possiamo leggere, tramite lo strumento "monitor seriale" i dati degli indirizzi.
Andate in Strumenti>Monitor seriale, controllare che la velocità della com sia impostata su 9600 e vi dovrebbe apparire una
schermata come questa:


 

Non mi resta che augurarvi buona sperimentazione e se avete qualche problema nella realizzazione e gestione sono disponibile
a darvi una mano.


Per contatti: