خواندن کیبورد + خواندن مقادیر آنالوگ + تغییر دامنه مقادیر | قسمت بیست و هفتم آموزش آردوینو

blog
gasemi.m100
۱۴۰۳-۱۲-۰۴
9 دقیقه

در قسمت بیست و ششم از آموزش آردوینو به بررسی تعیین مدت‌زمان فشرده‌شدن یک سوئیچ پرداختیم. در این قسمت قصد داریم درباره خواندن کیبورد (صفحه‌کلید)، خواندن مقادیر آنالوگ و تغییر دامنه مقادیر صحبت کنیم.

خواندن کیبورد

فرض کنید شما یک کیبورد ماتریسی دارید و می‌خواهید سوئیچ‌های فشرده‌شده را در اسکچ خود بخوانید. برای مثال،  صفحه‌کلید 12 دکمه‌ای که روی بسیاری از دستگاه‌ها مانند تلفن رومیزی وجود دارد.

در این کد ما از روشی موسوم به اسکن یا جاروب استفاده می کنیم. در این روش ستون‌ها را خروجی و سطرها را ورودی در نظر می‌گیریم و از ساختار for تو در تو کمک می‌گیریم تا کلید فشرده شده را پیدا کنیم. پس ابتدا ستون اول را صفر می کنیم و سطرها را به ترتیب می‌خوانیم (اسکن می‌کنیم) و این کار برای ستون های دیگر هم ادامه می دهیم تا مشخص شود آیا سطری صفر شده یا نه. صفر شدن پایه مربوط به هر سطر نشان دهنده‌ این است که کلید نگاشت شده به این سطر و ستون، فشرده شده است.

ردیف‌ها و ستون‌ها را از کانکتور کیبورد به آردوینو متصل کنید، همان‌طور که در شکل 1 نشان داده شده است:

اگر آردوینو و کیبورد خود را همان‌طور که در شکل 1 نشان داده شده است، سیم‌کشی کرده‌اید، کد زیر سوئیچ های فشرده‌شده را در Serial Monitor چاپ خواهد کرد:

این کد فقط در صورتی به‌درستی کار خواهد کرد که سیم‌کشی با کد مطابقت داشته باشد. جدول  1نشان می‌دهد که چگونه باید ردیف‌ها و ستون‌ها به پین‌های آردوینو متصل شوند. اگر از کیبورد دیگری استفاده می‌کنید، دیتاشیت آن را بررسی کنید تا بتوانید اتصالات ردیف‌ها و ستون‌ها را مشخص کنید. این موضوع را با دقت بررسی کنید… زیرا سیم‌کشی نادرست می‌تواند باعث اتصال کوتاه پین‌ها شده و به چیپ کنترل‌کننده شما آسیب برساند!

متصل کردن پین (پایه) های آردوینو به سطرها و ستون‌های کی‌پد

جدول 1: متصل کردن پین (پایه) های آردوینو به سطرها و ستون‌های کی‌پد

کیپدهای ماتریسی معمولاً از سوئیچ‌های Normally Open تشکیل شده‌اند که هنگام فشاردادن، یک سطر را به یک ستون متصل می‌کنند. سوئیچ Normally Open فقط زمانی که فشرده شود، اتصال الکتریکی برقرار می‌کند.

شکل 1 نشان می‌دهد که چگونه رساناهای داخلی، سطرها و ستون‌های دکمه‌ها را به کانکتور کیبورد متصل می‌کنند. هر یک از چهار سطر به یک پایه ورودی و هر ستون به یک پایه خروجی متصل است.

تابع setup حالت پین‌ها (پایه‌ها) را تنظیم می‌کند تا مقاومت‌های Pull-up را روی پایه‌های ورودی فعال کند. (برای اطلاعات بیشتر، به بخش مقاومت‌های Pull-up قسمت‌های قبلی مراجعه کنید)

تابع getkey به‌صورت متوالی پایه‌ی هر ستون را در حالت LOW (پایین) تنظیم کرده و سپس بررسی می‌کند که آیا هیچ‌یک از پایه‌های سطر LOW شده‌اند یا نه.

ازآنجاکه از مقاومت‌های Pull-up استفاده شده‌ است، سطرها در حالت عادی HIGH (بالا) هستند، مگر اینکه یک سوئیچ فشرده شود. فشردن یک سوئیچ باعث می‌شود سیگنال LOW در پایه‌ی ورودی ایجاد شود) اگر پایه‌ی سطر LOW باشد، این نشان می‌دهد که سوئیچ مربوط به آن سطر و ستون فشرده شده است.)

برای جلوگیری از تأثیر نویز (پرش سوئیچ)، یک تأخیر اعمال می‌شود. سپس کد منتظر می‌ماند تا سوئیچ رها شود و کاراکتر مرتبط با سوئیچ از آرایه‌ی keymap پیدا شده و از تابع بازگردانده می‌شود. اگر هیچ سوئیچی فشرده نشده باشد، مقدار 0 بازگردانده می‌شود.

