Introdução à comunicação I2C
O i2C conhecido como i2c ou iiC é um protocolo de comunicação síncrono-escravo mestre-escravo, onde um dispositivo mestre de sinal pode controlar o número múltiplo de dispositivos escravos em 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 comunicação.
Aqui podemos ver que usamos resistores de puxar com as duas linhas SDA, SCL. Isso ocorre porque, por padrão, o I2C gera apenas dois níveis de circuito baixo ou aberto. Por padrão, o I2C em todos os chips está no modo de circuito aberto, para puxá-los alto, usamos um resistor de pull-up.
A seguir, as duas linhas i2C usam:
Esp32 I2C Bus Interfaces
O ESP32 apresenta duas interfaces de barramento i2C usando a comunicação I2C é realizada como mestre ou escravo, dependendo do dispositivo, que é interface com o ESP32. De acordo com a folha de dados ESP32, a interface da placa ESP32 I2C suporta a configuração seguinte:
Conectando dispositivos I2C com ESP32
Os dispositivos de interface com ESP32 usando o protocolo I2C são muito simples, exatamente como o UART, precisamos apenas de duas linhas para conectar o SDA e a linha do relógio SCL.
O ESP32 pode ser configurado como no modo mestre e escravo.
Esp32 I2C Master Modo
Nesse modo.
Os dois pinos GPIO no ESP32 que são predefinidos para a comunicação I2C:
Esp32 I2C Modo de escravo
No modo escravo, o relógio é gerado pelo dispositivo mestre. Master é 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 ESP32 I2C, apenas o mestre pode iniciar a transferência de dados entre dispositivos.
A imagem mostra duas placas ESP32 na configuração de escravos mestre.
A partir de agora, entendemos o funcionamento do modo I2C no ESP32 agora, podemos encontrar facilmente o endereço I2C de qualquer dispositivo, enviando o código fornecido.
Como digitalizar o endereço I2C no ESP32 usando o 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 podemos nos comunicar com eles em 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 hexadecimal. Por exemplo, se estivermos usando dois monitores OLED do mesmo número ou produto do modelo, ambos terão o mesmo endereço I2C, para que não possamos usar os dois na mesma linha i2C no ESP32.
Para encontrar um endereço IC, vamos dar um exemplo.
Esquemático
Abaixo da imagem mostra o diagrama esquemático de interface com tela OLED com a placa ESP32 usando o I2C Communication Protocol.
A conexão do ESP32 com OLED inclui:
Tela OLED | PIN ESP32 |
---|---|
VCC | 3v3/vin |
Gnd | Gnd |
SCL | GPIO 22 |
SDA | GPIO 21 |
Código
Open Arduino Editor e faça o upload do código de digitalização I2C fornecido na placa ESP32. Verifique se o ESP32 está conectado e a porta COM está selecionada.
/*****************
******************
Linuxhint.com
******************
****************/
#include /*biblioteca de arame incluída* /
Void Setup ()
Arame.começar(); /*I2C A comunicação começa*/
Serial.começar (115200); /*Taxa de transmissão definida para comunicação serial*/
Serial.println ("\ ni2c scanner"); /*Print Scanner no monitor serial*/
Void Loop ()
erro de byte, endereço;
Int ntevices;
Serial.println ("Digitalização ..."); /*ESP32 inicia a digitalização de dispositivos i2c disponíveis*/
ndevices = 0;
para (endereço = 1; endereço < 127; address++ ) /*for loop to check number of devices on 127 address*/
Arame.BEGNTRANSMISSÃO (ENDEREÇO);
erro = fio.ENDTRANSMISSÃO ();
if (error == 0) /*se o dispositivo i2c encontrado* /
Serial.print ("dispositivo i2c encontrado no endereço 0x");/*imprima esta linha se o dispositivo i2c encontrado*/
if (endereço<16)
Serial.print ("0");
Serial.println (endereço, hex); /*Imprime o valor hexadecimal do endereço i2C*/
ndevices ++;
else if (error == 4)
Serial.print ("Erro desconhecido no endereço 0x");
if (endereço<16)
Serial.print ("0");
Serial.println (endereço, hex);
if (ndevices == 0)
Serial.println ("não dispositivos I2C encontrados \ n"); /*Se nenhum dispositivo I2C anexou esta mensagem*/
outro
Serial.println ("feito \ n");
atraso (5000); /*Atraso dado para verificar o barramento I2C a cada 5 segundos*/
O código acima vai digitalizar os dispositivos I2C disponíveis. O código começou ligando para a biblioteca de arames 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 varredura 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, é inicializado um loop que digitalizará o endereço I2C a partir de 0 a 127 dispositivos.
Depois de ler o endereço I2C, a saída é impressa no monitor serial em formato hexadecimal.
Hardware
Aqui podemos ver o OLED 0.A tela I2C de 96 polegadas está conectada à placa ESP32 nos pinos GPIO 21 e 22. VCC e GND da tela estão conectados com Esp32 3v3 e GND PIN.
Saída
Na saída, podemos ver o endereço I2C da tela OLED conectada à placa ESP32. Aqui, o endereço I2C é 0x3C, por isso não podemos usar nenhum outro dispositivo I2C com o mesmo endereço, para que tenhamos que alterar o endereço I2C desse dispositivo primeiro.
Obtivemos com sucesso o endereço I2C da tela OLED conectada à placa ESP32.
Conclusão
Encontrar um endereço I2C enquanto conecta vários dispositivos com o ESP32 é importante, pois os dispositivos que compartilham o mesmo endereço i2C não podem ser conectados em um único barramento i2c. Usando o código acima, pode -se identificar o endereço I2C e se o endereço de dois dispositivos corresponder, ele poderá ser alterado de acordo com as especificações do dispositivo.