อย่างที่บอกครับ ผมทำโครงงานหุ่นยนต์ดูดฝุ่นด้วย IR remote + L298n + sensor ultrasonic แต่ตอนนี้เอาแค่รถบังคับก่อนจึงยังไม่ใช้ sensor ultrasonic ตัว IR remote รับสัญญาณปกติไฟ feedback ขึ้นแล้ว เช็คกับโค้ดให้มันแสดงปุ่มที่กดไปในมอร์นิเตอร์แล้วขึ้นปกติ แต่ไม่ทำงานตามคำสั่งเกิดจากอะไรครับ ลองพยายามเองมาซักพักแล้ว พรุ่งนี้เดดไลน์เลยมาตั้งขอความเห็นไว้ก่อน ใครพอมีความรู้ช่วยแนะนำได้ไมครับ ขอบคุณครับ
โค้ดที่ใช้ครับ
#include <IRremote.h>
// กำหนดขาเชื่อมต่อ IR Receiver
const int recv_pin = 11;
// กำหนดขาเชื่อมต่อ L298N
#define PWM_ML 3 // กำหนดขา PWM_ML
#define in1_ML 2 // กำหนดขา in1_ML
#define in2_ML 4 // กำหนดขา in2_ML
#define in1_MR 5 // กำหนดขา in1_MR
#define in2_MR 7 // กำหนดขา in2_MR
#define PWM_MR 6 // กำหนดขา PWM_MR
int SpeedR = 255; // ความเร็วของมอเตอร์ด้านขวา
int SpeedL = 255; // ความเร็วของมอเตอร์ด้านซ้าย //140
void setup() {
Serial.begin(9600); // เปิดการเชื่อมต่อ Serial Monitor
IrReceiver.begin(recv_pin, ENABLE_LED_FEEDBACK);
pinMode(PWM_ML, OUTPUT); // ตั้งค่า PWM_ML เป็น OUTPUT
pinMode(in1_ML, OUTPUT); // ตั้งค่า in1_ML เป็น OUTPUT
pinMode(in2_ML, OUTPUT); // ตั้งค่า in2_ML เป็น OUTPUT
pinMode(in1_MR, OUTPUT); // ตั้งค่า in1_MR เป็น OUTPUT
pinMode(in2_MR, OUTPUT); // ตั้งค่า in2_MR เป็น OUTPUT
pinMode(PWM_MR, OUTPUT); // ตั้งค่า PWM_MR เป็น OUTPUT
}
void loop() {
if (IrReceiver.decode())
{
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.printIRResultShort(&Serial);
switch(IrReceiver.decodedIRData.decodedRawData)
{
case 0xE718FF00: //รหัสปุ่ม moveForward
moveForward();
break;
case 0xAD52FF00: // รหัสปุ่ม Backward
moveBackward();
break;
case 0xF708FF00: // รหัสปุ่ม Left
turnLeft();
break;
case 0xA55AFFF00: // รหัสปุ่ม Right
turnRight();
break;
case 0xE31FFF00: // รหัสปุ่ม Stop
stopMoving();
break;
}
IrReceiver.resume();
}
}
// สร้างฟังก์ชันสำหรับการเคลื่อนที่ไปข้างหน้า
void moveForward() {
digitalWrite(in1_ML, LOW); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, SpeedL); // ตั้งค่า PWM_ML ให้มอเตอร์ทำงานด้วยความเร็ว SpeedL
digitalWrite(in1_MR, LOW); // ตั้งค่า in1_MR เป็น LOW
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, SpeedR); // ตั้งค่า PWM_MR ให้มอเตอร์ทำงานด้วยความเร็ว SpeedR
}
// สร้างฟังก์ชันสำหรับการหยุดเคลื่อนที่
void stopMoving() {
digitalWrite(in1_ML, HIGH); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น LOW
analogWrite(PWM_ML, 0); // ตั้งค่า PWM_ML ให้มอเตอร์หยุดทำงาน
digitalWrite(in1_MR, HIGH); // ตั้งค่า in1_MR เป็น LOW
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น LOW
analogWrite(PWM_MR, 0); // ตั้งค่า PWM_MR ให้มอเตอร์หยุดทำงาน
}
// สร้างฟังก์ชันสำหรับการเลี้ยวซ้าย
void turnLeft() {
digitalWrite(in1_ML, HIGH); // ตั้งค่า in1_ML เป็น HIGH
digitalWrite(in2_ML, LOW); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, 255); // ตั้งค่า PWM_ML ให้มอเตอร์หยุดทำงาน
digitalWrite(in1_MR, LOW); // ตั้งค่า in1_MR เป็น LOW
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, 255); // ตั้งค่า PWM_MR ให้มอเตอร์ทำงานด้วยความเร็ว 170
// รอ 250 มิลลิวินาทีก่อนหยุดหมุน
}
// สร้างฟังก์ชันสำหรับการเลี้ยวขวา
void turnRight() {
digitalWrite(in1_ML, LOW); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, 255); // ตั้งค่า PWM_ML ให้มอเตอร์ทำงานด้วยความเร็ว 150
digitalWrite(in1_MR, HIGH); // ตั้งค่า in1_MR เป็น HIGH
digitalWrite(in2_MR, LOW); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, 255); // ตั้งค่า PWM_MR ให้มอเตอร์หยุดทำงาน
}
void moveBackward() {
digitalWrite(in1_ML, LOW); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, 255); // ตั้งค่า PWM_ML ให้มอเตอร์ทำงานด้วยความเร็ว 150
digitalWrite(in1_MR, LOW); // ตั้งค่า in1_MR เป็น HIGH
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, 255); // ตั้งค่า PWM_MR ให้มอเตอร์หยุดทำงาน
}
ผมทำรถบังคับด้วย IR remote + L298n แต่ตัว IR remote รับสัญญาณแต่ไม่ทำงานตามคำสั่งเกิดจากอะไรครับ
โค้ดที่ใช้ครับ
#include <IRremote.h>
// กำหนดขาเชื่อมต่อ IR Receiver
const int recv_pin = 11;
// กำหนดขาเชื่อมต่อ L298N
#define PWM_ML 3 // กำหนดขา PWM_ML
#define in1_ML 2 // กำหนดขา in1_ML
#define in2_ML 4 // กำหนดขา in2_ML
#define in1_MR 5 // กำหนดขา in1_MR
#define in2_MR 7 // กำหนดขา in2_MR
#define PWM_MR 6 // กำหนดขา PWM_MR
int SpeedR = 255; // ความเร็วของมอเตอร์ด้านขวา
int SpeedL = 255; // ความเร็วของมอเตอร์ด้านซ้าย //140
void setup() {
Serial.begin(9600); // เปิดการเชื่อมต่อ Serial Monitor
IrReceiver.begin(recv_pin, ENABLE_LED_FEEDBACK);
pinMode(PWM_ML, OUTPUT); // ตั้งค่า PWM_ML เป็น OUTPUT
pinMode(in1_ML, OUTPUT); // ตั้งค่า in1_ML เป็น OUTPUT
pinMode(in2_ML, OUTPUT); // ตั้งค่า in2_ML เป็น OUTPUT
pinMode(in1_MR, OUTPUT); // ตั้งค่า in1_MR เป็น OUTPUT
pinMode(in2_MR, OUTPUT); // ตั้งค่า in2_MR เป็น OUTPUT
pinMode(PWM_MR, OUTPUT); // ตั้งค่า PWM_MR เป็น OUTPUT
}
void loop() {
if (IrReceiver.decode())
{
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.printIRResultShort(&Serial);
switch(IrReceiver.decodedIRData.decodedRawData)
{
case 0xE718FF00: //รหัสปุ่ม moveForward
moveForward();
break;
case 0xAD52FF00: // รหัสปุ่ม Backward
moveBackward();
break;
case 0xF708FF00: // รหัสปุ่ม Left
turnLeft();
break;
case 0xA55AFFF00: // รหัสปุ่ม Right
turnRight();
break;
case 0xE31FFF00: // รหัสปุ่ม Stop
stopMoving();
break;
}
IrReceiver.resume();
}
}
// สร้างฟังก์ชันสำหรับการเคลื่อนที่ไปข้างหน้า
void moveForward() {
digitalWrite(in1_ML, LOW); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, SpeedL); // ตั้งค่า PWM_ML ให้มอเตอร์ทำงานด้วยความเร็ว SpeedL
digitalWrite(in1_MR, LOW); // ตั้งค่า in1_MR เป็น LOW
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, SpeedR); // ตั้งค่า PWM_MR ให้มอเตอร์ทำงานด้วยความเร็ว SpeedR
}
// สร้างฟังก์ชันสำหรับการหยุดเคลื่อนที่
void stopMoving() {
digitalWrite(in1_ML, HIGH); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น LOW
analogWrite(PWM_ML, 0); // ตั้งค่า PWM_ML ให้มอเตอร์หยุดทำงาน
digitalWrite(in1_MR, HIGH); // ตั้งค่า in1_MR เป็น LOW
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น LOW
analogWrite(PWM_MR, 0); // ตั้งค่า PWM_MR ให้มอเตอร์หยุดทำงาน
}
// สร้างฟังก์ชันสำหรับการเลี้ยวซ้าย
void turnLeft() {
digitalWrite(in1_ML, HIGH); // ตั้งค่า in1_ML เป็น HIGH
digitalWrite(in2_ML, LOW); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, 255); // ตั้งค่า PWM_ML ให้มอเตอร์หยุดทำงาน
digitalWrite(in1_MR, LOW); // ตั้งค่า in1_MR เป็น LOW
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, 255); // ตั้งค่า PWM_MR ให้มอเตอร์ทำงานด้วยความเร็ว 170
// รอ 250 มิลลิวินาทีก่อนหยุดหมุน
}
// สร้างฟังก์ชันสำหรับการเลี้ยวขวา
void turnRight() {
digitalWrite(in1_ML, LOW); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, 255); // ตั้งค่า PWM_ML ให้มอเตอร์ทำงานด้วยความเร็ว 150
digitalWrite(in1_MR, HIGH); // ตั้งค่า in1_MR เป็น HIGH
digitalWrite(in2_MR, LOW); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, 255); // ตั้งค่า PWM_MR ให้มอเตอร์หยุดทำงาน
}
void moveBackward() {
digitalWrite(in1_ML, LOW); // ตั้งค่า in1_ML เป็น LOW
digitalWrite(in2_ML, HIGH); // ตั้งค่า in2_ML เป็น HIGH
analogWrite(PWM_ML, 255); // ตั้งค่า PWM_ML ให้มอเตอร์ทำงานด้วยความเร็ว 150
digitalWrite(in1_MR, LOW); // ตั้งค่า in1_MR เป็น HIGH
digitalWrite(in2_MR, HIGH); // ตั้งค่า in2_MR เป็น HIGH
analogWrite(PWM_MR, 255); // ตั้งค่า PWM_MR ให้มอเตอร์หยุดทำงาน
}