آموزش آردوینو

آموزش پروتکل I2C با آردوینو

نوشته شده توسط اروند طباطبایی

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

در این ارتباط هم یک دستگاه فرستنده و دستگاه دیگر گیرنده است. ابتدا یک درخواست از فرستنده برای گیرنده ارسال می شود گیرنده درخواست فرستده را با کد صفر پاسخ می دهد. اگر گیرنده با فرستنده دیگری در ارتباط باشد کد ( یک ) ارسال می کند. پایه ارسال و دریافت دیتا SDA و پایه ارسال کلاک SCL نامیده می شوند ود در ماژول های مختلف آردوینو به شرح زیر است :

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 ۲۰ (SDA), 21 (SCL)
Leonardo ۲ (SDA), 3 (SCL)
Due ۲۰ (SDA), 21 (SCL), SDA1, SCL1

 

 

برنامه :

#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

void loop()
{
  Wire.requestFrom(2, 6);

  while(Wire.available())
  {
    char c = Wire.read();
    Serial.print(c);
  }

  delay(500);
}

 

 

شرح توابع کتابخانه Wire.h :

Wire.begin()
Wire.begin(address)

این تابع ارتباط را شروع می کند و گذرگاه به عنوان فرستنده یا گیرنده متصل می شود. فقط یکبار و درتابع setup() نوشته می شود.

 

 

پارامترها:

address: آدرس ۷بیتی گیرنده (اختیاری)؛ اگر مشخص نشود دستگاه به عنوان فرستنده متصل می شود.

Wire.requestFrom()

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

Syntax

Wire.requestFrom(address, quantity)
Wire.requestFrom(address, quantity, stop)

پارامترها:

address : آدرس ۷ بیتی از دستگاه گیرنده

:number تعداد بایت های ارسالی

stop : بیت توقف . بعد از ارسال پیام (بایت) درخواستی ؛ گذرگاه را آزاد میکند.

Wire.read()

بایت ارسالی را از گیرنده به فرستنده بعداز فراخوانی تابع requestFrom() یا ارسال شده از فرستنده به گیرنده، می خواند.

تابع read() از کلاس Stream است.

Wire.available()

تعداد بیت های قابل دسترس را برای بازیابی با تابع read() برمیگرداند.

این تابع در برنامه فرستنده بعد از فراخوانی requestFrom() و در برنامه گیرنده در تابع کنترلی onReceive() استفاده می شود.

این تابع از کلاس Stream است.

Wire.beginTransmission(address)
Wire.write()
Wire.endTransmission()

با تابعbeginTransmission() ارسال به گیرنده با آدرس داده شده شروع میشود. سپس تابع write() سری بایت های ارسالی را می نویسد. ( در برنامه گیرنده این تابع برای پاسخ به درخواست فرستنده استفاده می شود.)

Syntax

Wire.write(value)
Wire.write(string)
Wire.write(data, length)

value : برای ارسال یک بایت

string : برای ارسال یک سری از بایت

data : یک آرایه از بایت

length : تعداد بایت ارسالی

 

 

در ادامه به سایر توابع توضیح داده می شود.

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

اروند طباطبایی

بنیانگذار دیجی اسپارک: اولین مرجع تخصصی امبدد سیستم به زبان فارسی / کارشناس سئو و تولید محتوا

هرچه می آموزم میبینم که خیلی کم آموختم. در حال حاضر مدیریت تولید مقطع کارشناسی ارشد هستم. علاقه به رباتیک و تکنولوژی دارم. امیدوارم بتونم دانشی را که آموخته‌ام، به روش‌های مختلفی به کاربران علاقمند منتقل کنم.

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

۱۰ دیدگاه

  • سلام
    چگونه می توان از ۴ سنسور سنجش شدت نور مثل BH1750 اطلاعات را دریافت کرد؟ آیا با مالتی پلکسر cd4051 این کارامکان پذیر است؟ اگر بلی خروجی SCL و SDA سنسور سنجش شدت نور به کدام پایه های مالتی پلکسر cd4051 وصل می شود؟

    • با سلام و تشکر از شما
      بنده در این خصوص تجربه عملی ندارم. ولی با توجه به اطلاعات بنده برای کنترل ماژول‌ها و سنسورهای آنالوگ از طریق پین دیجیتال می‌باشد. در این خصوص از دیگر دوستان که تجربه عملی برای استفاده همزمان با I2c دارند، تقاضا دارم تا در این بحث شرکت کنند.

  • سلام،
    من یک سنسور MPU6050 رو از طریق پروتکل I2C با برد آردوینو UNO و Mega پروگرام کردم و بدون مشکل داده های سنسور را دریافت کردم. اما همون کد در آردوینو DUE به درستی اجرا نمیشه و پس از چند دقیقه کارکرد صحیح، گیر کرده و ارتباط I2C قطع میگردد.
    حال میخواستم یدونم این مشکل مربوط به کتابخونه DUE هست؟ و آیا راه کاری برای اون وجود دارد یا خیر؟

    • با سلام
      عملکرد برد DUE با آردوینو uno و mega کاملا متفاوت است و نیاز به تغییرات خواهد داشت.

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

      • سلام
        ممنونمیشم اگر امکانش هست بیشتر در این باره توضیح بدین،
        این اگر بخواهیم به اردوینو uno دو ماژول که هر دو با پروتکل i2c کار می کنند(مثلا همین max30102و max30205) متصل کنیم، با توجه به این که فقط دو پایه برای اتصال i2c رو برد اردوینو داریم، چگونه باید اتصالات سخت افزاری را انجام دهیم و در نوشتن برنامه(در حالی که میخوایم از کتابخونه های موجود برای این ماژول ها مثل همین کتابخونه ای که در این اموزش استفاده شده،استفاده کنیم) باید چه نکاتی را اعمال کنیم؟

        • با سلام
          تنها کافیست از پایه ها اشتراک بگیرید. هر سنسور I2c کد منحصر به فردی دارد که بایستی در کدهای برنامه کد I2C هر سنسور را دریافت و جداگانه تعریف کنید.