rob
  1. Auto inteligente comandado por Bluetooth

Requisitos Hardware:

2 Motor reductor con rueda:

1 Driver L298N Doble Puente H:

1 Módulo bluetooth HC-05:

1 Módulo HC-SR04 Sensor ultrasonico:

1 Servo Motor SG90:

1 Rueda Loca:

1 Protoboard:

1 Arduino Uno:

1 Placa acrilica, de madera o similar para ser la base dónde sujetaremos nuestros diversos dispositivos:

Cables Dupont:

2 Porta baterias 9V o Baterias con su correspondiente conector, powerbank, baterias lipo,etc.

Requisitos Software:

Librería NewPing:

Descargamos la última, si no funciona, la versión 1.7.

Aplicación para Android “Robocontrol” no disponible en PlayStore!!!:

Debemos permitir la instalación de fuentes desconocidas.

Las conexiones:

El código:

#include <SoftwareSerial.h> //Comunicacion serie por software 
#include <NewPing.h> //Libreria ultrasonico
#include <Servo.h> //Libreria servo

//Constante RightmotorF=Avance motor derecho, conectado al pin digital 9 IN3
#define RightmotorF 9
//Constante RightmotorB=Retroceso motor derecho, conectado al pin digital 10 IN4
#define RightmotorB 10
//Constante LeftmotorF=Avance motor izquierdo, conectado al pin digital 5 IN1
#define LeftmotorF 5 //digitalpin 5 for left motor forward
//Constante LeftmotorB=Retroceso motor izquierdo, conectado al pin digital 6 IN2
#define LeftmotorB 6 //digital pin 6 for right motor Backward
//Crea el objeto servo
Servo myservo;
//Variable entera LeftDistance(Distancia Izquierda) inicializada en cero
int LeftDistance=0;
//Variable entera RightDistance(Distancia Derecha) inicializada en cero
int RightDistance=0;
//Variable entera distance(distancia) inicializada en cero
int distance=0;
//Variable entera val
int val;
//Variable message,tipo string, se le asigna comillas
String message="";
//Variable entera FrontDistance(Distancia Frontal) inicializada en cero
int FrontDistance=0;
//Constructor sonar de la libreria NewPing, con parametros trig(Pin digital 2),echo(Pin digital 3),maxdistance(400cm)
NewPing sonar(2, 3, 400); //(trig,echo,maxdistance)
//Constructor BT de la libreria SoftwareSerial, con parametros RXD(Pin digital 12) TXD(Pin digital 11) BT(RXaTXD,TXaRXD)
SoftwareSerial BT(11,12);

//Funcion setup()
void setup()
{
    //Declaracion de pines como salidas 
    pinMode(RightmotorF, OUTPUT);//declaring these pins as output to control them
    pinMode(RightmotorB, OUTPUT);
    pinMode(LeftmotorF,OUTPUT);
    pinMode(LeftmotorB,OUTPUT);
    //Inicia terminal Serie a 9600 baud
    Serial.begin(9600);
    //Indica que el servo esta conectado al pin digital 4
    myservo.attach(4);
    //Inicia el Bluetooth a 115200 baud
    BT.begin(115200);
    //Envia un print al Bluetooth no se cambia esto!
    BT.print("$");//Bluetooth stuff dont change

    //Retraso de 100ms
    delay(100);
    //Tras lo cual envia un println con los parametros U, 9600, N
    BT.println("U,9600,N");
    //Ahora inicia la comunicacion Bluetooth a 9600 baud
    BT.begin(9600);
    //Configura el servo en la posicion inicial
    serv(512);
}

