GPIO یعنی پایه عمومی ورودی/خروجی
GPIO پایهای است که نرمافزار میتواند آن را برای خواندن یک وضعیت دیجیتال یا تولید یک سطح منطقی پیکربندی کند. دیجیتال یعنی در مدل ساده فقط دو حالت داریم: LOW و HIGH.
Button ──> GPIO Input ──> CPU ──> GPIO Output ──> LED/Driver Input
ورودی نباید معلق باشد
اگر پایه ورودی به هیچ سطح مشخصی وصل نباشد، Floating است و ممکن است نویز باعث خواندن تصادفی شود. برای همین از مقاومت Pull-up یا Pull-down استفاده میکنیم. بسیاری از MCUها Pull-up داخلی دارند.
در Arduino یک الگوی رایج:
pinMode(2, INPUT_PULLUP);
در این حالت دکمه را بین Pin و GND میگذاریم. نتیجه مهم: دکمه آزاد = HIGH، دکمه فشرده = LOW. این منطق برعکس چیزی است که بعضی تازهکارها انتظار دارند.
خروجی هم محدودیت دارد
وقتی Pin خروجی است، HIGH تقریبا نزدیک ولتاژ منطقی برد و LOW نزدیک GND است. اما جریان مجاز هر Pin محدود است و باید از مستندات برد دیده شود. یک LED با مقاومت ممکن است مناسب باشد، ولی موتور و رله مستقیم مناسب نیستند.
سطح ولتاژ
۵V و ۳.۳V را قاطی نکن. یک ورودی ۳.۳V ممکن است ۵V-tolerant نباشد. حتی اگر کانکتور فیزیکی جا میرود، باید محدوده ولتاژ الکتریکی بررسی شود.
Bounce دکمه
دکمه مکانیکی هنگام فشردن ممکن است در چند میلیثانیه چند بار اتصال/قطع شود. اگر برنامه هر تغییر را یک کلیک حساب کند، یک فشار میتواند چند بار ثبت شود. Debounce را میتوان سختافزاری یا نرمافزاری انجام داد؛ در شروع کافی است بدانیم این رفتار واقعی است و «خرابی کد» لزوما نیست.
تمرین
یک دکمه با INPUT_PULLUP و یک LED طراحی کن. جدول حقیقت بنویس: حالت دکمه، مقدار digitalRead و وضعیت LED. سپس توضیح بده چرا فشردن دکمه LOW دیده میشود. قبل از اتصال، مطمئن شو LED مقاومت سری دارد.