Go Down

Topic: Robot que esquiva obstáculos (Read 254 times) previous topic - next topic

Corhuila

Nov 05, 2018, 02:20 am Last Edit: Nov 05, 2018, 08:53 pm by Corhuila Reason: Titulo editado
Hola, hace unos día empecé hice un robot que esquiva obstáculos, algo sencillo, ahora quiero que  reconozca el entorno y poder ver lo que detecta en mi portátil, sin quitarle lo que ya tiene... Le adjuntaré el código... Agradezco su ayuda.


Pdt: El código no es mío.



Code: [Select]
// Definición de variables y constantes relacionadas con el motor izquierdo
const int IN1 = 13;  // Pin digital 13 para controlar sentido giro motor izquierdo
const int IN2 = 12;  // Pin digital 12 para controlar sentido giro motor izquierdo
 
// Definición de variables y constantes relacionadas con el motor derecho
const int IN3 = 11;  // Pin digital 11 para controlar sentido giro motor izquierdo
const int IN4 = 10;  // Pin digital 10 para controlar sentido giro motor izquierdo
 
// Definición de variables y constantes relacionadas con los LEDs
const int ledVerde1 = 4;  // Pin digital 4 para conectar el LED verde 1
const int ledVerde2 = 5;  // Pin digital 5 para conectar el LED verde 2
const int ledRojo1 = 6;  // Pin digital 6 para conectar el LED rojo 1
const int ledRojo2 = 7;  // Pin digital 7 para conectar el LED rojo 2
 
// Definición de variables y constantes relacionadas con el zumbador
const int zumbadorPiezo = 8;  // Pin digital 8 para conectar el zumbador
 
// Este programa usará el sensor de ultrasonidos HCSR04
// para medir la distancia a la que se encuentran diferentes obstáculos
// en centímetros y mostrarlo por el puerto serie.
const int triggerEmisor = 3; // El trigger se conecta al pin digital 3
const int echoReceptor = 2; // El echo se conecta al pin digital 2
const int valorUmbral = 10; // Fija la distancia a la que se percibe objeto (10 cm)
long tiempoEntrada;  // Almacena el tiempo de respuesta del sensor de entrada
float distanciaEntrada;  // Almacena la distancia en cm a la que se encuentra el objeto
 
// Función que se ejecuta una sola vez al cargar el programa
void setup()
{
  // Se declaran todos los pines como salidas
  // Pines asociados a los motores
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
 
  // Pines asociados a los LEDS
  pinMode (ledVerde1, OUTPUT);
  pinMode (ledVerde2, OUTPUT);
  pinMode (ledRojo1, OUTPUT);
  pinMode (ledRojo2, OUTPUT);
 
  // Pines asociados al zumbador
  pinMode (zumbadorPiezo, OUTPUT);
 
  // Pines asociados al sensor ultrasonico HCSR04
  pinMode(triggerEmisor,OUTPUT); // El emisor emite por lo que es configurado como salida
  pinMode(echoReceptor,INPUT);   // El receptor recibe por lo que es configurado como entrada
  Serial.begin(9600); // Inicia el puerto de comunicaciones en serie
}
 
// Función que se repite de manera periódica
void loop()
{
  sensorUltrasonidos();
  // Si el valor de la distancia es menor que el valor umbral
  if(distanciaEntrada>valorUmbral)
  {
    robotAvance(); // El robot avanza mientras no encuentre obstáculos
    enciendeLEDVerde(); // Enciende los LED verdes delanteros
  }
  else
  {
    enciendeLEDRojoZumbador(); // Enciende los LED rojos traseros y el zumbador
    // El robot retrocede 1 segundo y gira a la derecha 0,5 segundos para esquivarlo
    robotRetroceso();
    delay(1000);
    robotDerecha ();
    delay(500);
  }
}
 
/*
 Función sensorUltrasonidos: 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 echo empieza a recibir el rebote, HIGH,
 hasta que deja de hacerlo, LOW, la longitud del pulso entrante.
*/
void sensorUltrasonidos()
{
    // Se inicializa el sensor de infrasonidos
    digitalWrite(triggerEmisor,LOW);  // Para estabilizar
    delayMicroseconds(10);
 
    // Comenzamos las mediciones
    // Se envía una señal activando la salida trigger durante 10 microsegundos
    digitalWrite(triggerEmisor, HIGH);  // Envío del pulso ultrasónico
    delayMicroseconds(10);
    tiempoEntrada=pulseIn(echoReceptor, HIGH);
    distanciaEntrada= int(0.017*tiempoEntrada); // Calcula la distancia en cm
    Serial.println("El valor de la distancia es ");
    Serial.println(distanciaEntrada);
    delay(200);
}
/*
  Función robotAvance: esta función hará que ambos motores se activen a máxima potencia
  por lo que el robot avanzará hacia delante
*/
void robotAvance()
{
  // Motor izquierdo
  // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
}
/*
  Función robotRetroceso: esta función hará que ambos motores se activen a máxima potencia
  en sentido contrario al anterior por lo que el robot avanzará hacia atrás
*/
void robotRetroceso()
{
  // Motor izquierdo
  // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
 
  // Motor derecho
  // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, HIGH);
}
 