//Funcion loop()
void loop()
{
  //Si BT.available() devuelve 1 o cierto
  if(BT.available()){
    
    //Through comparing characters we will communicate, you can change this in app too
    //Mediante la comparacion de caracteres nos comunicaremos, esto se puede cambiar en la app tambien
    char GetBT = (char)BT.read();

    //Si GetBT es igual al caracter d(Avance)
    if(GetBT=='d'){
      //Sentido de giro RightmotorF se encendera
      digitalWrite(RightmotorF, HIGH);//for forward movement both R  & L forwards are high and backward low
      //Sentido de giro RightmotorB se apagara
      digitalWrite(RightmotorB, LOW);
      //Sentido de giro LeftmotorF se encendera
      digitalWrite(LeftmotorF, HIGH);
      //Sentido de giro LeftmotorB se apagara
      digitalWrite(LeftmotorB,LOW);
      //Al estar encendidos los sentidos de giro RightmotorF y LeftmotorF el  robot avanza
      //Al estar apagados los sentidos de giro RightmotorB y LeftmotorB no oponen resistencia al avance del robot
      }
      //entonces si GetBT es igual al caracter s (Stop)
      else if(GetBT=='s'){
        //Sentido de giro RightmotorF se apagara
        digitalWrite(RightmotorF, LOW);
        //Sentido de giro RightmotorB se apagara
        digitalWrite(RightmotorB, LOW);
        //Sentido de giro LeftmotorF se apagara
        digitalWrite(LeftmotorF, LOW);
        //Sentido de giro LeftmotorB se apagara
        digitalWrite(LeftmotorB,LOW);
        //Al estar todos los sentidos de giro apagados, el robot no podra generar movimiento
        }
        //entonces si GetBT es igual al caracter a(Retroceso)
        else if(GetBT=='a'){
          //Sentido de giro RightmotorF se apagara
          digitalWrite(RightmotorF, LOW);
          //Sentido de giro RightmotorB se encendera
          digitalWrite(RightmotorB, HIGH);
          //Sentido de giro LeftmotorF se apagara
          digitalWrite(LeftmotorF,LOW);
          //Sentido de giro LeftmotorB se encendera
          digitalWrite(LeftmotorB,HIGH);
          //Al encenderse los sentidos de giro RightmotorB y LeftmotorB el robot retrocede
          //Al apagarse los sentidos de giro RightmotorF y LeftmotorF, no oponen resistencia al retroceso del robot
          }
          //ademas si GetBT es igual al caracter g(Derecha)
          else if(GetBT=='g'){
            //Sentido de giro RightmotorF se apagara
            digitalWrite(RightmotorF, LOW);
            //Sentido de giro RightmotorB se encendera
            digitalWrite(RightmotorB, HIGH);
            //Sentido de giro LeftmotorF se encendera
            digitalWrite(LeftmotorF, HIGH);
            //Sentido de giro LeftmotorB se apagara
            digitalWrite(LeftmotorB, LOW);
            //Al encenderse los sentidos de giro RightmotorB y LeftmotorF el robot girara hacia la derecha
            //Al apagarse los sentidos de giro RightmotorF y LeftmotorB, no oponen resistencia al giro hacia la derecha
            }
            // ademas si GetBT es igua al caracter f(Izquierda)
            else if(GetBT=='f'){
              //Sentido de giro RightmotorF se encendera
              digitalWrite(RightmotorF, HIGH);
              //Sentido de giro RightmotorB se apagara
              digitalWrite(RightmotorB, LOW);
              //Sentido de giro LeftmotorF se apagara
              digitalWrite(LeftmotorF,LOW);
              //Sentido de giro LeftmotorB se encendera
              digitalWrite(LeftmotorB,HIGH);
              //Al encenderse los sentidos de giro RightmotorF y LeftmotorB, el robot girara hacia la izquierda
              //Al apagarse los sentidos de giro RightmotorB y LeftmotoF, no oponen resistencia al giro hacia la izquierda
              }

     //Si GetBT es igual al caracter letra o
     if(GetBT=='o'){
      //sucedera un bucle cierto (1)
      while(1){
        //El cual llamara a la funcion scan() para verificar la distancia
        scan();
        //Se asignara el valor distance a la variable FrontDistance
        FrontDistance=distance;
        //Si el valor de FrontDistance es mayor a 20 o igual a cero,codigo anulado por el autor
        // if(FrontDistance>20|| FrontDistance==0)
        //Si el valor FrontDistance es mayor a 20
        if(FrontDistance>20){
          //Se llama a la funcion Forward() (Avanzar)
          Forward();
          }
          //Sino
          else{
            //Se llama a las funciones movestop() (Detener movimiento) y navigate() (Navegar)
            movestop();
            navigate();
            }
        //Si BT.available() es cierto
        if(BT.available()){
          //Se asigna el caracter leido por BT.read() al caracter newBT
          char newBT = (char)BT.read();
          //Si newBT es igual al caracter t(Detencion por bluetooth)
          if(newBT=='t'){
            //Se llama a la funcion movestop()
            movestop();
            //Y se detiene la lectura
            break;
            }
         //Cierra el if BT.available   
         }
     //Cierra el bucle while(1)    
     }
   //Cierra el if GetBT es igual letra o
   }
   //Ademas si GetBT es igual al caracter k
   else if(GetBT=='k'){
    //Se llama a la funcion scan()
    scan();
    //Se envia por Bluetooth un print con el valor de distance
    //Alternativamente o a la vez podemos mostrar en Terminal Serie el valor de distance descomentando la siguiente linea
    //Serial.println(distance);
    BT.print(distance);
    }
   //Cierra el if BT.available()
   }
  //Si Serial.available es cierto
  if(Serial.available()){
    
    //Esta parte es usada para probar los motores a traves del monitor serie
    //Asigna a la variable al de tipo char lo devuelto por Serial.read() 
    char al=(char)Serial.read();
    // El siguiente codigo fue anulado por el autor
    //  int uS = sonar.ping();
    //  Serial.print("Ping: ");
    //  Serial.print(uS / US_ROUNDTRIP_CM);
    //  Serial.println("cm");
    
    //Si al es igual al caracter d(Avance)
    if(al=='d'){
      //Sentido de giro RightmotorF se encendera
      digitalWrite(RightmotorF, HIGH);
      //Sentido de giro RightmotorB se apagara
      digitalWrite(RightmotorB, LOW);
      //Sentido de giro Leftmotor se encendera
      digitalWrite(LeftmotorF, HIGH);
      //Sentido de giro LeftmotorB se apagara
      digitalWrite(LeftmotorB, LOW);
      //El robot avanza
      }
      //Sino si al es igual al caracter s(stop)
      else if(al=='s'){
        //Sentido de giro RightmotorF se apagara
        digitalWrite(RightmotorF, LOW);
        //Sentido de giro RightmotorB se apagara
        digitalWrite(RightmotorB, LOW);
        //Sentido de giro LeftmotorF se apagara
        digitalWrite(LeftmotorF,LOW);
        //Sentido de giro LeftmotorB se apagara
        digitalWrite(LeftmotorB,LOW);
        }
        //Sino si al es igual al caracter a(Retroceso)
        else if(al=='a'){
          //Sentido de giro RightmotorF se apagara
          digitalWrite(RightmotorF, LOW);
          //Sentido de giro RightmotorB se encendera
          digitalWrite(RightmotorB, HIGH);
          //Sentido de giro LeftmotorF se apagara
          digitalWrite(LeftmotorF, LOW);
          //Sentido de giro LeftmotorB se encendera
          digitalWrite(LeftmotorB, HIGH);
          //El robot retrocede
          }
          //Sino si al es igual al caracter g(Giro a derecha)
          else if(al=='g'){
            //Sentido de giro RightmotorF se apagara
            digitalWrite(RightmotorF, LOW);
            //Sentido de giro RightmotorB se encendera
            digitalWrite(RightmotorB, HIGH);
            //Sentido de giro LeftmotorF se encendera
            digitalWrite(LeftmotorF, HIGH);
            //Sentido de giro LeftmotorB se apagara
            digitalWrite(LeftmotorB, LOW);
            //El robot gira a la derecha
            }
            //Sino si al es igual al caracter f(Giro a izquierda)
            else if(al=='f'){
              //Sentido de giro RightmotorF se encendera
              digitalWrite(RightmotorF, HIGH);
              //Sentido de giro RightmotorB se apagara
              digitalWrite(RightmotorB, LOW);
              //Sentido de giro LeftmotorF se apagara
              digitalWrite(LeftmotorF, LOW);
              //Sentido de giro LeftmotorB se enecendera
              digitalWrite(LeftmotorB, HIGH);
              //El robot gira a la izquierda
              }
              //Codigo anulado por el autor
              //Serial.print(al);
             //Cierra el if Serial.available
             }
//Termina la funcion loop()             
}

