مــا نحــنُ إلا طُـــلاب عــلمِ نسعـــى لنشـــر الرحمـــة مــن خــلال العــلـــم ----- مطلوب مدرس - مدرب لديه خبره في الإلكترونيات التفاعلية و الأردوينو، راسلنا على رسائل الموقع
image

نقل البيانات بإستخدام I2C

Inter-integrated circuit  أو الـ I2C هو نظام لتبادل البيانات بطريقــة تسلسليــة  بين المتحكمات الدقيقة والدوائر المتكاملة المتخصصة من الجيل الجديد. يتم استخدامه عندما تكون المسافة بينهما قصيرة (عادةً ما يكون جهاز الاستقبال والإرسال على نفس اللوحة المطبوعة). يتم إنشاء الاتصال عبر طرفين. يستخدم أحدهما لنقل البيانات والآخر يستخدم للمزامنة (إشارة الساعة).

 

كما هو موضح في الشكل التالي، جهاز واحد هو دائمًا جهاز سيــد Master. يقوم بإجراء معالجة لشريحة تابعة Slave واحدة قبل بدء الاتصال. وبهذه الطريقة، يمكن لوحدة تحكم دقيقة واحدة التواصل مع 112 جهازًا مختلفًا. معدل الباود عادة ما يكون 100 كيلو بايت/ثانية (الوضع القياسي) أو 10 كيلو بايت/ثانية (وضع معدل الباود البطيء). ظهرت مؤخرًا أنظمة بمعدل نقل بيانات يبلغ 3.4 ميجا بايت / ثانية. المسافة بين الأجهزة التي تتواصل عبر ناقل I2C تقتصر على عدة أمتار.

أرجــل الـ I2C فــي الأردوينــو

يتكون ناقل I2C من إشارتين همـا SCL  وهي إشارة الساعة، و SDA هي إشارة البيانات. يقوم الجهــاز السيد دائمًا بإنشاء إشارة الساعة. قد تجبر بعض الأجهزة التابعة الساعة على الانخفاض في بعض الأحيان لتأخير إرسال المزيد من البيانات للسيد (أو لطلب المزيد من الوقت لإعداد البيانات قبل أن يحاول السيد إيقافها). يُعرف هذا باسم "تمدد الساعة clock stretching".

فيما يلي الأرجــل المستخدمــة مع الـ I2C في لوحــات الأردوينــو المختلفــة

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

الأردوينــو و الـ I2C

لدينــا وضعين لتوصيل لوحتين من الأردوينــو ببعضهمــا عن طريق الـ I2C – كــود للجهـاز الـMaster  و كــود للجهــاز الخــادم Slave – الوضعين همـا:

  • الجهــاز السيــد مرســل – الجهــاز الخـادم مستقبل
  • الجهــاز السيد مستقبــل – الجهــاز الخادم مرسـل

الجهــاز السيــد مرســل – الجهــاز الخـادم مستقبل

الجهــاز السيد مرســل Master Transmitter

تُستخدم الدوال التالية لتهيئة مكتبة Wire و توصيـل ناقل I2C كسيــد أو تابع. يتم استدعاء هذا عادة مرة واحدة فقط.

 

  • Wire.begin(address) - العنوان هو العنوان التابع المكون من 7 بتات في حالتنا حيث لم يتم تحديد السيد وسينضم إلى الناقل كسيــد.
  • Wire.beginTransmission(address) - ابدأ الإرسال إلى جهاز I2C التابع بالعنوان المحدد.
  • Wire.write(value) - وحدات البايت في قوائم الانتظار للإرسال من جهاز سيــد إلى جهاز خــادم (بين الاستدعاءات لـ beginTransmission() وendTransmission()).
  • Wire.endTransmission() - ينهي الإرسال إلى جهاز تابع بدأ بواسطة beginTransmission() وينقل البايتات التي تم وضعها في قائمة الانتظار بواسطة wire.write().

مثـــال

 

#include <Wire.h> //include wire library

 

void setup() //this will run only once {

   Wire.begin(); // join i2c bus as master

}

 

short age = 0;

 

void loop() {  

   Wire.beginTransmission(2);

   // transmit to device #2

   Wire.write("age is = ");

   Wire.write(age); // sends one byte

   Wire.endTransmission(); // stop transmitting

   delay(1000);

}

الجهــاز التابــع كمستقبـــل Slave Reciver

يتم استخدام الدوال التالية -

 

  • Wire.begin(address) - العنوان هو عنوان تابع مكون من 7 بتات.
  • Wire.onReceive(معالج البيانات المستلمة) – الدالــة التي سيتم استدعاؤها عندما يتلقى جهاز تابع بيانات من الجهاز السيــد.
  • Wire.available() - يُرجع عدد البايتات المتاحة للاسترجاع باستخدام Wire.read(). ويجب استدعاء هذا داخل معالج Wire.onReceive().

مثــال

 
#include <Wire.h> //include wire library
 
void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}
 
void loop() {   
   delay(250); 
}
 
//-----this function will execute whenever data is received from master-----//
 
void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

 

الجهــاز السيــد كمستقبــل – الجهــاز الخادم كمرســل

الجهــاز السيد كمستقبـــل

تمت برمجة برنامج الـ Master ليطلب ثم يقرأ بايتات من البيانات التي يتم إرسالها من الأردوينــو التابــع ذو العنوان الفريد.

يتم استخدام الدوال التالية -

  • Wire.requestFrom(address,number of bytes) - يستخدمه السيد لطلب البايتات من جهاز تابع. يمكن بعد ذلك استرداد البايتات باستخدام الدالتين wire.available() وwire.read().

مثـــال

 
#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 
 
void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

 

الجهـــاز التابــع كمرســـل

يتـــم إستخدام الدوال التاليــة

  • Wire.onRequest(handler) - يتم استدعاء هذه الدالــة عندما يطلب الجهــاز السيد بيانات من هذا الجهاز التابع.

مثــــال

#include <Wire.h> 
 
void setup() { 
   Wire.begin(2); // join i2c bus with address #2
   Wire.onRequest(requestEvent); // register event
} 
 
Byte x = 0;
 
void loop() { 
   delay(100); 
} 
 
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
 
void requestEvent() { 
   Wire.write(x); // respond with message of 1 bytes as expected by master
   x++; 
}

المخترع المجنـون

مدون و كاتب محتوى تكنولوجي و متخصص في علوم الإلكترونيات

التعليقات

سجل الدخول لتترك تعليق

نقوم بالتبرع بـ 5 % من قيمـة المنتجات للأعمال الخيرية

تـواصـل معنـا

الطائــف - المملكــة العربيــة السعــوديـة

المـوقـع مـوثـق من

المختــرع المجنــون © جميـــع الحقــوق محفوظــة