/*
  Función robotDerecha: esta función acccionará el motor izquierdo y parará el derecho
  por lo que el coche girará hacia la derecha (sentido horario)
*/
void robotDerecha()
{
  //  Motor izquierdo
  // Se activa el motor izquierdo
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Se para el motor derecho
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
}
/*
  Función robotIzquierda: esta función acccionará el motor derecho y parará el izquierdo
  por lo que el coche girará hacia la izquierda (sentido antihorario)
*/
void robotIzquierda ()
{
   //  Motor izquierdo
  // Se para el motor izquierdo
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Se activa el motor derecho
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
}
/*
  Función robotParar: esta función parará ambos motores
  por lo que el robot se parará.
*/
void robotParar()
{
  // Motor izquierdo
  // Se para el motor izquierdo
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Se para el motor derecho
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
}
/*
  Función enciendeLEDVerde: esta función hará que ambos LED verdes se enciendan
  y se apaguen los LED rojos (en caso de que estuvieran encendidos)
  y el zumbador (en caso de que estuviera sonando)
*/
void enciendeLEDVerde()
{
  // Manda 5 V a los pines por lo que enciende los 2 LED verdes
  digitalWrite (ledVerde1, HIGH);
  digitalWrite (ledVerde2, HIGH);
 
  // Quita 5V de los otros pines por lo que apaga los 2 LED rojos y el zumbador
  digitalWrite (ledRojo1, LOW);
  digitalWrite (ledRojo2, LOW);
  digitalWrite (zumbadorPiezo, LOW);
}
/*
  Función enciendeLEDRojoZumbador: esta función hará que ambos LED rojos se enciendan
  y que empiece a sonar el zumbador. Además de que se apaguen los LED verdes
*/
void enciendeLEDRojoZumbador()
{
  // Manda 5 V a los pines por lo que enciende los 2 LED rojos y el zumbador
  digitalWrite (ledRojo1, HIGH);
  digitalWrite (ledRojo2, HIGH);
  digitalWrite (zumbadorPiezo, HIGH);
 
  // Quita 5V de los otros pines por lo que apaga los 2 LED verdes
  digitalWrite (ledVerde1, LOW);
  digitalWrite (ledVerde2, LOW);
}



https://tecnopatafisica.com/tecno3eso/teoria/robotica/92-arduinorobot2

surbyte

Quote
ahora quiero que  reconozca el entorno y poder ver lo que detecta en mi portátil, sin quitarle lo que ya tiene
Amplia la idea!!

Corhuila

#2
Nov 10, 2018, 02:30 pm Last Edit: Nov 10, 2018, 11:13 pm by surbyte
No entendí tu respuesta.

surbyte

Quote
ahora quiero que  reconozca el entorno y poder ver lo que detecta en mi portátil, sin quitarle lo que ya tiene..
SImple.. entorno como piensas reconocer el entorno?
Poder ver lo que detecta en mi portatil, se lo envias como? WIFI, USB?

SI no te explicas uno tiene que hacer un trabajo detectivezco para entender lo que quieres decir.

Te parece que podemos brindarte ayuda de ese modo? Intentando entender que has querido decir cuando tu debes contarnos todo lo que esperas y nosotros decirte.. ahh si.. tal cosa la puedes hacer asi o de este otro modo.

Yo no te entiendo pero no soy el único en el foro, de modo que si no te parece mi respuesta espera a ver si otro te comprende.

Corhuila

Gracias por responder. Inicialmente mi proyecto fue un radar y las gráficas del radar las hice en Processing. Quisiera que reconociera el entorno de ese modo, es decir, mi nuevo proyecto es un radar móvil, solo que ahora esquiva obstáculos. No sé si me hice entender...

surbyte

Ahora si... pero es otra cosa lo que acabas de decir.
Tu quieres hacer una barrida o un scan y que arduino reconozca lo que vio, digamos vector (angulo, distancia) te acabo de dar la respuesta.

Lo mejor es cambiar de coordenadas y usar cilindricas, angulo distancia almacena lo minimo.
Angulo : el que se movió el servo.
Distancia: la que acusó el sensor ultrasónico.

Ya tienes tu entorno. Tienes mas puntos.. estarán tambien indicados como Ang, dist asi que terminas con una matriz de N filas y 2 columnas.

Dependerá de la cantidad de objetos y de los pasos de tu servo.

Con esa información tienes para trabajar y decidir cuando tomas nueva y descartas la vieja.

Corhuila

