در قسمت بیست و چهارم از آموزش آردوینو به بررسی مقدمهای از فصل ورودی دیجیتال و آنالوگ پرداختیم. در این قسمت قصد داریم درباره استفاده از سوئیچ صحبت کنیم.
در ادامه توضیح میدهیم که چگونه اسکچ شما به یک ورودی دیجیتال واکنش نشان میدهد؛ برای مثال، یک دکمهفشاری یا سوئیچ دیگر یا یک دستگاه خارجی که یک اتصال الکتریکی برقرار میکند.
شما میتوانید از تابع digitalRead برای تشخیص وضعیت یک سوئیچ که به یک پین دیجیتال Arduino متصل است و بهعنوان ورودی تنظیم شده است، استفاده کنید. کد زیر یک LED را زمانی که سوئیچ فشار داده میشود روشن میکند (شکل 1 نشان میدهد که چگونه باید سیمکشی شود):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* Pushbutton sketch a switch connected to pin 2 lights the built-in LED */ const int inputPin = 2; // choose the input pin (for a pushbutton) void setup() { pinMode(LED_BUILTIN, OUTPUT); // declare LED as output pinMode(inputPin, INPUT); // declare pushbutton as input } void loop(){ int val = digitalRead(inputPin); // read input value if (val == HIGH) // check if the input is HIGH { digitalWrite(LED_BUILTIN, HIGH); // turn LED on if switch is pressed } else { digitalWrite(LED_BUILTIN, LOW); // turn LED off } } |
مقاومت 10 کیلو همان پول دان (pull-down) است که در قسمت قبل به آن اشاره شد و ورودی را زمانی که کلید یک (1) منطقی نیست در حالت صفر نگه میدارد.
بردهای Arduino معمولاً دارای یک LED داخلی (built-in) متصل به یک پین هستند که به عنوان LED_BUILTIN تعریف شده است. که ما از همین LED برای سادگی بیشتر استفاده می کنیم. این مسئله که کدی پیدا کنید که به پین 13 بهعنوان LED داخلی اشاره میکند، غیرمعمول نیست. این شماره پین برای برد Uno و بسیاری دیگر از بردها صحیح است، اما استثناهای زیادی وجود دارد، بنابراین بهتر است از ثابت LED_BUILTIN استفاده کنید.
همچنین، اگر برد شما دارای LED داخلی نیست، باید شماره پین خروجی را از LED_BUILTIN به شماره پینی که استفاده میکنید تغییر دهید.
تابع setup پین LED را بهعنوان خروجی (OUTPUT) و پین سوئیچ را بهعنوان ورودی (INPUT) تنظیم میکند.
تابع digitalRead ولتاژ موجود روی پین ورودی (inputPin) را میخواند و اگر ولتاژ 1 (HIGH) باشد ، (5 ولت در اکثر بردهای 8 بیتی و 3.3 ولت در بیشتر بردهای 32 بیتی) مقدار HIGH را برمیگرداند. همچنین، اگر ولتاژ پایین باشد (0 ولت)، این تابع مقدار LOW را برمیگرداند.
هر ولتاژی بین ۳ تا ۵ ولت (یا بین ۲ تا ۳.۳ ولت در بردهای ۳.۳ ولتی) بهعنوان HIGH در نظر گرفته میشود و ولتاژهای کمتر بهعنوان LOW. اگر پایهای متصل نباشد که به آن شناور یا floating گفته میشود، مقدار بازگشتی از تابع digitalRead غیرقابلپیشبینی خواهد بود؛ یعنی ممکن است HIGH یا LOW باشد. (مقاومتی که در شکل 1 نمایشدادهشده است، نشان میدهد که ولتاژ روی پایه LOW باقی میماند، زیرا این مقاومت ولتاژ پایه را به زمین (در اکثر بردها با GND نمایش داده میشود)، میکشد و ولتاژ را به صفر ولت میرساند.
و در نهایت، وقتی سوئیچ فشرده میشود، اتصالی بین پایه و ۵ ولت برقرار میشود و مقدار بازگشتی از تابع digitalRead از LOW به HIGH تغییر میکند.
در این مثال، مقدار بازگشتی از تابع digitalRead در متغیر val ذخیره میشود. این مقدار درصورتیکه دکمه فشرده شود، HIGH و در غیر این صورت، LOW خواهد بود.
سوئیچی که در این مثال (و بیشتر مثالهای دیگر این آموزش) استفاده شده است، هنگام فشردهشدن اتصال الکتریکی برقرار میکند و در صورت فشرده نشدن، اتصال را قطع میکند. این نوع سوئیچها به Normal Open یا بهاختصار NO معروف هستند. نوع دیگری از سوئیچها، سوئیچ لحظهای Normally Closed یا بهاختصار NC نامیده میشود.
پین خروجی متصل به LED زمانی که مقدار val را روی HIGH تنظیم میکنید، روشن میشود و LED را روشن میکند.
اگرچه آردوینو خود بهصورت پیشفرض تمام پینهای دیجیتال را بهعنوان ورودی تنظیم میکند، اما بهتر است شما خودتان این کار را بهصورت صریح در کد خود انجام دهید تا فراموش نکنید که از کدام پینها استفاده میکنید.
ممکن است کدی مشابه ببینید که بهجای HIGH از true استفاده میکند؛ این دو بهصورت متقابل قابلاستفاده هستند و گاهی بهصورت عدد 1 نیز نمایش داده میشوند. به همین صورت، false معادل LOW و عدد 0 است.
تقریباً از هر نوع سوئیچی میتوان استفاده کرد، اگرچه سوئیچهایی که به آنها لحظهای (momentary) یا لمسی (tactile) گفته میشود، محبوب هستند؛ زیرا ارزان بوده و مستقیماً در یک بردبورد (breadboard) قابلاستفاده هستند.
در اینجا روش دیگری برای پیادهسازی منطق (logic) موجود در اسکچ قبلی آورده شده است:
1 2 3 4 5 | void loop() { // turn LED ON if input pin is HIGH, else turn OFF digitalWrite(LED_BUILTIN, digitalRead(inputPin)); } |
این روش حالت دکمه را در یک متغیر ذخیره نمیکند. در عوض، مستقیماً LED را با استفاده از مقداری که از digitalRead به دست میآید، روشن یا خاموش میکند. این یک شورت کات یا میانبُر کاربردی است!
در واقع digitalRead(inputPin) یک مقداری معادل 0 یا 1 منطقی دارد که در اسکچ قبل داخل یک متغییر ذخیره میشد اما الان مستقیما استفاده میشود.
کد Pull-Up مشابه نسخه Pull-Down است، اما منطق (logic) آن معکوس شده است: زمانی که دکمه فشار داده میشود، مقدار پین به LOW میرود. به خاطر داشته باشید که با فشاردادن دکمه به پایین، پین به LOW تغییر میکند:
1 2 3 4 5 6 7 8 9 10 11 12 | void loop() { int val = digitalRead(inputPin); // read input value if (val == HIGH) // check if the input is HIGH { digitalWrite(LED_BUILTIN, LOW); // turn LED OFF } else { digitalWrite(LED_BUILTIN, HIGH); // turn LED ON } } |
در ادامه توضیح میدهیم که چگونه با حذف مقاومتهای Pull-Up خارجی هنگام اتصال سوئیچها، سیمکشی خود را ساده کنید.
همانطور که توضیح داده شد، ورودیهای دیجیتال باید یک مقاومت داشته باشند تا زمانی که سوئیچ فشرده نشده، پین را به یک مقدار شناخته شده نگه دارند. آردوینو دارای مقاومتهای داخلی Pull-Up است که میتوان آنها را با استفاده از حالت INPUT_PULLUP در pinMode فعال کرد.
در این مثال، سوئیچ در شکل 3 متصل شده است. این شکل تقریباً مشابه شکل 2 است، اما بدون مقاومت خارجی.
سوئیچ فقط بین پین ۲ و زمین (در اکثر بردها با GND مشخص میشود) متصل است. زمین بهطور پیشفرض در ۰ ولت قرار دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* Input pullup sketch a switch connected to pin 2 lights the built-in LED */ const int inputPin = 2; // input pin for the switch void setup() { pinMode(LED_BUILTIN, OUTPUT); pinMode(inputPin, INPUT_PULLUP); // use internal pull-up on inputPin } void loop(){ int val = digitalRead(inputPin); // read input value if (val == HIGH) // check if the input is HIGH { digitalWrite(LED_BUILTIN, LOW); // turn LED off } else { digitalWrite(LED_BUILTIN, HIGH); // turn LED on } } |
وقتی از مقاومتهای Pull-Up استفاده میکنید، منطق (logic) معکوس میشود؛ یعنی هنگام فشردن دکمه digitalRead مقدار LOW و وقتی دکمه فشرده نشود، مقدار HIGH خواهد بود. مقاومتهای Pull-Up داخلی بین ۲۰ کیلو اهم تا ۵۰ کیلو اهم هستند. این مقدار برای بیشتر کاربردها مناسب است، اما برخی دستگاهها ممکن است به مقاومتهای با مقدار پایینتر نیاز داشته باشند. برای اطمینان از مناسببودن مقاومتهای Pull-Up داخلی، به دیتاشیت دستگاههای خارجی که میخواهید به آردوینو متصل کنید مراجعه کنید.
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
مقالات بیشتر
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.