Come scansionare l'indirizzo I2C in ESPTOP 10 usando Arduino IDE

Come scansionare l'indirizzo I2C in ESPTOP 10 usando Arduino IDE
ESP32 è una piattaforma basata su microcontroller in grado di interfacciarsi con diversi dispositivi per controllare i diversi output in base all'ingresso. Tutti i protocolli di comunicazione come UART, SPI e I2C svolgono un ruolo significativo nella comunicazione ESP32. Discuteremo di un circuito integrato o protocollo di comunicazione I2C in questa guida e come scansionare un indirizzo di un dispositivo.

Introduzione alla comunicazione I2C

I2C in alternativa noto come I2C o IIC è un protocollo di comunicazione sincrono master-slave in cui un dispositivo master di segnale può controllare diversi dispositivi slave su un singolo filo (linea SDA).

I2C Combina il funzionamento dei protocolli UART e SPI Ad esempio SPI supporta più dispositivi di slave controllano su un singolo master, i2c supporta anche questo, d'altra parte, UART utilizza TX e RX a due righe per la comunicazione i2C utilizza anche SDA e SCL a due righe per comunicazione.

Qui possiamo vedere che abbiamo usato resistori pull -up con entrambe le linee SDA, SCL. Questo perché per impostazione predefinita I2C emette solo due livelli di circuito basso o aperto. Per impostazione predefinita, I2C su tutti i chip è in modalità circuito aperto, quindi per tirarli in alto abbiamo usato una resistenza di pull-up.

Di seguito sono riportate le due righe che i2c usa:

  • SDA (dati seriali): Linea per trasmettere e ricevere dati dal master a slave e viceversa
  • SCL (orologio seriale): Linea di segnale di clock per selezionare un dispositivo slave specifico

ESP32 I2C Bus Interfaces

ESP32 presenta due interfacce bus i2c utilizzando quale comunicazione i2c viene eseguita come master o slave a seconda del dispositivo che è interfacciato con ESP32. Secondo la scheda tecnica ESP32 l'interfaccia SCHET I2C ESP32 supporta la seguente configurazione:

  • Comunicazione Modalità I2C standard alla velocità di 100 kbit/s
  • Comunicazione I2C in modalità veloce o avanzata a velocità di 400 kbit/s
  • Modalità di indirizzamento a doppio indirizzazione a 7 bit e 10 bit
  • Gli utenti possono controllare l'interfaccia I2C programmando i registri dei comandi
  • L'interfaccia del bus I2C ESP32 è più flessibile nel controllo

Collegamento dei dispositivi I2C con ESP32

I dispositivi di interfaccia con ESP32 usando il protocollo i2c sono molto semplici proprio come UART abbiamo solo bisogno di due righe per collegare SDA e la linea di clock SCL.

ESP32 può essere configurato come in modalità master e slave.

ESP32 I2C MASTER MODE

In questa modalità ESP32 genera un segnale di clock che avvia la comunicazione con dispositivi slave collegati.

I due pin GPIO in ESP32 che sono predefiniti per la comunicazione I2C:

  • SDA: Pin GPIO 21
  • SCL: Pin GPIO 22

ESP32 I2C Modalità slave

In modalità slave l'orologio viene generato dal dispositivo principale. Master è l'unico dispositivo che guida la linea SCL nella comunicazione I2C. Gli schiavi sono i dispositivi che rispondono al padrone ma non possono avviare un trasferimento di dati. Nel bus ESP32 I2C solo il master può avviare il trasferimento di dati tra i dispositivi.

L'immagine mostra due schede ESP32 nella configurazione di Master-Slave.

A partire da ora abbiamo capito il funzionamento della modalità I2C in ESP32 ora possiamo facilmente trovare l'indirizzo I2C di qualsiasi dispositivo caricando il codice dato.

Come scansionare l'indirizzo I2C in ESP32 usando Arduino IDE

Trovare l'indirizzo I2C dei dispositivi connessi con ESP32 è importante perché se stiamo usando dispositivi con lo stesso indirizzo I2C, non possiamo comunicare con loro su una singola linea di bus.

