به آموزش آردوینو ( قسمت یازدهم – I2C ) خوش اومدید.
بازبینی اول : در تاریخ ۱۴۰۰/۰۵/۲۲ انجام شد!
پروتکل ارتباطی SPI
پروتکل I2C یک ارتباط سریال از طریق دو سیم می باشد که یک ارتباط سنکرون است و از یک کلاک خارجی تبعیت میکند.این پروتکل بیشتر زمانی استفاده می شود که فاصله بین فرستنده و گیرنده کوتاه است (مثلا هر دو روی یک برد هستند). منظور از دو سیم این است که خط انتقال دیتا دوطرفه است ولی در پروتکل SPI یک خط فرستنده ویک خط گیرنده است.
پایه های I2C :
در پروتکل I2C از دو سیم به نام های SCL و SDA استفاده می شود. SCL سیگنال کلاک است و SDA سیگنال داده است.
پایه های مربوط به پروتکل I2C در بردهای مختلف آردوینو :
- در بردهای Uno و Pro Mini پایه A4 به عنوان SDA و A5 به عنوان SCL
- در بردهای Mega و Due پایه ۲۰ به عنوان SDA و ۲۱ به عنوان SCL
- در بردهای Leonardo و Yun پایه ۲ به عنوان SDA و ۳ به عنوان SCL
پیاده سازی عملی پروژه
برای این پروژه مدار خود را مانند شکل زیر ببندید.
پایه های A4 برد ها را به عنوان SDA و A5 را به عنوان SCL به یکدیگر متصل کنید.
شبیه سازی پروژه در نرم افزار پروتئوس
پایه های دو برد آردوینو را مانند شکل به یکدیگر متصل کنید. و برای نمایش سریال از سمت چپ نرم افزار وارد Instruments شده و VIRTUAL TERMINAL را به صفحه بیافزایید. RXD ترمینال را به TXD برد و TXD ترمینال را به RXD برد آردوینو متصل کنید.
کد های دستوری
کد سمت Master
ابتدا کتابخانه Wire.h را فراخوانی میکنیم . این کتابخانه از سایت گیت به صورت رایگان قابل دانلود است .سپس متغیری برای انتقال به slave تعریف میکنیم.
در تابع setup ارتباط I2C را آغاز میکنیم.
نکته : خالی بودن ورودی تابع Wire.begin نشان از master بودن دستگاه است .
#include <Wire.h>
char x = 0;
void setup() {
Wire.begin();
}
در loop با تابع Wire.beginTransmission ارتباط I2C با دیوایس مورد نظر که شماره آن را به عنوان ورودی به این تابع میدهیم آغاز میکنیم. سپس عملیات انتقال را نوشته و در آخر با تابع Wire.endTransmission به ارتباط پایان میدهیم.
void loop() {
Wire.beginTransmission(6);
Wire.write(x);
Wire.endTransmission();
x++;
delay(500);
}
کد سمت Slave
ابتدا کتابخانه Wire.h را فراخوانی میکنیم .
در تابع setup ارتباط I2C را آغاز میکنیم.ورودی تابع Wire.begin شماره slave است . با دستور Wire.onReceive تابع مورد نظر برای دریافت داده از مستر را فراخوانی میکنیم.
در آخر با یک ارتباط سریال مقادیر دریافتی را در سریال مانیتور نمایش می دهیم.
#include <Wire.h>
void setup() {
Wire.begin(6);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop() {
delay(100);
}
در تابع receiveEvent به دریافت و چاپ مقادیر در سریال مانیتور می پردازیم.
void ()
{
int x = Wire.read();
Serial.println(x);
}
کد کامل master
#include <Wire.h>
char x = 0;
void setup() {
Wire.begin();
}
void loop() {
Wire.beginTransmission(6);
Wire.write(x);
Wire.endTransmission();
x++;
delay(500);
}
کد کامل slave
#include <Wire.h>
void setup() {
Wire.begin(6);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop() {
delay(100);
}
void receiveEvent()
{
int x = Wire.read();
Serial.println(x);
}
پایان آموزش آردوینو ( قسمت یازدهم – I2C )