Com escanejar l'adreça I2C a ESP32 mitjançant Arduino IDE

Com Escanejar L Adreca I2c A Esp32 Mitjancant Arduino Ide



ESP32 és una plataforma basada en microcontroladors que pot interactuar amb diversos dispositius per controlar diferents sortides segons l'entrada. Tots els protocols de comunicació com UART, SPI i I2C tenen un paper important en la comunicació ESP32. En aquesta guia parlarem del protocol de comunicació Inter Integrated Circuit o I2C i de com escanejar una adreça d'un dispositiu.

Introducció a la comunicació I2C

I2C, alternativament conegut com I2C o IIC, és un protocol de comunicació mestre-esclau síncron on un dispositiu mestre de senyal pot controlar múltiples dispositius esclaus a través d'un sol cable (línia SDA).

I2C combina el funcionament dels protocols UART i SPI, per exemple, SPI admet el control de múltiples dispositius esclaus sobre un sol mestre, I2C també admet això, d'altra banda, UART utilitza TX i Rx de dues línies per a la comunicació I2C també utilitza SDA i SCL de dues línies per comunicació.









Aquí podem veure que hem utilitzat resistències pull up amb dues línies SDA i SCL. Això es deu al fet que, per defecte, I2C només emet dos nivells de circuit obert o BAIX. Per defecte, l'I2C de tots els xips està en mode de circuit obert, de manera que per tirar-los ALTA hem utilitzat una resistència pull-up.



A continuació es mostren les dues línies que utilitza I2C:





  • SDA (dades en sèrie) : Línia per transmetre i rebre dades de mestre a esclau i viceversa
  • SCL (rellotge sèrie) : línia de senyal de rellotge per seleccionar un dispositiu esclau específic

Interfícies de bus ESP32 I2C

L'ESP32 compta amb dues interfícies de bus I2C amb les quals la comunicació I2C es realitza com a mestre o esclau, depenent del dispositiu que està connectat amb ESP32. Segons el full de dades ESP32, la interfície I2C de la placa ESP32 admet la configuració següent:

  • Comunicació I2C en mode estàndard a una velocitat de 100 Kbit/s
  • Comunicació I2C en mode ràpid o avançat a una velocitat de 400 Kbit/s
  • Mode d'adreçament dual 7 bits i 10 bits
  • Els usuaris poden controlar la interfície I2C programant els registres d'ordres
  • La interfície de bus ESP32 I2C és més flexible en el control

Connexió de dispositius I2C amb ESP32

La interfície de dispositius amb ESP32 mitjançant el protocol I2C és molt senzill, igual que UART, només necessitem dues línies per connectar SDA i la línia de rellotge SCL.



L'ESP32 es pot configurar tant en mode mestre com en mode esclau.

Mode Mestre ESP32 I2C

En aquest mode, l'ESP32 genera un senyal de rellotge que inicia la comunicació amb els dispositius esclaus connectats.

Els dos pins GPIO a ESP32 que estan predefinits per a la comunicació I2C:

  • SDA : GPIO PIN 21
  • SCL : PIN GPIO 22

Mode esclau ESP32 I2C

En mode esclau, el rellotge el genera el dispositiu mestre. Master és l'únic dispositiu que condueix la línia SCL en comunicació I2C. Els esclaus són els dispositius que responen al mestre però que no poden iniciar una transferència de dades. Al bus ESP32 I2C només el mestre pot iniciar la transferència de dades entre dispositius.

La imatge mostra dues plaques ESP32 en configuració mestre-esclau.

A partir d'ara hem entès el funcionament del mode I2C a ESP32, ara podem trobar fàcilment l'adreça I2C de qualsevol dispositiu carregant el codi donat.

Com escanejar l'adreça I2C a ESP32 mitjançant Arduino IDE

Trobar l'adreça I2C dels dispositius connectats amb ESP32 és important perquè si utilitzem dispositius amb la mateixa adreça I2C, no podem comunicar-nos amb ells mitjançant una única línia de bus.

Cada dispositiu I2C ha de contenir una adreça única i l'interval d'adreces de 0 a 127 o (0 a 0X7F) en HEX. Per exemple, si utilitzem dues pantalles OLED del mateix número de model o producte, totes dues tindran la mateixa adreça I2C, de manera que no podem utilitzar totes dues a la mateixa línia I2C a ESP32.

Per trobar una adreça IC, prenguem un exemple.

Esquemàtic

La imatge següent mostra un diagrama esquemàtic de la interfície de la pantalla OLED amb la placa ESP32 mitjançant el protocol de comunicació I2C.

La connexió de l'ESP32 amb OLED inclou:

Pantalla OLED PIN ESP32
VCC 3V3/VIN
GND GND
SCL GPIO 22
SDA GPIO 21

Codi
Obriu l'editor Arduino i carregueu el codi d'escaneig I2C donat a la placa ESP32. Assegureu-vos que l'ESP32 estigui connectat i que el port COM estigui seleccionat.

/***************
****************
Linuxhint.com
****************
****************/

#include  /*Biblioteca de cable inclosa*/

configuració de buit ( ) {
Wire.begin ( ) ; /* Comença la comunicació I2C */
Serial.begin ( 115200 ) ; /* Velocitat en baudis definida per comunicació en sèrie */
Serial.println ( ' \n Escàner I2C' ) ; /* escàner d'impressió al monitor sèrie */
}

bucle buit ( ) {
error de bytes, adreça;
int nDispositius;
Serial.println ( 'Escanejant...' ) ; /* L'ESP32 comença a escanejar els dispositius I2C disponibles */
nDispositius = 0 ;
per ( adreça = 1 ; adreça < 127 ; adreça++ ) { /* per bucle per comprovar el nombre de dispositius activats 127 adreça */
Wire.beginTransmission ( adreça ) ;
error = Wire.endTransmission ( ) ;
si ( error == 0 ) { /* si S'ha trobat un dispositiu I2C */
Impressió.sèria ( 'Dispositiu I2C trobat a l'adreça 0x' ) ; /* imprimiu aquesta línia si S'ha trobat un dispositiu I2C */
si ( adreça < 16 ) {
Impressió.sèria ( '0' ) ;
}
Serial.println ( adreça, HEX ) ; /* imprimeix el valor HEX de l'adreça I2C */
nDispositius++;
}
altra cosa si ( error == 4 ) {
Impressió.sèria ( 'Error desconegut a l'adreça 0x' ) ;
si ( adreça < 16 ) {
Impressió.sèria ( '0' ) ;
}
Serial.println ( adreça, HEX ) ;
}
}
si ( nDispositius == 0 ) {
Serial.println ( 'No s'han trobat dispositius I2C \n ' ) ; /* Si no hi ha cap dispositiu I2C connectat, imprimiu aquest missatge */
}
altra cosa {
Serial.println ( 'fet \n ' ) ;
}
retard ( 5000 ) ; /* Retard donat per comprovant el bus I2C cada 5 sec */
}

El codi anterior buscarà els dispositius I2C disponibles. El codi va començar trucant a la biblioteca de cables per a la comunicació I2C. La següent comunicació en sèrie s'inicia utilitzant la velocitat de transmissió.

A la part del bucle del codi d'escaneig I2C dos noms de variables, error i adreça estan definits. Aquestes dues variables emmagatzemen l'adreça I2C dels dispositius. A continuació, s'iniciarà un bucle for que buscarà l'adreça I2C a partir de 0 a 127 dispositius.

Després de llegir l'adreça I2C, la sortida s'imprimeix al monitor sèrie en format HEX.

Maquinari

Aquí podem veure que la pantalla OLED I2C de 0,96 polzades està connectada a la placa ESP32 als pins GPIO 21 i 22. Vcc i GND de la pantalla estan connectats amb ESP32 3V3 i pin GND.

Sortida
A la sortida podem veure l'adreça I2C de la pantalla OLED connectada a la placa ESP32. Aquí l'adreça I2C és 0X3C, per la qual cosa no podem utilitzar cap altre dispositiu I2C amb la mateixa adreça per això primer hem de canviar l'adreça I2C d'aquest dispositiu.

Hem obtingut amb èxit l'adreça I2C de la pantalla OLED connectada amb la placa ESP32.

Conclusió

Trobar una adreça I2C mentre connecteu diversos dispositius amb ESP32 és important, ja que els dispositius que comparteixen la mateixa adreça I2C no es poden connectar a través d'un únic bus I2C. Utilitzant el codi anterior es pot identificar l'adreça I2C i si l'adreça de dos dispositius coincideix, es pot canviar en conseqüència depenent de les especificacions del dispositiu.