jueves, 10 de diciembre de 2015

Tercera Entrega

Implementación de sensores y sincronizacion de componentes
En esta tercera entrega se realizara la implementación de un segundo sensor ultrasonico  que nos permitirá captar objetos a una altura de 5 a 8 cm
En esta segunda entrega  el objetivo sera la sincronizacion de componentes en si el principal captar obstáculos en una altura de 2 cm  a + de 10 cm y su distancia para evadir los obstáculos es de 50 cm. 

La conexión de este dispositivo se realiza  de la siguiente manera  y su codificación la dejaremos en la parte de abajo 
Codificación y sincronizacion de componentes 

#include 

#include 


#define MOTOR_1_FORWARD 5

#define MOTOR_1_BACK 6

#define MOTOR_2_FORWARD 3

#define MOTOR_2_BACK 4


#define TRIG 12

#define ECHO 11


#define TRIG2 8

#define ECHO2 9

#define OBSTRACLE_DISTANCE2 50.0

#define TURN_DELAY2 200


#define HEAD_SERVO 2


#define OBSTRACLE_DISTANCE 50.0

#define TURN_DELAY 200



#define LOG false


Ultrasonic ultrasonic(TRIG, ECHO);


Ultrasonic ultrasonic2(TRIG2, ECHO2);


Servo headServo;


int servoAngle = 90;

int angleStep = 30;


float distance = 0;

float distance2 = 0;

void setup()

{

  pinMode(MOTOR_1_FORWARD, OUTPUT);

  pinMode(MOTOR_1_BACK,    OUTPUT);

  pinMode(MOTOR_2_FORWARD, OUTPUT);

  pinMode(MOTOR_2_BACK,    OUTPUT);

 

  stopMove();

 

  headServo.attach(HEAD_SERVO);

 

  if(LOG) Serial.begin( 9600 );

}


void loop()

{

 

 updateHeadAngle();

 

  checkDistance();

 checkDistance2();

 moove();

 moove2();

 

  delay(10);

}


void checkDistance()

{

  distance = ultrasonic.Ranging(CM);

  if(LOG) Serial.println(distance);

}


void checkDistance2()

{

  distance2 = ultrasonic2.Ranging(CM);

  if(LOG) Serial.println(distance2);

}

void moove()

{

  if( distance > OBSTRACLE_DISTANCE )

  {

    if(LOG) Serial.println("FORWARD");

   

    goForward();

    delay(TURN_DELAY);

  }

  else

  {

    stopMove();

   

    checkObstracle();

  }

}


void moove2()

{

  if( distance2 > OBSTRACLE_DISTANCE2 )

  {

    if(LOG) Serial.println("FORWARD");

   

    goForward();

    delay(TURN_DELAY);

  }

  else

  {

    stopMove();

   

    checkObstracle2();

  }

}


void checkObstracle()

{

  int obsLeft  = 0;

  int obsRight = 0;

 

  // Count the obstacles from left and right side

  for(servoAngle = 0; servoAngle <= 180; servoAngle += 10)

  {

    headServo.write(servoAngle);

    delay(10);

   

    checkDistance();

    if(distance < OBSTRACLE_DISTANCE && servoAngle < 90) obsLeft++;

    else if(distance < OBSTRACLE_DISTANCE) obsRight++;

  }

 

  if(LOG) Serial.print("TURN");

   

  if(obsLeft && obsRight)

  {

    goBack();

   

    delay(TURN_DELAY * 2);

   

    if(obsLeft < obsRight) goLeft();

    else goRight();

   

    delay(TURN_DELAY);

  }

  else if(obsRight)

  {

    goLeft();

   

    delay(TURN_DELAY);

  }

  else if(obsLeft)

  {

    goRight();

   

    delay(TURN_DELAY);

  }

  else

  {

    goForward();

   

    delay(TURN_DELAY);

  }

}


void checkObstracle2()

{

  int obsLeft  = 0;

  int obsRight = 0;

 

 

 

   

    checkDistance2();

    if(distance2 < OBSTRACLE_DISTANCE2 ) obsLeft++;

    else if(distance2 < OBSTRACLE_DISTANCE2) obsRight++;

 

 

  if(LOG) Serial.print("TURN");

   

  if(obsLeft && obsRight)

  {

    stopMove();

    goBack();

   

   

    delay(1000);

   

    if(obsLeft < obsRight) goLeft();

    else

    stopMove();

    goRight();

   

    delay(1000);

  }

  else if(obsRight)

  {

    stopMove();

    goLeft();

   

    delay(1000);

  }

  else if(obsLeft)

  {

    stopMove();

    goRight();

   

    delay(1000);

  }

  else

  {

    stopMove();

    goForward();

   

    delay(1000);

  }

}


void updateHeadAngle()

{

  headServo.write(servoAngle);

 

  servoAngle += angleStep;

 

  if(servoAngle >= 150)

  {

    servoAngle = 150;

   

    angleStep *= -1;

  }

 

  if(servoAngle <= 30)

  {

    servoAngle = 30;

   

    angleStep *= -1;

  }

}


void goForward()

{

  digitalWrite(MOTOR_1_FORWARD, HIGH);

  digitalWrite(MOTOR_1_BACK,    LOW);

  digitalWrite(MOTOR_2_FORWARD, HIGH);

  digitalWrite(MOTOR_2_BACK,    LOW);

}


void goBack()

{

  digitalWrite(MOTOR_1_FORWARD, LOW);

  digitalWrite(MOTOR_1_BACK,    HIGH);

  digitalWrite(MOTOR_2_FORWARD, LOW);

  digitalWrite(MOTOR_2_BACK,    HIGH);

}


void goLeft()

{

  digitalWrite(MOTOR_1_FORWARD, LOW);

  digitalWrite(MOTOR_1_BACK,    HIGH);

  digitalWrite(MOTOR_2_FORWARD, LOW);

  digitalWrite(MOTOR_2_BACK,    LOW);

}


void goRight()

{

  digitalWrite(MOTOR_1_FORWARD, LOW);

  digitalWrite(MOTOR_1_BACK,    LOW);

  digitalWrite(MOTOR_2_FORWARD, LOW);

  digitalWrite(MOTOR_2_BACK,    HIGH);

}


void stopMove()

{

  digitalWrite(MOTOR_1_FORWARD, LOW);

  digitalWrite(MOTOR_1_BACK,    LOW);

  digitalWrite(MOTOR_2_FORWARD, LOW);

  digitalWrite(MOTOR_2_BACK,    LOW);

}

1 comentario :