RC Car & Robot ตอนที่ 1
มาศึกษา เรื่อง การบังคับ รถยนต์ หุ่นยนต์ และการติดตามด้วย GPS กัน แต่ในตอนนี้จะเริ่มกันที่การสร้างรถยนต์กันก่อน
ในตอนนี้จะต้องใช้อุปกรณ์อะไรกันบ้าง
- โมเดลรถยนต์ ที่ซื้อไว้นานเป็นปีมาแล้ว มาพร้อมมอเตอร์ 4 ตัวคุม 4 ล้อกันเลย
- ชุดควบคุมมอเตอร์ L298N จำนวน 2 ตัว ( 1 ตัวคุมมอเตอร์ 2 ตัวให้เดินหน้า และถอยหลังได้
- บอร์ด ESP32 เพราะตั้งใจจะให้มันรับทั้ง WiFi และ ตัว ESP32 เองทำ PWM ได้หลายขา
- แบตเตอรี่ขนาด 12 V 1.3 Ah
และก็ประกอบตามรูป
L298N ตัวที่ 1
- ต่อ Output1, Output2 เข้ากับขั้วของมอเตอร์ ตัวที่ 1 ล้อหลังขวา (Back Right : BR )
- ต่อ Output3, Output4 เข้ากับขั้วของมอเตอร์ ตัวที่ 2 ล้อหน้าขวา (Front Right : FR )
- ถอด Jumper ENA, ENB (หากไม่ถอด จะปรับความเร็วไม่ได้)
- จ่ายไฟ 12 V เข้าที่ +12V,
- GND แบตมาที GND L298N
- สาย 5 V ต่อเข้ากับ Vin 5V ของ ESP32 (GPIO)
- IN1 ==> 24
- IN2 ==> 27
- IN3 ==> 32
- IN4 ==> 33
- ENA ==> 14
- ENB ==> 25
L298N ตัวที่ 2
- ต่อ Output1, Output2 เข้ากับขั้วของมอเตอร์ ตัวที่ 3 ล้อหลังซ้าย (BackLeft : BL )
- ต่อ Output3, Output4 เข้ากับขั้วของมอเตอร์ ตัวที่ 4 ล้อหน้าซ้าย (Front Left : FL )
- ถอด Jumper ENA, ENB (หากไม่ถอด จะปรับความเร็วไม่ได้)
- จ่ายไฟ 12 V เข้าที่ +12V,
- GND แบตมาที GND L298N
- IN1 ==> 2
- IN2 ==> 0
- IN3 ==> 16
- IN4 ==> 4
- ENA ==> 17
- ENB ==> 15
และไม่ต้องต่อ GND ของ L298N มาที่ GND ของ ESP32
และลงโค๊ดตามตัวอย่าง
ในการกำหนดทิศทางการหมุนของล้อ สามารถทำได้โดยการ ปรับเปลี่ยน สัญญาน LOW, HIGH ให้สอดคล้องกัน
ในการเลี้ยวซ้าย เลี้ยวขวา ใช้หลักการ ให้ล้อข้างหนึ่ง (ทั้งหน้าและหลัง ) หยุดหมุน และให้ล้ออีกข้างหนึ่ง (ทั้งหน้าและหลัง) หมุนตามปกติ ก็จะเกิดการเลี้ยวได้ ตามที่ต้องการ
และทดสอบซะนาน ประกอบกับมอเตอร์ซื้อมาตุนไว้เป็นปี เล่นซะเฟืองขับมอเตอร์เดี้ยงซะงั้น ต้องหาสำรองสำหรับโครงงานต่อไป
/****** Rui Santos Complete project details at https://randomnerdtutorials.com *********/ // Motor BR int motorBRPin1 = 27; int motorBRPin2 = 26; int enable11Pin = 14; // Motor BL int motorBLPin1 = 2; int motorBLPin2 = 0; int enable12Pin = 17; // Motor FR int motorFRPin1 = 32; int motorFRPin2 = 33; int enable21Pin = 25; // Motor FL int motorFLPin1 = 16; int motorFLPin2 = 4; int enable22Pin = 15; // Setting PWM properties const int freq = 30000; const int pwmChannel = 0; const int resolution = 8; int dutyCycle = 200; void setup() { // sets the pins as outputs: pinMode(motorBRPin1, OUTPUT); pinMode(motorBRPin2, OUTPUT); pinMode(enable11Pin, OUTPUT); pinMode(motorFRPin1, OUTPUT); pinMode(motorFRPin2, OUTPUT); pinMode(enable21Pin, OUTPUT); pinMode(motorBLPin1, OUTPUT); pinMode(motorBLPin2, OUTPUT); pinMode(enable12Pin, OUTPUT); pinMode(motorFLPin1, OUTPUT); pinMode(motorFLPin2, OUTPUT); pinMode(enable22Pin, OUTPUT); // configure LED PWM functionalitites ledcSetup(pwmChannel, freq, resolution); // attach the channel to the GPIO to be controlled ledcAttachPin(enable11Pin, pwmChannel); ledcAttachPin(enable21Pin, pwmChannel); ledcAttachPin(enable12Pin, pwmChannel); ledcAttachPin(enable22Pin, pwmChannel); Serial.begin(115200); // testing Serial.print("Testing DC Motor..."); } void loop() { while (dutyCycle <= 255){ ledcWrite(pwmChannel, dutyCycle); Serial.print("Forward with duty cycle: "); Serial.println(dutyCycle); dutyCycle = dutyCycle + 5; delay(500); } dutyCycle = 200; stopcar(); forward(); stopcar(); backward(); stopcar(); forward(); stopcar(); backward(); stopcar(); fastfw(); stopcar(); turnleft(); stopcar(); turnright(); /* while (dutyCycle <= 255){ ledcWrite(pwmChannel, dutyCycle); Serial.print("Forward with duty cycle: "); Serial.println(dutyCycle); dutyCycle = dutyCycle + 5; delay(500); } dutyCycle = 200; */ } void turnleft() { // Move the DC motor forward at maximum speed Serial.println("Car turnleft"); digitalWrite(motorBRPin1, LOW); digitalWrite(motorBRPin2, HIGH); digitalWrite(motorFRPin1, LOW); digitalWrite(motorFRPin2, HIGH); digitalWrite(motorBLPin1, LOW); digitalWrite(motorBLPin2, LOW); digitalWrite(motorFLPin1, LOW); digitalWrite(motorFLPin2, LOW); delay(2000); } void turnright() { // Move the DC motor forward at maximum speed Serial.println("Car turning right"); digitalWrite(motorBRPin1, LOW); digitalWrite(motorBRPin2, LOW); digitalWrite(motorFRPin1, LOW); digitalWrite(motorFRPin2, LOW); digitalWrite(motorBLPin1, LOW); digitalWrite(motorBLPin2, HIGH); digitalWrite(motorFLPin1, LOW); digitalWrite(motorFLPin2, HIGH); delay(2000); } void forward() { // Move the DC motor forward at maximum speed Serial.println("Moving Forward"); digitalWrite(motorBRPin1, LOW); digitalWrite(motorBRPin2, HIGH); digitalWrite(motorFRPin1, LOW); digitalWrite(motorFRPin2, HIGH); digitalWrite(motorBLPin1, LOW); digitalWrite(motorBLPin2, HIGH); digitalWrite(motorFLPin1, LOW); digitalWrite(motorFLPin2, HIGH); delay(2000); } void fastfw() { // Move DC motor forward with increasing speed digitalWrite(motorBRPin1, HIGH); digitalWrite(motorBRPin2, LOW); digitalWrite(motorFRPin1, HIGH); digitalWrite(motorFRPin2, LOW); digitalWrite(motorBLPin1, HIGH); digitalWrite(motorBLPin2, LOW); digitalWrite(motorFLPin1, HIGH); digitalWrite(motorFLPin2, LOW); while (dutyCycle <= 255){ ledcWrite(pwmChannel, dutyCycle); Serial.print("Forward with duty cycle: "); Serial.println(dutyCycle); dutyCycle = dutyCycle + 5; delay(500); } dutyCycle = 200; } void backward() { // Move DC motor backwards at maximum speed Serial.println("Moving Backwards"); digitalWrite(motorBRPin1, HIGH); digitalWrite(motorBRPin2, LOW); digitalWrite(motorFRPin1, HIGH); digitalWrite(motorFRPin2, LOW); digitalWrite(motorBLPin1, HIGH); digitalWrite(motorBLPin2, LOW); digitalWrite(motorFLPin1, HIGH); digitalWrite(motorFLPin2, LOW); delay(2000); } void stopcar() { // Stop the DC motor Serial.println("Motor stopped"); digitalWrite(motorBRPin1, LOW); digitalWrite(motorBRPin2, LOW); digitalWrite(motorFRPin1, LOW); digitalWrite(motorFRPin2, LOW); digitalWrite(motorBLPin1, LOW); digitalWrite(motorBLPin2, LOW); digitalWrite(motorFLPin1, LOW); digitalWrite(motorFLPin2, LOW); delay(1000); }
และทดลอง Run ก็จะเห็นมอเตอร์ เดินหน้า ถอยหลังและปรับความเร็วได้
ขั้นตอนต่อไปก็คือ การใส่เซนเซอร์ต่างๆ ให้เดินหลบ เลี้ยวซ้ายชวาได้
สำหรับการพัฒนาเป็นแขนกล จะมีความง่ายกว่า ตรงที่มันไม่ต้องเดินไปไหน เงื่อนไขการขยับมันคงที่ไปตามโปรแกรม แต่ความยากกว่าคือความแม่นยำในการขยับ หยิบจับ
สำหรับโครงการต่อไปคือ การติดตั้ง เซนเซอร์ เพื่อเลี่ยงการชนสิ่งกีดขวาง เพื่อพัฒนาไปเป็นไร้ยนต์อัตโนมัติ ไม่ชนสิ่งกีดขวาง
205 total views, 2 views today