ทดลองรีโมต (IR-Remote) กับ Arduino

Posted by | July 17, 2013 | Arduino, Tutorial | 3 Comments
example2

สำหรับรีโมต อุปกรณ์ง่ายๆ ราคาไม่แพงมาก ที่เรียกว่า เป็นจุดเปลี่ยนชีวิตเลยว่าได้ครับ คนนอนสบาย ง่อยกันไปเลย สำหรับประวัติของรีโมตถูกสร้างโดย ดร โรเบิร์ต แอดเลอร์ (Dr. Robert Adler) ดร. ทางฟิสิกส์ครับ โดยเวอร์ชั่นแรก ใช้คลื่นเสียง ultrasonic ส่งข้อมูล ยังไม่ได้ใช้ IR และราคาประมาณ 1 ใน 3 ของราคาทีวีในตอนนั้น เชื่อไหมว่าราคาขนาดนี้ มันก้อขายไปแล้วว่า 9 ล้านตัว

example2

สำหรับบทความตอนนี้ เราจะมาทดลองใช้ IR Receiver บน Arduino กันดีกว่าครับ เราจะได้ทำโปรเจค ที่ควบคุมจาก รีโมต ได้ แถมหาได้ง่าย ราคาประหยัด

โดยทางรีโมต และ ตัว IR Receiver เราใช้ชุดสำหรับรูป ที่หาได้จาก ในร้านของทาง ayarafun shop นะครับ ซึ่งจริง IR หาซื้อได้จากร้านในบ้านหม้อ และรีโมต เราจะเอาของที่บ้านมาก็ได้ครับ ก้อสามารถเทียบ และ ไปประยุกต์กันได้ครับ

remote_front_view

1. วิธีการติดตั้งLibraries

1. download library ไปใส่ใน

2. จากนั้น copy ไปใส่ใน [mydocument]\Documents\Arduino\libraries

 remote1

 หรือ [drive]\arduino-x.y.z\libraries

remote2

 แนะนำ เก็บไว้ใน my document ดีกว่า เผื่อเราเปลี่ยนเวอร์ชั่น arduinoในอนาคตครับ

***สำหรับการใช้งาน ทดสอบกับ arduino 1.0.3 นะครับ ถ้าต่ำกว่าอาจจะทำงานไม่ได้

 3. เปิดโปรแกรม arduino ขึ้นมาใหม่ เราจะเจอว่าใน example จะมี ตัวอย่างการใช้งาน remote ถือว่าจบการติดตั้ง

remote3

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 ใช้งานได้ครับ

remote_pinout

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 บนรีโมตตัวเล็กของเราครับ

capture-20130719-095744

FD08F7
FD8877
FD48B7
FD28D7
FDA857
FD6897
FD18E7
FD9867
FD58A7

จากตัวอย่างโปรแกรม ค่าของรีโมต code มันจะถูกเก็บไว้ใน ตัวแปร results.value คราวนี้เราจะเอาไปให้กด remote แล้วเอาไปทำอะไร ก็เริ่มจากตรงนี้ล่ะครับ อันนี้เราลองหารีโมตที่ถูกใจดูครับ สำหรับคนอยากได้เล็ก พกสะดวก จัดอันนี้ไปนะครับ

ตัวอย่าง Code ที่ 2

ตัวอย่างที่ 2 เราจะประยุกต์ใช้ รีโมตเพื่อควบคุม LED ครับ ลองดูจากตัวอย่างแล้วก็ทำดูนะครับ

example2

#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 หวังว่าชาวนักประดิษฐ์อย่างเรา จะเอาไปต่อยอด ในผลงานสิ่งประดิษฐ์ กันได้นะครับ

About chang

ชื่อ “ช้าง” ส่วนมากเขาจะเรียกว่า “พี่ช้าง” แล้ว มีความสนใจทางเทคโนโลยีทางคอมพิวเตอร์ อิเล็กทรอนิกส์ และ หุ่นยนต์ เป็นทั้งนักคิด นักประดิษฐ์ ชอบทดลองเล่น จนเดี่ยวนี้รู้สึกว่าจะเล่นมากกว่ามืออาชีพไปสักแล้ว

  • Wattana Nokngam

    ขอบคุณมากเลยครับ เพิ่มความรู้ให้ผมกำลังเริ่มต้นศึกษามากเลย

  • unctrl

    ขอบคุณมากกกกก……กำลังปวดหัวกับโจทย์นี้อยู่เลย

  • I’ssariyabhorn Jam’z

    สามารถใช้กับบอร์ดอื่นได้ไหมคะ เอามาประยุกต์กับ STM32F4 ได้ไหมคะ