در قسمت دوم آموزش آردوینو به زبان ساده، یاد گرفتیم که چطور یک چراغ چشمک زن داشته باشیم. حالا نوبت یکی از پرکاربردترین ورودیها در پروژههای الکترونیکی است: کلید فشاری (Push Button). در نگاه اول، کار با یک دکمه خیلی ساده به نظر میرسد؛ اما اگر مدار را مستقیم به آردوینو وصل کنیم، خیلی زود با مشکلی به نام floating input مواجه میشویم.

در قسمت قبلی پین رو با استفاده از تابع pinMode پین رو بصورت خروجی تعریف کردیم. برای مثال:
|
1 |
pinMode(ledPin, OUTPUT); |
برای تنظیم پین بصورت ورودی، این بار باید pinMode رو به شکل INPUT تعریف کنیم:
|
1 |
pinMode(pushPin, INPUT); |
کلید فشاری Push Button
برای یستن مدار، کلید فشاری رو به پین شماره 2 و یک LED (با مقاومت 220 اهم برای محافظت) به پین 4 متصل میکنیم. کلید فشاری مثل هر کلید دیگهای در دو توع چهار و دو پایه تولید میشه. در چهارپایه، پابه ها دو به دو به هم متصل هستن. عملکرد کلیدقشاری به این شکل هست که تا زمانی که کلید فشردهست پایهها متصل هستن و جریان عبور داده میشه. به محض اینکه انگشتمون رو از روی اون بر میداریم، به شکل فنری دکمه به حالت اول بر میگرده و جریان قطع میشه.

اتصال یا عدم اتصال کلید رو، یا این تابع میخونیم: digitalRead(pushPin)که تنها یک ورودی داره که اونم شماره پین مربوط به کلید قشاریه و خروجی این تایع از نوع Boolean هست؛ یعنی وقتی کلید متصله، یک (True) و در موقع قطع 0 (False) رو برمیگردونه.
کد آردوینو
حالا میتونیم سراغ کد کامل پروژه بریم:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const int pushPin = 2; // پایه دکمه const int ledPin = 4; // پایه LED void setup() { pinMode(pushPin, INPUT); // ورودی pinMode(ledPin, OUTPUT); // خروجی LED } void loop() { bool buttonState = digitalRead(pushPin); // فقط دو حالت true/false if (buttonState == HIGH) { // دکمه فشرده digitalWrite(ledPin, HIGH); // LED روشن } else { // دکمه آزاد digitalWrite(ledPin, LOW); // LED خاموش } } |
که روی مدار شکل زیر قراره پیاده سازی بشه. در این مدار یک سر کلید فشاری به 5 ولت و سر دیگه به پین شماره 2 متصل شده.

مشکل حالت شناور (Floating)
به نظر همه چیز درست میاد. انتظار داریم که با فشردن کلید فشاری، ولتاژ 5 به پایه 2 وصل بشه و LED روشن بشه. ولی قرار نیست همه چیز به این راحتی جلو بره. به محض شروع به کار بعد از آپلود فرمور، LED بدون نظم خاصی حتی بدون اینکه کلید فشاری لمس بشه، خاموش و روشن میشه.
به این اتقاق میگن حالت شناور یا Floating. یعنی وقتی کلید آزاده، ورودی ولتاژ مشخصی نداره و نویز محیط مثل یک آنتن میتونه روش تاثیر بگذاره. ما فکر میکنیم چون در حالت باز (حالتی که کلید فشار داده نشده) پین به هیچ جا وصل نیست، پس ولتاژ صفر داره که تصور کاملا اشتباهیه. چون تا زمانی که مسیر مشخصی به زمین (GND) یا منیع ولتاژ وجود نداشته باشه، مقدار ولتاژ پین هم نامعلوم و شناوره. برای حل این مشکل دو تا راهکار داریم، استفاده از مقاومت Pull-Down (پایین کش) یا مقاومت Pull-Up (بالا کش) که در ادامه هر دو رو بررسی میکنیم.
مقاومت Pull-Down
در این روش یک مقاومت بین پایه ورودی و زمین (GND) قرار میدیم. این کار باعث میشه وقتی کلید فشرده نشده، پایه ورودی به LOW (صفر ولت یا همان زمین GND) متصل باشه. پس به این شکل مشکل شناور بودن از بین میره و در حالتی که کلید فشار داده نشده ورودی حالت مشخص و پایدار صفر ولت داره. وقتی کلید فشار داده میشه ولتاژ ورودی 5 ولت میشه و سیگنال HIGH میشه. نوجه کنیم که اگر بجای مقاومت از سیم استفاده میکردیم، با فشار دادن کلید، مدار کوتاه (short circuit) میشه و با جریان کشی زیاد پین که به میکروکنترلر صدمه میزنه.

حالا مدار رو به شکل زیر اصلاح میکنیم که بدون مشکل سیگنال ورودی رو دریافت کنیم.

استفاده از مقاومت Pull-Up
در این حالت مقاومت بین پایه ورودی و منبع تغذیه (5 ولت) قرار میگیره. به این ترتیب وقتی دکمه آزاد است ورودی HIGH و وقتی دکمه رو فشار میدیم، ورودی LOW میشه. این راهکار هم شناور بودن رو از بین میبره، چون در حالتی که کلید رو فشار ندادیم پایه به 5 ولت متصله و حالت مشخصی داره.

بر این اساس، مدار رو کامل به شکل زیر میبندیم.

مقاومت Pull-Up داخلی
یه خبر خوب! تمام بردهای آردوینو مقاومت Pull-Up داخلی دارن؛ یعنی بدون اینکه از مقاومت فیزیکی استفاده کنیم، میتونیم از یک مقاومتی که بصورت سخت افزاری داخل خود میکروکنترلره استفاده کنیم و دیگه با دردسرهای سیم کشی و اتصال مقاومت خداحاقظی کنیم و با همون مدار شکل اول جلو بریم. فقط کافیه پین رو بجای INPUT روی INPUT_PULLUP تنظیم کنیم.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const int pushPin = 2; // پایه دکمه const int ledPin = 4; // پایه LED void setup() { pinMode(pushPin, INPUT_PULLUP); // ورودی با Pull-Up داخلی pinMode(ledPin, OUTPUT); // خروجی LED } void loop() { bool buttonState = digitalRead(pushPin); // فقط دو حالت true/false if (buttonState == HIGH) { // دکمه فشرده digitalWrite(ledPin, HIGH); // LED روشن } else { // دکمه آزاد digitalWrite(ledPin, LOW); // LED خاموش } } |

هیچ نظری ثبت نشده است! اولین نفر باشید.