การใช้งานรีโมตอินฟราเรด

ชุดสื่อสารรีโมตอินฟราเรด

ในการสื่อสารแบบไร้สาย ตัวควบคุมแบบรีโมตอินฟราเรด (Infrared Remote Controller) ถูกนำมาใช้กันอย่างแพร่หลายในงานหลายประเภท โดยตัวอย่างที่เห็นได้ทั่วไปคือการในการควบคุมโทรทัศน์ และเรียกอุปกรณ์นี้สั้น ๆ ว่า “รีโมต” โดยรีโมตลักษณะนี้จะใช้คลื่นแสงอินฟราเรด (แสงที่ตามองไม่เห็น) ในการสื่อสาร ระบบการสื่อสารไร้สายด้วยรีโมตประกอบด้วย ตัวส่ง (transmitter) และตัวรับ (receiver) รูปที่ 1 แสดงภาพถ่ายของตัวส่งหรือตัวรีโมตและตัวรับแบบต่าง ๆ ที่มักนำมาใช้ในการสื่อสารร่วมกับการควบคุมอัตโนมัติด้วยไมโครคอนโทรลเลอร์ โดยสำหรับตัวส่งมักจะมีลักษณะเป็นอาเรย์ของปุ่ม (รูปที่ 1()) และตัวรับที่นิยมใช้นั้นคือ ไอซีเบอร์ TL1838 ดังรูปที่ 1(ข) ในท้องตลาดจะมีจำหน่ายทั้งแบบที่เป็นตัวอุปกรณ์เดี่ยว ๆ (รูปที่ 1 (ข)) และแบบที่มีการนำมาติดตั้งบนแผ่นวงจรเพื่อให้การใช้งานทำได้อย่างง่ายดาย (รูปที่ 1(ค) และ (ง)) ซึ่งสำหรับตัวรับนี้จะประกอบด้วยโฟโต้ทรานซิสเตอร์และส่วนของวงจรถอดรหัสสัญญาณที่ได้รับให้เป็นข้อมูลดิจิทัล

 

image description

 

รูปที่ 1 ภาพถ่ายโมดูล (ก) ตัวส่งและ (ข) – () ตัวรับในชุดสื่อสารรีโมตอินฟราเรด

 

image description

 

รูปที่ 2 รหัสข้อมูลดิจิทัลเลขฐานสิบหกที่ส่งเมื่อมีการกดปุ่มต่าง ๆ บนโมดูลตัวส่งของรีโมต ชนิด 7 แถว 3 หลัก ที่แสดงในรูปที่ 1(ก)

 

ข้อมูลดิจิทัลที่ส่งจากโมดูลตัวส่งนั้น จะมีลักษณะที่ขึ้นกับปุ่มที่กด โดยสามารถเขียนเป็นเลขฐานสิบหกได้ดังแสดงในรูปที่ 2 โดยผู้ใช้งานจะต้องทราบรหัสเหล่านี้เพื่อนำไปใช้ในการเขียนโปรแกรมรับและอ่านข้อมูล ในการทำงานจริงนั้น โมดูลตัวส่งจะทำการมอดูเลตหรือแปลงรหัสข้อมูลดิจิทัลให้สามารถส่งได้ตามมาตรฐานการสื่อสาร โดยใช้คลื่นความถี่ 38 kHz และตัวรับข้อมูลนั้นจะมีการถอดรหัสดิจิทัลออกมา รูปที่ 3 แสดงลักษณะสัญญาณที่ส่งออกจากรีโมต (วัดโดยตัวตรวจวัดแสงทั่วไป) และสัญญาณดิจิทัลที่ถอดรหัสแล้ว ด้วยไอซี TL1838

 

image description

 

รูปที่ 3 ภาพลักษณะสัญญาณที่ส่งออกจากโมดูลตัวส่งและสัญญาณดิจิทัลที่ถอดรหัสแล้ว

 

 

ไลบรารี IRremoteESP8266

