כיצד לסרוק כתובת I2C ב-ESP32 באמצעות Arduino IDE

Kyzd Lsrwq Ktwbt I2c B Esp32 B Mz Wt Arduino Ide



ESP32 היא פלטפורמה מבוססת מיקרו-בקר שיכולה להתממשק עם מספר מכשירים כדי לשלוט ביציאות שונות בהתאם לקלט. כל פרוטוקולי התקשורת כמו UART, SPI ו-I2C ממלאים תפקיד משמעותי בתקשורת ESP32. אנו נדון בפרוטוקול תקשורת Inter Integrated Circuit או I2C במדריך זה וכיצד לסרוק כתובת של התקן.

מבוא לתקשורת I2C

I2C המכונה לחילופין I2C או IIC הוא פרוטוקול תקשורת מאסטר-עבד סינכרוני שבו התקן מאסטר אות יכול לשלוט במספר רב של התקני עבדים על חוט יחיד (קו SDA).

I2C משלבים את העבודה של פרוטוקולי UART ו-SPI לדוגמא SPI תומך בשליטה במספר התקני עבד על מאסטר יחיד, I2C גם תומכים בכך מצד שני UART משתמש ב-TX דו-קו ו-Rx לתקשורת. תִקשׁוֹרֶת.









כאן אנו יכולים לראות שהשתמשנו נגדים למשוך למעלה עם שני קווי SDA, SCL. הסיבה לכך היא שכברירת מחדל, I2C מוציא רק שתי רמות של מעגל נמוך או פתוח. כברירת מחדל, I2C בכל השבבים נמצא במצב מעגל פתוח אז כדי למשוך אותם גבוה השתמשנו בנגד משיכה.



להלן שני הקווים שבהם I2C משתמש:





  • SDA (נתונים סדרתיים) : קו לשידור וקבלת נתונים מאדון לעבד ולהיפך
  • SCL (שעון סדרתי) : קו אות שעון לבחירת התקן עבד ספציפי

ESP32 I2C ממשקי אוטובוס

ESP32 כולל שני ממשקי אפיק I2C שבהם מבוצעת תקשורת I2C כמאסטר או כעבד, בהתאם למכשיר שממומשק עם ESP32. על פי גיליון הנתונים של ESP32, ממשק הלוח I2C של ESP32 תומך בתצורה הבאה:

  • תקשורת I2C במצב סטנדרטי בקצב של 100 Kbit/s
  • תקשורת I2C במצב מהיר או מתקדם במהירות של 400 Kbit/s
  • מצב כתובת כפול 7-bit ו-10-bit
  • משתמשים יכולים לשלוט בממשק I2C על ידי תכנות אוגרי הפקודות
  • ממשק האוטובוס ESP32 I2C גמיש יותר בשליטה

חיבור התקני I2C עם ESP32

התממשקות התקנים עם ESP32 באמצעות פרוטוקול I2C היא פשוטה מאוד בדיוק כמו UART אנחנו צריכים רק שני קווים כדי לחבר את SDA ואת קו השעון SCL.



ניתן להגדיר את ה-ESP32 גם במצב מאסטר וגם במצב Slave.

ESP32 I2C Master Mode

במצב זה ESP32 יוצר אות שעון משמש שמתחיל את התקשורת עם התקני עבדים מחוברים.

שני פיני GPIO ב-ESP32 המוגדרים מראש לתקשורת I2C:

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

ESP32 I2C Slave Mode

במצב עבד השעון נוצר על ידי התקן מאסטר. מאסטר הוא המכשיר היחיד שמניע את קו SCL בתקשורת I2C. עבדים הם המכשירים המגיבים למאסטר אך אינם יכולים ליזום העברת נתונים. באפיק ESP32 I2C רק המאסטר יכול ליזום העברת נתונים בין מכשירים.

התמונה מציגה שני לוחות ESP32 בתצורת מאסטר-עבד.

נכון לעכשיו, הבנו את פעולתו של מצב I2C ב-ESP32 כעת נוכל למצוא בקלות את כתובת ה-I2C של כל מכשיר על ידי העלאת הקוד הנתון.

כיצד לסרוק כתובת I2C ב-ESP32 באמצעות Arduino IDE

מציאת כתובת I2C של מכשירים מחוברים עם ESP32 חשובה מכיוון שאם אנו משתמשים במכשירים עם אותה כתובת I2C אז איננו יכולים לתקשר איתם על קו אוטובוס בודד.

