การใช้ Remote ควบคุม MCU, ESP8266, Arduino ลงทุน 3 บาท

วิธีการควบคุมหรือใส่ข้อมูลให้ Arduino หรือ MCU อื่น IR Remote Control นี่เรียกได้ว่าน่าถูกที่สุด และง่ายที่สุดแล้วมั้ง เพราะทั้งชุด 60-100 บาท
ไม่ต้องเชื่อมไม่ต้องทำอะไรเลย


ผมเองก็ซื้อมา แต่ผมมองว่ามันไม่น่าซื้อเท่าไร สาเหตุหลักคือ

1 มีถูกกว่า
2 แบตแบบกระดุมหมดไวมากๆ จะหยิบมาใช้แบตหมด แบตแพงมากๆๆๆ
3 ปุ่มน้อยและก๊องแก๊ง

แต่ข้อดีมันอย่างเดียวคือมันเบาเล็ก
แต่เราไม่จำเป็นต้องซื้อมันมาให้เสียตังค์เลยเพราะทุกบ้านมีรีโมท ทั้งทีวี วิดีโอ เกินครึ่งเลิกใช้แล้ว หรือบางทีรีโมทมีปุ่ม 20-30 ปุ่มใช้จริงครึ่งเดียว เราก็เอาที่ไม่ใช้นั่นแหละมาใช้
ดีกว่าเยอะมีทั้งปุ่มทั้ง joy stick แบต AAA ใช้สามปียังเหลือ

จริงๆวิธีการใช้งาน Remote ก็มีเกลื่อน แต่วันนี้เรามาอธิบายแบบง่ายๆ เผื่อใครยังไม่เคยใช้ ไม่เอาแบบ Code NEC, SONY, อะไรพวกนี้ เพราะผมก๊ไม่รู้เหมือนกันเอาแบบง่ายๆ ก๊อปค่ามาหน้าตาเฉย เอาใช้งานอย่างเดียวทำงานยังไงไม่รู้ไม่สน


ทีนี้มาดู ตัวรับมันมักจะใช้ Chip HX1838 มีแบบ
แบบ Module ตัวละ 25 บาท



กับแบบ Chip ตัวละ 3 บาท


ทั้งสองต่างกันแค่ มี LED กระพริบเวลารับสัญญาณ เลือกเอาเลย อันใดอันหนึ่ง ขาต่อเท่ากัน ความสะดวกเท่ากัน สำหรับผมของถูกมาก่อน
ในทางปฏิบัติแบบ Chip สะดวกกว่ามาก เพราะเอาไปแปะตรงไหนก็ได้ ส่วนแบบ Module แปะไม่ได้ทุกแนวแถมขอบชนอีก คิดเอา เวลาใส่กล่องมันไม่มีทางแนบฝากล่องได้เลยทำให้รับสัญญาณได้ในมุมตรงๆที่รูเจาะเท่านั้น  แบบ Chip เอากาวร้อนทาเลย และ LED ในกล่องไม่ได้ดูหรอก แถมมันอยู่ในแนวคนละทิศกับ Sensor

สรุปคือเราลงทุน 3 บาท (แต่มันขายทีละสิบตัว) กับ Remote เก่าๆอันนึง


ดูรูปเราต่อ Arduino เข้ากับ Sensor GND กับ GND, 5V กับ Vcc, และ D2 กับ Out เสร็จแล้ว 30 วินาที (หาก 5V ไม่มีก็ต่อตรง Vcc ของบอร์ด)

หมายเหตุ : D3 จะไม่สามารถใช้ได้ตลอดไปเพราะจะถูก lock ไว้สำหรับ ตัวส่ง อย่าใช้ทำอะไร



ไป load IRremote library มาลงใน Arduino IDE
https://github.com/z3t0/Arduino-IRremote/blob/master/IRremote.h
แล้วทดลองลงโปรแกรมนี้


#include <IRremote.h>
byte RECV_PIN = 2;// infrared pin
IRrecv irrecv(RECV_PIN);
decode_results results;
long Val;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}
void loop() {
  if (irrecv.decode(&results))
  {
    Val = results.value;
    irrecv.resume(); // Receive the next value
    Serial.println( Val, DEC);
  }
}

เปิด Serial monitor กด Remote ของเราส่องไปที่ Sensor หากค่าไม่เปลี่ยนมักมาจากสายไม่แน่นกับรีโมทแบตหมด กดนานๆหน่อยแต่ละครั้ง
กดย้ำๆซ้าๆๆๆ หลายๆที มันจะมีค่ายเยอะๆออกมาเหมือนๆกันค่าหนึ่ง และมั่วๆอีกชุดหนึ่ง จดเอาค่าที่ซ้ำๆกันมา


บันทึกไว้ด้วยนะครับปุ่มไหนค่าอะไร เข่นตามรูปกดปุ่ม 1 ได้ค่า 12429399 กดและบันทึกทำไปทุกปุ่มที่ต้องการเอามาใช้ครับ

