Automação, Hobby, Microcontroladores, Motores, Projetos, Sensores

Robô autônomo que evita obstáculos

O vídeo do robô com um sensor de ultrasom que se desvia de obstáculos.

O esquemático elétrico. Clique na imagem para ampliá-la.

O código foi baseado em um projeto no site arduino.cc. Este robô é uma versão melhorada do veículo autônomo mostrado na parte 6 do tutorial de Arduino. 

Arduino parte 6Clique aqui

O código-fonte abaixo.

#include <NewPing.h>
#include <Servo.h>
#define trigPin 9
#define echoPin 10

Servo servo;
int posservo;

int IN1=4;
int IN2=5;
int IN3=7;
int IN4=2;
int ENA=3;
int ENB=6;

#define max_distance 200
boolean goesForward = false;
int distance;

NewPing sensor(trigPin,echoPin,max_distance);
 
void setup() {
  servo.attach(8);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(ENA,OUTPUT);
  pinMode(ENB,OUTPUT);
  pinMode(echoPin,INPUT);
  pinMode(trigPin,OUTPUT);
  Serial.begin(9600);
  servo.write(90);
  delay(150);
}

void loop(){
 analogWrite(ENA,210);
 analogWrite(ENB,190);
 int distanceR=0;
 int distanceL=0;
 distance = readPing();
 Serial.println(distance);
 if(distance <= 20){//Verifica se há obstáculo à frente.
    moveStop();
    delay(300);
    moveBackward();
    delay(400);
    moveStop();
    delay(300);
    distanceR = lookRight();
    delay(300);
    distanceL = lookLeft();
    delay(300);
    if (distanceR >= distanceL){
      turnRight();
      moveStop();
    }
    else{
      turnLeft();
      moveStop();
    }  
 }else{
  moveForward();
 }
}
int lookRight(){  
  servo.write(0);
  delay(150);
  int distance = readPing();
  delay(100);
  servo.write(90);
  return distance;
}

int lookLeft(){
  servo.write(180);
  delay(150);
  int distance = readPing();
  delay(100);
  servo.write(90);
  return distance;
  delay(100);
}
int readPing(){
  delay(70);
  int cm = sensor.ping_cm();
  if (cm==0){
    cm=250;
  }
  return cm;
}
void moveStop(){
  
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}
void turnRight(){
   digitalWrite(IN1,HIGH);
   digitalWrite(IN2,LOW);
   digitalWrite(IN3,HIGH);
   digitalWrite(IN4,LOW);
   delay(600);  //Valor deve mudar dependendo da carga da bateria.
   digitalWrite(IN1,LOW);
   digitalWrite(IN2,HIGH);
   digitalWrite(IN3,HIGH);
   digitalWrite(IN4,LOW);
}

void turnLeft(){
   digitalWrite(IN1,LOW);
   digitalWrite(IN2,HIGH);
   digitalWrite(IN3,LOW);
   digitalWrite(IN4,HIGH);
   delay(600);  //Valor deve mudar dependendo da carga da bateria.
   digitalWrite(IN1,LOW);
   digitalWrite(IN2,HIGH);
   digitalWrite(IN3,HIGH);
   digitalWrite(IN4,LOW);
}
void moveForward(){

  if(!goesForward){
    goesForward=true;
    digitalWrite(IN1,LOW);
    digitalWrite(IN2,HIGH);
    digitalWrite(IN3,HIGH);
    digitalWrite(IN4,LOW);
    }
}

void moveBackward(){
  goesForward=false;
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
}

About Pedro Ney Stroski

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *