การใช้งานสวิตช์
สวิตช์
สวิตช์
(switch) เป็นอุปกรณ์พื้นฐานในทางไฟฟ้าและอิเล็กทรอนิกส์ที่มีการใช้งานอย่างแพร่หลาย
สวิตช์ไฟฟ้าโดยทั่วไปจะทำหน้าที่เป็นอุปกรณ์ตัดต่อกระแสไฟฟ้า
ในขณะที่สวิตช์ในทางอิเล็กทรอนิกส์จะทำหน้าที่รับข้อมูลจากผู้ใช้มาประมวลผล
นอกจากนี้
สวิตช์ยังสามารถนำมาใช้เป็นเซนเซอร์ที่บอกตำแหน่งพิกัดของอุปกรณ์ที่มีการเคลื่อนที่ต่าง
ๆ ได้ โดยอาศัยการเปลี่ยนสถานะทางวงจรของสวิตช์ด้วยอุปกรณ์ทางกล เช่น ลิมิตสวิตช์
สวิตช์มีหลากหลายชนิด รูปร่าง ขนาด/พิกัด โดยสวิตช์ที่มีการใช้งานกันมากและพบเห็นได้ทั่วไปในทางไฟฟ้า/อิเล็กทรอนิกส์มีสัญลักษณ์ดังแสดงในรูปที่
1 โดยสวิตช์ปุ่มกด (Pushbutton
Switch) และสวิตช์ปิด-เปิดแบบ SPST (Single
Pole Single Throw)
เป็นสวิตช์พื้นฐานที่ใช้งานได้ง่ายที่สุดเพราะมีเพียงหน้าสัมผัสเดียว สำหรับสวิตช์ที่ใช้ในงานที่ซับซ้อนขึ้นมีด้วยกันมากมายหลายชนิด
ตัวอย่างเช่น สวิตช์ปิด-เปิดแบบ DPST (Double Pole
Single Throw) และแบบ SPDT (Single Pole Double Throw) และสวิตช์เลือก (Selector Switch) แบบ 4 ตำแหน่ง
แสดงรูปที่ 1 โดยทั่วไป ที่ตัวสวิตช์จะมีการระบุขา โดยมีตัวย่อที่สำคัญคือ
C
= Common คือขาร่วม
NO
= Normally Open คือขาที่ปกติจะเป็นวงจรเปิด หากไม่มีการกดสวิตช์
NC
= Normally Closed คือขาที่ปกติจะเป็นวงจรปิด
รูปที่
1
สัญลักษณ์ของสวิตช์ต่าง ๆ ที่พบเห็นได้ทั่วไป
รูปที่
2
วงจรสวิตช์พื้นฐานสองประเภทที่มีการต่อตัวต้านทานเพื่อ
ดึงแรงดันลง
(pull down) และ ดึงแรงดันขึ้นขึ้น (pull up)
สำหรับการใช้งานสวิตช์นั้น
เราจะต้องต่อวงจรให้แก่สวิตช์เพื่อให้สามารถส่งสัญญาณไปยังไมโครคอนโทรลเลอร์ได้ รูปที่
2 แสดงลักษณะการต่อวงจรสวิตช์พื้นฐานสองประเภท
ในประเภทแรกจะต่อให้ตัวต้านทานดึงระดับแรงดันลง (pull down) เป็นระดับกราวด์
(0 V) ในขณะที่ไม่มีการกดสวิตช์
เราจึงเรียกตัวต้านทานตัวนี้ว่า Rpull
down โดยเมื่อมีการกดสวิตช์แล้ว สัญญาณจะมีระดับแรงดันเป็น VCC
หรือเป็นระดับ HIGH ในการต่อสวิตช์อีกประเภทหนึ่ง
หากไม่มีการกดสวิตช์ สัญญาณจะถูกดึงไปอยู่ที่ระดับ VCC ผ่าน Rpull up โดยระดับสัญญาณจะกลายเป็นกราวด์หรือ
LOW เมื่อมีการกดสวิตช์
หากพิจารณาให้ถี่ถ้วนจะพบว่า
เราจะต้องมีการนำตัวต้านทานมาต่อเป็นวงจรสวิตช์เสมอ โดย ค่า R ของตัวต้านทานที่นำมาต่อนี้จะบ่งบอกระดับกระแสไฟฟ้าที่ไหลและระดับการสูญเสียกำลังไฟฟ้าในวงจร
หากว่าใช้ R ที่มีค่าน้อยเกินไปก็จะทำให้เกิดกระแสไหลมาก (I
= VCC/R) และเกิดการสูญเสียมาก (P = VCC2/R = I×VCC) แต่หากใช้ R ที่มีค่ามากเกินไปก็ทำให้สัญญาณกระแสมีระดับต่ำมากและอาจทำให้สัญญาณรบกวนส่งผลกระทบต่อการทำงานของวงจรได้
โดยทั่วไป เรามักจะใช้ R ที่มีค่าระหว่าง 10 kW 100 kW สำหรับวงจรสวิตช์นี้
รูปที่ 3 แสดงภาพถ่ายและวงจรโมดูลสวิตช์แบบปุ่มกด
ที่นำมาใช้ในการทดลองในบทนี้ โดยเนื่องจากวงจรสวิตช์ทั้งสองประเภทที่แสดงในรูปที่
2 มีการใช้งานกันทั่วไป
ผู้ใช้จึงควรที่จะตรวจสอบการต่อวงจรภายในโมดูลสวิตช์นี้ได้ด้วยตนเอง โดยใช้มัลติมิเตอร์วัดค่าความต้านทานระหว่างขาต่าง
ๆ ของโมดูล
รูปที่
3
ภาพถ่ายและแผนผังวงจรโมดูลสวิตช์แบบปุ่มกด
การเขียนโปรแกรมรับค่าดิจิทัล
คำสั่งเบื้องต้นในการใช้งานสวิตช์
ใน ภาษา Arduino คือ ฟงกชันอินพุตแบบดิจิทัล (Digital Input)
ซึ่งมีฟังก์ชันที่ต้องทราบ 2 ฟังก์ชัน คือ
1) pinMode(pin,
mode) เปนคําสั่งใชกําหนดขาหรือพอร์ตใด ๆ ที่ทําหนาที่เปน
พอรตดิจิทัล ปกติจะเรียกใช้ในฟังก์ชัน setup() เพื่อกำหนดการทำงานเริ่มต้นของขาต่าง
ๆ ที่เกี่ยวข้อง โดย
- pin หมายถึงชื่อหรือเลขขาของบอร์ด NodeMCU เปน D0,
D1,
หรือเป็นเลขจำนวนเต็ม โดยชื่อขาเหล่านี้
ถูกกำหนดให้สอดคล้องกับพิน GPIO อยู่ก่อนแล้ว
- mode หมายถึงโหมดการทํางาน กำหนดให้มีค่าเปน INPUT หรือ OUTPUT เท่านั้น
ตัวอย่างเชน คำสั่ง pinMode(D5, INPUT) คือการกําหนดใหขา D5 ของ NodeMCU ทํางานโดยส่งสัญญาณออกไปเท่านั้น
2)
digitalRead(pin) เปนคําสั่งให้อ่านสถานะทางลอจิกของขาที่กําหนด
โดยค่าที่ส่งคืนมาคือ ลอจิกสูง (HIGH หรือ ค่าตัวเลข 1)
หรือ ลอจิกต่ำ (LOW หรือ ค่าตัวเลข 0) เท่านั้น
ตัวอย่างเชน คำสั่ง digitalRead(D5) คือการอ่านค่าลอจิกที่ขา D5 ของ NodeMCU
ข้อมูลเพิ่มเติม: สำหรับ
NodeMCU
ช่วงของค่าแรงดันของลอจิก HIGH คือ 1.8 3.3
โวลต์ และ ของลอจิก LOW คือ -0.3 ~0.83 โวลต์ โดยหากทำการอ่านค่าลอจิกจากขาที่ไม่มีการเชื่อมต่อในทางวงจร
ก็จะได้ค่าลอจิก HIGH คืนมา
การทดลองควบคุมรีเลย์ด้วยสวิตช์
วัตถุประสงค์
1.
สามารถตอบอร์ด NodeMCU v.3 กับบอร์ดรีเลย์และสวิตช์ได
2.
สามารถเขียนโปรแกรมให้ NodeMCU รับค่าจากสวิตช์เพื่อควบคุมการทํางานของรีเลย์ได
3.
เขียนโปรแกรมควบคุมรีเลย์ด้วยสวิตช์โดยมีการจดจำสถานะของรีเลย์ด้วย
อุปกรณ์ที่ใช้ในการทดลอง
1. เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ
Windows
(ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม Arduino IDE 1.8.8 IoT 1
เครื่อง
2. NodeMCU v.3 1
บอร์ด
3. NodeMCU Base
Ver 1.0 1
บอร์ด
4. บอร์ดรีเลย์ชนิด 4 ช่อง 1 บอร์ด
5. สวิตช์แบบปุ่มกด 2
บอร์ด
6. สาย USB 1
เส้น
7. สายต่อวงจร (สายจัมพ์
เมีย-เมีย) 12 เส้น
วิธีการทดลอง
ตอนที่
1 การควบคุมรีเลย์ด้วยสวิตช์แบบปุ่มกดสองปุ่ม
1.
ตอวงจรตามรูปที่ 4 โดยต่อบอร์ดรีเลย์กับขา D1
D4 และต่อสวิตช์โมดูลทั้งสองที่ขา D5 และ D6 ของ NodeMCU และต่อไฟ VUSB และ
กราวด์ (GND) ด้วย
2.
เขียนโค้ดข้างล่างนี้แล้วอัปโหลดลง NodeMCU v.3 เพื่อควบคุมการเปิดปิดรีเลย์ทั้งสี่ตัวด้วยสวิตช์ โดยสวิตช์ SW1 จะทำหน้าที่ ON รีเลย์และสวิตช์ SW2 จะทำหน้าที่ OFF รีเลย์ ทั้งสี่ตัว
โดยที่จะมีการหน่วงเวลา 0.2 วินาที (ด้วยคำสั่ง delay(200);) เพื่อให้ผู้ทดลองสามารถสังเกตเห็นการทำงานได้อย่างชัดเจน
รูปที่
4
การเชื่อมต่อ NodeMCU
v.3 กับบอร์ดรีเลย์และโมดูลสวิตช์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// Read Switch & Control Relay by
NodeMCU ESP8266 #define ON LOW // Relay is active low #define OFF HIGH int Relay1 = D1; int Relay2 = D2; int Relay3 = D3; int Relay4 = D4; int SW1 = D5; int SW2 = D6; int state; // Switch State void Relay_ON() { digitalWrite(Relay1, ON);
delay(200); digitalWrite(Relay2, ON);
delay(200); digitalWrite(Relay3, ON);
delay(200); digitalWrite(Relay4, ON);
delay(200); } void Relay_OFF() { digitalWrite(Relay1, OFF);
delay(200); digitalWrite(Relay2, OFF);
delay(200); digitalWrite(Relay3, OFF);
delay(200); digitalWrite(Relay4, OFF);
delay(200); } void setup() { pinMode(Relay1, OUTPUT); pinMode(Relay2, OUTPUT); pinMode(Relay3, OUTPUT); pinMode(Relay4, OUTPUT); pinMode(SW1, INPUT); pinMode(SW2, INPUT); Relay_OFF(); } void loop() { state = digitalRead(SW1); if(state
== HIGH) { Relay_ON(); } state = digitalRead(SW2); if(state
== HIGH) { Relay_OFF(); } } |
แผนผังการทำงานของโปรแกรมในฟังก์ชัน
loop()
ของการทดลองนี้แสดงดังรูปที่ 5
รูปที่
5
แผนผังการทำงานของโปรแกรมที่แสดงในการทดลองตอนที่ 1
ตอนที่
2 การควบคุมรีเลย์ด้วยสวิตช์แบบปุ่มกดปุ่มเดียว
1. ตอวงจรตามรูปที่ 6
รูปที่
6
การเชื่อมต่อ NodeMCU
v.3 กับบอร์ดรีเลย์และโมดูลสวิตช์
2.
เขียนโค้ดข้างล่างนี้แล้วอัปโหลดลง NodeMCU v.3 เพื่อควบคุมการเปิดปิดรีเลย์ทั้งสี่ตัวด้วยสวิตช์ โดยสวิตช์ SW1 จะทำหน้าที่ได้ทั้ง ON และ OFF รีเลย์ทั้งสี่ตัวเมื่อมีการกดปุ่ม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
// Read Switch & Control Relay by
NodeMCU ESP8266 #define ON LOW #define OFF HIGH int Relay1 = D1; int Relay2 = D2; int Relay3 = D3; int Relay4 = D4; int SW1 = D5; int state; // switch state int relaystate; // relay state void setup() { pinMode(Relay1, OUTPUT); pinMode(Relay2, OUTPUT); pinMode(Relay3, OUTPUT); pinMode(Relay4, OUTPUT); pinMode(SW1, INPUT); Relay_OFF(); } void Relay_ON() { digitalWrite(Relay1, ON);
delay(200); digitalWrite(Relay2, ON);
delay(200); digitalWrite(Relay3, ON);
delay(200); digitalWrite(Relay4, ON);
delay(200); relaystate
= 1; } void Relay_OFF() { digitalWrite(Relay1, OFF);
delay(200); digitalWrite(Relay2, OFF);
delay(200); digitalWrite(Relay3, OFF);
delay(200); digitalWrite(Relay4, OFF);
delay(200); relaystate
= 0; } void loop() { state = digitalRead(SW1); if(state
== HIGH) { if(relaystate == 0) { Relay_ON(); } else { Relay_OFF(); } } } |
แผนผังการทำงานของโปรแกรมในฟังก์ชัน
loop()
ของการทดลองนี้แสดงดังรูปที่ 7
รูปที่
7
แผนผังการทำงานของโปรแกรมที่แสดงในการทดลองตอนที่ 2
แบบฝึกหัดท้ายการทดลอง
ในการทดลองตอนที่ 2 หากเรากดสวิตช์ปุ่มกดค้างไว้
จะพบว่า รีเลย์จะมีการเปลี่ยนสถานะตลอดเวลา
ทั้งนี้เนื่องจากเรามิได้กำหนดให้ปุ่มกดต้องเปลี่ยนสถานะจาก HIGH กลับมาเป็น LOW เสียก่อนแล้วจึงอ่านค่าใหม่
ดังนั้นเพื่อแก้ปัญหาการกดปุ่มค้างนี้
(คือให้รีเลย์ถูกเปลี่ยนสถานะเพียงครั้งเดียวเมื่อมีการกดปุ่มค้าง)
เราจะต้องแก้ไขโค้ดให้จดจำสถานะของปุ่มกดก่อนหน้านี้ด้วย
จงเขียนโปรแกรมที่ทำให้รีเลย์ไม่มีการเปลี่ยนสถานะเมื่อมีการกดปุ่มค้าง
|
int oldstate; // old switch state void loop() { state = digitalRead(SW1); if( (state
== HIGH) && (state != oldstate) ) { if(relaystate == 0) { Relay_ON(); } else { Relay_OFF(); } } oldstate
= state; } |