استفاده از ماوس + دریافت موقعیت از GPS | قسمت سی و هفتم آموزش آردوینو

استفاده از ماوس + دریافت موقعیت از GPS
17 بازدید
۱۴۰۴-۰۷-۱۳
9 دقیقه
  • نویسنده: Arduino captain
  • درباره نویسنده: من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!

در قسمت سی و ششم از آموزش آردوینو به بررسی ردیابی حرکت چرخشی و ردیابی حرکت چرخشی در اسکچ با استفاده از وقفه‌ها پرداختیم. در این قسمت قصد داریم درباره استفاده از ماوس و دریافت موقعیت از GPS صحبت کنیم.

استفاده از ماوس

فرض کنید می‌خواهید حرکت‌های یک ماوس سازگار با PS/2 را تشخیص دهید و به تغییرات مختصات افقی (x) و عمودی (y) واکنش نشان دهید. برای این کار باید از LEDها برای نمایش حرکت ماوس استفاده کنید. شدت روشنایی LEDها با حرکت ماوس در جهت افقی (چپ و راست) و عمودی (نزدیک‌تر و دورتر) تغییر می‌کند. کلیک‌کردن دکمه‌های ماوس باعث می‌شود موقعیت فعلی به‌عنوان نقطه‌ی مرجع تنظیم شود. (در شکل 1 اتصالات نشان‌داده‌شده است.) برای استفاده از این کد لازم است کتابخانه‌ی PS/2 را نصب کنید. همچنین، نیاز است فایل ps2.h را که در پوشه‌ی ps2 قرار دارد با یک ویرایشگر متن‌باز کنید و عبارت ‎#include “WProgram.h”‎ را به ‎#include “Arduino.h”‎ تغییر دهید:

شکل 1: اتصال ماوس برای نشان‌دادن موقعیت و روشن‌کردن LEDها

شکل 1: اتصال ماوس برای نشان‌دادن موقعیت و روشن‌کردن LEDها

✅ نکته

اگر از برد ۳٫۳ ولتی استفاده می‌کنید، لازم است برای پین‌های کلاک و دیتا از یک تقسیم‌کننده ولتاژ (Voltage Divider) استفاده کنید، یا می‌توانید ماوس را به‌جای ۵ ولت با ۳٫۳ ولت تغذیه کنید (که بسته به نوع ماوس ممکن است کار کند یا نکند).

شکل 1 یک سوکت female PS/2،  محفظه‌ای که ماوس در آن وصل می‌شود را از نمای روبه‌رو نشان می‌دهد. اگر سوکت female در اختیار ندارید و بریدن سر کابل ماوس برایتان مشکلی ندارد، می‌توانید سیم‌ها را بررسی کنید تا ببینید هر کدام به کدام پین متصل است و سپس آن‌ها را به پین‌های هدر لحیم کنید تا مستقیماً به پین‌های مناسب آردوینو وصل شوند. یک تست پیوستگی (continuity test) بین پین و سیم به شما کمک می‌کند خیلی سریع تشخیص دهید کدام سیم به کدام پین مربوط است. اما اگر تست را از سمت سوکت male که از ماوس بریده‌اید انجام می‌دهید، باید توجه داشته باشید که دیاگرام پین ها را باید چپ و راست برعکس در نظر بگیرید.

شاید برای شما مفید باشد:
خواندن چندین ورودی آنالوگ و اندازه‌گیری ولتاژ در آردوینو | قسمت بیست و هشتم آموزش آردوینو

سیم‌های سیگنال ماوس (کلاک و دیتا) و همچنین سیم‌های تغذیه را مطابق شکل 1 به آردوینو وصل کنید. این کار فقط با دستگاه‌های سازگار با PS/2 کار می‌کند، بنابراین باید یک ماوس قدیمی پیدا کنید—بیشتر ماوس‌هایی که کانکتور گرد PS/2 دارند برای این کار مناسب اند.

راه‌اندازی و دریافت داده از ماوس PS/2 با تابع mouseBegin

تابع mouseBegin ماوس را راه‌اندازی می‌کند تا به درخواست‌های مربوط به حرکت و وضعیت دکمه‌ها پاسخ دهد. کتابخانه‌ی PS/2 ارتباط سطح پایین با ماوس را مدیریت می‌کند. دستور mouse.write برای اطلاع‌دادن به ماوس استفاده می‌شود که قرار است داده درخواست شود. اولین‌بار که mouse.read فراخوانی می‌شود، یک پیام تأیید (acknowledgment) دریافت می‌شود که در این مثال نادیده گرفته شده است. بار دوم که mouse.read فراخوانی می‌شود، وضعیت دکمه‌ها به دست می‌آید و دو فراخوانی آخر mouse.read مقدار حرکت در محورهای x و y را از آخرین درخواست تاکنون برمی‌گردانند.

کنترل موقعیت و روشنایی LED‌ها بر اساس ورودی ماوس

این کد بررسی می‌کند که کدام بیت‌ها در مقدار status روی HIGH قرار دارند تا مشخص شود دکمه‌ی چپ یا راست ماوس فشرده شده است. دو بیت سمت راست زمانی که دکمه‌های چپ و راست ماوس فشار داده شوند روی HIGH قرار می‌گیرند و این موضوع در کد زیر بررسی می‌شود:

مقادیر x و y که از ماوس خوانده می‌شوند نشان‌دهنده‌ی میزان حرکت از زمان آخرین درخواست هستند و این مقادیر در متغیرهای xPosition و yPosition جمع می‌شوند.

مقادیر x و y مثبت خواهند بود اگر ماوس به سمت راست یا دورتر از شما حرکت کند و منفی خواهند بود اگر به سمت چپ یا به سمت شما حرکت کند.

این کد با استفاده از تابع constrain اطمینان می‌دهد که مقدار جمع‌شده از محدوده‌ی تعریف‌شده (mouseRange) فراتر نرود.

محاسبه‌ی yPosition یک روش کوتاه برای انجام همان کار را نشان می‌دهد؛ در اینجا محاسبه‌ی مقدار y مستقیماً داخل فراخوانی تابع constrain انجام می‌شود:

اگر دکمه‌های چپ و راست ماوس فشار داده شوند، مقادیر متغیرهای xPosition و yPosition ریست و در نتیجه، صفر می‌شوند.

LEDها با استفاده از analogWrite روشن می‌شوند تا موقعیت ماوس را نشان دهند—در مرکز با نصف روشنایی و با افزایش یا کاهش موقعیت ماوس، شدت روشنایی افزایش یا کاهش می‌یابد. برای اینکه این کار درست انجام شود، باید از پینی که قابلیت PWM دارد استفاده کنید. اگر برد شما پین‌های ۹ و ۱۰ را برای PWM پشتیبانی نکند (اکثر بردها پشتیبانی می‌کنند)، نور LEDها به‌جای کم‌وزیاد شدن، فقط روشن و خاموش می‌شود. در خانواده‌ی بردهای MKR، پین ۹ از PWM پشتیبانی نمی‌کند، بنابراین باید سیم‌کشی و کد را تغییر دهید تا از پینی استفاده کنید که PWM داشته باشد.

می‌توان موقعیت ماوس را روی Serial Plotter رسم کرد، با افزودن کد زیر درست بعد از دومین فراخوانی analogWrite():

همچنین لازم است این خط کد را به تابع setup() اضافه کنید:

تابع زیر را در انتهای اسکچ اضافه کنید تا موقعیت فعلی ماوس را چاپ یا رسم کند:

شاید برای شما مفید باشد:
دریافت دیتا در پروتکل UART در STM32 | قسمت نهم آموزش STM32 با توابع LL

دریافت موقعیت از GPS

فرض کنید می‌خواهید با استفاده از یک ماژول GPS موقعیت مکانی را تعیین کنید.

امروزه چندین ماژول GPS سازگار با آردوینو در دسترس هستند. اکثر آن‌ها از رابط سریال برای ارتباط با میکروکنترلر میزبان خود استفاده می‌کنند و از پروتکلی به نام NMEA 0183 پیروی می‌کنند. این استاندارد صنعتی امکان می‌دهد داده‌های GPS به‌صورت جملات ASCII قابل خواندن برای انسان به دستگاه‌های دریافت‌کننده مانند آردوینو ارسال شوند. برای مثال، جمله‌ی زیر از NMEA:

این جمله، در کنار اطلاعات دیگر، یک موقعیت جغرافیایی روی کره‌ی زمین را نشان می‌دهد: ۴۹° ۱۶.۴۵′ عرض شمالی و ۱۲۳° ۱۱.۱۲′ طول غربی.