//Funcion serv() con parametro variable entera a, indica la posicion fisica del servo sg90
void serv(int a){
  //Asigna a la variable val lo devuelto por map()
  //map(value, fromLow, fromHigh, toLow, toHigh)
  //Devuelve un valor desde 0 a 1023, minimo 0 grados a 179 grados
  val=map(a,0,1023,0,179);
  //Llama al metodo myservo.write escribiendo el valor almacenado en val
  myservo.write(val);
  //Retraso de 1 segundo(1000ms)
  delay(1000);
//Termina la funcion serv()
}

//Funcion Forward() Avanzar
void Forward(){
  //Sentido de giro RightmotorF se encendera
  digitalWrite(RightmotorF, HIGH);
  //Sentido de giro RightmotorB se apagara
  digitalWrite(RightmotorB, LOW);
  //Sentido de giro LeftmotorF se encendera
  digitalWrite(LeftmotorF, HIGH);
  //Sentido de giro LeftmotorF se apagara
  digitalWrite(LeftmotorB, LOW);
  //Al encenderse el sentido de giro en RightmotorF y LeftmotorF, el robot avanza
//Termina la funcion Forward()  
}

//Funcion Backward() Retroceder
void Backward(){
  //Sentido de giro RightmotorF se apagara
  digitalWrite(RightmotorF, LOW);
  //Sentido de giro RightmotorB se encendera
  digitalWrite(RightmotorB, HIGH);
  //Sentido de giro LeftmotorF se apagara 
  digitalWrite(LeftmotorF, LOW);
  //Sentido de giro LeftmotorB se encendera
  digitalWrite(LeftmotorB, HIGH);
  //Al encenderse el sentido de giro en RightmotorB y LeftmotorB, el robot retrocede
//Termina la funcion Backward()
}