Gracias, pero ahora tengo un gran problema... No sé cómo incluirle un servo(Micro-Servo 9g-SG909). He modificado un poco el código, me hace falta agregarle el servo pero no se cómo, este es mi primer trabajo con Arduino, es muy limitado lo que sé... La idea es que el servo se mueva a cada lado sin detenerse por lo que no usaré "delay", usaré "millis" pero no tengo ni la menor idea de como incluirlo.



Code: [Select]
#include <Servo.h>
const int IN1 = 13;  // Pin digital 13 para controlar sentido giro motor izquierdo
const int IN2 = 12;  // Pin digital 12 para controlar sentido giro motor izquierdo
 
// Definición de variables y constantes relacionadas con el motor derecho
const int IN3 = 11;  // Pin digital 11 para controlar sentido giro motor izquierdo
const int IN4 = 10;  // Pin digital 10 para controlar sentido giro motor izquierdo
 
// Definición de variables y constantes relacionadas al Led
const int pinLed = 9;  // Pin digital 4 para conectar el LED verde 1

// Definición de variables y constantes relacionadas con el Buzzer
const int pinBuzzer = 8;  // Pin digital 8 para conectar el Buzzer
 
// Este programa usará el sensor de ultrasonidos HCSR04
const int triggerEmisor = 3; // El trigger se conecta al pin digital 3
const int echoReceptor = 2; // El echo se conecta al pin digital 2
const int valorUmbral = 10; // Fija la distancia a la que se percibe objeto (10 cm)
long tiempoEntrada;  // Almacena el tiempo de respuesta del sensor de entrada
float distanciaEntrada;  // Almacena la distancia en cm a la que se encuentra el objeto
int tiempo = 0;
 
// Función que se ejecuta una sola vez al cargar el programa
void setup()
{
  // Se declaran todos los pines como salidas
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (pinLed, OUTPUT);
  pinMode (pinBuzzer, OUTPUT);
  pinMode(triggerEmisor,OUTPUT); // El emisor emite por lo que es configurado como salida
  pinMode(echoReceptor,INPUT);   // El receptor recibe por lo que es configurado como entrada
  Serial.begin(9600); // Inicia el puerto de comunicaciones en serie
}
 
// Función que se repite de manera periódica
void loop()
{
  sensorUltrasonidos();
  // Si el valor de la distancia es menor que el valor umbral
  if(distanciaEntrada>valorUmbral)
  {
    robotAvance(); // El robot avanza mientras no encuentre obstáculos
  }
  else
  {
    enciendeLedBuzzer(); // Enciende los LED rojos traseros y el zumbador
    // El robot retrocede 1 segundo y gira a la derecha 0,5 segundos para esquivarlo
    robotRetroceso();
    delay(1000);
    robotDerecha ();
    delay(500);
  }


  if (Serial.available()) {
     char dato= Serial.read();
     if(dato=='e')
     {
        robotAvance();
        tiempo=0;
     }
     else if(dato=='a')
     {
        robotRetroceso();
        tiempo=0;
     }
     else if(dato=='d')
     {
        robotDerecha();
        tiempo=0;
     }
     else if(dato=='b')
     {
        robotIzquierda();
        tiempo=0;
     }
     else if(dato=='c')
     {
       robotParar();
       tiempo=0;   
     }
   
  }

}
 

void sensorUltrasonidos()
{
    // Se inicializa el sensor de infrasonidos
    digitalWrite(triggerEmisor,LOW);  // Para estabilizar
    delayMicroseconds(10);
 
    // Comenzamos las mediciones
    // Se envía una señal activando la salida trigger durante 10 microsegundos
    digitalWrite(triggerEmisor, HIGH);  // Envío del pulso ultrasónico
    delayMicroseconds(10);
    tiempoEntrada=pulseIn(echoReceptor, HIGH);
    distanciaEntrada= int(0.017*tiempoEntrada); // Calcula la distancia en cm
    Serial.println("El valor de la distancia es ");
    Serial.println(distanciaEntrada);
    delay(200);
}

void robotAvance()
{
  // Motor izquierdo
  // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
}

void robotRetroceso()
{
  // Motor izquierdo
  // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
 
  // Motor derecho
  // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, HIGH);
}
 

void robotDerecha()
{
  //  Motor izquierdo
  // Se activa el motor izquierdo
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Se para el motor derecho
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
}

void robotIzquierda ()
{
   //  Motor izquierdo
  // Se para el motor izquierdo
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Se activa el motor derecho
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
}

void robotParar()
{
  // Motor izquierdo
  // Se para el motor izquierdo
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
 
  // Motor derecho
  // Se para el motor derecho
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
}


void enciendeLedBuzzer()
{
  // Manda 5V a los pines por lo que enciende el Led y el Buzzer
  digitalWrite (pinLed, HIGH);
  digitalWrite (pinBuzzer, HIGH);

}


Agradezco enormemente su ayuda. Gracias de nuevo...

Go Up