banner

O que os engenheiros fazem quando não sabem...



O que eu faço quando não sei alguma coisa? Geralmente eu crio uma ferramenta que me ajude a explorar aquilo que eu desconheço. Então, hoje, trago um exemplo de uma aplicação com ESP32 capaz de identificar os dispositivos I2C conectados. Isso pode ser necessário em inúmeras circunstâncias. Como que eu faço para descobrir o endereço? Confira nesse vídeo!




RECURSOS USADOS

·         ESP32 (30 pinos)
·         SSD1306 0.96 inch I2C OLED display
·         Módulo Bússola Eletrônica HMC5883L
·         Conversor AD (ADC) ADS1115 16-Bit
·         Protoboard
·         Jumpers





MONTAGEM

 

As ligações dos dispositivos I2C (Display, bússola e conversor AD) usados neste exemplo seguem o mesmo padrão indicado pela tabela abaixo.





MONITOR SERIAL






CÓDIGO

Declarações e variáveis

// Biblioteca do driver i2c
#include <driver/i2c.h>

// Pinos I2C do ESP32
#define SDA_PIN 18
#define SCL_PIN 19


Setup e Loop

void setup()
{
  // Iniciamos a velocidade da Serial
  Serial.begin(115200);

  // Exibimos "Starting..." na Serial
  Serial.println("\nStarting...");
  
  // Executamos a função de escaneamento i2c
  i2c_scanner();

  // Exibimos "Done" na Serial
  Serial.println("Done"); 
}

void loop()
{

}


Fluxograma

Função i2c_scanner()




i2c_scanner


// Função que obtém o endereço do componente i2c conectado nos pinos SDA_PIN e SCL_PIN.
// Enviamos uma solicitação de início (i2c_master_start) e parada (i2c_master_stop) para cada um dos endereços possíveis (de 0x00 a 0x78) no barramento i2c.
// Os dispositivos que estão presentes retornam com um sinal ACK (acknowledgement / reconhecimento) como resposta.
// Essa função pode ser usada para detectar se o dispositivo está ou não devidamente se comunicando com o ESP32, assim como seu respectivo endereço.
// Os endereços são exibidos na saída do monitor serial.
void i2c_scanner()
{
  // Flag que indica se foi possível efetuar a comunicação com o dispositivo (dispositivo encontrado)
  bool deviceFound = false;

  // Configuração dos pinos SDA_PIN e SCL_PIN
 i2c_config_t conf;
 conf.mode = I2C_MODE_MASTER;
 conf.sda_io_num = (gpio_num_t)SDA_PIN;
 conf.scl_io_num = (gpio_num_t)SCL_PIN;
 conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
 conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
  // Configuração de velocidade do clock
 conf.master.clk_speed = 100000;
 i2c_param_config(I2C_NUM_0, &conf);



  // Após inicializarmos a configuração, o próximo passo é instalar o driver I2C chamando i2c_driver_install()
 i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);

  // Variável do tipo 'esp_err_t' que receberá um código de erro ou de sucesso
 esp_err_t espRc; 
 for (int i=3; i< 0x78; i++) 
  {
    // De acordo com o manual da espressif, devemos criar um "command link" antes de enviarmos qualquer comando para o I2C master
  i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  i2c_master_start(cmd);
  i2c_master_write_byte(cmd, (i << 1) | I2C_MASTER_WRITE, 1 /* espera-se o sinal ack */);
  i2c_master_stop(cmd);

    // Enviamos o comando "cmd" para o I2C master, que por sua vez retornará os dados recebidos do slave para nossa variável "espRc"
  espRc = i2c_master_cmd_begin(I2C_NUM_0, cmd, 10/portTICK_PERIOD_MS);
    



    // Se diferente de zero significa que foi possível se comunicar com o dispositivo (spi slave) e obter seu endereço
    if(espRc == 0) 
    {
      // Exibimos no monitor serial o endereço correspondente ao dispositivo i2c
      Serial.printf("---> 0x%.2x\n", i);
      // Setamos nossa flag como true indicando dispositivo encontrado
      deviceFound = true;
    }   
    // Liberamos/desalocamos a memória préviamente alocada por "i2c_cmd_link_create"
  i2c_cmd_link_delete(cmd);
 }

  // Se não foi encontrado nenhum dispositivo exibimos erro na Serial
  if(!deviceFound)
    Serial.println("[No devices detected]");
}





Faça o download dos arquivos:




Um comentário:

Tecnologia do Blogger.