//Funcion Right() Giro a Derecha
void Right(){
  //Sentido de giro RightmotorF se apagara
  digitalWrite(RightmotorF, LOW);
  //Sentido de giro RightmotorB se enecendera
  digitalWrite(RightmotorB, HIGH);
  //Sentido de giro LeftmotorF se encendera
  digitalWrite(LeftmotorF, HIGH);
  //Sentido de giro LeftmotorB se apagara
  digitalWrite(LeftmotorB, LOW);
  //Al encenderse el sentido de giro en RightmotorB y LeftmotorF, el robot gira hacia la derecha
//Termina la funcion Right()
}

//Funcion Left() Izquierda
void Left(){
  //Sentido de giro RightmotorF se encendera
  digitalWrite(RightmotorF, HIGH);
  //Sentido de giro RightmotorB se apagara
  digitalWrite(RightmotorB, LOW);
  //Sentido de giro LeftmotorF se apagara
  digitalWrite(LeftmotorF,LOW);
  //Sentido de giro LeftmotorB se encendera
  digitalWrite(LeftmotorB,HIGH);
  //Al encenderse el sentido de giro en RightmotorF y LeftmotorB, el robot gira hacia la izquierda
//Termina la funcion Left()
}

//Funcion movestop() Detener movimiento
void movestop(){
  //Sentido de giro RightmotorF se apagara
  digitalWrite(RightmotorF, LOW);
  //Sentido de giro RightmotorB se apagara
  digitalWrite(RightmotorB, LOW);
  //Sentido de giro LeftmotorF se apagara
  digitalWrite(LeftmotorF, LOW);
  //Sentido de giro LeftmotorB se apagara
  digitalWrite(LeftmotorB, LOW);
  //Al apagarse todos los sentidos de giro en ambos motores Right y Left, el robot se detiene
//Termina la funcion movestop() 
}

//Funcion scan() Escanear
void scan(){
  //Se declara la variab;le entera local uS y se le asigna el metodo sonar.ping()
  //El cual envia un ping, devuelve el tiempo en microsegundos de echo o 0(cero) si no hay ping echo,con el limite de distancia configurado
  int uS = sonar.ping();
  //Se asigna a la variable distance el resultado de la division uS/US_ROUNDTRIP_CM
  distance=(uS / US_ROUNDTRIP_CM);
  //Retraso de medio segundo 500ms
  delay(500);
//Termina la funcion scan()
}

//Funcion navigate() Navegar
void navigate(){
  //Mueve el servo a la izquierda, espera medio segundo que el servo llegue a la posicion
  serv(1023);
  //Llama a la funcion scan()
  scan();
  //Asigna el valor de distancia a la variable LeftDistance
  LeftDistance = distance;
  //Mueve el servo a la derecha, espera medio segundo a que el servo llegue a la posicion
  serv(10);
  ////Llama a la funcion scan()
  scan();
  //Asigna el valor de distancia a la variable RightDistance
  RightDistance = distance;
  //Si el valor absoluto devuelto entre RightDistance y LeftDistance es menor a 5
  if(abs(RightDistance - LeftDistance) < 5){
    //Llama a la funcion Backward()
    Backward();
    //Retraso de 200ms
    delay(200);
    //Llama a la funcion Right()
    Right();
    //Retraso de 100ms
    delay(100);
    //Mueve el servo a la posicion inicial
    serv(512);
    }
    //Sino si RightDistance es menor que LeftDistance
    else if(RightDistance < LeftDistance){
      //Llama a la funcion Left()
      Left();
      //Retraso de 100ms
      delay(100);
      //Mueve el servo a la posicion inicial
      serv(512);
      }
      //Sino si LeftDistance es menor que RightDistance
      else if(LeftDistance < RightDistance){
        //Llama a la funcion Right()
        Right();
        //Retraso de 100ms
        delay(100);
        //Mueve el servo a la posicion inicial
        serv(512);
        }
//Termina la funcion navigate()
}

Agradecimientos a Nestor Kern

views
555


ElectroMercado

  • arduino
2 Comentarios
  1. Daniel01
    Daniel01 7 meses

    Hola Luciano , no convendría hacerlo fijo el ultrasonido, que capte de frente solamente si hay objetos. Cual es la ventaja de hacerlo tipo radar?. Saludos

    1+
  2. Luciano
    Luciano 7 meses

    Hace esto, ponte las manos a los laterales de los ojos, camina hacia la pared hasta que solo veas la pared, te quedaste sin ruta posible verdad? solo te queda marcha atrás y nueva ruta. Cuando en ocaciones solo girar a un lado te hubiese brindado una nueva ruta. Al mover el ultrasonido haces un barrido de obstáculos, viendo la ruta posible sin regresar en tu camino, a menos que esa sea la única oportunidad. La otra es agregar 2 sensores más a la izquierda y derecha que harían lo mismo que uno en radar pero con mayor velocidad de procesamiento.

    2+

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos .Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account