مهندس موفق الکترونیک

پروتکل I2C در آردوینو

پروتکل I2C در آردوینو ، پروتکل درون زیر مدار مجتمع یا همان I2C رابطی است برای انتقال اطلاعات بین میکروکنترلرها و تجهیزات جانبی دیگر مانند حافظه ها و… . این پروتکل بیشتر زمانی استفاده می شود که فاصله بین فرستنده و گیرنده کوتاه است (مثلا هر دو روی یک برد هستند). برای ارتباط در این پروتکل از دو سیم استفاده می شود. یک سیم برای ارسال داده و دیگری برای سنکرون سازی (سیگنال کلاک) استفاده می شود.

همان طور که در شکل زیر مشاهده می شود، یک وسیله به عنوان مستر شناخته می شود. مستر وسیله تخصیص آدرس به تراشه اسلیو را پیش از شروع ارتباط به عهده دارد. توسط این روش آدرس دهی 112 میکروکنترلر یا تراشه میتوانند توسط این پروتکل به هم وصل شوند. باود ریت یا نرخ ارسال بیت ها معمولا 100 Kb/sec یا 100 کیلوبیت بر ثانیه است (در حالت استاندارد) یا 10 Kb/sec ( در حالت سرعت پایین). اخیرا استفاده از نرخ ارسال 3.4 Mb/sec نیز در این ارتباط در بعضی از تراشه های مرسوم شده است. فاصله بین تراشه هایی که از پروتکل استفاده می کنند باید حداکثر چند متر باشد.

پروتکل I2C در آردوینو

پایه های I2C :

در پروتکل I2C از دو سیم به نام های SCL و SDA استفاده می شود. 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 در آردوینو برای ایجاد ارتباط بین دو برد آردوینو باید دو کد داشته باشید : یک کد برای مستر و یک کد برای اسلیو، دو حالت وجود دارد :

  • مستر فرستنده / اسلیو گیرنده
  • مستر گیرنده / اسلیو فرستنده

الف) مستر فرستنده / اسلیو گیرنده :

در این بخش بررسی می کنیم که عملکرد مستر و اسلیو در این حالت چگونه خواهد بود.

مستر فرستنده :

از توابع زیر برای راه اندازی کتابخانه های I2C و انجام تنظیمات اولیه برای مستر و اسلیو استفاده می شود. معمولا از این توابع یکبار استفاده می شود.

  • begin(address) : address آدرس 7 بیتی اسلیو است، با اجرای این تابع میکروکنترلر به عنوان مستر شناخته می شود.
  • (beginTransmission(address : ارتباط I2C با اسلیو با آدرس address شروع می شود.
  • (write(value  : پس از استفاده از تابع ()beginTransmission  برای شروع و قبل از استفاده از تابع ()endTransmission  برای پایان ارتباط، از این تابع برای ارسال داده value به سمت اسلیو استفاده می شود.
  • ()endTransmission : ارتباط I2C با اسلیو که توسط تابع ()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); 
}

اسلیو گیرنده :

از توابع زیر به این منظور استفاده می شود :

  • مستر شناخته می شود.
  • (begin (address : متغیر address آدرس 7 بیتی اسلیو است.
  • (onReceive(received data handler  : از این تابع برای دریافت داده های ارسال شده توسط مستر استفاده می شود.
  • ()available : از این تابع برای دریافت تعداد بایت های آماده برای دریافت توسط تابع ()Wire.read استفاده می شود. از این تابع باید در هنگام استفاده از تابع ()Wire.onReceive در بخش handler استفاده شود.

مثال :

#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
 }
}

ب) مستر گیرنده / اسلیو فرستنده :

در این بخش بررسی می کنیم که عملکرد مستر و اسلیو در این حالت چگونه خواهد بود.

مستر گیرنده :

در این حالت مستر برای دریافت داده های ارسال شده توسط اسلیو با آدرس مشخص برنامه ریزی می شود. همچنین در صورت نیاز پاسخ مورد نظر نیز به سمت اسلیو ارسال می شود.

مطلب پیشنهادی:  راه اندازی برد اردینو

از تابع زیر به این منظور استفاده می شود :

(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++; 
}

به پایان بحث پروتکل I2C در آردوینو آمدیم . این بجث در ماه های قبلی هم بصورت مفصل برسی شده بود ولی بدلیل اهمیت موضوع دوباره برسی شد.امیدوارم برایتان مفید واقع شده باشد. لطفا نظرات خودتان را ما به اشتراک بگذارید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

2 دیدگاه

  1. سلام
    اگر بخواهیم به اردوینوuno دو ماژول که هر دو با پروتکل i2c کار می کنند متصل کنیم، با توچه به این که فقط دو پایه برای اتصال i2c رو برد ارپوینو داریم، چگونه باید اتصالات سخت افزاری را انجام دهیم و در نوشتن برنامه باید چه نکاتی را اعمال کنیم؟