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

برقراری ارتباط SPI با آردوینو (راه اندازی پروتکل SPI)

در این آموزش، ما می آموزیم که ارتباط SPI چیست، چگونه کار می کند و چگونه باید آن را در آردوینو راه اندازی کنیم. برای درک بهتر شما، یک پروژه مثال می‌سازیم که در آن Arduino Uno از SPI برای کنترل پتانسیومتر دیجیتال MCP4131 استفاده می‌کند.

SPI چیست؟

SPI مخفف Serial Parallel Interface است. SPI یک نوع ارتباط سریال همزمان است، به این معنی که انتقال داده ها با پالس های ساعت زمان بندی می شود. ارتباط SPI برای انتقال داده در فواصل طولانی خوب نیست. فقط باید برای ارتباط بین دستگاه هایی که کمتر از 10 متر از هم فاصله دارند استفاده شود.

قطعات یک شبکه SPI

یک شبکه SPI شامل یک دستگاه Master و یک یا چند دستگاه Slave متصل به یک گذرگاه است.

دستگاه SPI MASTER: دستگاه Master داده ها را به دستگاه های Slave می فرستد و از آنها دریافت می کند. تنها یک دستگاه Master در یک شبکه SPI وجود دارد.

دستگاه SPI SLAVE: دستگاه Slave دستورات را از دستگاه Master دریافت می کند و داده ها را به دستگاه Master ارسال می کند. ممکن است یک یا چند دستگاه Slave در یک شبکه SPI وجود داشته باشد.

باس SPI: گذرگاه SPI به سیم هایی اشاره دارد که دستگاه Master را به دستگاه های Slave متصل می کند. هر دستگاه Master و Slave دارای پین های زیر است:

  • Master Out Slave In (MOSI) – اتصال دستگاه Master برای ارسال داده به دستگاه Slave
  • Master In Slave Out (MISO) – اتصال دستگاه Slave برای ارسال داده ها به دستگاه Master
  • ساعت سریال (SCLK) – خطی که پالس ساعت تولید شده توسط دستگاه Master را حمل می کند.
  • Slave Select/Chip Select (SS/CS) – اتصالی که توسط دستگاه Master برای اطلاع دادن به دستگاه Slave استفاده می‌شود. پین SS/CS باید روی LOW تنظیم شود تا به Slave اطلاع دهد که master داده‌ها را ارسال یا درخواست می‌کند. در غیر این صورت، همیشه HIGH است.

برای کسب اطلاعات بیشتر، مقاله ارتباط SPI را مطالعه کنید.

پایه های ارتباط SPI در آردوینو

Arduino Uno دارای پشتیبانی سخت افزاری داخلی برای ارتباط SPI است. پین‌های SS/CS، MOSI، MISO و SCLK در تصویر زیر نشان داده شده‌اند:

پایه های ارتباط SPI در آردوینو

معمولا از پین های 10-13 استفاده می شود، اما پین های MOSI، MISO و SCLK در هدر ICSP (نزدیک تراشه ATMEGA) هم وجود دارد. MOSI، MISO و SCLK روی پین‌های 11-13 و هدر ICSP یکسان هستند.

پتانسیومتر دیجیتال MCP4131

MCP4131 در اصل یک شبکه مقاومتی با خروجی پین پتانسیومتر است. ما می‌توانیم با ارسال دستورات از طریق SPI به پایه‌های 1، 2 و 3، مقاومت خروجی را در پایه 6 به صورت دیجیتالی کنترل کنیم. در زیر یک نمودار پین برای MCP4131 آمده است:

پتانسیومتر دیجیتال MCP4131

شاید تعجب کنید که پین ​​های MOSI، MISO و SCLK کجا هستند. گاهی اوقات، پین های رابط SPI بسته به سازنده دستگاه برچسب متفاوتی دارند. پین های MCP4131 SPI به شرح زیر است:

  • MISO = ورودی داده سریال (SDI) در پایه 3 (ترکیب با MOSI)
  • MOSI = خروجی داده سریال (SDO) در پایه 3 (ترکیب با MISO)
  • SCLK = ساعت سریال (SCK) در پایه 2
  • CS = پایه انتخاب SS

ارتباط SPI برد آردوینو با پتانسیومتر دیجیتال

حال بیایید نحوه استفاده از SPI در آردوینو را با ساختن یک پروژه مثال ساده نشان دهیم. ما از Arduino Uno برای کنترل پتانسیومتر دیجیتال MCP4131 با پروتکل SPI استفاده می کنیم. پس از ارسال فرمان از طریق SPI، تغییرات مقاومت خروجی MCP4131 را در سریال مانیتور مشاهده خواهیم کرد.

برای ساخت این پروژه به اجزای زیر نیاز دارید:

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
  • آردوینو Uno
  • پتانسیومتر دیجیتال MCP4131
  • برد بورد
  • سیم های جامپر
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

پس از جمع آوری تمام اجزاء، مدار را مطابق شماتیک سیم کشی زیر بسازید:

ارتباط SPI برد آردوینو با پتانسیومتر دیجیتال

کد ارتباط SPI آردوینو

برای استفاده از رابط SPI Arduino Uno، باید از کتابخانه SPI استفاده کنیم. این یک کتابخانه استاندارد است که با نرم افزار Arduino IDE به صورت پیشفرض همراه و نصب شده است.

کد کامل پروژه در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مهم کد را توضیح میدهیم.

کتابخانه SPI تنها از آردوینو به عنوان یک دستگاه Master پشتیبانی می کند. به همین دلیل، پین 10 باید به عنوان یک OUTPUT پیکربندی شود تا از تداخل در عملکرد کتابخانه جلوگیری شود. ما این کار را با اضافه کردن pinMode(10, OUTPUT) داخل بخش setup() انجام می دهیم.

SPI.BEGIN(): بعد باید گذرگاه SPI را مقداردهی اولیه کنیم. ما این کار را با استفاده از تابع SPI.begin() در قسمت setup() انجام می دهیم. فراخوانی ()SPI.begin حالت های پین MOSI، MISO و SS/CS را روی OUTPUT تنظیم می کند. همچنین MOSI و SCLK را روی LOW و پین SS/CS را روی HIGH قرار می دهد.

اولین کاری که باید قبل از ارسال داده به یک دستگاه Slave انجام دهید این است که پین ​​SS/CS دستگاه Master را روی LOW قرار دهید. در این پروژه، پین SS/CS پین 10 آردوینو است.

SPI.TRANSFER(): برای ارسال دستورات به MCP4131، باید از تابع SPI.transfer(val) استفاده کنیم. پارامتر val داده‌ای است که می‌خواهیم از طریق SPI ارسال کنیم. این تابع همچنین داده های دریافتی از MCP4131 را برمی گرداند.

با توجه به برگه داده MCP4131، ما باید آدرس رجیستر را 0x00 و به دنبال آن عددی بین 0 تا 128 ارسال کنیم. این عدد مقاومت خروجی را روی پایه 6 MCP4131 تنظیم می کند. عدد کوچکتر مقاومت کمتری را تعیین می کند و عدد بزرگتر مقاومت بالاتری را ایجاد می کند.

در طرح بالا، از یک حلقه for برای تکرار مقدار لغزنده پتانسیومتر از 0 تا 128 استفاده می کنیم، مقدار را در متغیر wiper_value ذخیره می کنیم، سپس از wiper_value به عنوان آرگومان در تابع SPI.transfer() برای ارسال آن به MCP4131 استفاده می کنیم.

برای تجسم مقاومت خروجی MCP4131، باید ولتاژ پایه آنالوگ A0 آردوینو را بخوانیم و آن را در سریال مانیتور چاپ کنیم. برای این کار از Serial.println(analogRead(A0)) در انتهای حلقه for استفاده می کنیم. در مرحله بعد یک ثانیه تاخیر برای کاهش سرعت تکرار wiper_value اضافه می کنیم.

پس از ارسال مقدار ذخیره شده در wiper_value به MPC4131، پین SS را روی HIGH تنظیم کنید تا به MCP4131 بگوید که ارتباط ما با آن تمام شده است. ما این کار را با دستور digitalWrite(10، HIGH) در آخرین خط بخش loop() انجام می دهیم.

تست پروژه

پس از اتصال مدار و آپلود کد بالا، مانیتور سریال آردوینو خود را باز کنید تا ولتاژ شناسایی شده در پین A0 آردوینو را ببینید. آردوینو به طور مداوم دستوراتی را به MCP4131 ارسال می کند تا مقدار لغزنده پتانسیومتر از 0 به 128 تبدیل شود. پس از رسیدن به 128، مقدار به 0 بازنشانی می شود و این روند تکرار می شود. مقدار نشان داده شده در مانیتور سریال بسته به مقاومت MCP4131 از 0 تا 1023 تغییر می کند. هنگامی که مقاومت بالا باشد، ولتاژ شناسایی شده در پین آنالوگ A0 کم خواهد بود، بنابراین عدد در مانیتور سریال کم خواهد بود. هنگامی که مقاومت MCP4131 کم است، ولتاژ در پایه A0 بالا خواهد بود، بنابراین عدد در مانیتور سریال زیاد خواهد بود.

از کد مثال و نمودارهای سیم کشی بالا به عنوان راهنمایی برای اتصال دستگاه های SPI خود به آردوینو استفاده کنید. اگر سوالی دارید، در همین صفحه یا انجمن نظر خود را با ما در میان بگذارید.

موارد موجود در فایل : فایل سورس کامل

5 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

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

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