برای تعیین موقعیت، اسکچ آردوینو شما باید این رشته‌ها را تجزیه (parse) کرده و متن مرتبط را به فرمت عددی تبدیل کند. نوشتن کد برای استخراج دستی داده‌ها از جملات NMEA می‌تواند پیچیده و زمان‌بر باشد و باتوجه‌به حافظه‌ی محدود آردوینو، مشکل‌ساز شود.

راهبرد کلی برای استفاده از GPS به شرح زیر است:

  1. ماژول GPS را به صورت فیزیکی به آردوینو وصل کنید.
  2. داده‌های NMEA را از طریق رابط سریال از ماژول GPS بخوانید.
  3. داده‌ها را پردازش کرده و موقعیت مکانی را تعیین کنید.

با استفاده از TinyGPSPlus مراحل زیر را انجام می‌دهید:

  1. ماژول GPS را به‌صورت فیزیکی به آردوینو وصل کنید.
  2. یک شیء TinyGPSPlus ایجاد کنید.
  3. داده‌های NMEA را از طریق سریال از ماژول GPS بخوانید.
  4. هر بایت داده را با روش encode() کتابخانه‌ی TinyGPSPlus پردازش کنید.
  5. به‌صورت دوره‌ای با استفاده از روش get_position() موقعیت مکانی را دریافت کنید.

اسکچ زیر نشان می‌دهد چگونه می‌توانید داده‌ها را از یکGPS  متصل به پورت سریال آردوینو دریافت کنید. هر پنج ثانیه، اگر دستگاه در نیمکره‌ی جنوبی باشد، LED داخلی یک‌بار و اگر در نیمکره‌ی شمالی باشد، دو بار چشمک می‌زند. اگر پین‌های TX و RX آردوینو شما به یک دستگاه سریال دیگر مانند Serial1 متصل هستند، تعریف GPS_SERIAL را تغییر دهید (به جدول 1 مراجعه کنید).

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

یک اتصال با سرعت ۹۶۰۰ بیت در ثانیه (baud) با ماژول GPS برقرار می‌شود. وقتی داده‌ها شروع به جریان‌یافتن کردند، با روش encode() پردازش می‌شوند که داده‌های NMEA را تجزیه می‌کند. بازگشت مقدار true  از encode() نشان می‌دهد که TinyGPSPlus توانسته یک جمله کامل را تجزیه کند و داده‌ی موقعیت جدید ممکن است در دسترس باشد. این زمان مناسبی است تا با فراخوانی gps.location.isValid() بررسی کنید که موقعیت دریافتی معتبر است یا خیر.

اتصال یک ماژولGPS  به آردوینو معمولاً به‌سادگی وصل کردن دو یا سه سیم داده از GPS به پین‌های ورودی آردوینو است، همان‌طور که در جدول 1 نشان‌داده‌شده است. اگر از برد ۵ ولتی مانندUno  استفاده می‌کنید، می‌توانید از ماژول GPS با ولتاژ ۳٫۳ ولت یا ۵ ولت استفاده کنید. اما اگر از بردی استفاده می‌کنید که تحمل ۵ ولت را ندارد، مانند بردهای مبتنی بر SAMD مثل Arduino Zero،Adafruit Metro M0/M4 یا SparkFun Redboard Turbo، باید از ماژول GPS با ولتاژ ۳٫۳ ولت استفاده کنید.

جدول 1: اتصالات پین های GPS

جدول 1: اتصالات پین های GPS

✅ نکته

برخی ماژول‌های GPS از سطح ولتاژ RS-232 استفاده می‌کنند که با منطق TTL آردوینو ناسازگار است و می‌تواند به طور دائمی برد را خراب کند. اگر GPS شما از سطح ولتاژ RS-232 استفاده می‌کند، باید از یک مبدل منطقی میانی مانند مدار مجتمع MAX232 استفاده کنید.

اتصال GPS به آردوینو با SoftwareSerial و لاگ‌کردن داده‌های NMEA

در این کدی فرض شده است که GPS  مستقیماً به پین‌های سریال داخلی آردوینو متصل است. در بردهای مبتنی بر ATmega328 مانند Arduino Uno، این معمولاً طراحی راحتی نیست، زیرا پین‌های RX و TX (پین‌های ۰ و ۱) با اتصال سریال USB مشترک هستند. در بسیاری از پروژه‌ها، ممکن است بخواهید از پورت سریال سخت‌افزاری برای ارتباط با یک کامپیوتر میزبان یا سایر دستگاه‌های جانبی استفاده کنید که در این صورت این پورت نمی‌تواند توسط GPS استفاده شود. در چنین مواردی، یک جفت پین دیجیتال دیگر را انتخاب کرده و از کتابخانه‌ای برای شبیه‌سازی پورت سریال (Soft Serial) استفاده کنید تا با GPS ارتباط برقرار شود.

