Translate

domingo, 13 de diciembre de 2015

Detector de obstaculos

A continuación os dejamos el programa que hemos hecho para que el robot no choque con obstáculos cuando su distancia sea menor de 20 
centímetros.

#include <Servo.h>  //libreria servo
long distancia;
long tiempo;

int trig = 2;
int echo = 6;
//definir las posiciones de los servos
#define SERVO_FRONT 1700
#define SERVO_REAR 1300
#define SERVO_STOP 1500

Servo ServoIzq, ServoDer;

void setup()

{
Serial.begin(9600); //inicio de la comunicación serie

pinMode(trig, OUTPUT); /*activamos el pin 9 como salida: emite un pulso ultrasónico*/
pinMode(echo, INPUT); /*activamos el pin 8 como entrada: tiempo del rebote del ultrasonido*/

ServoIzq.attach(8);
ServoDer.attach(9);

}

void loop()

{


digitalWrite(trig,LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(5);
digitalWrite(trig, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);

tiempo=pulseIn(echo, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío  del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que  deja de hacerlo, LOW, la longitud del pulso entrante*/

distancia= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/


 /*Monitorización en centímetros por el monitor serial*/
Serial.println("Distancia ");
Serial.println(distancia);
Serial.println(" cm");

delay (100);

//el robot va hacia delante 
ServoIzq.writeMicroseconds(SERVO_FRONT);
ServoDer.writeMicroseconds(SERVO_REAR);

 if(distancia<20) /*si la distancia del sensor con el objeto es menor de 20*/

 {
//gira a la derecha
  
   ServoIzq.writeMicroseconds(SERVO_FRONT);
   ServoDer.writeMicroseconds(SERVO_FRONT);
   

 }

  else  /*si no*/

{ 
//sigue hacia delante
ServoIzq.writeMicroseconds(SERVO_FRONT);
ServoDer.writeMicroseconds(SERVO_REAR);

}
 
}











3 comentarios:

  1. Gracias chicos. El sketch es similar al mio, aunque mi rover no quería que girara sino que se detuviera (en un principio). Les dejo el trozo de sketch que corresponde al sensor ultrasónico:

    digitalWrite(Ptrig, LOW);
    delayMicroseconds(2);
    digitalWrite(Ptrig, HIGH); // genera el pulso de trigger por 10ms
    delayMicroseconds(10);
    digitalWrite(Ptrig, LOW);

    duracion = pulseIn(Pecho, HIGH);
    distancia = (duracion/2) / 29; // calcula la distancia en centimetros

    if (distancia <= 10 && distancia>=2){
    analogWrite(derB, 0); // para
    analogWrite(izqB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);

    analogWrite(derA, 0); // retrocede
    analogWrite(izqA, 0);
    analogWrite(derB, vel);
    analogWrite(izqB, vel);

    delay(250);
    analogWrite(derB, 0); // para
    analogWrite(izqB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    estado=0;

    }

    Veo que ustedes sensan a 20cm y no a 10cm como yo. Quizás sea eso el fallo de mi rover y no le doy tiempo a reaccionar, pero tampoco quería que retrocediera o se detuviera demasiado temprano. ¿Han probado vuestro sketch en situación real? Por experiencia les comento que en la mesa funciona todo y luego los duendes hacen de las suyas (que no digo que sea vuestro caso...)

    Gracias por compartir. Tendré que volver a probar mi rover con 20 cm a ver que tal. Seguiré de cerca vuestro proyecto.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Suso, prueba a ver con éste programa en principio no importa la distancia de sensado
      Usas Arduino como controlador del proyecto??


      #include //libreria servo
      long distancia;
      long tiempo;

      int trig = 2;
      int echo = 6;
      //definir las posiciones de los servos
      #define SERVO_FRONT 1700
      #define SERVO_REAR 1300
      #define SERVO_STOP 1500

      Servo ServoIzq, ServoDer;

      void setup()

      {
      Serial.begin(9600); //inicio de la comunicación serie

      pinMode(trig, OUTPUT); /*activamos el pin 9 como salida: emite un pulso ultrasónico*/
      pinMode(echo, INPUT); /*activamos el pin 8 como entrada: tiempo del rebote del ultrasonido*/

      ServoIzq.attach(8);
      ServoDer.attach(9);

      }

      void loop()

      {


      digitalWrite(trig,LOW); /* Por cuestión de estabilización del sensor*/
      delayMicroseconds(5);
      digitalWrite(trig, HIGH); /* envío del pulso ultrasónico*/
      delayMicroseconds(10);

      tiempo=pulseIn(echo, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/

      distancia= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/


      /*Monitorización en centímetros por el monitor serial*/
      Serial.println("Distancia ");
      Serial.println(distancia);
      Serial.println(" cm");

      delay (100);
      //el robot va hacia delante
      ServoIzq.writeMicroseconds(SERVO_FRONT);
      ServoDer.writeMicroseconds(SERVO_REAR);

      if(distancia<20) /*si la distancia del sensor con el objeto es menor de 20*/

      {

      ServoIzq.writeMicroseconds(SERVO_STOP);
      ServoDer.writeMicroseconds(SERVO_STOP);

      }

      }

      Eliminar
  2. Gracias por el aporte. Tendré que probarlo a ver.

    Saludos.

    ResponderEliminar