از سوئیچ برای خاموش و روشن کردن دستگاههایی نظیر چراغ اتاق یا لوازم الکتریکی استفاده میشود که با فشردن دکمه مشخصی از کیبورد، سیگنال را برای دستور خاموش و روشن کردن ارسال میکند. از سوئیچ میتوان برای کنترل دستگاه نیز استفاده کرد؛ وقتی سوئیچ فشار داده شود، دستگاه روشن میشود. با فشار دادن سوئیچ، اگر تماس فلزی در سوئیچ ایجاد شود، منجر به پرش کلید شده و دستگاه مکرراً خاموش و روشن میشود. میتوان پرش سوئیچ/کلید را با نرمافزار یا سخت افزار کنترل کرد که به آن دیبانسینگ (debouncing ) سوئیچ گفته میشود.
سوئیچ لمسی
به منظور خاموش یا روشن کردن LED، میتوان سوئیچ را به پین آردوینو متصل کرد. با بسته شدن سوئیچ، پین به 5V وصل شده و حالت پین HIGH (یک)خواهد بود. وقتی سوئیچ باز باشد، مقاومت پول آپ 10kΩ اجازه میدهد یک جریان کوچک بین پین دیجیتال و GND ایجاد شود، بنابراین وضعیت پین به LOW (صفر) کاهش مییابد (شکل 2 را ببینید).
اگر سوئیچ و مقاومت نسبت به پین دیجیتال معکوس شوند، آنگاه با باز بودن سوئیچ، پین دیجیتال از طریق مقاومت پول آپ 10kΩ به 5V متصل میشود و حالت پین HIGH خواهد بود. استفاده از مقاومت پول آپ یا پول دان بستگی به این دارد که در شرایط باز بودن سوئیچ، حالت پین HIGH یا LOW باشد. اگر مقاومت پول آپ یا پول دان وجود نداشته باشند، آنگاه در وضعیت باز بودن سوئیچ، پین دیجیتال به GND یا 5V متصل نیست، بنابراین حالت پین نامعلوم خواهد بود. ادغام سوئیچ با مقاومت پول دان در شکل زیر نشان داده شده است.
ماژول سوئیچ شامل دو جفت پین متصل بهم است که پینهای آن نزدیک به یکدیگر در زیر سوئیچ قرار دارند. اتصالات شکل بالا در جدول زیر ارائه شده است.
قطعه | اتصال به | و به |
پایه سمت چپ سوئیچ | 5 ولت آردوینو | |
پایه سمت راست سوئیچ | پین 8 آردوینو | |
پایه سمت راست سوئیچ | مقاومت kΩ10 | GND آردوینو |
پایه بلند LED | پین 4 آردوینو |
|
پایه کوتاه LED | مقاومت 220Ω | GND آردوینو |
جدول 1. اتصالات سوئیچ با مقاومت pull-down
لیست زیر روشن شدن LED را پس از فشردن سوئیچ و خاموش شدن LED را بدون فشردن سوئیچ نشان میدهد. دستور digitalRead (pin number) وضعیت HIGH یا LOW بودن پین را مشخص میکند.
کد 2.1 سوئیچ LED
int switchPin = 8; // define switch pin
int LEDpin = 4; // define LED pin
int reading; // define reading as integer
void setup()
{
pinMode(LEDpin, OUTPUT); // LED pin as output
}
void loop()
{
reading = digitalRead(switchPin); // read switch pin
digitalWrite(LEDpin, reading); // turn LED on if switch is HIGH
} // turn LED off if switch is LOW
سوئیچ LED
بهتر است LED تنها زمانی خاموش یا روشن شود که سوییچ فشرده شده است (لیست 2.2). وضعیت سوئیچ و LED به صورت متغیر switchState (وضعیت سوئیچ) و LEDState (وضعیت LED) ذخیره میشوند. وقتی سوئیچ اولین بار فشرده میشود، وضعیت سوئیچ از LOW به HIGH تغییر کرده و وضعیت LED نیز از LOW (خاموش) به HIGH (روشن) یا HIGH به LOW تغییر میکند. متغیر وضعیت سوئیچ نیز زمانی که سوئیچ اولین بار فشرده میشود تغییر میکند، اما اگر سوئیچ به صورت پیوسته فشرده شود، آنگاه وضعیت سوئیچ تغییری نمیکند. رها کردن سوئیچ باعث تغییر وضعیت سوئیچ از HIGH به LOW شده و متغیر وضعیت سوئیچ نیز تغییر میکند، اما هیچ تغییری در وضعیت LED ایجاد نمیشود. تابع () void loop نیز به خواندن پین سوئیچ ادامه میدهد.
کد 2.2: وضعیت LED در زمانیکه سوییچ فشرده میشود
int switchPin = 8; // define switch pin
int LEDpin = 4; // define LED pin
int reading; // define reading as an integer
int switchState = LOW; // set switch state to LOW
int LEDState = LOW; // set LED state to LOW
void setup()
{
pinMode(LEDpin, OUTPUT); // LED pin as output
}
void loop()
{
reading = digitalRead(switchPin); // read switch pin
if(reading != switchState) // if switch state has changed
{ // if switch pressed, change LED state
if(reading == HIGH && switchState == LOW) LEDState = !LEDState;
digitalWrite(LEDpin, LEDState); // turn LED on or off
switchState = reading; // update switch state
}
}
مقایسه عملگرها
AND منطقی
با نماد && نشان داده شده است؛ به عنوان مثال if(X>Y && A==HIGH) که نشان میدهد اگر X بزرگتر از Y و A برابر با HIGH باشد، آنگاه شرط برقرار بوده و تابع اجرا میشود.
OR منطقی
با نماد || نشان داده شده است؛ به عنوان مثال if(X>Y || A==HIGH) که نشان میدهد اگر X بزرگتر از Y یا A معادل بالا (HIGH) باشد، آنگاه شرط برقرار بوده و تابع اجرا میشود.
علامت دوتایی (دابل)
(==) در مقایسه “برابر است با” را نشان میدهد، مثل in if(reading == HIGH) ، که نشان میدهد “آیا خوانش برابر است با HIGH”.
!=
در مقایسه “برابر نیست با” را نشان نمیدهد، مثل if(reading != switchState یعنی “آیا خوانش برابر نیست با وضعیت سوئیچ”.
علامت تعجب !
“مقدار متضاد” را نشان میدهد، مثل LEDState=!LEDState، یعنی “تغییر در وضعیت LED به مقدار متضاد آن” که از HIGH به LOW یا LOW به HIGH خواهد بود.
تساوی X=X+1 همان X++ است و به طور مشابه، X—معادل X=X-1 میباشد.
محاسبه y%x ماژول x است، یا نشان میدهد که عدد صحیح y بر عدد صحیح x تقسیم میشود.
دیبانسینگ سوئیچ
وقتی سوئیچ فشرده میشود ماهیت فنری فلزی که در نقاط تماس استفاده شده است، منجر به اتصال چند باره نقاط تماس میشود. به عبارت دیگر، بانسینگ (پرش کلید) قبل از تماس دائمی ایجاد میشود. سرعت کلاک آردوینو 16MHz معادل 16 میلیون عملیات در ثانیه است، بنابراین بانسینگ سوییچ با چندین بار باز و بسته سوییچ نمایان میشود. به عنوان مثال وقتی LED توسط سوئیچ کنترل میشود، گاهی اوقات LED با زدن سوئیچ، خاموش یا روشن نمیشود. سوئیچ توسط دو روش نرمافزاری یا یک راه حل سخت افزاری، میتواند دیبانسینگ شود.
در روش نرمافزاری ابتدا یک تاخیر، و سپس تغییر در وضعیت سوئیچ ایجاد میشود و بعد از آن وضعیت سوئیچ را پس از تاخیر مجدد خوانش میکند که بر اساس دستور delay (ms) مشخص خواهد شد. اگر تاخیر خیلی کم نباشد، آنگاه سوئیچ ممکن است در پایان تاخیر همچنان بانسینگ کند. تابع () void loop در لیست 2.3 شامل تاخیر دیبانسینگ، خوانش مجدد پین سوئیچ و مقایسه وضعیت جدید سوئیچ با وضعیت سوئیچ قبل از تاخیر، میباشد. در لیست 2.3، دستورات جدید مقایسه شده با لیست 2.2 به صورت بولد، برجسته شده اند.
کد 2.3: سوئیچ با زمان دیبانسینگ
void loop()
{
reading = digitalRead(switchPin); // read switch pin
if(reading != switchState) // if state of switch has changed
{
delay(50); // debounce time of 50ms
reading = digitalRead(switchPin); // read switch pin again
if(reading != switchState) // compare switch state again
{
if (reading == HIGH && switchState == LOW) LEDState =!LEDState;
digitalWrite(LEDpin, LEDState);
switchState = reading;
}
}
}
دومین روش نرمافزاری تاخیر را تا زمانی ادامه میدهد که دیگر تغییری در وضعیت سوئیچ، در پایان تاخیر یا زمان دیبانسینگ، ارخ ندهد. زمان دیبانسینگ اساساً به زمانی اطلاق میشود که سوئیچ باید قبل از روشن یا خاموش شدن LED در وضعیت ثابت قرار گیرد. وضعیت سوئیچ باید سه بار ذخیره شود: قبل از زدن سوئیچ (oldswitch)، وقتی سوئیچ در حین زمان دیبانسینگ زده میشود (switchstate) و وقتی سوئیچ برای آخرین بار زده میشود (reading). تابع ()millis تعداد میلی ثانیه هایی را که برنامه در حال اجرا بوده شمارش میکند، و برای ذخیره زمانی که سوییچ زده شد مورد استفاده قرار میگیرد. وضعیت سوئیچ به طور پیوسته خوانش میشود، تا وقتی که وضعیت سوئیچ برای مدت طولانیتری از زمان دیبانسینگ یکسان بماند، یعنی زمانی که LED میتواند خاموش یا روشن شود. تعداد میلی ثانیهها ممکن است بیشتر از حد بالای عدد صحیح (215–1)ms یا 33 ثانیه باشد، بنابراین متغیر زمان به صورت unsigned long با حداکثر مقدار (232–1)ms یا 50 روز تعریف میشود.
در لیست 2.4، lastSwitch اشاره به زمانی دارد که سوئیچ برای آخرین بار در زمان دیبانسینگ زده شده و نسبت به برنامه بدون دیبانسینگ تغییر میکند. در لیست 2.4 به صورت برجسته نشان داده شده است.
کد 2.4: سوئیچ دیبانس شده با تاخیر پیوسته
int switchPin = 8; // define switch pin
int LEDpin = 4; // define LED pin
int reading; // define reading as an integer
int switchState = LOW; // set switch state to LOW
int LEDState = LOW; // set LED state to LOW
unsigned long switchTime; // define time as unsigned long
int lastSwitch = LOW; // set last switch press in debounce time
int debounceTime = 50; // define debounce time in ms
void setup()
{
pinMode(LEDpin, OUTPUT); // LED pin as output
}
void loop()
{
reading = digitalRead(switchPin); // read switch pin
if(reading != lastSwitch) // if reading different from last reading
{
switchTime = millis(); // time switch state change in debounce time
lastSwitch = reading; // update last switch state
} // is switch state the same for required time
if((millis() – switchTime) > debounceTime)
{
Chapter 2 Switches
25
if(reading !=switchState)
{
if (reading == HIGH && switchState == LOW) LEDState =!LEDState;
digitalWrite(LEDpin, LEDState);
switchState = reading;
}
}
}
وقتی دستورات درون حلقه ()if را نتوان در یک خط نوشت، آنگاه همانند تابع () void loop دستورات را باید در {} قرار داد،. تور رفتگی دستورات در تابع ()if باعث میشود تا برنامه را بتوان سادهتر تفسیر نمود.
دیبانس سوئیچ سخت افزاری
راه حل سختافزاری شامل خازن در مقابل سوئیچ میباشد (شکل 4). خازن زمانی شارژ میشود که سوئیچ زده نشود. با زدن سوئیچ، خازن دشارژ میشود و سیگنال سوئیچ HIGH به آردوینو ارسال میشود. در حالت دیبانس سوئیچ، خازن سیگنال را HIGH نگه میدارد. در راه حل سخت افزاری، نیازی به دستور دیبانسینگ نرمافزاری نیست. ترکیب خازن – مقاومت، شامل مقاومت پول دان 10kΩ و خازن 10μF میباشد.
ثابت زمانی RC، که در آن خازن شارژ یا دشارژ میشود به مقدار مقاومت (R) و ظرفیت خازن (C) بستگی دارد. ولتاژ خازن پس از t ثانیه شارژ V (1 – e-t/RC) ااست، که در آن V ولتاژ تغذیه میباشد؛ همچنین پس از t ثانیه دشارژ، ولتاژ خازن V (e-t/RC)خواهد بود. هرچه مقدار RC بالاتر باشد، تاخیر دیبانس بیشتر میشود. پس از زدن اولیه سوئیچ و دشارژ خازن، خازن به 50% ظرفیت رسیده و سیگنال سوئیچ پس از تاخیر دیبانس RC × ln(2) ثانیه، HIGH خواهد بود. زمان تاخیر دیبانس را میتوان به صورت RC × ln(2) یا RC/1.44 ثانیه بیان کرد.
با ترکیب خازن – مقاومت 10kΩ و 10μF تاخیر دیبانس 69 میلی ثانیه است. ترکیبهای متعددی برای خازن-مقاومت وجود دارد که به تاخیر بانس موردنظر RC × ln(2) ثانیه دست مییابند، اما باید از مقاومت بزرگ برای کمینه کردن جریان داخل مقاومت استفاده کرد.
خازنهای الکترولیتی قطبیده میشوند و آند باید ولتاژ بیشتری از کاتد داشته باشد. کاتد علامت “-” و نوار رنگی در کنار خازن دارد. پایه بلند خازن الکترولیتی آند یا پایه مثبت است (جدول زیر).
قطعه | اتصال به | و به |
پای سمت چپ سوئیچ | 5 ولت آردوینو | |
پای سمت راست سوئیچ | پین 8 آردوینو |
|
پای سمت راست سوئیچ | مقاومت 10kΩ | GND آردوینو |
منفی خازن | سوئیچ راست | |
مثبت خازن | سوئیچ چپ | |
پایه بلند LED | پین 4 آردوینو |
|
پایه کوتاه LED | مقاومت 220Ω | GND آردوینو |
جدول 2. اتصالات برای شکل 4
سوئیچ بال
سوئیچ بال شامل یک توپ فلزی است که هر زمان سوئیچ به زاویه خاصی میرسد و تا زاویه 70 درجه مجاز است، دو نقطه تماس را بهم پیوند میزند، و توپ بروی نقاط تماس میلغزد. سوئیچ زاویه مشابه با سوئیچ بال است، بجز اینکه بجای توپ از غلتش یک قطره جیوه برای اتصال نقاط تماس استفاده میکند.
چیدمان مدار سوئیچ بال ( شکل 5) مشابه با مدار سوئیچ لمسی است ( شکل 4)، اما طرح آن شامل یک دستور if else برای خاموش یا روشن کردن LED میباشد. این دستور موثرتر از دو دستور ()if بوده و زمانی که بیش از یک شرط وجود داشته باشد که هر کدام از آنها دارای خروجی متفاوتی باشند، مورد استفاده قرار میگیرد. در طرح سوئیچ بال، اگر خوانش LOW باشد، آنگاه LED روشن میشود؛ در غیر اینصورت LED خاموش میشود.
کد 2.5 LED و سوئیچ بال
int switchPin = 8; // define switch pin
int LEDpin = 4; // define LED pin
int reading;
void setup()
{
pinMode(LEDpin, OUTPUT); // LED pin as output
}
void loop()
{
reading = digitalRead(switchPin); // read switch pin
Figure 2-4. LED and ball switch
Chapter 2 Switches
29
if(reading == LOW) digitalWrite (LEDpin, HIGH); // ball switch tips
// over, led on
else digitalWrite(LEDpin, LOW); // ball switch not tipped over, led off
}
خلاصه
در این مقاله توضیح دادیم که چگونه آردوینو را برنامه نویسی کنیم تا سوئیچ بتواند LED را کنترل کند. تاثیر بانس (پرش کلید) سوئیچ توضیح داده شد و سوئیچ با استفاده از دو راه حل نرمافزاری و یک راه حل سختافزاری با مقاومت و خازن، دیبانسینگ شد.
فهرست قطعات
- برد بورد و آردوینو Uno
- LED
- مقاومت: 220Ω 10kΩ
- خازن: 10μF
- سوئیچها: لمسی و بال