پروتکل 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 توسعه داده شده است و با فراخوانی آن دستورات اجرا میشود.
سلام ایا امکان اینکه دو ماژول با پروتکل i2c رو به اردینو وصل نمود؟
با سلام
بله امکان پذیر است. از اتصال مشترک استفاده کنید.
سلام
ممنونمیشم اگر امکانش هست بیشتر در این باره توضیح بدین،
این اگر بخواهیم به اردوینو uno دو ماژول که هر دو با پروتکل i2c کار می کنند(مثلا همین max30102و max30205) متصل کنیم، با توجه به این که فقط دو پایه برای اتصال i2c رو برد اردوینو داریم، چگونه باید اتصالات سخت افزاری را انجام دهیم و در نوشتن برنامه(در حالی که میخوایم از کتابخونه های موجود برای این ماژول ها مثل همین کتابخونه ای که در این اموزش استفاده شده،استفاده کنیم) باید چه نکاتی را اعمال کنیم؟
با سلام
تنها کافیست از پایه ها اشتراک بگیرید. هر سنسور I2c کد منحصر به فردی دارد که بایستی در کدهای برنامه کد I2C هر سنسور را دریافت و جداگانه تعریف کنید.