کتابخانه Keypad مدیریت تعداد مختلفی از سوئیچ‌ها را در آردوینو آسان‌تر می‌کند و می‌تواند به‌گونه‌ای تنظیم شود که برخی از پین‌ها را با نمایشگر کاراکتری LCD به اشتراک بگذارد. این کتابخانه در Arduino Library Manager موجود است.

خواندن مقادیر آنالوگ

فرض کنید می‌خواهید ولتاژ روی یک پین آنالوگ را بخوانید. ممکن است بخواهید مقدار یک پتانسیومتر (pot)، یک مقاومت متغیر یا یک سنسوری را که ولتاژ متغیری ارائه می‌دهد، دریافت کنید.

کد زیر، ولتاژ ورودی از یک پین آنالوگ (A0) را می‌خواند و یک LED را با نرخی متناسب با مقدار بازگشتی از تابع analogRead فلش می‌کند. ولتاژ توسط یک پتانسیومتر به صورتی که در شکل 2 نشان داده شده است، تنظیم می‌شود.

✅نکته

اگر برد شما تحمل 5 ولت را ندارد، حتی اگر برد شما پین 5 ولت داشته باشد، نباید پتانسیومتر را به پین 5 ولت متصل کنید. بسیاری از بردهایی که تحمل 5 ولت را ندارند، پین 5 ولت دارند که انرژی را مستقیماً از منبع تغذیه USB دریافت می‌کنند. این پین می‌تواند برای تأمین انرژی دستگاه‌هایی که به 5 ولت نیاز دارند استفاده شود، اما باید مراقب باشید که هرگز خروجی 5 ولت را به پینی که فقط قادر به تحمل 3.3 ولت است متصل نکنید. همچنین، بهتر است پتانسیومتر را به پین 3.3 ولت برد متصل کنید.
خواندن کیبورد + خواندن مقادیر آنالوگ + تغییر دامنه مقادیر | قسمت بیست و هفتم آموزش آردوینو

شکل 2: اتصال یک پتانسیومتر به آردوینو

این کد از تابع analogRead برای خواندن ولتاژ از وایپرwiper) ) پتانسیومتر (پین وسط) استفاده می‌کند. یک پتانسیومتر دارای سه پین است؛ دو پین به یک ماده مقاومتی متصل هستند و پین سوم (معمولاً وسط) به wiper متصل است که می‌توان آن را چرخاند تا در هر نقطه‌ای از ماده مقاومتی تماس برقرار کند.

با چرخش پتانسیومتر، مقاومت بین wiper و یکی از پین‌ها افزایش می‌یابد، درحالی‌که مقاومت آن نسبت به پین دیگر کاهش پیدا می‌کند. نمودار شماتیک این مدار (شکل 2) می‌تواند به درک بهتر نحوه عملکرد پتانسیومتر کمک کند.

هنگامی که wiper به سمت پایین حرکت می‌کند، مقاومت آن نسبت بهGND کاهش‌یافته و مقاومت آن نسبت به 5 ولت (یا 3.3 ولت بسته به نوع برد) افزایش می‌یابد.

با حرکت wiper به سمت پایین، ولتاژ روی پین آنالوگ کاهش می‌یابد و می‌تواند حداقل به 0 ولت برسد.

در مقابل، حرکت wiper به سمت بالا، ولتاژ روی پین آنالوگ را افزایش می‌دهد که حداکثر مقدار آن 5 ولت (یا 3.3 ولت) خواهد بود.

اگر با افزایش چرخش پتانسیومتر، ولتاژ روی پین به‌جای اینکه افزایش پیدا کند، کاهش می‌یابد، باید اتصالات پین‌های 5 ولت و GND را جابجا کنید.

ولتاژ با استفاده از تابع analogRead اندازه‌گیری می‌شود که مقداری متناسب با ولتاژ واقعی روی پین آنالوگ ارائه می‌دهد. این مقدار 0 خواهد بود زمانی که ولتاژ روی پین 0 ولت باشد و زمانی برابر با 1023 خواهد بود که ولتاژ 5 ولت (یا 3.3 ولت برای بردهای 3.3 ولتی مانند اکثر بردهای 32 بیتی) باشد. همچنین، مقدارهای بین این دو مقدار متناسب با نسبت ولتاژ روی پین 5 ولت (یا 3.3 ولت بسته به نوع برد) متفاوت خواهند بود.

پتانسیومترهای با مقدار 10 کیلواهم بهترین گزینه برای اتصال به پین‌های آنالوگ هستند.

نیازی به تنظیم potPin به‌عنوان ورودی (input) نیست، زیرا در هر بار فراخوانی تابع analogRead، این کار به‌صورت اتوماتیک انجام می‌شود.

تغییر دامنه مقادیر

فرض  کنید می‌خواهید دامنه یک مقدار را تغییر دهید، مثلاً مقداری که از analogRead با اتصال یک پتانسیومتر (pot) یا دستگاه دیگری که ولتاژ متغیر ارائه می‌دهد، به‌دست می‌آید.

