RC Car & Robot ตอนที่ 1

มาศึกษา  เรื่อง  การบังคับ  รถยนต์  หุ่นยนต์  และการติดตามด้วย GPS  กัน  แต่ในตอนนี้จะเริ่มกันที่การสร้างรถยนต์กันก่อน

ในตอนนี้จะต้องใช้อุปกรณ์อะไรกันบ้าง

  1. โมเดลรถยนต์  ที่ซื้อไว้นานเป็นปีมาแล้ว  มาพร้อมมอเตอร์  4 ตัวคุม  4 ล้อกันเลย
  2. ชุดควบคุมมอเตอร์  L298N  จำนวน  2 ตัว ( 1 ตัวคุมมอเตอร์  2 ตัวให้เดินหน้า และถอยหลังได้
  3. บอร์ด  ESP32  เพราะตั้งใจจะให้มันรับทั้ง  WiFi  และ  ตัว ESP32 เองทำ  PWM ได้หลายขา
  4. แบตเตอรี่ขนาด 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  ก็จะเห็นมอเตอร์  เดินหน้า  ถอยหลังและปรับความเร็วได้

ขั้นตอนต่อไปก็คือ  การใส่เซนเซอร์ต่างๆ  ให้เดินหลบ  เลี้ยวซ้ายชวาได้

สำหรับการพัฒนาเป็นแขนกล  จะมีความง่ายกว่า  ตรงที่มันไม่ต้องเดินไปไหน  เงื่อนไขการขยับมันคงที่ไปตามโปรแกรม   แต่ความยากกว่าคือความแม่นยำในการขยับ  หยิบจับ

สำหรับโครงการต่อไปคือ  การติดตั้ง  เซนเซอร์  เพื่อเลี่ยงการชนสิ่งกีดขวาง  เพื่อพัฒนาไปเป็นไร้ยนต์อัตโนมัติ  ไม่ชนสิ่งกีดขวาง

 

160 total views, 1 views today