به نام خدا. در این مطلب از آموزش Arduino قصد آموزش Debouncing یا نویزگیری کلید آردوینو بخش اول و کیپدها را داریم. در ادامه آموزش با مرجع تخصصی آردوینو ، دیجیاسپارک همراه باشید.
برای اتصال کلیدها در سادهترین حالت اگر تعداد کلیدها کم باشد، این امکان وجود دارد که تعداد محدودی کلید را مطابق شکل زیر به آردوینو یا میکروکنترلر متصل کنیم، که دراین حالت باید PULL UP داخلی توسط برنامه نویسی فعال شود.
در مدار بالا اگر کلیدی فشار داده شود مقدار ۰ به ورودی اعمل میشود و اگر کلید در حالت آزاد باشد (فشرده نشود )، مقدار ۱ به ورودی اعمال میشود. در مواردی که نویز زیاد میباشد توصیه میشود که ازمقاومت PULL UP خارجی نیز استفاده شود و فقط به PULL UP داخلی اکتفا نکنیم. برای مقاومت PULL UP خارجی میتوان از مقاومتی بین ۲٫۲ کیلو اهم تا ۴٫۷ کیلو اهم استفاده کرد. همانند شکل زیر:
فرض کنید یک توپ پینگ پونگ را به بالا پرتاب میکنیم، هنگامی که توپ از بالا به زمین میخورد و دوباره بالا میرود و این عملیات (نوسان) بارها و بارها تکرار میشود تا اینکه توپ کاملا به زمین بنشیند و به حالت پایدار برسد. کنتاکتهای مکانیکی ( کلید ) هم رفتاری شبیه این توپ دارند، و با هر بار اشاره با آنها چندین بار عمل قطع و وصل انجام میشود و شکل موجی شبیه شکل زیر ایجاد میشود:
به علت سرعت زیاد آردوینو و وجود این نوسانات، ممکن است هنگامی که ورودی کلید را بخوانیم، چندین بار عمل صفر و یک انجام شود و باعث اختلال در برنامه میشود. به عملیاتی که باعث حذف نوسانات و نویزها شود اصطلاحا Debouncing میگویند. برای عملیات Debouncing میتوان از روشهای برنامهنویسی یا قطعات سخت افزاری استفاده کرد. که در این بخش قصد آموزش روش برنامه نویسی برای عملیات Debouncing را داریم. شیوهی برنامه نویسی این گونه است که وضعیت ورودی آروینو ( وضعیت دکمه ) را در یک دوره زمانی کوتاه دو بار بررسی میکنیم. بدون انجام عمل Debounce یک بار فشردن کلید میتواند در کد به صورت چندبار فشردن تشخیص داده شود.
برنامه
در برنامه پین متصل به دکمه را در وضعیت پول آپ قرار داده ایم. با هر بار فشار دادن دکمه وضعیت LED تغییر میکند.
const int buttonPin = 8; // شماره پینی که دکمه به آن متصل است const int ledPin = 12; // شماره پینی که ال ای دی به آن متصل است // متغیر های زیر در طول برنامه تغییر می کنند int ledState = HIGH; //وضعیت کنونی ال ای دی قبل از شروع برنامه int buttonState; // مقداری که از وردودی آردوینو که به دکمه متصل است در این متغیر ریخته می شود int lastButtonState = HIGH; // وضعیت پیشین دکمه long lastDebounceTime = 0; // مقدار آخرین زماتی که دکمه تحریک شده است long debounceDelay = 50; // مقدار زمان مورد نیاز برای عملیات نویز گیری یا دیبانسینگ void setup () { //مشخص کردن وضعیت ال ای دی و دکمه pinMode (buttonPin, INPUT_PULLUP); pinMode (ledPin, OUTPUT); digitalWrite (ledPin, ledState); } void loop () { //مقدار دکمه در متغیر ریخته می شود int reading = digitalRead (buttonPin); // چک کردن این که آیا دکمه فشار داده شده است // هنگام فشرده شدن دکمه ، وضعیت وروودی از ۱ منطقی به صفر منطقی تغییر می کند if ( reading != lastButtonState ) { // ریست کردن مقدار آخرین زمانی که دکمه تحریک شده است lastDebounceTime = millis (); } if ( (millis () - lastDebounceTime) > debounceDelay ) { //زمانی که پس از فشار داده شدن دکمه ۵۰ میلی ثانیه بگذرد وارد این شرط می شود // اگر وضعیت دکمه تغییر کرده باشد if ( reading != buttonState ) { buttonState = reading; // وضعیت ال ای دی هنگامی که کلید به وضعیت صفر منطقی تغییر کرده باشد ، تغییر میکند if ( buttonState == LOW ) { ledState = !ledState; } } } // set the LED: digitalWrite (ledPin, ledState); // مقدار خوانده شده از دکمه برای تکرار حلقه ذخیره می شود lastButtonState = reading; }
در بخش بعدی از آموزش به آموزش استفاده از کتابخانه Debounce برای عملیات نویز گیری خواهیم پرداخت. آموزش دی بانسینگ کلید در آردوینو بخش دوم در ادامه ویدیوی این آموزش را ببنید.
سلام
آقا متشکرم، اینا از آموزش های پایه ای برای آردوینو و کلا کار با میکرو است.
[…] آموزش دیبانسیگ کلید در آردوینو بخش اول […]
خیلی ممنون
واقعا مفید بود
آقا خیلی خیلی ممنون واقعا زحمت کشیدی تشکر فراوان استفاده کردیم
خواهش میکنم 🙂
در ضمن پیشنهاد میکنم حتما بخش دوم را هم مطالعه کنید 🙂
سلام . من در حال ساخت یک خشک کن مایکروویو – خلا هستم . مغز فعال سیستم یک برد اردینو مگا هست. تمام مدار عالی کار می کنند ولی زمانی که مایکروویو دستگاه توسط برد فعال میشه کل مدار ریست میشه. چطوری می تونم نویز حاصل از مایکروویو رو حذف کنم.
با سلام
ضمن تشکر از توجه شما، در این خصوص بنده اطلاعات دقیقی ندارم. از دیگر کاربران که اطلاعات کافی دارند تقاضا دارم تا در این بحث شرکت کنند.