برای مثال، تصور کنید می‌خواهید موقعیت دستگیره پتانسیومتر را به‌صورت درصدی از 0٪ تا 100٪ نمایش دهید.

از تابع map در آردوینو برای مقیاس‌بندی مقادیر به دامنه‌ی موردنظر خود استفاده کنید.

اسکچ (کد نمونه) زیر مقدار ولتاژ پتانسیومتر را خوانده و آن را در متغیر val ذخیره می‌کند، سپس مقدار خوانده‌شده را از 0 تا 100 مقیاس‌بندی می‌کند، به‌طوری که با چرخش پتانسیومتر از یک سر به سر دیگر، مقدار به صورت متناسب تغییر می کند.

همچنین، این کد باعث می‌شود یک LED با نرخی متناسب با ولتاژ روی پایه چشمک بزند و مقدار مقیاس‌بندی شده را روی پورت سریال چاپ می‌کند.

در قسمت‌های قبلی توضیح دادیم که چگونه موقعیت پتانسیومتر را به یک مقدار تبدیل کنید. اما در این قسمت آموزش می‌دهیم که چگونه از این مقدار همراه با تابع map برای مقیاس‌بندی مقدار به دامنه‌ی موردنظر خود استفاده ‌کنید.

در این مثال، مقدار دریافت‌شده ازanalogRead (0 to 1023)  به صورت درصد (از 0 تا 100) نوشته می‌شود. سپس از این درصد برای تنظیم چرخه کاری (Duty Cycle) LED استفاده می‌شود.

چرخه کاری (Duty Cycle) درصدی از زمان است که LED فعال است. این مقدار در یک بازه‌ی زمانی به نام پریود (Period) اندازه‌گیری می‌شود که در اینجا 100 میلی‌ثانیه است.

مدت‌زمانی که LED خاموش می‌ماند، با کم‌کردن مقدار چرخه کاری از 100 محاسبه می‌شود.

بنابراین، اگر مقدار analogRead برابر 620 باشد، با استفاده از تابع map مقدار آن به 60 مقیاس‌بندی می‌شود. در نتیجه، LED به مدت 60 میلی‌ثانیه روشن و سپس 40 میلی‌ثانیه خاموش خواهد شد (100 – 60 = 40).

درصورتی‌که ولتاژ ورودی بین 0 تا 5 ولت باشد (یا 3.3 ولت در بردهای 3.3 ولتی)، مقادیر خوانده‌شده از analogRead در بازه‌ی 0 تا 1023 قرار دارند. اما شما می‌توانید از هر بازه‌ی مناسب برای مقادیر ورودی و خروجی استفاده کنید.

به‌عنوان‌مثال، یک پتانسیومتر معمولی تنها 270 درجه از یک انتها به انتهای دیگر می‌چرخد. اگر بخواهید زاویه‌ی چرخش دستگیره پتانسیومتر را نمایش دهید، می‌توانید از کد زیر استفاده کنید.

مقادیر دامنه می‌توانند منفی نیز باشند. اگر بخواهید مقدار 0 را در مرکز پتانسیومتر نمایش دهید، به‌طوری که مقادیر منفی هنگام چرخش به چپ و مقادیر مثبت هنگام چرخش به راست نشان داده شوند، می‌توانید از کد زیر استفاده کنید.

تابع map زمانی مفید است که بازه‌ی ورودی موردنظر شما از صفر شروع نشود.

به‌عنوان‌مثال، اگر یک باتری داشته باشید که ظرفیت قابل‌استفاده آن متناسب با ولتاژی بین 1.1 ولت تا 1.5 ولت باشد، می‌توانید از کد زیر استفاده کنید:

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

برای این کار، می‌توانید مقدار خوانده‌شده را روی پورت سریال، مشاهده کنید تا کمترین و بیشترین مقدار را تعیین کنید. سپس این مقادیر را به‌عنوان کران پایین و کران بالا (lower and upper Bound) در تابع map وارد کنید.

اگر دامنه‌ی مقادیر سنسور را از قبل نمی‌دانید، می‌توانید با کالیبره کردن سنسور این مقادیر را به دست آورید.

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

برای جلوگیری از این مشکل، می‌توانید از تابع constrain استفاده کنید.

تابع map از محاسبات عدد صحیح (integer math) استفاده می‌کند، بنابراین فقط اعداد صحیح را در بازه‌ی مشخص‌شده برمی‌گرداند و هر مقدار اعشاری حذف می‌شود و گرد نمی‌شود.

اطلاعات
0
0
لینک و اشتراک
profile

Arduino captain

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

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

مقالات بیشتر
slide

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

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

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

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

فروشگاه سیسوگ

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

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

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

نویسنده شو !

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

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

نویسنده شو !

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

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

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

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

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

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

فروشگاه سیسوگ

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

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

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

دیدگاه ها

become a writer

نویسنده شو !

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

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

نویسنده شو !

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

ارسال مقاله