แม้ว่าสัญญาณจากตัวรับสัญญาณรีโมตจะมีการแปลงเป็นสัญญาณดิจิทัลแล้ว เราก็ยังจำเป็นต้องมีการอ่านสัญญาณดิจิทัลนี้อย่างถูกต้องเพื่อให้ได้รับข้อมูลการกดปุ่มจากตัวส่งที่ถูกต้อง การเขียนโปรแกรมเพื่ออ่านข้อมูลแต่ละบิตเองนั้นเป็นเรื่องยุ่งยาก ดังนั้นในการเขียนโปรแกรมด้วย Arduino IDE เพื่อควบคุมไมโครคอนโทรลเลอร์ที่ใช้ชิป ESP8266 ให้อ่านค่าจากสัญญาณจากรีโมตนั้น เรามักจะใช้ไลบรารีสำเร็จรูป ซึ่งเราจะต้องมีการเพิ่มไลบรารีนี้ที่มีชื่อว่า IRremoteESP8266 เข้าไป เสียก่อน โดยเราทำได้โดยการไปดาวน์โหลดมาติดตั้งในเครื่อง (เช่นเดียวกับไลบรารีอื่น ๆ ที่กล่าวถึงในบทก่อนหน้านี้ เช่น OLED) โดยผู้ใช้สามารถดาวน์โหลดไลบรารีสำหรับการสื่อสารด้วยรีโมตนี้ได้ที่ https://github.com/crankyoldgit/IRremoteESP8266 รูปที่ 4 การดาวน์โหลดและรูปที่ 5 แสดงการติดตั้งไลบรารี IRremoteESP8266 ลงในโปรแกรม Arduino IDE

 

image description

 

รูปที่ 4 การดาวน์โหลดไลบรารีของ IRremoteESP8266 จาก github

 

image description

 

รูปที่ 5 การติดตั้งไลบรารี IRremoteESP8266 ลงใน Arduino IDE

 

คำสั่งหรือฟังก์ชันที่ใช้ในการอ่านค่าที่ได้รับจากโมดูลตัวรับสัญญาณรีโมตจะเก็บอยู่ในไฟล์ไลบรารีชื่อ IRrecv.h โดย เราจะต้องเพิ่มไฟล์ไลบรารีฐาน 2 ไฟล์ ที่บรรจุคำสั่งที่จะถูกเรียกใช้ด้วย นั่นคือไฟล์ไลบรารี Arduino.h และ IRremoteESP8266.h นอกจากนี้ ในการแสดงผลเลขฐานสิบหก (ในรูปที่ 2) ผ่านพอร์ตอนุกรม เราจะต้องใช้คำสั่งหรือฟังก์ชันแสดงผลที่มีอยู่ไฟล์ไลบรารี IRutils.h ด้วย ดังนั้นในการอ่านค่าจากตัวรับสัญญาณรีโมตนี้ เราจะต้องเพิ่มไฟล์ไลบรารีไว้ที่ส่วนหัวของโปรแกรมคือ

 

#include <Arduino.h>

#include <IRremoteESP8266.h>

#include <IRrecv.h>

#include <IRutils.h>    // for serialPrintUint64

 

สำหรับผู้ที่สนใจรายละเอียดคำสั่งต่าง ๆ ที่อยู่ในไลบรารีเหล่านี้ ก็สามารถเปิดไฟล์เหล่านั้นมาอ่านเพิ่มเติมได้

ในการใช้งานไลบรารีนี้ เราจะต้องกำหนด “วัตถุ” หรือออปเจค 2 ตัว จาก คือ ตัวรับรีโมตที่บ่งบอกพินที่เราเชื่อมต่อ ระหว่าง ตัวรับและ NodeMCU และ ตัวข้อมูลที่เราได้รับ โดยกำหนดจากคลาส IRrecv และ decode_results ตามลำดับ เช่น

 

int irPin = D1;

IRrecv irrecv(irPin);

