برد هوش مصنوعی Sipeed

راه اندازی و کار با برد Maixduino بخش هشتم: پورت I2C در Sipeed

getting-started-with-sipeed-m1-maixduino-step-eight-i2c-protocol-digispark
نوشته شده توسط معین صابری

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

 


ارتباط I2C تعریف و کاربرد


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

ارتباط i2c در برد sipeed مایکسدوینو maixduino - دیجی اسپارک

 

 ارتباط I2C از دو پایه SCL(که گاهی SCK هم خوانده می شود) و SDA بهره می برد. این دو پایه وظیفه برقراری ارتباط و تبادل داده را بر عهده دارند. پایه SCL وظیفه تامین کلاک بین فرستنده و گیرنده و پایه SDA وظیفه تبادل داده را برعهده دارد. بدین ترتیب با ایجاد پالس کلاک، داده ها از طریق کابل SDA بین فرستنده و گیرنده جا به جا می شوند. در این فناوری می توان تا ۱۲۸ دستگاه را روی یک باس اشتراکی راه اندازی کرد. از طرفی دیگر، از آنجاییکه هر دستگاه متصل به باس دارای آدرس منحصر به فرد است، لذا می توان به راحتی دستگاه ها را شناسایی نمود.

در رابطه با برد Maixduino، این برد دارای پورت I2C است. پایه های مربوط به این پورت همانند برد آردوینو UNO در بالا و سمت راست(از سمت جک آداپتور) قرار گرفته اند. از طرفی دیگر این برد از توابع مربوط به کتابخانه wire نیز پشتیبانی می کند. بدین ترتیب به سادگی و با همان دستورات آردوینو می توان پورت را راه اندازی نمود. در قسمت بعدی به این موضوع می پردازیم.

 


دستورات راه اندازی و کار با پورت I2C


همانطور که پیشتر گفته شد، جهت راه اندازی و کار با پورت I2C در بر Maixduino از کتابخانه wire استفاده می شود. جدول زیر برخی از توابع پایه ای و کاربردی این کتابخانه را نمایش می دهد.

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

 

ورودی اول آدرس دستگاه I2C

*****************

ورودی دوم تعداد بایت هایی که قصد خواندن داریم.

****************

کنترل ارتباط باس I2C

 

requestFrom(address, quantity, stop)
به کمک این تابع ارتباط با دستگاه متصل به برد جهت تبادل داده آغاز می گردد. آدرس ۷ بیتی است. ورودی آدرس دستگاه I2C متصل را تعیین می کند. beginTransmission(address)

 

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

۰: قطع ارتباط با موفقیت

۱: بزرگتر بودن داده از حجم بافر

۲: دریافت NACK در ارسال

۳:دریافت NACK دردریافت

۴: خطای دیگر

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

 

 

 پس از بررسی توابع کلیدی و کاربردی، قسمت بعدی این آموزش را به یک مثال عملی اختصاص می دهیم.

 


اجرای یک نمونه برنامه


پس از بررسی ارتباط I2C و معرفی توابع آن، نوبت به اجرای یک نمونه برنامه می رسد. در این برنامه دستگاه های متصل به پورت I2C(پایه های SCL و SDA برد Maixduino) شناسایی شده و آدرس آن ها در سریال مانیتور نمایش داده می شود.

#include <Wire.h>  //اضافه کردن کتابخانه i2c

void setup() {
  Serial.begin (115200);   //باودریت ارتباط سریال
  Serial.println ();
  byte count = 0;  //متغیر جهت شمارش تعداد دستگاه های متصل
  
  Wire.begin();
  for (byte i = 0; i < 128; i++)   //یک حلقه تکرار راه اندازی می کنیم. این حلقه از شماره ۰ تا ۱۲۸ شروع به شمارش می کند. آدرس دستگاه I2C باید بین ۰ الی ۱۲۸ باشد.
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)  //در صورتیکه آدرس دستگاه بین یافت شود این تابع صفر می شود.
      {
      Serial.print ("Found address: ");  //چاپ آدرس به دهدهی و هگزا دسیمال
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      } 
  }
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  

void loop() {}

 

 پس از اجرای برنامه، در صورتیکه دستگاهی به پایه های I2C متصل کنید، آدرس آن در سریال نمایش داده می شود. برای ارتباط، در این آموزش ما یک نمایشگر I2C را به پورت I2C متصل کرده ایم. توجه داشته باشید که برای اتصال، پایه SCL دستگاه به پایه SCL برد و پایه های SDA نیز به یکدیگر متصل گردند.

 


 لوازم مورد نیاز


بردهای مبتنی بر هوش مصنوعی Sipeed

برد Maixduino

 


جمع بندی


در سلسلسه آموزش های برد Maixduino قسمت هشتم به معرفی پورت سریال I2C پرداختیم. پورت ارتباطی I2C یکی از مهم ترین و پرکاربردترین ابزار ارتباطی بین میکروکنترلرها و بردها به شمار می رود. برد Maixduino نیز از این پورت به همراه دستورات آردوینو پشتیبانی می کند. در این آموزش ابتدا به معرفی ارتباط I2C پرداختیم. سپس توابع مهم و کاربردی ارتباط I2C را بررسی کردیم. در نهایت با ارائه یک مثال برنامه نویسی، نحوه استفاده توابع در مثال های عملی را مشاهده کردیم.

 

چنانچه هرگونه ابهامی در مطالب درج شده وجود دارد، می توانید با ثبت نظر در انتهای همین پست سوال خود را بپرسید. تاکنون در دیجی اسپارک بیش از ۲۶ هزار سوال و پاسخ ثبت شده است؛ پس نظرات بی جواب نمی مانند! همچنین اگر ایراد و یا اشکالی در مطالب درج شده وجود دارد، لطفا آن را با ثبت نظر، مطرح کنید. همچنین اگر مشکلی در کدها وجود داشته و یا اجرا نمی شوند، مورد را حتما در انتهای همین آموزش مطرح نمایید. نظرات شما برای ما بسیار ارزشمند هسنند!! 

 

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

معین صابری

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

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه