โปรเจกต์ Robot car ควบคุมด้วย IR
การควบคุม Robot ผ่าน ir
การควบคุม Robot ผ่าน ir
สวัสดี ทุกคนครับ นี่เป็นโพสต์แรกของผมในคอมมูนิตี้นี้ หวังว่าโปรเจกต์ของผมจะเป็นประโยชน์กับทุกคนนะครับ
ในการทำโปรเจกต์นี้ เรามีการทดลองสองส่วนที่ต้องทำให้เสร็จ ดังนี้
1. IR Decoding
2. โปรแกรมหลักของ IR Robot
IIR DECODING
โปรเจกต์ของผมเกี่ยวกับ IR communication ที่มีการใช้ตัวส่ง (transmitter) และตัวรับ (receiver) โดย Remote จะทำหน้าที่ เป็น IR Transmitter และตัว IC ทำหน้าที่เป็นตัวรับ (receiver) รังสี IR คือคลื่นแม่เหล็กไฟฟ้า ที่ ตาเปล่าของมนุษย์มองไม่เห็น โดย IR Receiver IC ที่ใช้ในที่นี้คือ TSOP1738 ซึ่งสามารถทำงานได้ สูงสุดที่ 38MHZ
Remote จะมีความถี่ที่แตกต่างกันในแต่ละปุ่ม เนื่องจากเราต้องควบคุมการเคลื่อนที่ของ Robot เราจึงสามารถ decode ความถี่สำหรับการเคลื่อนที่ไปข้างหน้า (Forward), ถอยหลัง (Backward), เลี้ยวซ้าย (Left) และเลี้ยวขวา (Right) ขั้นแรกในการ decode ความถี่ ให้ลองเชื่อมต่อ TSOP1738 IC และ Arduino Uno ตามการเชื่อมต่อดังต่อไปนี้

=>>เชื่อมต่อ OUTPUT เข้ากับ PIN 11 บน Arduino Uno
=>>เชื่อมต่อ VCC เข้ากับ VCC บน Arduino Uno
=>>เชื่อมต่อ GROUND เข้ากับ GND
#include
#include
#include
#include
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{ Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver}
void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value }}
ตอนนี้จะอธิบายโปรแกรมอย่างละเอียดทีละขั้นตอน
1. เริ่มต้นด้วยการรวม Header files สำหรับ IR Remote ดังนี้ คือ
#include
#include
#include
#include
2. ขั้นตอนต่อไปคือการประกาศขา output ของ IR receiver ดังนั้นให้ประกาศ IR receiver pin ไว้ที่ Pin 11 คือ
int RECV_PIN=11;
3. ขั้นตอนต่อไปคือการตั้งค่า BAUD RATE เป็น 9600 คือ
Serial.begin(9600);
4. วางเงื่อนไข (conditional statement) เพื่อรับค่าความถี่ที่ decode ได้ คือ
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX);
irrecv.resume();
}
5. ขั้นตอนสุดท้ายคือการอัปโหลดโปรแกรมลง Arduino และเปิด Serial Monitor ที่มุมขวาบน

6. คราวนี้ให้กดปุ่มบน Remote ของคุณ แล้วคุณจะได้รับ HEX CODE ที่ decode แล้วบน Serial Monitor พร้อมๆ กัน

7. จาก HEX codes ที่ได้รับ ให้เลือกโค้ดเฉพาะสำหรับการเคลื่อนที่ไปข้างหน้า, ถอยหลัง, เลี้ยวซ้าย และเลี้ยวขวา
0xC1AA0DF2 - Forward button
0xC1AA4DB2 - Backward button
0xC1AACD32 - Left Button
0xC1AA8D72 - Right Button
0xC1AA11EE - Stop Button
ตอนนี้การควบคุม Automation หรือ Robot ทำได้โดยการเชื่อมต่อ
1. High volt DC Motor
2. แบตเตอรี่แบบชาร์จได้ 12 โวลต์
3. บอร์ด Arduino Uno
4. Motor Driver
การเชื่อมต่อมีดังต่อไปนี้

ตอนนี้ High volt DC Motor จะถูกเชื่อมต่อกับไมโครคอนโทรลเลอร์ Arduino Uno โดยใช้ Dual H bridge motor driver module(L293D)
Motor 1 ------> PIN 2, PIN 3
Motor 2------> PIN 4, PIN 5
ต้องจ่ายไฟ DC จากแหล่งจ่ายไฟแบบชาร์จได้ขนาดอย่างน้อย 12 โวลต์ให้กับ Motor Driver
ความถี่ที่ decode ได้จากการทดลองก่อนหน้านี้จะถูกนำมาใส่ในโปรแกรมหลักต่อไปนี้เพื่อให้การทำงานแบบอัตโนมัติสมบูรณ์แบบ
#include
#include
#include
#include
int receiver = 11; // Signal Pin of IR receiver to Arduino Digital Pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
void setup()
{
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn(); // Start the receiver
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
}
void loop()
{
if (irrecv.decode(&results)) // have we received an IR signal?
{
switch(results.value) //case starts
{
case 0xC1AA0DF2: //MOVEMENT -FORWARD
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
break;
case 0xC1AA4DB2: //MOVEMENT- BACKWARD
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
break;
case 0xC1AACD32: //MOVEMENT- LEFT
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
break;
case 0xC1AA8D72: //MOVEMENT- RIGHT
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
break;
case 0xC1AA11EE: //MOVEMENT- stop
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
break;
default: //incase you pressed other buttons
Serial.println(" other button ");
} // case ends
delay(100); // to not get immediate repeat
irrecv.resume(); // receive the next value
}
}
โปรแกรม หลักมีการอธิบายทีละขั้นตอนดังนี้
1. รวม IR Header files แบบเดียวกับที่ทำในการทดลอง decoding
2. ประกาศ IR output ไปที่ PIN 11
3. สร้าง Instance สำหรับการรับ (Receiving) และการถอดรหัส (Decoding) ดังนี้
IRrecv irrecv(receiver);
decode_results results;
4. ตั้งค่า BAUD RATE เป็น 9600 ตามปกติ ดังนี้
Serial.begin(9600);
5. ตั้งค่า Motor output ไปที่ PIN 2, PIN 3, PIN 4, PIN 5
6. ในฟังก์ชัน Loop เพื่อตรวจสอบว่าเราได้รับสัญญาณ IR หรือไม่ โดยใช้
if (irrecv.decode(&results))
7. ใช้ Switch case เพื่อดำเนินการคำสั่งใดคำสั่งหนึ่งในเวลาเดียวกัน รูปแบบของ Switch case คือ...

รูปแบบ switch case
8. ใส่ HEX Code ของความถี่ที่ตรงกันในแต่ละ case เพื่อควบคุมการเคลื่อนที่ของ Robot
9. มีการใส่ Delay เพื่อให้ระบบหยุดพักชั่วคราวแล้วจึงเริ่มการ IR decoding ต่อ
delay(1000);
irrecv.resume();
10. Compile และ Upload โปรแกรมไปยัง Microcontroller และตรวจสอบผลลัพธ์โดยใช้ Remote
หลังจาก Upload โปรแกรมหลักลงใน Arduino Uno แล้ว ให้กด ปุ่มบน Remote ที่ได้ decode ความถี่ไว้ เพื่อให้คำสั่งที่ระบุไว้ทำงาน
ลองนำแนวคิดนี้ไปใช้เชื่อมต่อกับเครื่องใช้ไฟฟ้าในบ้าน เช่น หลอดไฟ (BULB), พัดลม (FAN), ไฟนีออน (TUBELIGHT) และสนุกกับการดูพวกมันทำงานครับ
Schematics และโค้ดมีให้ดาวน์โหลดแล้ว โปรดอย่าเพียงแค่คัดลอกโค้ด แต่ควรทำความเข้าใจก่อนที่จะดาวน์โหลดไปใช้งานครับ
ขอบคุณ ครับ!!!!!! สำหรับการรับชม และหากมีข้อสงสัยใดๆ โปรดทิ้งข้อความไว้ในคอมเมนต์ได้เลยครับ
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้