decode_results results;

 

คำสั่งที่เกี่ยวข้องกับการใช้งานตัวรับสัญญาณรีโมต ที่อยู่ในไลบรารีที่กล่าวมาข้างต้นนี้คือ

- enableIRIn() เป็นเมดธอดที่เป็นการบอกให้โปรแกรมเริ่มต้นการทำงานของตัวรับสัญญาณ

- decode() เป็นเมดธอดที่ใช้ถอดรหัสข้อมูลที่ตัวรับสัญญาณได้รับ

- resume() เป็นเมดธอดที่สั่งให้ถอดรหัสข้อมูลที่ตัวรับสัญญาณได้รับต่อไป

และ    

- serialPrintUint64() เป็นฟังก์ชันหรือคำสั่งให้พิมพ์ตัวเลขขนาดใหญ่ โดยมีตัวโค้ดเก็บอยู่ใน IRutils.cpp และเรียกใช้โดยเพิ่มไฟล์เฮดเดอร์ IRutils.h ลงในโปรแกรม

 

 

การทดลองใช้งานรีโมตอินฟราเรด

วัตถุประสงค์

1. สามารถต่อบอร์ด Node MCU v.3 กับโมดูลรับสัญญาณอินฟราเรดได้

2. สามารถเขียนโปรแกรมให้ NodeMCU อ่านค่าที่ได้รับจากโมดูลรับสัญญาณอินฟราเรดได้

3. สามารถเขียนโปรแกรมให้ NodeMCU ควบคุมรีเลย์จากคำสั่งที่ได้รับจากโมดูลรับสัญญาณอินฟราเรดได้

 

อุปกรณ์ที่ใช้ในการทดลอง

 