Ogni dispositivo I2C deve contenere un indirizzo univoco e l'indirizzo varia da 0 a 127 o (0 a 0x7f) in esadecimale. Ad esempio, se stiamo usando due display OLED dello stesso numero di modello o prodotto avranno entrambi lo stesso indirizzo I2C, quindi non possiamo usare entrambi sulla stessa linea I2C in ESP32.

Per trovare un indirizzo IC facciamo un esempio.

Schema

L'immagine sotto mostra il diagramma schematico dell'interfaccia del display OLED con la scheda ESP32 utilizzando il protocollo di comunicazione I2C.

La connessione di ESP32 con OLED include:

Display OLED ESP32 PIN
VCC 3v3/vin
GND GND
SCL GPIO 22
SDA GPIO 21

Codice
Apri Arduino Editor e caricamento il codice di scansione I2C fornito nella scheda ESP32. Assicurati che ESP32 sia collegato e che la porta COM sia selezionata.

/***************
****************
Linuxhint.com
****************
****************/
#include /*libreria filo inclusa* /
void setup ()
Filo.inizio(); /*Inizia la comunicazione i2c*/
Seriale.Inizia (115200); /*Tasso di baud definito per la comunicazione seriale*/
Seriale.println ("\ NI2C Scanner"); /*Stampa scanner sul monitor seriale*/

void loop ()
Errore byte, indirizzo;
int ndevices;
Seriale.println ("scansione ..."); /*ESP32 inizia la scansione disponibili dispositivi I2C*/
nDevices = 0;
per (indirizzo = 1; indirizzo < 127; address++ ) /*for loop to check number of devices on 127 address*/
Filo.BeginTransmission (indirizzo);
errore = filo.endTransmission ();
if (errore == 0) /*se il dispositivo i2c è stato trovato* /
Seriale.print ("dispositivo i2c trovato all'indirizzo 0x");/*Stampa questa riga se il dispositivo I2C è stato trovato*/
if (indirizzo<16)
Seriale.print ("0");

Seriale.println (indirizzo, esadecimale); /*stampa il valore esagonale dell'indirizzo I2C*/
ndevices ++;

else if (errore == 4)
Seriale.print ("Errore sconosciuto all'indirizzo 0x");
if (indirizzo<16)
Seriale.print ("0");

Seriale.println (indirizzo, esadecimale);


if (nDevices == 0)
Seriale.println ("no i2c dispositivi trovati \ n"); /*Se nessun dispositivo I2C è legato Stampa questo messaggio*/

altro
Seriale.println ("done \ n");

ritardo (5000); /*Ritardo fornito per il controllo del bus i2c ogni 5 sec*/

Il codice sopra scansionerà per i dispositivi i2c disponibili. Codice avviato chiamando la libreria Wire per la comunicazione i2c. La prossima comunicazione seriale viene avviata utilizzando il tasso di baud.

Nella parte del loop del codice di scansione I2C due nomi delle variabili, errore E indirizzo Sono definiti. Queste due variabili archiviano l'indirizzo i2c dei dispositivi. Il prossimo a loop è inizializzato che scansionerà l'indirizzo I2C a partire da 0 a 127 dispositivi.

Dopo aver letto l'indirizzo I2C, l'uscita viene stampata sul monitor seriale in formato esadecimale.

Hardware

Qui possiamo vedere l'OLED 0.Il display I2C da 96 pollici è collegato alla scheda ESP32 su GPIO PIN 21 e 22. VCC e GND del display sono collegati con ESP32 3v3 e GND PIN.

Produzione
Nell'output possiamo vedere l'indirizzo I2C del display OLED collegato alla scheda ESP32. Qui l'indirizzo I2C è 0x3c, quindi non possiamo usare nessun altro dispositivo I2C con lo stesso indirizzo per questo dobbiamo modificare prima l'indirizzo I2C di quel dispositivo.

Abbiamo ottenuto con successo l'indirizzo I2C del display OLED collegato alla scheda ESP32.

Conclusione

Trovare un indirizzo I2C durante la connessione di più dispositivi con ESP32 è importante poiché i dispositivi che condividono lo stesso indirizzo I2C non possono essere collegati su un singolo bus i2c. L'uso del codice sopra si può identificare l'indirizzo I2C e se l'indirizzo di due dispositivi corrispondono può essere modificato di conseguenza a seconda delle specifiche del dispositivo.