,

Xe tự hành tự tránh vật cản bằng cảm biến siêu âm

Posted by

Xe tự hành tự tránh vật cản là một mẫu robot cơ bản, dành cho người mới nhập môn trong gia đình những robot tự động. Hoạt động của xe rất đơn giản: xe tự động chạy liên tục đến khi gặp vật cản thì sẽ tự dừng lại chọn hướng đi khác (bằng cảm biến siêu âm)

https://youtu.be/r4KuNs3h_Fw

Sơ đồ kết nối:

Nạp code:

#include <Servo.h>          

#include <NewPing.h>        



//L298N motor control pins

const int LeftMotorForward = 6;

const int LeftMotorBackward = 7;

const int RightMotorForward = 5;

const int RightMotorBackward = 4;



//sensor pins

#define trig_pin 11 //

#define echo_pin 12 //



#define maximum_distance 200

boolean goesForward = false;

int distance = 100;



NewPing sonar(trig_pin, echo_pin, maximum_distance); //sensor function

Servo servo_motor; 



void setup(){



  pinMode(RightMotorForward, OUTPUT);

  pinMode(LeftMotorForward, OUTPUT);

  pinMode(LeftMotorBackward, OUTPUT);

  pinMode(RightMotorBackward, OUTPUT);

  

  servo_motor.attach(10); //our servo pin



  servo_motor.write(115);

  delay(2000);

  distance = readPing();

  delay(100);

  distance = readPing();

  delay(100);

  distance = readPing();

  delay(100);

  distance = readPing();

  delay(100);

}



void loop(){



  int distanceRight = 0;

  int distanceLeft = 0;

  delay(50);

  

  if (distance <= 15){

    moveStop();

    delay(300);

    moveBackward();

    delay(300);

    moveStop();

    delay(300);

    distanceRight = lookRight();

    delay(300);

    distanceLeft = lookLeft();

    delay(300);



    if (distance >= distanceLeft){

      turnRight();

      moveStop();

    }

    else{

      turnLeft();

      moveStop();

    }

  }

  else{

    moveForward(); 

    

  }

    distance = readPing();

}



int lookRight(){  

  servo_motor.write(50);

  delay(300);

  int distance = readPing();

  delay(100);

  servo_motor.write(115);

  return distance;

}



int lookLeft(){

  servo_motor.write(170);

  delay(300);

  int distance = readPing();

  delay(100);

  servo_motor.write(115);

  return distance;

  delay(100);

}



int readPing(){

  delay(70);

  int cm = sonar.ping_cm();

  if (cm==0){

    cm=250;

  }

  return cm;

}



void moveStop(){

  

  digitalWrite(RightMotorForward, LOW);

  digitalWrite(LeftMotorForward, LOW);

  digitalWrite(RightMotorBackward, LOW);

  digitalWrite(LeftMotorBackward, LOW);

}



void moveForward(){



  if(!goesForward){



    goesForward=true;

    

    digitalWrite(LeftMotorForward, HIGH);

    digitalWrite(RightMotorForward, HIGH);

  

    digitalWrite(LeftMotorBackward, LOW);

    digitalWrite(RightMotorBackward, LOW); 

  }

}



void moveBackward(){



  goesForward=false;



  digitalWrite(LeftMotorBackward, HIGH);

  digitalWrite(RightMotorBackward, HIGH);

  

  digitalWrite(LeftMotorForward, LOW);

  digitalWrite(RightMotorForward, LOW);

  

}



void turnRight(){



  digitalWrite(LeftMotorForward, HIGH);

  digitalWrite(RightMotorBackward, HIGH);

  

  digitalWrite(LeftMotorBackward, LOW);

  digitalWrite(RightMotorForward, LOW);

  

  delay(300);

  

  digitalWrite(LeftMotorForward, HIGH);

  digitalWrite(RightMotorForward, HIGH);

  

  digitalWrite(LeftMotorBackward, LOW);

  digitalWrite(RightMotorBackward, LOW);

 

  

  

}



void turnLeft(){



  digitalWrite(LeftMotorBackward, HIGH);

  digitalWrite(RightMotorForward, HIGH);

  

  digitalWrite(LeftMotorForward, LOW);

  digitalWrite(RightMotorBackward, LOW);



  delay(300);

  

  digitalWrite(LeftMotorForward, HIGH);

  digitalWrite(RightMotorForward, HIGH);

  

  digitalWrite(LeftMotorBackward, LOW);

  digitalWrite(RightMotorBackward, LOW);

} 

Một bình luận

  1. Ảnh đại diện Huỳnh Gia Huynh
    Huỳnh Gia Huynh

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *