شما به اینترنت متصل نیستید.
ارتباط I2C بین بردهای آردوینو
نویسنده:
امتیاز دهید

ارتباط I2C بین بردهای آردوینو

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

ارتباط I2C یک پروتکل جالب است که معمولاً برای ارتباط بین قطعات در مادربردها، دوربین‌ها و یا هر سیستم الکترونیکی استفاده می‌شود. در این آموزش ما قصد داریم تا از این پروتکل ارتباطی برای ارتباط میان دو برد آردوینو استفاده کنیم.

در این آموزش یک برد آردوینو که برد راهبر یا مستر (Master) است را برنامه‌نویسی می‌نماییم تا به برد آردوینو دیگر که برد رهرو یا اسلیو (Slave) خوانده می‌شود فرمان بدهد که LED داخلی استفاده‌شده در برد را بسته به فرمان و مقدار دریافتی از برد آردوینو مستر با چه سرعتی روشن و خاموش کند.

برای این منظور به قطعات زیر نیاز است.

قطعات موردنیاز

برد آردوینو UNO R3
برد آردوینو UNO R3 + کابل USB
2 عدد
سیم اتصال به برد بورد 65 تایی
1 عدد

شماتیک مداری

شماتیک مداری

طبق شکل نشان داده‌شده و شماتیک مداری، پین‌های A4 و A5 هر برد آردوینو را به همان پین از برد آردوینو دیگر متصل کنید و پین GND هر دو برد باید مشترک باشد. پس آن پین را هم برای هر دو برد به یکدیگر متصل کنید.

فقط توجه داشته باشید که پین‌های 3.3 و 5 ولت بردها را هیچ‌وقت به یکدیگر متصل نکنید چراکه باعث آسیب رساندن به پورت 3.3 ولتی بردها می‌شود.

شماتیک مداری

برنامه‌نویسی

برای این آموزش، همان‌طور که پیش‌تر گفتیم دو برد آردوینو مستر و اسلیو به کار گرفته‌شده است؛ بنابراین، برای هر یک برنامه متناسب با خود آن باید نوشته شود. برنامه نوشته‌شده برای برد آردوینو مستر به‌صورت زیر است:

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

int x = 0;

void setup() {

  // Start the I2C Bus as Master

  Wire.begin();

}

void loop() {

  Wire.beginTransmission(9); // transmit to device #9

  Wire.write(x);              // sends x

  Wire.endTransmission();    // stop transmitting

  x++; // Increment x

  if (x > 5) x = 0; // `reset x once it gets 6

  delay(500);

{

در این برنامه به این صورت عمل شده است که ابتدا کتابخانه را با دستور زیر فراخوانی می‌کنیم:

#include <Wire.h>

سپس، در قسمت Setup function ارتباط I2C را با دستور Wire.begin() شروع می‌کنیم. این دستور به این صورت است که اگر در داخل پرانتز این تابع آرگومانی قرار نگیرد، برد به‌عنوان برد مستر تلقی می‌شود. درنهایت یک کاراکتر x که بین 0 و 5 است را ارسال می‌کنیم. ما از توابع زیر برای شروع انتقال به برد آردوینو دیگر با آدرس 9، نوشتن کاراکتر و سپس توقف انتقال استفاده کردیم:

Wire.beginTransmission(9); // transmit to device #9

Wire.write(x);             // sends x

Wire.endTransmission();    // stop transmitting

حال برنامه برد آردوینو اسلیو را در ادامه می‌نویسیم که فرامین ارسالی از برد مستر را تفسیر می‌کند:

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

int LED = 13;

int x = 0;

void setup() {

  // Define the LED pin as Output

  pinMode (LED, OUTPUT);

  // Start the I2C Bus as Slave on address 9

  Wire.begin(9);

  // Attach a function to trigger when something is received.

  Wire.onReceive(receiveEvent);

}

void receiveEvent(int bytes) {

  x = Wire.read();    // read one character from the I2C

}

void loop() {

  //If value received is 0 blink LED for 200 ms

  if (x == '0') {

    digitalWrite(LED, HIGH);

    delay(200);

    digitalWrite(LED, LOW);

    delay(200);

  }

  //If value received is 3 blink LED for 400 ms

  if (x == '3') {

    digitalWrite(LED, HIGH);

    delay(400);

    digitalWrite(LED, LOW);

    delay(400);

  }

}

در این برنامه هم ابتدا کتابخانه I2C را فراخوانی می‌کنیم ولی برای شروع ارتباط این بار دستور Wire.begin(9) را وارد می‌کنیم. شماره 9 به‌کاررفته در این دستور آدرسی است که ما به این برد آردوینو اسلیو داده‌ایم تا با آن شناخته شود. تمامی دستگاه‌های با آدرس 9 می‌توانند فرامین ارسالی از برد مستر را بگیرند.

حال نیاز داریم تا هر زمان که فرمانی از طریق ارتباط I2C ارسال شد در پاسخ به آن برد اسلیو عکس‌العملی از خود نشان دهد. با استفاده از تابع زیر هر زمان که آردوینو یک کاراکتر را بر روی I2C دریافت می‌کند، عملکردی را اجرا می‌کند که ما مدنظر ما است:

Wire.onReceive(receiveEvent);

و تابع مدنظر به‌صورت زیر است که در اینجا ما می‌خواهیم فقط مقدار کاراکتر دریافتی را ذخیره کند:

void receiveEvent(int bytes) {

   x = Wire.read();

}

در قسمت loop() برنامه هم ما فقط گفته‌ایم که بسته با مقدار کاراکتر دریافتی LED قرارگرفته روی برد آردوینو اسلیو به چه سرعتی خاموش و روشن شود.

اطلاعات بیشتر درباره ارتباط I2C

برای دریافت اطلاعات بیشتر در رابطه با ارتباط I2C می‌توانید به آموزش "آشنایی با پروتکل های ارتباطی: درس سوم(I2C)" مراجعه کنید. ولی به‌طور خلاصه باید گفت که ارتباط I2C به دو خط دیجیتال نیاز دارد که یک خط آن Serial Data line (SDA) برای انتقال اطلاعات و خط دیگر Serial Clock Line (SCL) برای کلاک یا زمان است. در هر ارتباط I2C می‌توان یک برد مستر و چندین برد اسلیو داشته باشیم. برد مستر می‌تواند فرامین را به بردهای اسلیو بفرستد و یا از آن‌ها درخواست اطلاعات کند. ولی هیچ برد اسلیوی نمی‌تواند به‌طور مستقیم به برد مستر یا بردهای اسلیو دیگر فرمانی را صادر کند. هر برد اسلیو هم آدرس مخصوص به خود را دارد که برد آردوینو مستر برای ارتباط با آن‌ها نیاز به داشتن آن آدرس دارد.

هر ارتباط I2C تا 112 دستگاه را می‌تواند به یکدیگر ارتباط دهد که همگی با زمین یا پورت GND مشترکی داشته باشند و با سرعت 100 kb/s می‌توانند با یکدیگر در ارتباط باشند که سرعت زیادی نیست ولی قابل‌قبول و بسیار قابل‌استفاده است. امکان وجود و استفاده از چند مستر هم وجود دارد که خیلی پیچیده است.

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

تمامی بردهای آردوینو دارای پروتکل ارتباط I2C هستند که فقط شماره پین‌های آن‌ها با یکدیگر متفاوت است که به شرح زیر می‌باشد:

Uno, Pro Mini A4 (SDA), A5 (SCL)

Mega, Due 20 (SDA), 21 (SCL)

Leonardo, Yun 2 (SDA), 3 (SCL)

اگر نیاز به ارتباط تعداد بردهای بیشتری داشتید هم فقط کافی است تا خط‌های SDA و SCL آن‌ها را به یکدیگر وصل کنید و آدرس هر یک را به برد مستر بدهید.

نظرات شما باعث بهبود محتوای آموزشی ما می‌شود. اگر این آموزش را دوست داشتید، همین‌طور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.

ترجمه شده توسط تيم اتومی | منبع: سايت instructables

آیا این مطلب برایتان مفید بود؟
بله خیر
تاکنون هیچ نظری ثبت نشده است.
برای ثبت نظر وارد حساب کاربری خود شوید.