برقراری ارتباط بین دو برد آردوینو با پروتکل I2C

محتویات
در این آموزش، در مورد اینکه پروتکل ارتباطی I2C چیست، چگونه کار می کند و چگونه از آن در آردوینو استفاده کنیم، صحبت خواهیم کرد. ما قصد داریم پروژه ای بسازیم که از ارتباطات I2C برای تبادل داده بین دو آردوینو استفاده می کند.
I2C چیست؟
I2C مخفف Inter-Integrated Circuit است. I2C یک پروتکل ارتباطی سریال با سرعت کم است که برای انتقال داده ها در فواصل کوتاه استفاده می شود. اگر نیاز به انتقال داده در فاصله زیاد دارید، این پروتکل توصیه نمی شود.
نمونه ای از یک شبکه ساده I2C در زیر نشان داده شده است:
همانطور که در نمودار بالا مشاهده می کنید، مزیت استفاده از I2C این است که برای برقراری ارتباط با چندین دستگاه فقط به دو سیم نیاز دارید. تمام داده ها از طریق دو سیم به دستگاه master و slave منتقل می شود. از آنجایی که آردوینو دارای تعداد محدودی پین ورودی/خروجی است، I2C می تواند به شما امکان اتصال دستگاه های بیشتری را بدهد. بسیاری از سنسورها و ماژول ها دارای ارتباط I2C هستند.
پیشنهاد میکنم مقاله I2C چیست را مطالعه کنید.
ارتباط I2C در آردوینو
برای نشان دادن نحوه استفاده از I2C در آردوینو، بیایید پروژه ای بسازیم که داده ها را بین دو آردوینو به ارسال و دریافت میکند. این پروژه موقعیت یک پتانسیومتر متصل به آردوینو Master را می خواند، اطلاعات را از طریق I2C ارسال می کند و سرعت چشمک زدن LED را روی آردوینو Slave تغییر می دهد.
پین های I2C در آردوینو
آردوینو پین های اختصاصی برای I2C دارد که طبق پروتکل I2C دارای مقاومت های پول آپ داخلی هستند.
برای بردهای آردوینو Uno، پینهای A4 و A5 برای I2C هستند. پایه A4 پایه SDA و پایه A5 پایه SCL است. در نسخه آردوینو Uno R3، مجموعه دیگری از پینهای I2C در نزدیکی سوکت USB وجود دارد.
قطعات مورد نیاز
برای ساخت این پروژه به قطعات زیر نیاز دارید:
- آردوینو اونو – 2 عدد
- پتانسیومتر (10 کیلو اهم) – 2 عدد
- سیم های جامپر
- برد بورد
شما باید اتصالات را مطابق تصویر زیر انجام دهید:
ما در پایه های SDA و SCL به مقاومت های pull-up نیاز نداریم، زیرا به صورت پیشفرض در پین های I2C آردوینو تعبیه شده اند.
ما دو آردوینو در شبکه I2C خود داریم، بنابراین دو نوع کد داریم. یکی برای آردوینو Master و دیگری برای آردوینو Slave.
کد Master آردوینو در ارتباط I2C
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مهم کد را بررسی میکنیم.
بخش اصلی کد برای هر دو دستگاه master و slave چیزی است که برای تنظیم چشمک زدن ال ای دی استفاده میشود. برای چشمک زدن پین 13 LED در آردوینو، باید موارد زیر را انجام دهیم:
- متغیرهای بایت i2c_rcv، int time_start، stat_LED و byte value_pot را در بالای کد اضافه میکنیم.
- متغیرهای دیگر را در قسمت setup() مقداردهی میکنیم.
- با استفاده از pinMode() پایه 13 آردوینو را به عنوان پایه خروجی تنظیم میکنیم.
- کد blink را در داخل loop() اضافه میکنیم.
برای استفاده از رابط داخلی I2C آردوینو، از کتابخانه Wire استفاده می کنیم. این کتابخانه به صورت پیشفرض همراه با Arduino IDE است، بنابراین نیازی به نصب آن نیست.
کتابخانه Wire دارای عملکردهای آماده I2C است تا برنامه نویسی را برای ما آسان تر کند. برای استفاده از توابع موجود در کتابخانه Wire، ابتدا باید آن را در ابتدای کد فراخوانی کنیم.
پس از گنجاندن کتابخانه، کار بعدی این است که ارتباط I2C را آغاز کنیم. خیلی راحت کد Wire.begin(); را در بخش setup قرار میدهیم.
اکنون در بخش loop() کد آردوینو مقدار پتانسیومتر متصل به پین A0 را میخواند و آن مقدار را در متغیر value_pot ذخیره میکند.
پس از ذخیره مقدار از پین A0 در متغیر value_pot، می توانیم مقدار را از طریق I2C ارسال کنیم. ارسال داده از طریق I2C شامل سه عملکرد است:
- Wire.beginTransmission()
- Wire.write()
- Wire.endTransmission()
WIRE.BEGINTRANSMISSION(): ما ابتدا با اطلاع دادن به دستگاه های متصل، دستور ارسال را آغاز می کنیم. برای این کار تابع Wire.beginTransmission(address) را فراخوانی می کنیم. address، آدرس دستگاه I2C است که داده ها را دریافت می کند. این تابع به Slave اطلاع می دهد که برای دریافت داده ها آماده شود
WIRE.WRITE(): سپس مقدار ذخیره شده در متغیر value_pot را با استفاده از تابع Wire.write(value) ارسال می کنیم. value متغیری است که داده هایی را که می خواهید ارسال کنید ذخیره می کند.
WIRE.ENDTRANSMISSION(): پس از ارسال داده ها، باید شبکه را آزاد کنیم تا دستگاه های دیگر از طریق شبکه با هم ارتباط برقرار کنند. این کار با تابع Wire.endTransmission() انجام می شود.
آردوینو Master نیز باید مقدار پتانسیومتر را از آردوینو Slave دریافت کند. برای دریافت داده از طریق I2C، از سه تابع زیر استفاده می کنیم:
- Wire.requestFrom()
- Wire.available()
- Wire.read()
WIRE.REQUESTFROM(): دستور کامل برای درخواست داده از یک دستگاه Wire.requestFrom(address،value) است. address آدرس I2C دستگاه Slave =است که باید از آن داده دریافت کنیم و value تعداد بایت هایی است که ما نیاز داریم. برای پروژه ما، آدرس دستگاه slave برابر با 0x08 است و ما به یک بایت داده نیاز داریم. بنابراین در داخل loop()، از Wire.requestFrom(0x08, 1) برای درخواست یک بایت داده از slave 0x08 استفاده می کنیم.
WRITE.AVAILABLE(): ابتدا بررسی می کنیم که آیا داده ای وجود دارد یا خیر. ما این کار را با استفاده از تابع Write.available() در داخل یک عبارت شرطی if() انجام می دهیم. تابع Write.available() تعداد بایت هایی که منتظر خوانده شدن هستند را برمی گرداند.
WIRE.READ(): برای بدست آوردن داده های موجود، از تابع Wire.read() استفاده می کنیم و مقدار بازگشتی را در متغیر i2c_rcv ذخیره می کنیم. هر فراخوانی تابع Wire.read() تنها یک بایت داده از گذرگاه I2C دریافت می کند.
کد دستگاه Slave برای ارتباط I2C
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مهم کد را بررسی میکنیم.
برای دستگاه slave، تفاوت جزئی در کد وجود دارد. اولین تفاوت در Wire.begin(address) است. برای دستگاه های slave، نوشتن address الزامی است. برای پروژه ما، آدرس دستگاه slave 0x08 خواهد بود. این می تواند هر آدرسی که می خواهید باشد، اما مطمئن شوید که در شبکه I2C منحصر به فرد است یعنی تکراری نیست. برخی از دستگاه ها و ماژول های slave I2C به صورت پیشفرض آدرس تعریف شده دارند و میتوانید دیتاشیت را برای دسترسی به آدرس بررسی کنید.
با افزودن کد Wire.begin(0x08)، برد آردوینو به شبکه I2C به عنوان یک دستگاه SLAVE ملحق می شود.
هر دو کد را روی برد های آردوینو آپلود کنید.
- در نهایت پتانسیومتر را روی دستگاه Master تنظیم کنید تا میزان چشمک زدن LED دستگاه Slave را کنترل کنید.
- پتانسیومتر را روی دستگاه slave تنظیم کنید تا میزان چشمک زدن LED دستگاه Master را کنترل کنید.
- کد ما موقعیت پتانسیومتر master را می گیرد و از طریق I2C به دستگاه Slave ارسال می کند. سپس دستگاه Slave از مقدار دریافتی برای تنظیم
- زمان تاخیر چشمک زدن LED استفاده می کند. همین اتفاق در مورد موقعیت پتانسیومتر Slave نیز رخ می دهد.
موارد موجود در فایل : فایل سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام،آیا میتوانم از یک برد اونو و دیگری نانو برای این پروژه استفاده کنم؟ضمنا برنامه یک مقدار برای برنامه نویسان مبتدی پیچیده است.
سلام وقت بخیر
بله میتوانید استفاده کنید
برای یادگیری برنامه نویسی آردوینو میتوانید دوره آموزش آردوینو را مشاهده کنید
سلام
آیا با این روش میشه یه فایل mp3 رو جا به جا کرد؟
یعنی مثلا با شیلد vs1053 یه فایل ضبط بشه
و از این طریق به آردوینو دوم ارسال بشه؟؟