โปรแกรมตัวอย่าง


//-------------------------------------Program Developed By Ruth P----------------------------------------
#include <IRremote.h>
byte RECV_PIN = 2;// infrared pin
IRrecv irrecv(RECV_PIN);
decode_results results;

#define btnZero 0
#define btnOne 1
#define btnTwo 2
#define btnThree 3
#define btnFour 4
#define btnFive 5
#define btnSix 6
#define btnSeven 7
#define btnEight 8
#define btnNine 9
#define btnStar 10

#define btnNONE  255 //Nothing

long MultiSW; // Value of analog data to identify switch selector
long MultiSW2; // 2nd read, Value of analog data to identify switch selector for compare
byte OldxKey;// Prevent bouncing signal
byte xKey; // key pad value
boolean BounceAllow = HIGH;


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}
void loop() {

  xKey = read_MultiSW();
  if (xKey != btnNONE)
  {
    Serial.println(xKey);
  }
}

int ReadKey()
{
  if (irrecv.decode(&results))
  {
    MultiSW = results.value;
    irrecv.resume(); // Receive the next value
  }
  switch (MultiSW)
  {
    case 12419709:
      return btnZero;
      break;
    case 12429399:
      return btnOne;
      break;
    case 12413079:
      return btnTwo;
      break;
    case 12445719:
      return btnThree;
      break;
    case 12425319:
      return btnFour;
      break;
    case 12408999:
      return btnFive;
      break;
    case 12441639:
      return btnSix;
      break;
    case 12433479:
      return btnSeven;
      break;
    case 12417159:
      return btnEight;
      break;
    case 12449799:
      return btnNine;
      break;
    case 12443679:
      return btnStar;
      break;
    
    default:
      return btnNONE;
  }
}

//------------------------------------------
int read_MultiSW()
{
  int TempKey;
  TempKey = ReadKey();
  if (BounceAllow == HIGH)
  {
    return TempKey;
  }
  else
  {
    if ((TempKey != btnNONE) && (OldxKey == btnNONE)) //-------prevent bouncing
    {
      OldxKey = TempKey;
      return TempKey;
    }
    else
    {
      if (TempKey == btnNONE) OldxKey = TempKey;
      return btnNONE;
    }

  }
  return btnNONE;
}
//---------------------------------------------------------------------------




โปรแกรมต้องแก้ไขตามนี้ครับ



1 byte RECV_PIN = 2;
   สามารถต่อไปที่ Pin อื่นก็ได้และแก้ตรงนี้ให้ตรง อย่าลืมห้ามใช้ Pin D3 เด็ดขาด
2 #define ชื่อปุ่มแก้หรือเพิ่มเองตามใจชอบเลย ในตัวอย่างคือปุ่ม 0-9 และ *
3 BounceAllow
   HIGH= Repeat key ได้เอง
   LOW = กดปุ่มแล้วไม่ Repeat ต้องยกออกก่อน

4 เอาค่าที่บันทึกข้างต้น มาใส่ให้ตรงกับ ชื่อปุ่มที่ Define
  เสร็จแล้วครับ

ข้อดี
1 ต่อง่ายมาก
2 ถูก
3 หาง่าย
4 ปุ่มเยอะแต่ไม่ซับซ้อน
5 ทนถึกอึด
6 อยู่ไกลได้ระยะหนึ่งเหมาะกับงานที่ไม่อยากอยู่ใกล้
7 ประหยัดไฟ
8 เสถียรกดปุ่มไหนไม่มีมั่วอันอื่นมาแน่นอน เพราะค่ามันต้องตรงที่ตั้งไว้เท่านั้น

ข้อเสีย
1 ช้าเนื่องจากส่งข้อมูลเป็นสัญญาณกระพริบของ IR LED ต้องครบชุดถึงเอาไปแปลงอีกที (ช้านี่คือคือเทียบกับแบบอื่นที่เวลาเป็น Microsec ครับ แต่จริงๆกดปุ๊บติดปั๊บในการใช้งาน)
2 เป็น Interrupt ไม่ได้ ขณะ Program ทำงานส่วนอื่น Remote จะไม่รับค่าเลย แก้โดยเอา Function อ่าน Remote ไปไว้หลายๆจุดที่จำเป็น
3 Remote ใคร Remote มัน ก๊อปเอา Code เอาไปให้อีกคนใช้ไม่ได้ ต้องมี Remote ยี่ห้อเดียวกัน
4 ส่งข้อมูลได้ทีละตัวหากจะใช้ใส่ข้อมูล ต้องเขียนโปรแกรมเอาไปแปลงเอาเอง
5 รับได้ทิศทางเดียวห้ามีอะไรบัง คือทางด้านหน้า Sensor เท่านั้น ต่างกับ RF ที่ได้รอบทิศทาง
เหมาะกับงานประเภทเอาไปควบคุม เอาไปเปิดปิดไฟ

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