Arduino Autonomous Rover Technology Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Robot Autónomo: Parte III

Este sketch es un poco mas fácil de entender y no utiliza un motor shield si ese es tu caso.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO.
  3. Llantas (2)
  4. Motores DC (2)
  5. Sensor Ultrasonico
  6. Mini Servo
  7. Arduino IDE (https://www.arduino.cc/en/Main/Software)

 

Componentes

Arduino Robot Autonomo Movil Motor Shield Tutorial Santiapps Marcio Valenzuela
Arduino Robot Autonomo Movil Motor Shield

La única diferencia es que no usa el motor shield o sea que los motores se conectan directamente a la UNO.  Veamos el código:

#include <Servo.h>
#include <NewPing.h>

//CONSTANTES
#define LeftMotorForward 2
#define LeftMotorBackward 3
#define RightMotorForward 5
#define RightMotorBackward 4
#define USTrigger 8
#define USEcho 9
#define MaxDistance 100
#define LED 13

Servo servo;
NewPing sonar(USTrigger, USEcho, MaxDistance);

//VARIABLES
unsigned int duration;
unsigned int distance;
unsigned int FrontDistance;
unsigned int LeftDistance;
unsigned int RightDistance;
unsigned int Time;
unsigned int CollisionCounter;

void setup() {
  Serial.begin(9600);
  pinMode(LeftMotorForward, OUTPUT); //Modo de los pines
  pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorForward, OUTPUT);
  pinMode(RightMotorBackward, OUTPUT);
  pinMode(LED, OUTPUT);
  servo.attach(6); //Servo en pin 6
}

void loop(){
  servo.write(90); //Ver frente                 
  scan(); //Mapear
  FrontDistance = distance; //Que tenemos al frente
  Serial.println("Distancia frontal = ");
  Serial.print(distance);
  if(FrontDistance > 40 || FrontDistance == 0) {
   moveForward(); //Si no hay nada, mover al frente
  } else {
    CollisionCounter = CollisionCounter + 1;
    moveStop(); //Detener
    navigate(); //Navegar
  }
}

void moveForward(){
  Serial.println("");
  Serial.println("Avanzando");
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorBackward, LOW);
  digitalWrite(RightMotorForward, HIGH);
}

void moveBackward(){
  Serial.println("");
  Serial.println("Retrocediendo");
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(RightMotorBackward, HIGH);
}

void moveLeft(){
  Serial.println("");
  Serial.println("Izquierda");
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorBackward, LOW);
  digitalWrite(RightMotorForward, HIGH);
  
}

void moveRight(){
  Serial.println("");
  Serial.println("Derecha");
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(RightMotorBackward, HIGH);
}

void moveStop(){
  Serial.println("");
  Serial.println("Deteniendo marcha");
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
}
void scan(){
  Serial.println("");
  Serial.println("Mapeando");
  Time = sonar.ping(); 
  distance = Time / US_ROUNDTRIP_CM;
  delay(500);
}
void navigate(){
    Serial.println("PELIGRO!");
    servo.write(167); //Mover servo a la izquierda
    delay(1000); 
    scan(); 
    LeftDistance = distance;
    Serial.println("Distancia Izquierda = ");
    Serial.print(distance);
    servo.write(0); //Mover servo a la derecha
    delay(1000);
    scan();
    RightDistance = distance; 
    Serial.println("Distancia Derecha = ");
    Serial.print(distance);
    if(abs(RightDistance - LeftDistance) < 5){
      moveBackward();
      delay(200);
      moveRight();
      delay(100);
    }else if(RightDistance < LeftDistance){
     moveLeft();  
     delay(100);
    }else if(LeftDistance < RightDistance){
     moveRight(); 
     delay(100);
    }
}

Esperamos que te estes divirtiendo!

Leave a Reply