สำหรับรีโมต อุปกรณ์ง่ายๆ ราคาไม่แพงมาก ที่เรียกว่า เป็นจุดเปลี่ยนชีวิตเลยว่าได้ครับ คนนอนสบาย ง่อยกันไปเลย สำหรับประวัติของรีโมตถูกสร้างโดย ดร โรเบิร์ต แอดเลอร์ (Dr. Robert Adler) ดร. ทางฟิสิกส์ครับ โดยเวอร์ชั่นแรก ใช้คลื่นเสียง ultrasonic ส่งข้อมูล ยังไม่ได้ใช้ IR และราคาประมาณ 1 ใน 3 ของราคาทีวีในตอนนั้น เชื่อไหมว่าราคาขนาดนี้ มันก้อขายไปแล้วว่า 9 ล้านตัว
สำหรับบทความตอนนี้ เราจะมาทดลองใช้ IR Receiver บน Arduino กันดีกว่าครับ เราจะได้ทำโปรเจค ที่ควบคุมจาก รีโมต ได้ แถมหาได้ง่าย ราคาประหยัด
โดยทางรีโมต และ ตัว IR Receiver เราใช้ชุดสำหรับรูป ที่หาได้จาก ในร้านของทาง ayarafun shop นะครับ ซึ่งจริง IR หาซื้อได้จากร้านในบ้านหม้อ และรีโมต เราจะเอาของที่บ้านมาก็ได้ครับ ก้อสามารถเทียบ และ ไปประยุกต์กันได้ครับ
1. วิธีการติดตั้งLibraries
1. download library ไปใส่ใน
- http://www.dfrobot.com/image/data/DFR0107/IRremote.zip
- https://github.com/shirriff/Arduino-IRremote
2. จากนั้น copy ไปใส่ใน [mydocument]\Documents\Arduino\libraries
หรือ [drive]\arduino-x.y.z\libraries
แนะนำ เก็บไว้ใน my document ดีกว่า เผื่อเราเปลี่ยนเวอร์ชั่น arduinoในอนาคตครับ
***สำหรับการใช้งาน ทดสอบกับ arduino 1.0.3 นะครับ ถ้าต่ำกว่าอาจจะทำงานไม่ได้
3. เปิดโปรแกรม arduino ขึ้นมาใหม่ เราจะเจอว่าใน example จะมี ตัวอย่างการใช้งาน remote ถือว่าจบการติดตั้ง
2. การ wiring ส่วน Hardware
สำหรับการใช้งาน IR Receiver Module จะเป็นลักษณะด้านภาพ มี สามขา ไฟเลี้ยง , Ground และ Data Out เราเพียงต่อขา Data Out ของ IR Receiver Module ต่อกับ บอร์ด Arduino โมดุล เท่านั้น ก็ใช้งานได้แล้ว
ในที่นี้ เราจะต่อ Signal Out เข้ากับขา D11 ของ Arduino ดังภาพ หลังจากนั้น เราแค่ config libraries ของ arduino ก่อนการใช้งานว่า เราต่อขา Signal Out ของ IR Receiver Module ที่พิน D11 ใช้งานได้ครับ
3. การทดสอบ
มาดูตัวอย่างแรกของการใช้งาน ทดสอบว่า รีโมตส่งข้อมูล และ บอร์ด arduino เรารับข้อมูลได้
ตัวอย่าง Code ที่ 1
#include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; int on = 0; unsigned long last = millis(); void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver Serial.println("Hello"); } void loop() { if (irrecv.decode(&results)) { if (millis() - last > 50) { if ( (results.value != 0xFFFFFFFF) && (results.value != 0x00) ) Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } last = millis(); irrecv.resume(); // Receive the next value } }
จากตัวอย่างแรก ให้เราเปิด Serial Monitor เมื่อเรากดรีโมต มันจะขึ้น Code ซึง Code นี้ รีโมตแต่ล่ะยีห้อ แต่ล่ะปุ่มจะส่งออกมาไม่เหมือนกันครับ สำหรับอันนี้ เราได้จากกดปุ่ม 1-9 บนรีโมตตัวเล็กของเราครับ
FD08F7 FD8877 FD48B7 FD28D7 FDA857 FD6897 FD18E7 FD9867 FD58A7
จากตัวอย่างโปรแกรม ค่าของรีโมต code มันจะถูกเก็บไว้ใน ตัวแปร results.value คราวนี้เราจะเอาไปให้กด remote แล้วเอาไปทำอะไร ก็เริ่มจากตรงนี้ล่ะครับ อันนี้เราลองหารีโมตที่ถูกใจดูครับ สำหรับคนอยากได้เล็ก พกสะดวก จัดอันนี้ไปนะครับ
ตัวอย่าง Code ที่ 2
ตัวอย่างที่ 2 เราจะประยุกต์ใช้ รีโมตเพื่อควบคุม LED ครับ ลองดูจากตัวอย่างแล้วก็ทำดูนะครับ
#include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; #define OUTPUT_COUNT 4 unsigned long last = millis(); long remote_key[]={0xFD08F7,0xFD8877,0xFD48B7,0xFD28D7}; const byte outputPins[OUTPUT_COUNT] = {2, 3, 4, 5}; struct keypad { boolean state; }; keypad output[OUTPUT_COUNT]; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver Serial.println("Hello"); for (int i=0;i<OUTPUT_COUNT;i++) { pinMode(outputPins[i], OUTPUT); output[i].state = LOW; } } void loop() { unsigned long currentMillis = millis(); if (irrecv.decode(&results)) { if (currentMillis - last > 50) { //Serial.println(results.value, HEX); if ( (results.value != 0xFFFFFFFF) && (results.value != 0x00) ) { for (int val=0;val<OUTPUT_COUNT;val++) { if ( results.value == remote_key[val] ) { if (output[val].state==LOW) { Serial.print ("ch["); Serial.print(val); Serial.println("] ON"); output[val].state=HIGH; } else { output[val].state=LOW; Serial.print ("ch["); Serial.print(val); Serial.println("] OFF"); } } } } for (int i=0;i<OUTPUT_COUNT;i++) digitalWrite(outputPins[i], output[i].state); } last = currentMillis; irrecv.resume(); // Receive the next value } } }
ตัวอย่างที่สอง เป็นการประยุกต์ง่ายๆ เอามาเปิดปิด LED ครับ พื้นฐานของทุกสิ่งในโลกเลย เปิด ปิด LED ทางผม ก็เก็บค่า remote ที่กดปุ่ม 1,2,3,4 ไว้ มันจะได้ค่า FD08F7 , FD8877, FD48B7, FD28D7 และเก็บไว้ในตัวแปร array remote_key[] สำหรับรีโมตรุ่นอื่นจะได้ค่าอื่นนะครับ
จากนั้นทุกครั้ง ที่มีการกดรีโมต โปรแกรมส่วนนี้จะเอาค่าที่อ่านได้มาตรวจสอบ ว่าตรงกับ index ที่เท่าไร พอได้ index ก็เอาไป map กับ LED ที่ติดไว้ครับ กดเลขไหน เลขนั้นจะสว่าง กดอีกที่มันก็ดับครับ บอกแล้ว เขียนแบบง่าย เน้นให้ผู้อ่าน เอาไปใช้ต่อง่ายๆนะ ก็จบไปแล้วตัวอย่างการใช้ IR-Receive หวังว่าชาวนักประดิษฐ์อย่างเรา จะเอาไปต่อยอด ในผลงานสิ่งประดิษฐ์ กันได้นะครับ
ขอบคุณมากเลยครับ เพิ่มความรู้ให้ผมกำลังเริ่มต้นศึกษามากเลย
ขอบคุณมากกกกก……กำลังปวดหัวกับโจทย์นี้อยู่เลย
สามารถใช้กับบอร์ดอื่นได้ไหมคะ เอามาประยุกต์กับ STM32F4 ได้ไหมคะ
Remote ยุคแรกๆ ยังเป็นสายอยู่ครับ แล้วปุ่มมันวางอยู่ที่โต๊ะ ขายเป็นชุด คล้ายชุดเฟอร์นิเจอร์ Remote ไร้สายนี่ยังเป็นยุคหลัง