כיצד לחבר שני לוחות ארדואינו באמצעות I2C

כיצד לחבר שני לוחות ארדואינו באמצעות I2C
קוראים כמוך עוזרים לתמוך ב-MUO. כאשר אתה מבצע רכישה באמצעות קישורים באתר שלנו, אנו עשויים להרוויח עמלת שותף. קרא עוד.

בעוד ש-Arduino בודד יכול לבצע משימות רבות, פרויקטים מסוימים עשויים לדרוש שימוש ביותר מלוח אחד כדי לטפל בפונקציות שונות. לכן, כדי לאפשר העברת נתונים בין שני המיקרו-בקרים, יש להגדיר פרוטוקול תקשורת כגון CAN, SPI, I2C או UART.





במדריך זה, נסקור את היסודות של אופן הפעולה של I2C, חיבורי החומרה והטמעת התוכנה הדרושה להגדרת שני לוחות Arduino כהתקני I2C מאסטר ו-slave.





איפור של סרטון היום גלול כדי להמשיך עם התוכן

מה זה I2C?

Inter-Integrated Circuit (I2C) הוא פרוטוקול תקשורת בשימוש נרחב במערכות משובצות ומיקרו-בקרים כדי לאפשר העברת נתונים בין מכשירים אלקטרוניים. בניגוד ל-SPI (ממשק היקפי טורי), I2C מאפשר לך לחבר יותר מהתקן מאסטר אחד לאוטובוס עם התקני עבד בודדים או מרובים. הוא שימש לראשונה על ידי פיליפס והוא ידוע גם כפרוטוקול תקשורת דו-חוטי (TWI).





סרטים מרגיעים להירדם אליהם

איך עובדת תקשורת I2C?

I2C משתמש בשני קווים דו-כיווניים: נתונים טוריים (SDA) ושעון סדרתי (SCL) כדי להעביר נתונים ולסנכרן תקשורת בין מכשירים. לכל מכשיר המחובר לאפיק I2C יש כתובת ייחודית המזהה אותו במהלך התקשורת. פרוטוקול I2C מאפשר למספר התקנים לשתף את אותו אפיק, וכל מכשיר יכול לפעול כמאסטר או כעבד.

  הדגמת תקשורת I2C

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



יתרון מרכזי של תקשורת I2C שכדאי לשים לב אליו הוא הגמישות שהיא מציעה בכל הנוגע לניהול צריכת חשמל. מכשירים הפועלים ברמות מתח שונות עדיין יכולים לתקשר ביעילות בעזרת משמרות מתח. משמעות הדבר היא שמכשירים הפועלים ב-3.3V זקוקים למעבירי מתח כדי להתחבר לאפיק 5V I2C.

ספריית החוטים

ספריית ה-Wire היא ספריית Arduino מובנית המספקת פונקציות לתקשורת דרך I2C. הוא משתמש בשני פינים - SDA ו- SCL - בלוח Arduino לתקשורת I2C.





פיני I2C ב- Arduino Uno:

  סיכות Arduino I2C Uno

פינים של Arduino Nano I2C:





  Arduino nano I2C pinout

כדי להשתמש בספרייה, עליך לכלול את Wire.h קובץ header בתחילת הסקיצה של Arduino.

 #include <Wire.h>

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

  • Wire.begin() : משמש להצטרפות לאפיק I2C וייזום תקשורת.
  • Wire.beginTransmission() : משמש כדי לציין את כתובת העבד ולהתחיל שידור.
  • Wire.write() : משמש לשליחת נתונים להתקן I2C.
  • Wire.endTransmission() : משמש לסיום השידור ולבדיקת שגיאות.
  • Wire.requestFrom() : משמש לבקשת נתונים מהתקן I2C.
  • Wire.available() : משמש כדי לבדוק אם נתונים זמינים לקריאה מהתקן I2C.
  • wire.read() : משמש לקריאת נתונים מהתקן I2C.

להשתמש ב Wire.beginTransmission() פונקציה לקביעת הכתובת של החיישן, המוכנסת כארגומנט. לדוגמה, אם הכתובת של החיישן היא 0x68 , היית משתמש ב:

 Wire.beginTransmission(0x68);

הגדרת חומרה של Arduino I2C

כדי לחבר שני לוחות Arduino באמצעות I2C, תזדקק לרכיבי החומרה הבאים:

  • שני לוחות ארדואינו (מאסטר ועבד)
  • קרש לחם
  • חוטי מגשר
  • שני נגדי משיכה של 4.7kΩ

חבר את SDA ו SCL סיכות של שני לוחות הארדואינו ללוח לחם. חבר את נגדי המשיכה בין ה SDA ו SCL סיכות ואת 5V מסילת חשמל על לוח הלחם. לבסוף, חבר את שני לוחות הלחם יחד באמצעות חוטי מגשר.

כיצד להשתמש בקול הטוב ביותר של גוגל

מעגל Arduino Uno

  חיבור Arduino_I2C על לוח לחם

Arduino Nano Circuit

  nano33BS_06_illustration עבור פרוטוקול תקשורת I2C
קרדיט תמונה: תיעוד Arduino I2C

הגדרת לוחות Arduino כהתקני I2C מאסטר ו-Slave

להשתמש ב Wire.requestFrom() פונקציה כדי לציין את הכתובת של מכשיר העבדים שאיתו אנו רוצים לתקשר. לאחר מכן השתמש ב- wire.read() פונקציה כדי לקבל נתונים ממכשיר העבד.

קוד מכשיר ראשי:

 #include <Wire.h> 
void setup() {
Wire.begin(); // join i2c bus
Serial.begin(9600); // start serial for output
}
void receiveData() {
int address = 8;
int bytesToRead = 6;
Wire.requestFrom(address, bytesToRead);
while (Wire.available()) {
char data = Wire.read();
Serial.print(data);
}
delay(500);
}
void loop() {
receiveData();
}

ה Wire.onReceive() הפונקציה משמשת כדי לציין מה לעשות כאשר העבד מקבל נתונים מהמכשיר הראשי. בקוד לעיל, ה Wire.available() הפונקציה בודקת אם נתונים זמינים, ואת wire.read() הפונקציה קוראת את הנתונים שנשלחו על ידי המכשיר הראשי.

קוד מכשיר עבד:

 #include <Wire.h> 
void setup() {
Wire.begin(8); // join the I2C bus with address 8
Wire.onReceive(receiveEvent); // call receiveEvent when data is received
}
void loop() {
delay(100);
}
void receiveEvent(int bytes) {
Wire.write("hello "); // respond with message of 6 bytes as expected by master
}

שליחה וקבלה של נתונים באמצעות I2C

בדוגמה זו, הבה נקרא את הטמפרטורה מחיישן טמפרטורה DHT11 המממשק עם העבד Arduino ונדפיס אותה על הצג הטורי של ה-Arduino המאסטר.

  דוגמה DHT11 I2C עם 2 לוחות ארדואינו

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

קוד מכשיר ראשי:

 #include <Wire.h> 
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Master Initialized!");
}
void loop() {
Wire.requestFrom(8, 1); // Request temperature data from slave
if (Wire.available()) {
byte temperature = Wire.read(); // Read temperature data from slave
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" &deg;C");
}
delay(2000); // Wait for 2 seconds before requesting temperature again
}

קוד מכשיר עבד:

 #include <Wire.h> 
#include <DHT.h>

#define DHTPIN 4 // Pin connected to DHT sensor
#define DHTTYPE DHT11 // DHT sensor type
DHT dht(DHTPIN, DHTTYPE);
byte temperature;

void setup() {
Wire.begin(8); // Slave address is 8
Wire.onRequest(requestEvent);
dht.begin();
}

void loop() {
delay(2000); // Wait for 2 seconds for DHT to stabilize
temperature = dht.readTemperature(); // Read temperature from DHT sensor
}

void requestEvent() {
Wire.write(temperature); // Send temperature data to master
}

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

כתובת עבדים עם I2C ב- Arduino

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

כיצד לשחק משחקי שיתוף פעולה מקומיים באינטרנט

השתמש בקוד הבא כדי לזהות כתובת של כל התקן עבד הקיים באפיק I2C.

 #include <Wire.h> // Include the Wire library for I2C communication 

void setup() {
Wire.begin(); // Initialize the I2C communication
Serial.begin(9600); // Initialize the serial communication with a baud rate of 9600
while (!Serial); // Wait for the serial connection to establish
Serial.println("\nI2C Scanner"); // Print a message indicating the start of I2C scanning
}

void loop() {
byte error, address; // Declare variables to store errors and device addresses
int nDevices; // Declare a variable to store the number of devices found

Serial.println("Scanning..."); // Print a message indicating the start of I2C scanning

nDevices = 0; // Set the number of devices found to 0
for (address = 1; address < 127; address++) { // Iterate over all possible I2C addresses
Wire.beginTransmission(address); // Start a transmission to the current address
error = Wire.endTransmission(); // End the transmission and store any errors

if (error == 0) { // If no errors were found
Serial.print("I2C device found at address 0x"); // Print a message indicating a device was found
if (address < 16) Serial.print("0"); // If the address is less than 16, add a leading 0 for formatting purposes
Serial.print(address, HEX); // Print the address in hexadecimal format
Serial.println(" !"); // Print a message indicating a device was found

nDevices++; // Increment the number of devices found
}
else if (error == 4) { // If an error was found
Serial.print("Unknown error at address 0x"); // Print a message indicating an error was found
if (address < 16) Serial.print("0"); // If the address is less than 16, add a leading 0 for formatting purposes
Serial.println(address, HEX); // Print the address in hexadecimal format
}
}
if (nDevices == 0) { // If no devices were found
Serial.println("No I2C devices found\n"); // Print a message indicating no devices were found
}
else { // If devices were found
Serial.println("done\n"); // Print a message indicating the end of I2C scanning
}
delay(5000); // Delay for 5 seconds before starting the next scan
}

הרחב את הפרויקט שלך עוד היום

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