تصویر شاخص نوشته: دکمه فشاری (Pushbutton) و رازِ پایه‌ی شناور

دکمه فشاری (Pushbutton) و رازِ پایه‌ی شناور

۲۷ تیر ۱۴۰۵ سنسورها و ورودی‌ها

در فصل‌های «ورودی دیجیتال: دکمه» و «منطق و تصمیم‌های ترکیبی» با ساده‌ترین وسیله‌ی ورودی آشنا شدی: دکمه‌ی فشاری. ظاهرش از همه‌چیز ساده‌تر است، ولی پشتِ همین دکمه دو مفهومِ مهم پنهان شده که تا نفهمی‌شان، ورودی‌های ربات مدام تو را گیج می‌کنند: پایه‌ی شناور و لرزشِ کلید.

چطور واقعاً کار می‌کند

یک دکمه‌ی فشاری در باطن فقط دو تکه فلز است که معمولاً از هم جدا هستند. وقتی فشارش می‌دهی، یک پُلِ فلزی این دو را به هم وصل می‌کند و مسیرِ برق بسته می‌شود؛ رهایش کنی، دوباره باز می‌شود. برد این وضعیت را به‌شکل HIGH یا LOW (یک یا صفر) می‌خواند.

حالا مشکلِ اصلی: پایه‌ی شناور (floating). تصور کن یک پایه‌ی ورودی را فقط به یک سرِ دکمه وصل کنی و کارِ دیگری نکنی. وقتی دکمه رها است، آن پایه به هیچ ولتاژِ مشخصی وصل نیست؛ مثل یک آنتنِ کوچک نویزِ محیط را می‌گیرد و مقدارش تصادفی بین صفر و یک می‌پرد. نتیجه؟ ربات بی‌دلیل فکر می‌کند دکمه فشار داده شده. راه‌حل یک مقاومتِ pull-up یا pull-down است که وقتی دکمه رها است، پایه را به یک مقدارِ مطمئن می‌کشد. ESP32 مقاومتِ pull-up داخلی دارد، پس با یک خط کد فعالش می‌کنیم.

با pull-up منطق کمی وارونه می‌شود و این خیلی‌ها را گیج می‌کند: وقتی دکمه رها است پایه به HIGH (یک) کشیده می‌شود، و وقتی دکمه را فشار می‌دهی پایه به GND وصل و برابرِ LOW (صفر) می‌شود. پس «صفر» یعنی «فشرده».

مسئله‌ی دومِ واقعی، لرزشِ کلید (bounce) است. آن دو تکه فلز در لحظه‌ی برخورد چند میلی‌ثانیه به‌طور فیزیکی می‌لرزند و چند بار سریع وصل و قطع می‌شوند. برد این را چند بار فشردن می‌بیند، در حالی که تو فقط یک بار فشار داده‌ای. راه‌حل debounce است: یا در نرم‌افزار کمی صبر می‌کنی، یا در سخت‌افزار یک خازنِ کوچک می‌گذاری.

کاربردهای واقعی

  • هر کلیدِ صفحه‌کلید، دکمه‌ی ریموت و دسته‌ی بازی.
  • دکمه‌ی روشن/خاموش و دکمه‌ی reset دستگاه‌ها.
  • دکمه‌های آسانسور، مایکروویو و زنگِ درِ خانه.
  • کلیکِ ماوس (که در باطن یک میکروسوییچ است).
  • پنل‌های کنترلِ صنعتی و دکمه‌ی توقفِ اضطراری.

در عمل: سیم‌کشی و کد

یک پایه‌ی دکمه را به GPIO 32 و پایه‌ی دیگرش را به GND وصل کن؛ همین. مقاومتِ pull-up داخلی را با آرگومان PULL_UP فعال می‌کنیم و یادمان می‌ماند که «صفر یعنی فشرده»:

import machine
import time

button = machine.Pin(32, machine.Pin.IN, machine.Pin.PULL_UP)
led = machine.Pin(25, machine.Pin.OUT)

while True:
    if button.value() == 0:   # 0 = feshorde
        led.value(1)
    else:
        led.value(0)
    time.sleep(0.05)

اشتباه‌های رایج

  • پایه‌ی شناور: بدون pull-up یا pull-down، دکمه رفتارِ تصادفی و غیرقابل‌اعتماد دارد.
  • وارونه‌گرفتنِ منطق: با pull-up یادت باشد فشرده یعنی صفر، نه یک.
  • بی‌توجهی به bounce: بدون debounce یک فشار ممکن است چند بار شمرده شود.
  • بستنِ هر دو پایه به یک ریل: اگر هر دو سرِ دکمه به یک سیم برود، هیچ‌وقت مداری بسته یا باز نمی‌شود.
  • انتظار مقدارِ آنالوگ: دکمه فقط دو حالت دارد؛ برای مقادیرِ پیوسته باید سراغ پتانسیومتر بروی.

همین حالا امتحان کن

دکمه را در مرورگر فشار بده و منطقِ ترکیبی را ببین: شبیه‌ساز منطق و دکمه را باز کن. برای یادگیری کاملِ ورودی دیجیتال سراغ فصل ورودی دیجیتال: دکمه برو.