การใช้งานรีโมตอินฟราเรด
ชุดสื่อสารรีโมตอินฟราเรด
ในการสื่อสารแบบไร้สาย
ตัวควบคุมแบบรีโมตอินฟราเรด (Infrared Remote Controller)
ถูกนำมาใช้กันอย่างแพร่หลายในงานหลายประเภท
โดยตัวอย่างที่เห็นได้ทั่วไปคือการในการควบคุมโทรทัศน์ และเรียกอุปกรณ์นี้สั้น ๆ
ว่า รีโมต โดยรีโมตลักษณะนี้จะใช้คลื่นแสงอินฟราเรด
(แสงที่ตามองไม่เห็น) ในการสื่อสาร ระบบการสื่อสารไร้สายด้วยรีโมตประกอบด้วย
ตัวส่ง (transmitter) และตัวรับ (receiver) รูปที่ 1 แสดงภาพถ่ายของตัวส่งหรือตัวรีโมตและตัวรับแบบต่าง
ๆ ที่มักนำมาใช้ในการสื่อสารร่วมกับการควบคุมอัตโนมัติด้วยไมโครคอนโทรลเลอร์
โดยสำหรับตัวส่งมักจะมีลักษณะเป็นอาเรย์ของปุ่ม (รูปที่ 1(ก)) และตัวรับที่นิยมใช้นั้นคือ ไอซีเบอร์ TL1838 ดังรูปที่
1(ข) ในท้องตลาดจะมีจำหน่ายทั้งแบบที่เป็นตัวอุปกรณ์เดี่ยว ๆ
(รูปที่ 1 (ข)) และแบบที่มีการนำมาติดตั้งบนแผ่นวงจรเพื่อให้การใช้งานทำได้อย่างง่ายดาย
(รูปที่ 1(ค) และ (ง))
ซึ่งสำหรับตัวรับนี้จะประกอบด้วยโฟโต้ทรานซิสเตอร์และส่วนของวงจรถอดรหัสสัญญาณที่ได้รับให้เป็นข้อมูลดิจิทัล
รูปที่
1 ภาพถ่ายโมดูล (ก) ตัวส่งและ (ข) (ง) ตัวรับในชุดสื่อสารรีโมตอินฟราเรด
รูปที่
2 รหัสข้อมูลดิจิทัลเลขฐานสิบหกที่ส่งเมื่อมีการกดปุ่มต่าง ๆ บนโมดูลตัวส่งของรีโมต
ชนิด 7 แถว 3 หลัก ที่แสดงในรูปที่ 1(ก)
ข้อมูลดิจิทัลที่ส่งจากโมดูลตัวส่งนั้น
จะมีลักษณะที่ขึ้นกับปุ่มที่กด โดยสามารถเขียนเป็นเลขฐานสิบหกได้ดังแสดงในรูปที่ 2 โดยผู้ใช้งานจะต้องทราบรหัสเหล่านี้เพื่อนำไปใช้ในการเขียนโปรแกรมรับและอ่านข้อมูล
ในการทำงานจริงนั้น
โมดูลตัวส่งจะทำการมอดูเลตหรือแปลงรหัสข้อมูลดิจิทัลให้สามารถส่งได้ตามมาตรฐานการสื่อสาร
โดยใช้คลื่นความถี่ 38 kHz
และตัวรับข้อมูลนั้นจะมีการถอดรหัสดิจิทัลออกมา รูปที่ 3 แสดงลักษณะสัญญาณที่ส่งออกจากรีโมต
(วัดโดยตัวตรวจวัดแสงทั่วไป) และสัญญาณดิจิทัลที่ถอดรหัสแล้ว ด้วยไอซี TL1838
รูปที่
3 ภาพลักษณะสัญญาณที่ส่งออกจากโมดูลตัวส่งและสัญญาณดิจิทัลที่ถอดรหัสแล้ว
ไลบรารี
IRremoteESP8266
แม้ว่าสัญญาณจากตัวรับสัญญาณรีโมตจะมีการแปลงเป็นสัญญาณดิจิทัลแล้ว
เราก็ยังจำเป็นต้องมีการอ่านสัญญาณดิจิทัลนี้อย่างถูกต้องเพื่อให้ได้รับข้อมูลการกดปุ่มจากตัวส่งที่ถูกต้อง
การเขียนโปรแกรมเพื่ออ่านข้อมูลแต่ละบิตเองนั้นเป็นเรื่องยุ่งยาก ดังนั้นในการเขียนโปรแกรมด้วย
Arduino
IDE เพื่อควบคุมไมโครคอนโทรลเลอร์ที่ใช้ชิป ESP8266 ให้อ่านค่าจากสัญญาณจากรีโมตนั้น เรามักจะใช้ไลบรารีสำเร็จรูป ซึ่งเราจะต้องมีการเพิ่มไลบรารีนี้ที่มีชื่อว่า
IRremoteESP8266 เข้าไป เสียก่อน โดยเราทำได้โดยการไปดาวน์โหลดมาติดตั้งในเครื่อง
(เช่นเดียวกับไลบรารีอื่น ๆ ที่กล่าวถึงในบทก่อนหน้านี้ เช่น OLED) โดยผู้ใช้สามารถดาวน์โหลดไลบรารีสำหรับการสื่อสารด้วยรีโมตนี้ได้ที่ https://github.com/crankyoldgit/IRremoteESP8266 รูปที่ 4 การดาวน์โหลดและรูปที่
5 แสดงการติดตั้งไลบรารี IRremoteESP8266 ลงในโปรแกรม Arduino IDE
รูปที่
4 การดาวน์โหลดไลบรารีของ IRremoteESP8266 จาก
github
รูปที่
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)
รูปที่
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 ดู สังเกตการทำงานของรีเลย์
รูปที่
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 ในบทเสริมเรื่องการใช้งานสวิตช์)