โปรเจคนี้จะเป็นการใช้ Keyestudio PIR Motion Sensor + Arduino UNO มาทำเป็น หุ่นยนต์ติดตามความเคลื่อนไหว PIR Motion Keyestudio PIR Motion Sensor เป็นโมดูลตรวจจับความเคลื่อนไหว ตัวโมดูลผลิตจาก Keyestudio ที่มีความเสถียรภาพในการตรวจจับ และมีประสิทธิ์ภาพในการทำงาน สามารถใช้งานได้ที่แรงดันไฟฟ้า 3.3 - 5V ให้กระแสเอาต์พุตที่ขา S (ขาสถานะเอาต์พุต) ที่ 100mA ทำงานแบบ Active HIGH มาพร้อมรูยึดน๊อตขนาด M3 จำนวน 1 ช่องกลางโมดูล ซึ่งเหมาะสำหรับมาทำเป็นหุ่นยนต์
10.
สายไฟแดงดำ ขนาด 22AWG มาตรฐาน 11.
Keyestudio PIR Motion Sensor จำนวน 3 ชิ้น 12.
Mounting Bracket for HC-SR04 แบบสั้น จำนวน 3 ชิ้น
เริ่มต้นด้วยการ ประกอบ 2WD Smart Car Robot Chassis Kits
และประกอบ รางถ่านแบบ 18650 และ เชื่อมต่อ Motor Drive Module L298N เข้ากับ Arduino Sensor Shield V 5.0 วงจรตามรูป
หมายเหตุ : ถ้ามี Jumper อยู่ที่ขา ENA และ ENB ของ บอร์ด L298N ให้ถอดออก
การเชื่อมต่อระหว่าง บอร์ด Arduino Sensor Shield V5.0 กับ บอร์ด L298N
*** VCC ของ Sensor Shield V5.0 คือ V ***
ประกอบ 2WD Smart Car Robot Chassis Kits และประกอบ รางถ่านแบบ 18650 และ เชื่อมต่อ 5V และ GND ของ Motor Drive Module L298N เข้ากับ V และ G ของ Arduino Sensor Shield
เชื่อมต่อการควบคุมมอเตอร์ ของ Motor Drive Module L298N เข้ากับ Arduino Sensor Shield
หลังจากนั้นให้ทดสอบเบื้องต้น ว่าการหมุนของล้อถูกต้องหรือไม่ โดย
เปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด Arduino UNO R3
// Motor A pins (enableA = enable motor, pinA1 = forward, pinA2 = backward) int enableA = 3; int pinA1 = 6; int pinA2 = 7; //Motor B pins (enabledB = enable motor, pinB2 = forward, pinB2 = backward) int enableB = 5; int pinB1 = 8; int pinB2 = 9; //This lets you run the loop a single time for testing boolean run = true; void setup() { pinMode(enableA, OUTPUT); pinMode(pinA1, OUTPUT); pinMode(pinA2, OUTPUT); pinMode(enableB, OUTPUT); pinMode(pinB1, OUTPUT); pinMode(pinB2, OUTPUT); } void loop() { if (run) { delay(2000); enableMotors(); //Go forward forward(400); //Go backward backward(400); //Turn left turnLeft(400); coast(200); //Turn right turnRight(400); coast(200); //This stops the loop run = false; } } //Define high-level H-bridge commands void enableMotors() { motorAOn(); motorBOn(); } void disableMotors() { motorAOff(); motorBOff(); } void forward(int time) { motorAForward(); motorBForward(); delay(time); } void backward(int time) { motorABackward(); motorBBackward(); delay(time); } void turnLeft(int time) { motorABackward(); motorBForward(); delay(time); } void turnRight(int time) { motorAForward(); motorBBackward(); delay(time); } void coast(int time) { motorACoast(); motorBCoast(); delay(time); } void brake(int time) { motorABrake(); motorBBrake(); delay(time); } //Define low-level H-bridge commands //enable motors void motorAOn() { digitalWrite(enableA, HIGH); } void motorBOn() { digitalWrite(enableB, HIGH); } //disable motors void motorAOff() { digitalWrite(enableB, LOW); } void motorBOff() { digitalWrite(enableA, LOW); } //motor A controls void motorAForward() { digitalWrite(pinA1, HIGH); digitalWrite(pinA2, LOW); } void motorABackward() { digitalWrite(pinA1, LOW); digitalWrite(pinA2, HIGH); } //motor B controls void motorBForward() { digitalWrite(pinB1, HIGH); digitalWrite(pinB2, LOW); } void motorBBackward() { digitalWrite(pinB1, LOW); digitalWrite(pinB2, HIGH); } //coasting and braking void motorACoast() { digitalWrite(pinA1, LOW); digitalWrite(pinA2, LOW); } void motorABrake() { digitalWrite(pinA1, HIGH); digitalWrite(pinA2, HIGH); } void motorBCoast() { digitalWrite(pinB1, LOW); digitalWrite(pinB2, LOW); } void motorBBrake() { digitalWrite(pinB1, HIGH); digitalWrite(pinB2, HIGH); } ใส่ แบตเตอรี่ลิเธียม 18650 จำนวน 2 ก้อน ไปที่ รางถ่าน และ ตรวจสอบขั้วของแบตเตอรี่ ใส่ถุกต้องหรือไม่
โปรแกรมนี้จะทำงานเพียง 1 ครั้ง ถ้าต้องการทดลองใหม่ให้ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ เมื่อล้อหมุน ตรวจสอบการหมุน ขอล้อต่างๆถูกต้องหรือไม่ ถ้าต่อวงจรถูกต้อง ล้อ ทั้งสองข้างจะหมุนไปข้างหน้า 1ครั้ง กลับหลัง 1 ครั้ง และ เดินหน้าอีกหนึ่งครั้งแล้วจึงหยุด ถ้าไม่ถูกต้องให้แก้ไข เช่นการต่อขั้วของมอเตอร์ผิด เป็นต้น
ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้วทดสอบ อีกครั้ง ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ ถ้าทุกอย่างถูกต้อง รถจะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว จึงกลับสู่ตำแหน่งเดิม
ถ้าหุ่นยนต์วิ่งได้ถูกต้องแล้ว จึง Upload โค้ด หุ่นยนต์ติดตามความเคลื่อนไหว PIR Motion
/* by : RobotSiam.com */ // Motor A int enableA = 3; int pinA1 = 6; int pinA2 = 7; //Motor B pins int enableB = 5; int pinB1 = 8; int pinB2 = 9; byte sensor[3] = {0, 0, 0}; void setup() { pinMode(enableA, OUTPUT); pinMode(pinA1, OUTPUT); pinMode(pinA2, OUTPUT); pinMode(enableB, OUTPUT); pinMode(pinB1, OUTPUT); pinMode(pinB2, OUTPUT); } void loop() { enableMotors(); analogWrite(enableA, 200); // ปรับค่าความเร็วของหุ่นยนต์ analogWrite(enableB, 200); // ปรับค่าความเร็วของหุ่นยนต์ delay(700); sensor[0] = digitalRead(A3); sensor[1] = digitalRead(A4); sensor[2] = digitalRead(A5); if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) ) { forward(100); coast(10); } else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0) ) { forward(180); coast(10); } else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) ) { turnRight(100); coast(10); } else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) ) { turnRight(50); coast(10); } else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0) ) { turnLeft(100); coast(10); } else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) ) { turnLeft(50); coast(10); } else { forward(100); coast(10); } } //Define high-level H-bridge commands void enableMotors() { motorAOn(); motorBOn(); } void disableMotors() { motorAOff(); motorBOff(); } void forward(int time) { motorAForward(); motorBForward(); delay(time); } void backward(int time) { motorABackward(); motorBBackward(); delay(time); } void turnLeft(int time) { motorABackward(); motorBForward(); delay(time); } void turnRight(int time) { motorAForward(); motorBBackward(); delay(time); } void coast(int time) { motorACoast(); motorBCoast(); delay(time); } void brake(int time) { motorABrake(); motorBBrake(); delay(time); } //Define low-level H-bridge commands //enable motors void motorAOn() { digitalWrite(enableA, HIGH); } void motorBOn() { digitalWrite(enableB, HIGH); } //disable motors void motorAOff() { digitalWrite(enableB, LOW); } void motorBOff() { digitalWrite(enableA, LOW); } //motor A controls void motorAForward() { digitalWrite(pinA1, HIGH); digitalWrite(pinA2, LOW); } void motorABackward() { digitalWrite(pinA1, LOW); digitalWrite(pinA2, HIGH); } //motor B controls void motorBForward() { digitalWrite(pinB1, HIGH); digitalWrite(pinB2, LOW); } void motorBBackward() { digitalWrite(pinB1, LOW); digitalWrite(pinB2, HIGH); } //coasting and braking void motorACoast() { digitalWrite(pinA1, LOW); digitalWrite(pinA2, LOW); } void motorABrake() { digitalWrite(pinA1, HIGH); digitalWrite(pinA2, HIGH); } void motorBCoast() { digitalWrite(pinB1, LOW); digitalWrite(pinB2, LOW); } void motorBBrake() { digitalWrite(pinB1, HIGH); digitalWrite(pinB2, HIGH); }
จากนั้นประกอบ Keyestudio PIR Motion Sensor เข้ากับตัวหุ่นยนต์
Motion Sensor -> Arduino Sensor Shield
- (ทั้ง3 ตัว) <-> G+ (ทั้ง3 ตัว) <-> S S (ตำแหน่งซ้าย) <-> A3 S (ตำแหน่ง กลาง)<-> A4 S (ตำแหน่ง ขวา) <-> A5
ภาพรวมการต่อ หุ่นยนต์ติดตามความเคลื่อนไหว PIR Motion
จากนั้นทดสอบ หุ่นยนต์ติดตามความเคลื่อนไหว PIR Motion
วีดีโอผลลัพธ์การทำงานของ โปรเจค หุ่นยนต์ติดตามความเคลื่อนไหว PIR Motion
VIDEO