1.     เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ Windows (ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม
Arduino IDE 1.8.8 IoT                            1 เครื่อง

2.     NodeMCU v.3                                                              1 บอร์ด

3.     NodeMCU Base Ver 1.0                                                 1 บอร์ด

4.     ชุดรับส่งรีโมตอินฟราเรด ประกอบด้วยตัวส่งและตัวรับ                     1 ชุด

5.     บอร์ดรีเลย์ชนิด 4 ช่อง                                                      1 บอร์ด

6.     สาย USB                                                                    1 เส้น

7.     สายต่อวงจร (สายจัมพ์ เมีย-เมีย)                                           9 เส้น

 

วิธีการทดลอง

ตอนที่ 1 การอ่านค่าเลขฐานสิบหกจากตัวรับสัญญาณรีโมต

1. ต่อวงจรดังรูปที่ 6

2. เขียนโปรแกรมดังที่แสดงในโค้ดหน้าถัดไป จากนั้นจึงอัปโหลดลง NodeMCU v.3

3. เปิด Serial Monitor (ในเมนู Tools) จากนั้นทดสอบกดปุ่มบนโมดูลตัวส่งสัญญาณรีโมตและสังเกตผลลัพธ์ที่ได้ (เทียบกับ ข้อมูลในรูปที่ 2)

 

image description

รูปที่ 6 การเชื่อมต่อ NodeMCU v.3 กับไอซีรับสัญญาณรีโมตอินฟราเรดเบอร์ TL1838

 

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

// Read IR Remote Code by NodeMCU ESP8266

// using VS1838B IR Receiver

 

#include <Arduino.h>

#include <IRremoteESP8266.h>

#include <IRrecv.h>

#include <IRutils.h>    // for serialPrintUint64

 

int irPin = D1;   // Pin D1 = GPIO 5, D5 = GPIO 14

 

IRrecv irrecv(irPin);

 

decode_results results;

 

void setup() {

  Serial.begin(9600);

  irrecv.enableIRIn();  // Start the receiver

  while (!Serial)    // Wait for the serial comm.

    delay(50);

  Serial.println();

  Serial.print("IRrecv Test is now running on Pin ");

  Serial.println(irPin);

}

 

void loop() {

  if (irrecv.decode(&results)) {

    // print() & println() cannot handle printing long longs.

    serialPrintUint64(results.value, HEX);

    Serial.println("");   

    irrecv.resume();  // Receive the next value

  }

  delay(100);

}

 

 

 

ตอนที่ 2 การควบคุมรีเลย์ด้วยรีโมตอินฟราเรด

1. ต่อวงจรดังรูปที่ 7

2. เขียนโปรแกรมดังที่แสดงในโค้ดหน้าถัดไป จากนั้นจึงอัปโหลดลง NodeMCU v.3

3. ทดสอบกดปุ่มบนโมดูลตัวส่งสัญญาณรีโมต ที่ปุ่มเลข ‘0’, ‘1’, ‘2’ หรือ ‘3’ ดู สังเกตการทำงานของรีเลย์

 

image description

 

รูปที่ 7 การเชื่อมต่อ 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

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

// Remote Control Relay by NodeMCU ESP8266

// using VS1838B IR Receiver

 

#include <Arduino.h>

#include <IRremoteESP8266.h>

#include <IRrecv.h>

// #include <IRutils.h>  // for serialPrintUint64

 

#define ON LOW

#define OFF HIGH

int Relay1 = D1;

int Relay2 = D2;

 

int irPin = D5; // Pin D1 = GPIO 5, D5 = GPIO 14

 

IRrecv irrecv(irPin);

 

decode_results results;

 

/* Define function of the buttons

'0' = Switch Relay1 OFF

'1' = Switch Relay1 ON

'2' = Switch Relay2 OFF

'3' = Switch Relay2 ON

*/

 

const uint64 b0 = 0xFF6897;   // 0

const uint64 b1 = 0xFF30CF;   // 1

const uint64 b2 = 0xFF18E7;   // 2

const uint64 b3 = 0xFF7A85;   // 3

 

void setup() {

  // Serial.begin(9600);       // For debugging

  // Serial.println("Remote Control Relay Module");

  pinMode(Relay1, OUTPUT);

  pinMode(Relay2, OUTPUT);

  digitalWrite(Relay1, OFF);

  digitalWrite(Relay2, OFF);

  irrecv.enableIRIn();  // Start the receiver

}

 

void loop() {

  if (irrecv.decode(&results)) {

 

    if(results.value == b0) {

      // Serial.println("'0' is pressed.");      

      digitalWrite(Relay1, OFF);

    }  

 

    if(results.value == b1) {

      // Serial.println("'1' is pressed.");

      digitalWrite(Relay1, ON);

    }

 

    if(results.value == b2) {

      // Serial.println("'2' is pressed.");

      digitalWrite(Relay2, OFF);

    }

   

    if(results.value == b3) {

      // Serial.println("'3' is pressed.");

      digitalWrite(Relay2, ON);

    }

 

    irrecv.resume();  // Receive the next value

  }

  delay(100);

}

 

 

 

แบบฝึกหัดท้ายการทดลอง

จงเขียนต่อวงจรและโค้ดเพิ่มเติมจากการทดลองตอนที่ 2 เพื่อให้รีโมตสามารถควบคุมการทำงานของรีเลย์ทั้ง 4 ตัว โดยในการควบคุมนี้ เราทำได้สองกรณี คือ

1. เพิ่มการเปรียบเทียบค่าที่ตัวรับสัญญาณรับได้ กับค่าของปุ่ม ‘4’, ‘5’, ‘6’, และ ‘7’

หรือ

2. ใช้ 4 ปุ่มเดิม แต่เปลี่ยนแปลงโค้ดให้แต่ละปุ่มใช้ควบคุมรีเลย์ ปุ่มละ 1 ตัว ซึ่งทำได้โดยการเก็บสถานะของรีเลย์ไว้ในหน่วยความจำด้วย (ศึกษาเพิ่มเติมได้จากการทดลองตอนที่ 2 ในบทเสริมเรื่องการใช้งานสวิตช์)