כל התקן I2C חייב להכיל כתובת ייחודית וטווח הכתובות מ-0 עד 127 או (0 עד 0X7F) ב-HEX. לדוגמה, אם אנו משתמשים בשני צגי OLED מאותו מספר דגם או מוצר לשניהם תהיה אותה כתובת I2C כך שלא נוכל להשתמש בשניהם באותו קו I2C ב-ESP32.

כדי למצוא כתובת IC בואו ניקח דוגמה.

סכמטי

התמונה למטה מציגה דיאגרמה סכמטית של תצוגת OLED המתממשקת עם לוח ESP32 באמצעות פרוטוקול התקשורת I2C.

החיבור של ESP32 עם OLED כולל:

תצוגת OLED פין ESP32
VCC 3V3/VIN
GND GND
SCL GPIO 22
SDA GPIO 21

קוד
פתח את עורך Arduino והעלה את קוד הסריקה הנתון I2C בלוח ESP32. ודא שה-ESP32 מחובר ויציאת ה-COM נבחרת.

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

#include  /*ספריית חוטים כלולה*/

הגדרה בטלה ( ) {
Wire.begin ( ) ; /* תקשורת I2C מתחילה */
Serial.begin ( 115200 ) ; /* קצב בונד מוגדר ל תקשורת טורית */
Serial.println ( ' \n סורק I2C' ) ; /* הדפס סורק על צג טורי */
}

לולאה ריקה ( ) {
שגיאת בתים, כתובת;
int nDevices;
Serial.println ( 'סורק...' ) ; /* ESP32 מתחיל לסרוק התקני I2C זמינים */
nDevices = 0 ;
ל ( כתובת = 1 ; כתובת < 127 ; כתובת++ ) { /* ל לולאה כדי לבדוק את מספר המכשירים המופעלים 127 כתובת */
Wire.beginTransmission ( כתובת ) ;
error = Wire.endTransmission ( ) ;
אם ( שגיאה == 0 ) { /* אם נמצא מכשיר I2C */
Serial.print ( 'התקן I2C נמצא בכתובת 0x' ) ; /* להדפיס שורה זו אם נמצא מכשיר I2C */
אם ( כתובת < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( כתובת, HEX ) ; /* מדפיס את ערך HEX של כתובת I2C */
nDevices++;
}
אַחֵר אם ( שְׁגִיאָה == 4 ) {
Serial.print ( 'שגיאה לא ידועה בכתובת 0x' ) ;
אם ( כתובת < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( כתובת, HEX ) ;
}
}
אם ( nDevices == 0 ) {
Serial.println ( 'לא נמצאו התקני I2C \n ' ) ; /* אם לא מצורף התקן I2C הדפס הודעה זו */
}
אַחֵר {
Serial.println ( 'בוצע \n ' ) ;
}
לְעַכֵּב ( 5000 ) ; /* ניתן עיכוב ל בודק אוטובוס I2C כל 5 שניות */
}

הקוד לעיל יסרוק את מכשירי I2C הזמינים. הקוד התחיל בקריאה לספריית החוטים לתקשורת I2C. התקשורת הטורית הבאה מתחילה באמצעות קצב ה-baud.

בחלק הלולאה של קוד סריקת I2C שני שמות משתנים, שְׁגִיאָה ו כתובת מוגדרים. שני משתנים אלה מאחסנים את כתובת ה-I2C של התקנים. בשלב הבא מאתחל לולאת for שתסרוק את כתובת ה-I2C החל מ-0 עד 127 מכשירים.

לאחר קריאת כתובת I2C הפלט מודפס על הצג הטורי בפורמט HEX.

חוּמרָה

כאן נוכל לראות את צג ה-OLED 0.96 אינץ' I2C מחובר ללוח ESP32 בפינים GPIO 21 ו-22. Vcc ו-GND של הצג מחוברים עם ESP32 3V3 ו-pin GND.

תְפוּקָה
בפלט נוכל לראות את כתובת ה-I2C של תצוגת ה-OLED המחוברת ללוח ESP32. כאן כתובת I2C היא 0X3C כך שאיננו יכולים להשתמש באף מכשיר I2C אחר עם אותה כתובת לשם כך עלינו לשנות תחילה את כתובת ה-I2C של אותו מכשיר.

השגנו בהצלחה את כתובת ה-I2C של תצוגת ה-OLED המחוברת ללוח ESP32.

סיכום

מציאת כתובת I2C תוך חיבור התקנים מרובים עם ESP32 חשובה שכן לא ניתן לחבר מכשירים שחולקים את אותה כתובת I2C דרך אוטובוס I2C יחיד. באמצעות הקוד שלמעלה ניתן לזהות את כתובת ה-I2C ואם הכתובת של שני התקנים תואמת ניתן לשנות אותה בהתאם בהתאם למפרטי המכשיר.