ورودی دیجیتال: دکمه و مقاومت بالاکش
خواندن دکمه با digitalRead، سه حالت pinMode، مقاومت بالاکش داخلی و گرفتن لرزش کلید با millis.
در پایان این درس میتوانید
- با digitalRead وضعیت یک پایهٔ دیجیتال را بخوانی و آستانههای HIGH و LOW را بشناسی.
- سه حالت pinMode یعنی OUTPUT و INPUT و INPUT_PULLUP را از هم تشخیص دهی.
- مسئلهٔ پایهٔ شناور را توضیح دهی و بگویی چرا مقاومت بالاکش آن را برطرف میکند.
- جریان مقاومت بالاکش داخلی را حساب کنی و با مقاومت پایینکش بیرونی بسنجی.
- لرزش کلید را بشناسی و با millis یک فیلتر زمانی برایش بنویسی.
تا اینجا برد فقط حرف میزد؛ حالا باید گوشدادن را هم یاد بگیرد. تابع digitalRead(pin) ولتاژ یک پایهٔ دیجیتال را میسنجد و یکی از دو مقدار HIGH یا LOW را برمیگرداند. روی برد پنج ولتی، ولتاژ کمتر از حدود ۱٫۵ ولت پایین و بیشتر از حدود ۳ ولت بالا خوانده میشود؛ فاصلهٔ میان این دو منطقهای مبهم است و اگر ولتاژ پایه آنجا بماند، نتیجهٔ خواندن هیچ تضمینی ندارد.
سه حالت pinMode
هر پایه سه نقش ممکن دارد. با OUTPUT رانندههای داخلی وصل میشوند و پایه خودش ولتاژ میسازد؛ همان چیزی که در درس پیش برای الایدی به کار بردی. با INPUT پایه پرمقاومت میشود و فقط ولتاژ بیرون را میبیند بیآنکه بارش کند. با INPUT_PULLUP همان حالت ورودی برقرار است، ولی افزون بر آن مقاومتی که از پیش روی سیلیکون ساخته شده پایه را به پنج ولت میچسباند؛ تو فقط کلید نرمافزاریاش را میبندی.
مسئلهٔ پایهٔ شناور
یک دکمهٔ فشاری تنها دو کار میکند: در حالت فشرده دو سرش را به هم وصل و در حالت رها از هم جدا میکند. اگر یک سرش را به پایه و سر دیگر را به زمین ببندی، حالت فشرده روشن است؛ پایه به زمین میچسبد و ولتاژش صفر میشود. اما در حالت رها پایه به هیچجا وصل نیست؛ به آن پایهٔ شناور میگویند. چنین پایهای مثل آنتنی کوچک عمل میکند و نویز محیط ولتاژش را بالا و پایین میبرد، تا جایی که برنامه بیآنکه کسی دکمه را لمس کند پیاپی یک و صفر میخواند.
چرا منطق وارونه میشود
INPUT_PULLUP این ابهام را برمیدارد: تا وقتی دکمه رها است، مقاومت داخلی پایه را آرام به پنج ولت میکشد و خواندن قطعاً HIGH است. لحظهای که دکمه فشرده میشود، اتصال مستقیم به زمین بر آن مقاومت ضعیف غلبه میکند و خواندن LOW میشود. پس فشرده یعنی صفر و رها یعنی یک. این وارونگی ایراد نیست، نتیجهٔ مستقیم سیمکشی است؛ پس شرط را در کد روی LOW بگذار، نه اینکه سیم را جابهجا کنی.
یک نمونهٔ عددی
مقاومت بالاکش داخلی ATmega328P مقدار دقیقی ندارد؛ برگهٔ داده میگوید جایی میان ۲۰ تا ۵۰ کیلواهم است. تا وقتی دکمه رها است جریانی از آن نمیگذرد. اما لحظهای که دکمه را نگه میداری مسیر پنج ولت تا زمین بسته میشود و جریان برقرار میماند. در بدترین حالت، یعنی کوچکترین مقاومت، این جریان برابر است با ۵ ولت تقسیم بر ۲۰۰۰۰ اهم، یعنی ۰٫۰۰۰۲۵ آمپر یا همان ۲۵۰ میکروآمپر؛ با ۵۰ کیلواهم به ۱۰۰ میکروآمپر میرسد. در برابر ۱۵ میلیآمپرِ یک الایدی ناچیز است، ولی در دستگاهی که سالها با باتری کار میکند، دکمهای که فشرده بماند بیسروصدا باتری را خالی میکند.
مقاومت پایینکش بیرونی
راه دیگر این است که سیمکشی را وارونه کنی: سر دیگر دکمه را به پنج ولت ببندی و مقاومتی ده کیلواهمی از پایه به زمین بگذاری. حالا در حالت رها آن مقاومت پایه را به صفر میکشد و در حالت فشرده پنج ولت مستقیم به پایه میرسد؛ پس منطق طبیعی میشود، یعنی فشرده برابر HIGH. بهایش یک قطعهٔ اضافه است و جریان بیشتر: ۵ تقسیم بر ۱۰۰۰۰ برابر ۰٫۵ میلیآمپر، دو برابر بدترین حالت بالاکش داخلی. چون تراشه بالاکش دارد و پایینکش داخلی ندارد، در پروژههای کوچک معمولاً همان INPUT_PULLUP را برمیداریم.
پایهای که باOUTPUTخروجی شده و مقدارشLOWاست، اگر مستقیم به پنج ولت وصل شود اتصال کوتاه میسازد و رانندههای داخلیاش میسوزند. پیش از سیمکشی دکمه، نقش پایه را با آنچه به آن وصل میکنی بسنج.
لرزش کلید
تیغههای فلزی داخل دکمه در لحظهٔ تماس چند بار میجهند و از هم جدا میشوند؛ به این پدیده لرزش کلید میگویند و معمولاً پنج تا بیست میلیثانیه طول میکشد. برای چشم تو یک فشار ساده است، اما تراشهای که هر دور حلقه پایه را میخواند در همان بازه چند تغییر حالت میبیند و نتیجه تصادفی میشود. درمانش ساده است: پس از دیدن هر تغییر، زمان همان لحظه را با millis() نگه دار و تا وقتی ۵۰ میلیثانیه نگذشته هیچ تصمیمی نگیر. این عدد از بلندترین لرزش بلندتر و از سریعترین فشار انگشت انسان کوتاهتر است.
باdelay()هم میشود لرزش را گرفت، ولی آن راه کل برنامه را متوقف میکند و هر کار همزمان دیگری از دست میرود. شمردن زمان باmillis()برنامه را زنده نگه میدارد.
کجا به کار میآید
هر کلید صفحهکلید، شستی آسانسور و سوئیچ پایان مسیر یک چاپگر سهبعدی، از دید برنامه دقیقاً همیناند: اتصالی که باز و بسته میشود. در کیت این درس دکمهای روی پایهٔ D2 بستهایم و الایدی با هر فشار کامل وضعیتش را عوض میکند؛ یعنی برنامه لبهٔ فشردن را تشخیص میدهد و وضعیت را در یک متغیر به یاد میسپارد.
رابطههای کلیدی
مأموریت روی میز کار
کیت را اجرا کن؛ دکمه فشاری با مقاومت بالاکش داخلی به پایهٔ شمارهٔ ۲ بسته است و الایدی با هر فشار کامل وضعیتش را عوض میکند.
- کد را اجرا کن و چند بار دکمه فشاری را بزن؛ تأیید کن الایدی با هر فشار عوض میشود، نه اینکه فقط تا زمان نگهداشتن روشن بماند.
- عدد فیلتر زمانی را از ۵۰ به ۱ میلیثانیه کم کن، پیاپی و تند دکمه را بزن و بینظمی ناشی از لرزش کلید را ببین؛ بعد برش گردان.
- شرط داخل حلقه را از LOW به HIGH تغییر بده و ببین حالا الایدی در لحظهٔ رهاکردن دکمه عوض میشود، نه در لحظهٔ فشردن.
- کد را طوری ساده کن که الایدی فقط تا وقتی دکمه نگه داشته شده روشن بماند، و تفاوت این رفتار را با حالت قبل بسنج.
- سر سیم دکمه را از پایهٔ شمارهٔ ۲ به پایهٔ شمارهٔ ۴ ببر و عدد داخل کد را هم عوض کن تا مدار دوباره کار کند.
مدار و کد این درس از پیش چیده شدهاند. آزادانه تغییرشان بدهید — پروژههای خودتان دستنخورده میمانند. تمامصفحه با همین کیت
آزمون این درس
۵ پرسش چهارگزینهای. پس از ثبت، پاسخ درست و توضیح هر پرسش را میبینید. میتوانید هر چند بار که خواستید تلاش کنید؛ بهترین نمره در کارنامه ثبت میشود.