شاید برای شما مفید باشد:
‌راه‌اندازی ماژول Laser Emit با آردوینو

با خاموش بودن آردوینو و GPS، سیم TX ماژول GPS را به پین ۲ و سیم RX را به پین ۳ آردوینو وصل کنید تا پورت سریال سخت‌افزاری برای دیباگ آزاد شود. سپس با اتصال کابل USB به کامپیوتر میزبان، اسکچ زیر را اجرا کنید تا نگاهی دقیق به عملکرد TinyGPS از طریقSerial Monitor آردوینو داشته باشید:

توجه داشته باشید که می‌توانید از سرعت ارتباط (baud rate) متفاوتی برای اتصال به Serial Monitor و GPS استفاده کنید.

بررسی اعتبار و تازگی داده‌های GPS با TinyGPSPlus

این اسکچ جدید همانند مثال قبلی است (اما برای کوتاه‌شدن آن، کد چشمک‌زدن LED حذف شده است) و دیباگ بسیار آسان‌تری دارد. در هر زمان می‌توانید یک نمایشگر LCD سریال را به پورت سریال داخلی وصل کنید تا جملات NMEA و داده‌های TinyGPSPlus را مشاهده کنید. همچنین می‌توانید از طریق Serial Monitor آردوینو به پورت سریال متصل شوید.

هنگامی که برق روشن می‌شود، یک واحد GPS شروع به ارسال جملات NMEA می‌کند. بااین‌حال، جملاتی که شامل داده‌های موقعیت مکانی معتبر هستند، تنها پس از آنکه GPS یک فیکس (Fix) برقرار کند، ارسال می‌شوند. برای این کار، آنتن GPS باید دید مستقیمی به آسمان داشته باشد و این فرایند می‌تواند تا دو دقیقه یا بیشتر طول بکشد. هوای طوفانی یا وجود ساختمان‌ها و موانع دیگر نیز ممکن است توانایی GPS برای تعیین دقیق موقعیت را مختل کند.

پس اسکچ چگونه می‌داند که TinyGPSPlus داده‌های موقعیت معتبر را ارائه می‌دهد؟ پاسخ در مقدار بازگشتی تابع gps.location.isValid() نهفته است. مقدار false به این معنی است که TinyGPS هنوز هیچ جمله‌ی معتبری شامل داده‌های موقعیت را تجزیه نکرده است. در این حالت، مختصات عرض و طول جغرافیایی بازگشتی نیز نامعتبر خواهند بود.

سنجش تازگی فیکس و تشخیص مختصات منسوخ در GPS

همچنین می‌توانید بررسی کنید که آخرین فیکس چقدر قدیمی است. تابع gps.date.age() تعداد میلی‌ثانیه‌های گذشته از آخرین فیکس را برمی‌گرداند. اسکچ مقدار آن را در متغیر fix_age ذخیره می‌کند. در عملکرد عادی، انتظار می‌رود که مقدارfix_age  نسبتاً کم باشد. دستگاه‌های GPS مدرن قادرند داده‌های موقعیت را با فراوانی یک تا پنج بار در ثانیه یا بیشتر گزارش دهند، بنابراین اگر fix_age بیش از حدود ۲۰۰۰ میلی‌ثانیه باشد، ممکن است مشکلی وجود داشته باشد. ممکن است GPS در حال عبور از یک تونل باشد یا یک اشکال در سیم‌کشی باعث خراب شدن جریان داده‌های NMEA شود و چک‌سام (Checksum) را نامعتبر کند (محاسباتی برای بررسی عدم خرابی داده‌ها). در هر صورت، مقدار بزرگ fix_age نشان می‌دهد که مختصات بازگشتی از get_position() قدیمی و منسوخ هستند.

اطلاعات
17
0
0
لینک و اشتراک
جلسات دیگر
آردوینو

ردیابی حرکت چرخشی | قسمت سی و ششم...

profile

نویسنده: Arduino captain

متخصص الکترونیک

من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!


ویراستار: محمد کبیر
مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ
سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله