كيفية توصيل لوحتي Arduino باستخدام I2C

كيفية توصيل لوحتي Arduino باستخدام I2C
القراء مثلك يساعدون في دعم MUO. عند إجراء عملية شراء باستخدام الروابط الموجودة على موقعنا ، فقد نربح عمولة تابعة. اقرأ أكثر.

في حين أن Arduino واحد يمكنه إنجاز العديد من المهام ، فقد تتطلب بعض المشاريع استخدام أكثر من لوحة واحدة للتعامل مع وظائف مختلفة. لذلك ، لتمكين نقل البيانات بين اثنين من وحدات التحكم الدقيقة ، يجب إعداد بروتوكول اتصال مثل CAN أو SPI أو I2C أو UART.





في هذا الدليل ، سنغطي أساسيات كيفية عمل I2C ، وتوصيلات الأجهزة ، وتنفيذ البرامج اللازمة لإعداد لوحتين من Arduino كأجهزة I2C الرئيسية والأجهزة التابعة.





اجعل فيديو اليوم قم بالتمرير للمتابعة مع المحتوى

ما هو I2C؟

Inter-Integrated Circuit (I2C) هو بروتوكول اتصال يستخدم على نطاق واسع في الأنظمة المدمجة والميكروكونترولر لتمكين نقل البيانات بين الأجهزة الإلكترونية. على عكس SPI (الواجهة الطرفية التسلسلية) ، يسمح لك I2C بتوصيل أكثر من جهاز رئيسي بناقل باستخدام أجهزة فرعية مفردة أو متعددة. تم استخدامه لأول مرة بواسطة Philips وهو معروف أيضًا باسم بروتوكول الاتصال بواجهة سلكية (TWI).





كيف تعمل اتصالات I2C؟

تستخدم I2C خطين ثنائي الاتجاه: البيانات التسلسلية (SDA) والساعة التسلسلية (SCL) لنقل البيانات ومزامنة الاتصال بين الأجهزة. كل جهاز متصل بناقل I2C له عنوان فريد يحدده أثناء الاتصال. يسمح بروتوكول I2C لأجهزة متعددة بمشاركة نفس الناقل ، ويمكن لكل جهاز أن يعمل كسيد أو تابع.

  مظاهرة اتصالات I2C

يبدأ الاتصال بواسطة الجهاز الرئيسي ، ويمكن أن تتسبب العنونة غير الصحيحة للأجهزة التابعة في حدوث أخطاء في النقل. تحقق من دليلنا المتعمق حول كيف تعمل الاتصالات التسلسلية UART و SPI و I2C لإعطائك بعض السياق.



الميزة الرئيسية لاتصالات I2C الجديرة بالملاحظة هي المرونة التي توفرها عندما يتعلق الأمر بإدارة الطاقة. لا يزال بإمكان الأجهزة التي تعمل بمستويات جهد مختلفة أن تتواصل بشكل فعال بمساعدة محولات الجهد. هذا يعني أن الأجهزة التي تعمل عند 3.3 فولت تحتاج إلى محولات جهد لتوصيلها بحافلة 5V I2C.

مكتبة الأسلاك

مكتبة Wire هي مكتبة Arduino مضمنة توفر وظائف للتواصل عبر I2C. يستخدم دبابيس - SDA و SCL - على لوحة Arduino لاتصالات I2C.





دبابيس I2C على Arduino Uno:

  دبابيس Arduino I2C Uno

دبابيس Arduino Nano I2C:





  اردوينو نانو I2C pinout

لاستخدام المكتبة ، يجب عليك تضمين الامتداد سلك header في بداية رسم Arduino الخاص بك.

 #include <Wire.h>

توفر مكتبة Wire وظائف لبدء الاتصال بجهاز I2C وإرسال البيانات واستقبال البيانات. تتضمن بعض الوظائف المهمة التي يجب أن تعرفها ما يلي:

  • Wire.begin () : تستخدم للانضمام إلى ناقل I2C وبدء الاتصال.
  • Wire.beginTransmission () : يستخدم لتحديد عنوان الرقيق وبدء الإرسال.
  • Wire.write () : تستخدم لإرسال البيانات إلى جهاز I2C.
  • Wire.endTransmission () : يستخدم لإنهاء الإرسال والتحقق من الأخطاء.
  • طلب تحويل من () : تستخدم لطلب البيانات من جهاز I2C.
  • Wire.available () : تستخدم للتحقق مما إذا كانت البيانات متاحة للقراءة من جهاز I2C.
  • wire.read () : تستخدم لقراءة البيانات من جهاز I2C.

استخدم ال Wire.beginTransmission () وظيفة لتعيين عنوان المستشعر ، والذي يتم إدراجه كوسيطة. على سبيل المثال ، إذا كان عنوان المستشعر هو 0x68 ، يمكنك استخدام:

 Wire.beginTransmission(0x68);

إعداد أجهزة Arduino I2C

لتوصيل لوحتين من Arduino باستخدام I2C ، ستحتاج إلى مكونات الأجهزة التالية:

  • لوحان اردوينو (رئيسي وعبد)
  • اللوح
  • أسلاك العبور
  • مقاومات سحب 4.7kΩ

ربط SDA و SCL دبابيس كل من لوحي Arduino على لوح التجارب. قم بتوصيل مقاومات السحب بين SDA و SCL دبابيس و 5 فولت قضيب كهربائي على اللوح. أخيرًا ، قم بتوصيل اللوحين معًا باستخدام أسلاك توصيل.

دائرة اردوينو أونو

  اتصال Arduino_I2C على اللوح

حلبة اردوينو نانو

  nano33BS_06_ill Illustration لبروتوكول اتصالات I2C
حقوق الصورة: وثائق Arduino I2C

إعداد لوحات Arduino كأجهزة I2C Master و Slave

استخدم ال طلب تحويل من () وظيفة لتحديد عنوان الجهاز التابع الذي نريد التواصل معه. ثم استخدم ملف 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 مع لوحين من Arduino

دعنا نعدل الكود الذي كتبناه سابقًا ليشمل قياس درجة الحرارة الذي سنرسله بعد ذلك إلى اللوحة الرئيسية عبر ناقل 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 أمرًا سهلاً ، مما يتيح لك إضافة المزيد من المكونات إلى مشروعك.