Como escanear endereço I2C no ESP32 usando Arduino IDE
|Neste guia, irá aprender como encontrar o endereço de dispositivos I2C com o ESP32 programado usando o Arduino IDE.
ESP32 é uma plataforma baseada em microcontrolador que pode interagir com vários dispositivos para controlar diferentes saídas de acordo com a entrada. Todos os protocolos de comunicação como UART, SPI e I2C desempenham um papel significativo na comunicação ESP32. Discutiremos o protocolo de comunicação Inter Integrated Circuit ou I2C neste guia e como escanear um endereço de um dispositivo.
Introdução à Comunicação I2C
I2C, também conhecido como I2C ou IIC, é um protocolo de comunicação mestre-escravo síncrono, onde um dispositivo mestre de sinal pode controlar vários dispositivos escravos por meio de um único fio (linha SDA).
O I2C combina o funcionamento dos protocolos UART e SPI, por exemplo, o SPI suporta o controle de vários dispositivos escravos sobre um único mestre. O I2C também suporta isso. Por outro lado, o UART usa TX e Rx de duas linhas para comunicação. O I2C também usa SDA e SCL de duas linhas para comunicação.
Aqui podemos ver que usamos resistores pull up com ambas as linhas SDA e SCL. Isso ocorre porque, por padrão, o I2C só emite dois níveis de LOW ou circuito aberto. Por padrão, o I2C em todos os chips está no modo de circuito aberto, então, para puxá-los para HIGH, usamos um resistor pull-up.
A seguir estão as duas linhas que o I2C usa:
- SDA (Serial Data) : Linha para transmitir e receber dados do mestre para o escravo e vice-versa
- SCL (Serial Clock) : Linha de sinal de clock para selecionar um dispositivo escravo específico
Interfaces de barramento I2C ESP32
O ESP32 apresenta duas interfaces de barramento I2C usando as quais a comunicação I2C é realizada como mestre ou escravo, dependendo do dispositivo que está interligado ao ESP32. De acordo com a folha de dados do ESP32, a interface I2C da placa ESP32 suporta a seguinte configuração:
- Comunicação I2C de modo padrão a uma taxa de 100 Kbit/s
- Comunicação I2C de modo rápido ou avançado a uma velocidade de 400 Kbit/s
- Modo de endereçamento duplo de 7 bits e 10 bits
- Os usuários podem controlar a interface I2C programando os registradores de comando
- A interface de barramento I2C ESP32 é mais flexível no controle
Conectando dispositivos I2C com ESP32
A interface de dispositivos com o ESP32 usando o protocolo I2C é muito simples, assim como o UART, precisamos apenas de duas linhas para conectar o SDA e a linha de clock SCL.
O ESP32 pode ser configurado tanto no modo Mestre quanto no modo Escravo.
Modo Mestre ESP32 I2C
Neste modo, o ESP32 gera um sinal de clock que inicia a comunicação com os dispositivos escravos conectados.
Os dois pinos GPIO no ESP32 que são pré-definidos para comunicação I2C:
- SDA : GPIO PIN 21
- SCL : PINO GPIO 22
Modo escravo ESP32 I2C
No modo escravo, o clock é gerado pelo dispositivo mestre. O mestre é o único dispositivo que aciona a linha SCL na comunicação I2C. Os escravos são os dispositivos que respondem ao mestre, mas não podem iniciar uma transferência de dados. No barramento I2C do ESP32, apenas o mestre pode iniciar a transferência de dados entre os dispositivos.
A imagem mostra duas placas ESP32 em configuração mestre-escravo.
Agora que entendemos o funcionamento do modo I2C no ESP32, podemos encontrar facilmente o endereço I2C de qualquer dispositivo enviando o código fornecido.
Compre O ESP32 clicando neste link.
Como escanear endereço I2C no ESP32 usando Arduino IDE
Encontrar o endereço I2C dos dispositivos conectados com o ESP32 é importante porque se estivermos usando dispositivos com o mesmo endereço I2C, não poderemos nos comunicar com eles por meio de uma única linha de barramento.
Cada dispositivo I2C deve conter um endereço exclusivo e o intervalo de endereços de 0 a 127 ou (0 a 0X7F) em HEX. Por exemplo, se estivermos usando dois displays OLED do mesmo número de modelo ou produto, ambos terão o mesmo endereço I2C, então não podemos usar ambos na mesma linha I2C no ESP32.
Para encontrar um endereço IC, vamos dar um exemplo.
Esquemático
A imagem abaixo mostra o diagrama esquemático da interface do display OLED com a placa ESP32 usando o protocolo de comunicação I2C.
A conexão do ESP32 com OLED inclui:
OLED Display | ESP32 Pin |
---|---|
VCC | 3V3/VIN |
GND | GND |
SCL | GPIO 22 |
SDA | GPIO 21 |
Código
Abra o editor Arduino e carregue o código de escaneamento I2C fornecido na placa ESP32. Certifique-se de que o ESP32 esteja conectado e a porta COM esteja selecionada.
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 |
#include <Wire.h> /*Wire library Included*/ void setup() { Wire.begin(); /*I2C Communication begins*/ Serial.begin(115200); /*Baud Rate defined for serial communication*/ Serial.println("\nI2C Scanner"); /*print scanner on serial monitor*/ } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); /*ESP32 starts scanning available I2C devices*/ nDevices = 0; for(address = 1; address < 127; address++ ) { /*for loop to check number of devices on 127 address*/ Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { /*if I2C device found*/ Serial.print("I2C device found at address 0x");/*print this line if I2C device found*/ if (address<16) { Serial.print("0"); } Serial.println(address,HEX); /*prints the HEX value of I2C 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"); /*If no I2C device attached print this message*/ } else { Serial.println("done\n"); } delay(5000); /*Delay given for checking I2C bus every 5 sec*/ } |
O código acima fará a varredura dos dispositivos I2C disponíveis. O código começou chamando a biblioteca wire para comunicação I2C. A próxima comunicação serial é iniciada usando a taxa de transmissão.
Na parte do loop do código de escaneamento I2C, dois nomes de variáveis, erro e endereço, são definidos. Essas duas variáveis armazenam o endereço I2C dos dispositivos. Em seguida, um loop for é inicializado para escanear o endereço I2C começando de 0 a 127 dispositivos.
Saída
Na saída, podemos ver o endereço I2C do display OLED conectado à placa ESP32. Aqui, o endereço I2C é 0X3C, então não podemos usar nenhum outro dispositivo I2C com o mesmo endereço, para isso temos que alterar o endereço I2C desse dispositivo primeiro.