Paano I-scan ang I2C Address sa ESP32 Gamit ang Arduino IDE

Paano I Scan Ang I2c Address Sa Esp32 Gamit Ang Arduino Ide



Ang ESP32 ay isang microcontroller-based na platform na maaaring mag-interface sa ilang device para makontrol ang iba't ibang output ayon sa input. Ang lahat ng mga protocol ng komunikasyon tulad ng UART, SPI at I2C ay may mahalagang papel sa komunikasyon ng ESP32. Tatalakayin natin ang Inter Integrated Circuit o I2C communication protocol sa gabay na ito at kung paano mag-scan ng address ng isang device.

Panimula sa I2C Communication

Ang I2C na kahalili na kilala bilang I2C o IIC ay isang synchronous master-slave communication protocol kung saan ang isang signal master device ay maaaring makontrol ang maraming bilang ng mga slave device sa isang wire (SDA line).

Pinagsasama ng I2C ang pagtatrabaho ng mga protocol ng UART at SPI halimbawa ang SPI ay sumusuporta sa maramihang mga slave device na kontrol sa isang master, sinusuportahan din ito ng I2C sa kabilang banda, ang UART ay gumagamit ng dalawang-linya na TX at Rx para sa komunikasyon I2C ay gumagamit din ng dalawang-linya na SDA at SCL para sa komunikasyon.









Dito makikita natin na gumamit tayo ng mga pull up resistors na may parehong mga linya ng SDA, SCL. Ito ay dahil sa default, ang I2C ay naglalabas lamang ng dalawang antas ng alinman sa LOW o open circuit. Bilang default, ang I2C sa lahat ng chips ay nasa open circuit mode kaya para hilahin ang mga ito HIGH gumamit kami ng pull-up resistor.



Ang sumusunod ay ang dalawang linya na ginagamit ng I2C:





  • SDA (Serial Data) : Linya upang magpadala at tumanggap ng data mula sa master hanggang sa alipin at vice versa
  • SCL (Serial Clock) : Linya ng signal ng orasan para pumili ng partikular na slave device

Mga Interface ng ESP32 I2C Bus

Nagtatampok ang ESP32 ng dalawang interface ng I2C bus na ginagamit ang komunikasyong I2C bilang master o slave depende sa device na naka-interface sa ESP32. Ayon sa ESP32 datasheet ang ESP32 board I2C interface ay sumusuporta sa sumusunod na pagsasaayos:

  • Standard mode I2C na komunikasyon sa bilis na 100 Kbit/s
  • Mabilis o advanced na mode I2C na komunikasyon sa bilis na 400 Kbit/s
  • Dual addressing mode 7-bit at 10-bit
  • Maaaring kontrolin ng mga user ang interface ng I2C sa pamamagitan ng pagprograma ng mga rehistro ng command
  • Ang ESP32 I2C bus interface ay mas nababaluktot sa pagkontrol

Pagkonekta ng mga I2C Device gamit ang ESP32

Ang pag-interfacing ng mga device na may ESP32 gamit ang I2C protocol ay napakasimple tulad ng UART kailangan lang namin ng dalawang linya para ikonekta ang SDA at ang linya ng orasan ng SCL.



Maaaring i-configure ang ESP32 bilang pareho sa Master at Slave mode.

ESP32 I2C Master Mode

Sa mode na ito, ang ESP32 ay bumubuo ng isang clock signal ay ginagamit na nagpapasimula ng komunikasyon sa mga konektadong slave device.

Ang dalawang GPIO pin sa ESP32 na paunang tinukoy para sa komunikasyon ng I2C:

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

ESP32 I2C Slave Mode

Sa slave mode ang orasan ay nabuo ng master device. Ang Master ay ang tanging device na nagtutulak sa linya ng SCL sa komunikasyon ng I2C. Ang mga alipin ay ang mga device na tumutugon sa master ngunit hindi makapagpasimula ng paglilipat ng data. Sa ESP32 I2C bus lamang ang master ang makakapagsimula ng paglipat ng data sa pagitan ng mga device.

Ipinapakita ng larawan ang dalawang ESP32 board sa master-slave configuration.

Sa ngayon ay naunawaan na namin ang paggana ng I2C mode sa ESP32 ngayon madali naming mahanap ang I2C address ng anumang device sa pamamagitan ng pag-upload ng ibinigay na code.

Paano I-scan ang I2C Address sa ESP32 Gamit ang Arduino IDE

Ang paghahanap ng I2C address ng mga konektadong device na may ESP32 ay mahalaga dahil kung gumagamit kami ng mga device na may parehong I2C address, hindi kami maaaring makipag-ugnayan sa kanila sa isang linya ng bus.

Ang bawat I2C device ay dapat maglaman ng natatanging address at ang hanay ng address mula 0 hanggang 127 o (0 hanggang 0X7F) sa HEX. Halimbawa, kung gumagamit kami ng dalawang OLED na display ng parehong numero ng modelo o produkto ay magkakaroon ng parehong I2C address kaya hindi namin magagamit ang pareho sa parehong linya ng I2C sa ESP32.

Para makahanap ng IC address, kumuha tayo ng halimbawa.

Schematic

Ang larawan sa ibaba ay nagpapakita ng schematic diagram ng OLED display interfacing sa ESP32 board gamit ang I2C communication protocol.

Kasama sa koneksyon ng ESP32 sa OLED ang:

OLED Display ESP32 Pin
VCC 3V3/VIN
GND GND
SCL GPIO 22
SDA GPIO 21

Code
Buksan ang Arduino editor at i-upload ang ibinigay na I2C scanning code sa ESP32 board. Tiyaking nakakonekta ang ESP32, at napili ang COM port.

/****************
*****************
linuxhint.com
*****************
*****************/

#include  /*Wire library Kasama*/

walang bisang setup ( ) {
Kawad.magsimula ( ) ; /* Nagsisimula ang I2C Communication */
Serial.magsimula ( 115200 ) ; /* Tinukoy ang Baud Rate para sa serial na komunikasyon */
Serial.println ( ' \n I2C Scanner' ) ; /* print scanner sa serial monitor */
}

walang laman na loop ( ) {
byte error, address;
int nDevices;
Serial.println ( 'Nag-scan...' ) ; /* Nagsisimula ang ESP32 sa pag-scan ng mga available na I2C device */
nMga Device = 0 ;
para sa ( address = 1 ; address < 127 ; address++ ) { /* para sa loop upang suriin ang bilang ng mga device na naka-on 127 address */
Wire.beginTransmission ( address ) ;
error = Wire.endTransmission ( ) ;
kung ( error == 0 ) { /* kung Nahanap ang I2C device */
Serial.print ( 'Nahanap ang I2C device sa address 0x' ) ; /* i-print ang linyang ito kung Nahanap ang I2C device */
kung ( address < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( address, HEX ) ; /* ini-print ang halaga ng HEX ng I2C address */
nMga Device++;
}
iba pa kung ( pagkakamali == 4 ) {
Serial.print ( 'Hindi kilalang error sa address 0x' ) ;
kung ( address < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( address, HEX ) ;
}
}
kung ( nMga Device == 0 ) {
Serial.println ( 'Walang nakitang I2C device \n ' ) ; /* Kung walang nakalakip na I2C device i-print ang mensaheng ito */
}
iba pa {
Serial.println ( 'tapos na \n ' ) ;
}
pagkaantala ( 5000 ) ; /* Ibinigay ang pagkaantala para sa sinusuri ang I2C bus bawat 5 sec */
}

I-scan ng code sa itaas ang mga available na I2C device. Nagsimula ang code sa pamamagitan ng pagtawag sa wire library para sa komunikasyon ng I2C. Ang susunod na serial communication ay sinimulan gamit ang baud rate.

Sa loop na bahagi ng I2C scanning code dalawang variable na pangalan, pagkakamali at address ay tinukoy. Iniimbak ng dalawang variable na ito ang I2C address ng mga device. Susunod na ang isang for loop ay sinisimulan na mag-ii-scan para sa I2C address simula 0 hanggang 127 na mga device.

Pagkatapos basahin ang I2C address ang output ay naka-print sa serial monitor sa HEX format.

Hardware

Dito makikita natin ang OLED 0.96-inch I2C display ay konektado sa ESP32 board sa GPIO pins 21 at 22. Ang Vcc at GND ng display ay konektado sa ESP32 3V3 at GND pin.

Output
Sa output makikita natin ang I2C address ng OLED display na konektado sa ESP32 board. Narito ang I2C address ay 0X3C kaya hindi namin magagamit ang anumang iba pang I2C device na may parehong address para sa na kailangan naming baguhin ang I2C address ng device na iyon muna.

Matagumpay naming nakuha ang I2C address ng OLED display na konektado sa ESP32 board.

Konklusyon

Ang paghahanap ng I2C address habang nagkokonekta ng maraming device gamit ang ESP32 ay mahalaga dahil ang mga device na may parehong I2C address ay hindi maaaring konektado sa isang I2C bus. Gamit ang code sa itaas, matutukoy ng isa ang I2C address at kung magkatugma ang address ng alinmang dalawang device, maaari itong baguhin nang naaayon depende sa mga detalye ng device.