การใช้งานสวิตช์

สวิตช์

สวิตช์ (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);) เพื่อให้ผู้ทดลองสามารถสังเกตเห็นการทำงานได้อย่างชัดเจน

 

image description

 

รูปที่ 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

 

image description

 

รูปที่ 5 แผนผังการทำงานของโปรแกรมที่แสดงในการทดลองตอนที่ 1

 

 

ตอนที่ 2 การควบคุมรีเลย์ด้วยสวิตช์แบบปุ่มกดปุ่มเดียว

1. ตอวงจรตามรูปที่ 6

 

image description

 

รูปที่ 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

 

image description

 

รูปที่ 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;

}