آموزش راه اندازی i2c در آردوینو – آموزش آردوینو جلسه دوازدهم

راه اندازی ارتباط  i2c با آردوینو

راه اندازی i2c در آردوینو

پروتکل i2c چیست ؟

پروتکل I2C مثل روش های ارتباطی دیگه ، یک پروتکل برای ارتباط میکروکنترلر ها با هم یا با قطعات جانبی به حساب میاد .توی این پروتکل میشه تا 128 وسیله (با هفت بیت آدرس) رو فقط با 2 تا سیم به هم وصل کرد.یکی از سیم ها SCL و سیم دیگه اسمش SDA هستش ، آردوینو هم 2 پایه با همین اسم ها داره و برای تبادل داده به این روش به کار میره.تنها قطعات خارجی برای راه اندازی i2c مقاومت های پول آپِ و بس!

راه اندازی i2c

راه اندازی i2c در آردوینو

پایه های i2c در آردوینو :

 

I2C / TWI pins

Board  

  A4 (SDA), A5 (SCL)

Uno, Ethernet

20 (SDA), 21 (SCL)

Mega2560

2 (SDA),3 (SCL)

Leonardo

20 (SDA)21 (SCL), SDA1, SCL1

DUE


I2C چند تا اصطلاح داره که باید باهاشون آشنا باشیم و بعد بریم سراغ تابع ها:

  1. MASTER(فرمانده):دستگاهی که تبادل داده رو شروع میکنه
  2. SLAVE(فرمانگیر): دستگاهی که فرمانده به اون ادرسی دهی میکنه
  3. Transmiter(فرستنده): دستگاهی که داده رو روی گذرگاه میزاره
  4. Receiver(گیرنده): دستگاهی که داده رو از روی گذرگاه برمیداره

برای i2c باید از کتابخونه Wire.h استفاده کرد که با استفاده از تابع های اون میشه با دستگاهایی که واحد I2C/TW1 دارن ارتباط برقرار کرد.

دستورات و تابع های راه اندازی I2C در آردوینو

تابع Wire.begin

این تابع گذرگاه I2C را مقدار دهی اولیه می کنه و تراشه به صورت فرمانده یا فرمانگیر به گذرگاه متصل میشه. این تابع تنها یک بار در حلقه SETUP فراخوانی بشه کافیه 🙂

در صورتی که ورودی ای داخل پرانتز بزاریم و تابع دارای ورودی باشه ، میکروکنترلر بعنوان فرمانگیر استفاده میشه (وقتی کاربرد داره که 2 یا چند تا میکرو رو بخوایم به هم وصل کنیم و یکی میشه فرمانده و بقیه فرمانگیر) و آدرس فرمانگیر بصورت عدد هفت بیتی در ورودی تابع قرار میگیره. درصورت خالی گذاشتن ورودی، تراشه به صورت فرمانده تعریف میشه.

حواستون باشه این تابع پارامتر خروجی نداره.

تابع Wire.beginTransmission

این تابع تراشه رو برای ارسال داده به فرمانگیری که آدرسش داده شده آماده می کنه. پس درنتیجه ورودی این تابع عددی هفت بیتی هستش که آدرس فرمانگیر رو مشخص میکنه.بعد از ارتباط با فرمانگیر مورد نظر برای پایان ارتباط از تابع Wire.endTransmission() استفاده می کنیم.

تابع Wire.endTransmission

این تابع ارسال داده ای که با تابع Wire.beginTransmission() رو شروع شده رو تموم میکنه.اگر بایت هایی داده ای توی صف ارسال بود اول داده هارو ارسال میکنه و بعدش ارتباط رو خاتمه میده.

قالب تعریف این تابع به شکل زیره:

 

stop: یک متغیره ، و این تابع، مقادیر زیر رو میتونه دراین متغییر قرار بده که خروجیش یک بایت هست و وضعیت ارسال رو نشون میده. اگه تابع Wire.endTransmission کارش رو درست انجام بده عدد 0 رو در متغییر stop ذخیره میکنه و اگه نتونه بسته به خطایی که به وجود اومده یکی ازین عدد هارو ذخیره میکنه :

1 : طول داده بزرگتر از اندازه ی بافر ارساله
2 : موقع ارسال آدرس به فرمانگیر، فرستنده پیام نبود تایید NACK دریافت کرده.
3 : موقع ارسال داده به فرمانگیر، فرستنده پیام نبود تایید NACK دریافت کرده.
4 : سایر خطاها

تابع Wire.write
فرمانده (من هعی میگم فرمانده شما هم بخونین فرمانده و هم بخونین master، کلا برای شنیدن جفتش ذهنتون رو آماده کنید، هرکسی از یک اصلاح استفاده میکنه!) با این تابع داده رو روی slave یا فرمانگیر مینویسه ، یا بایت های داده رو توی صف میگذاره تا اونهارو بفرسته.

ساختارشم اینطوریه :

این تابع یک رشته رو به صورت بایت های  داده روی فرمانگیر مینویسه

 

این تابع یک آرایه رو به صورت بایت هایی از داده روی فرمانگیر مینویسه

 

توی قالب بالا length تعداد بایت های ارسالی رو تعیین میکنه. تابع بالا یک بایت که نشان دهنده ی تعداد بایت های نوشته شده هستش رو به صورت خروجی برمیگردونه که خوندن اون اختیاریه و واجب نیس!

تابع Wire.available

این تابع تعداد بایت هایی رو که تابع Wire.receive خونده ،برمیگردونه. این تابع بعد از فراخونی Wire.requestForm در master یا در تابع داخلی onReceive در فرمانگیر نوشته میشه. این تابع ورودی نداره  خروجیشم که گفتیم تعداد بایت های موجود برای خوندن هست.

تابع Wire.requestForm

وقتی که فرمانده از فرمانگیر داده بخواد اول این تابع رو اجرا میکنه، بعدش فرمانگیر داده هارو میفرسته و فرمانگیر با تابع Wire.read() اونهارو میخونه.

قالب تابع به شکل زیره:

 

پارامتر address ، آدرس فرمانگیری است که فرمانده از اون داده می خواد، پارامتر quantity تعداد بایت های درخواستی هستش.

تابع Wire.read

این تابع یک بایت داده رو که فرمانگیر به فرمانده فرستاده میخونه.

اول فرمانده از فرمانگبر داده رو میخواد و این کار رو با فراخوانی تابع Wire.requestForm انجام میده. این تابع پارامتر ورودی نداره و خروجی اون بایت داده ی بعدی دریافت شده هستش.

تابع Wire.onRequest

این تابع در فرمانگیر نوشته میشه. وقتی که فرمانده از فرمانگیر داده درخواست کنه تابع از قبل نوشته شده ی handler ، به صورت خودکار اجرا میشه ، تابع handler پارامتر ورودی و خروجی نداره.

تابع Wire.onReceive

این تابع هم در فرمانگیر نوشته میشه. وقتی فرمانگیر ، داده ای دریافت کرد ، تابع دیگه ای هم handler رو اجرا میکنه. تعداد بایت هایی که فرمانگیر خوانده ، numBytes ، به ورودی تابع میدیم. تابع خروجی نداره و شکل تابع صورت زیره:

 

تابع Wire.send

این تابع داده رو در یک بافر ارسال قرار میده و هیچ عملیاتی روی گذر گاه I2C انجام نمیده. قالب تابع به صورت زیره:

که value داده از نوع بایته
string از نوع رشته که نوع اون char  هست.
data  هم از نوع بایته و quantity تعداد بایت های ارسالی رو مشخص میکنه.

 

از کاربرد های معروف این ارتباط میشه به پروژه ی زیر اشاره کرد :

ایجاد ارتباط بین 2 برد آردوینو با کمک I2C

 

ارتباط بین 2 آردوینو

ارتباط i2c بین 2 آردوینو

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

و برای معرفی برد دوم بعنوان فرمانگیر یا Slave باید از کد زیر استفاده کنید:

 

پروژه های دیگه ای رو هم برای راه اندازی ارتباط I2C در آینده روی وبسایت قرار میدم ، پروژه هایی مثل راه اندازی ال سی کاراکتری با 2 سیم و نمایشگر های OLED و… که از کاربرد های این روش ارتباطی بشمار میرن.

 

این آموزش هم تموم شد ، به امید روزهای پر از موفقیت و شادی برای همه …

نظرات و تجربیات خودتون رو با ما و بقیه بازدید کننده ها از طریق بخش نظرات درمیون بزارین 🙂

حمیدرضا مودت

یک مهندس الکترونیک ، علاقه مند به یاد دادن و یاد گرفتن پیرامون دانش برق و الکترونیک

شما ممکن است این را هم بپسندید

6 پاسخ‌ها

  1. داود گفت:

    سلام ، مطالب مفید یود ، اگر من بخواهم دیتایی که slave1 برای Master1 ارسال میکنه را توسط یک Master یا Slave دیگه بخوانم بدون اینکه به اطلاعات صدمه بزنم باید از چه کد و سیم کشی استفاده کنم ؟
    به اطلاعات Master 1 دسترسی ندارم

    • با اسلیو دیگه که معنی نداره, چو مستره که دیتا مینویسه و میخونه و اسلیو, دیتا میگیره و میده, هر موقع که آدرس مستر با اون یکی باشه. مستر هم که تو هر لحظه فقط یک باس i2c یک مستر دارد, و دو مستر, پروتکل هنگ میکنه!!
      بهترین کار برای استراغ سمع یا شنود این باس, ساختن یک i2c bus پروتکل آنالایزره که بعد با usart اطلاعات رو میفرستن روی کامپیوتر.
      البته من خیلی باهاش آشنا نیستم و تابحال این کارو نکردم ولی شنیدم خیلی سخت نیست!

  2. رضا گفت:

    آقا ممنون از وقتی ک گذاشتی عالی بود

  3. حمید گفت:

    خیییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییلی عالی !
    از مطالعه مطالب مورد علاقه خودم که توسط جوانهای با استعداد باهوش و درسخون ارایه میشه بی نهایت لذت میبرم .

پاسخ دهید

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