Félix Rojo Trueba

Felix@cajon.es

Coche autónomo

Bueno estos días estado con un kit de arduino que me compre hace tiempo y que tenia abandonado, el kit traia un coche para su montaje "sin ningún tipo de instrucciones", sin programa para arduino. Buscando encontra alguna imagen y algún video de como quedaba montado con eso me hice una idea y monte la estructura como se conectaba y programaba el arduino eso ya no tenia ni idea, pues bueno me puesto manos a la obra y esto es lo que fue surgiendo.


El kit venia con el coche de tres ruedas, un arduino chino, un doble puente en h,un servo, un shiel de sensores y un sensor de ultrasonidos.
Lo primero como no se nada de arduino investigo un poco, llegando a la conclusion que no me termina de convencer que con un sensor cada vez que encuentre un ostaculo tenga que parar mover el servo con el sensnor de ultrasonidos y buscar nueva ruta, por lo que decido montarlo con 3 sensores de ultrasonidos.

Empezando descargo el IDE de arduino y miro algunos ejemplos y algun video para familiarizarme con arduino, conecto mi arduino creo el hola mundo de arduino compilo y no me sube, primer problema, consulatando al tener el arduino chino hay que descargarse un driver, lo descargo y todo funciona bien.
Miro documentacion de los sensores ultrasonicos y trane cuatro patas una tierra otra 5v y las otras dos una trig para enviar una señal y la cuarta eco que recive el eco de la señal mandada y ese numero entre 58.2 da los cm que esta el ostaculo si da 0 o menos es que esta fuera de rango.
el puente h tiene dos conexiones laterales para cada motor y luego tres conectores uno tierra otro voltaje, que permite hasta 34 volitos "me parece no recuerdo bien" y el tercero que si dejas puesto el jumper da 5 voltios de salida para alimentar el arduino por ejemplo, y ademas nos trae dos jumper mas para activar los dos motores uno o ninguno y cuartro pines dos para cada motor que son el sentido de giro del motor donde le mandaremos con un pin con pwd de arduino la velocidad de giro.
Sabiendo esto monto todo lo cableo y lo programo.

Tambien le puse un sensor de infrarojos en en suelo para que detectaria si no habia suleo para evitar caidas como escaleras etc.. pero no fue util ya que si me las detectaba pero no le da tiempo a frenar por lo que se cae.

Otro problema que tuve es que cuando lo probava conectado al ordenador todo funcionaba correctamente y en cuanto lo ponía solo me iba mal, mire la salida de voltaje del puente h hacia el arduino y me daba 4 voltios lo cual no es suficiente para alimentar el arduino, la solución mas normal habria sido poner un cargador de 6 pilas en vez de cuatro pero en ese momento no disponia de ninguno por lo que le puse un power bank directo a la entrada del usb del arduino.

// Control de cochecito con tres sensores
// Programado Félix rojo
// Versión 0.1

//Ruedas
int velocidadIzquierda;
int velocidadDerecha;
int sentidoIzquierda;
int sentidoDerecha;
// Adelante=0 y atras=1

//Sensores ultrasonicos
int TRIGIZQUIERDA=2;
int ECOIZQUIERDA=3;
int TRIGCENTRO=4;
int ECOCENTRO=5;
int TRIGDERECHA=12;
int ECODERECHA=13;

//Motores
int MOTORIADELANTE=11;
int MOTORIATRAS=10;
int MOTORDADELANTE=9;
int MOTORDATRAS=6;

//Sensor IR
int IR=8;

void setup() {
  
  //Puertos de sensores
  pinMode(TRIGIZQUIERDA,OUTPUT);
  pinMode(ECOIZQUIERDA,INPUT);
  pinMode(TRIGCENTRO,OUTPUT);
  pinMode(ECOCENTRO,INPUT);
  pinMode(TRIGDERECHA,OUTPUT);
  pinMode(ECODERECHA,INPUT);
  //Puertos de motores
  pinMode(MOTORIADELANTE,OUTPUT);
  pinMode(MOTORIATRAS,OUTPUT);
  pinMode(MOTORDADELANTE,OUTPUT);
  pinMode(MOTORDATRAS,OUTPUT);
  //Puerto ir antisuicidio
  pinMode(IR,INPUT);
  
  Serial.begin(9600);
  

}

void loop() {
  
  marcha();//El coche se mueve
  antisuicidio();//Sensor que controla si hay suelo
  delay(100);
  
  

}

//funcion antisuicidio
void antisuicidio(){
  int suelo=0;
  suelo=digitalRead(IR);
  if(suelo==HIGH){
    Serial.println("cae ");
    atras(100);
    delay(2000);
    
  }
}

// Función de direccion
void marcha(){
  
  int centro=sensor(TRIGCENTRO,ECOCENTRO);
  int derecha=sensor(TRIGDERECHA,ECODERECHA);
  int izquierda=sensor(TRIGIZQUIERDA,ECOIZQUIERDA);
  Serial.print("Sensor izquierda -> ");
  Serial.println (izquierda);
  
  Serial.print("Sensor centro -> ");
  Serial.println (centro);
  
 Serial.print("Sensor derecha -> ");
  Serial.println (derecha);
  
  // velocidad dependiendo de la distancia al ostaculo frontal
  if(centro>100){
    adelante(250);// si tiene más de un metro motores a tope
    Serial.println("tope");
  }
  if(centro>=30 and centro<=100){
    adelante(100);// si tiene menos de un metro motores a 100
    Serial.println("lento");
  }
  if(centro<30 and centro>10){
    //miro donde tengo mas sitio y giro
    Serial.println(izquierda);
    Serial.println(centro);
    Serial.println(derecha);
    if (izquierda>derecha){
      giroIzquierda();
    }else{
      giroDerecha();
    }
  }
  if(centro<11){
    atras(100);
    Serial.println(izquierda);
    Serial.println(centro);
    Serial.println(derecha);
    Serial.println("atras");
    delay(1000);
    adelante(0);
  }

  centro=sensor(TRIGCENTRO,ECOCENTRO);
  derecha=sensor(TRIGDERECHA,ECODERECHA);
  izquierda=sensor(TRIGIZQUIERDA,ECOIZQUIERDA);
  if (derecha<=30){
    giroIzqPeque();
  }
  if (izquierda<=30){
    giroDrcPeque();
  }
}

//Funcion gira poco izquierda
void giroIzqPeque(){
  int velocidad=velocidadIzquierda;
  velocidadMotor(MOTORIADELANTE,0);
  Serial.println("giro izquierda fino");
  delay(500);
  velocidadMotor(MOTORIADELANTE,velocidad);  
}
//Funcion gira poco derecha
void giroDrcPeque(){
  int velocidad=velocidadDerecha;
  velocidadMotor(MOTORDADELANTE,0);
  Serial.println("giro derecha fino");
  delay(500);
  velocidadMotor(MOTORDADELANTE,velocidad);  
}


//Función giro izquierda
void giroIzquierda(){
  velocidadMotor(MOTORIADELANTE,0);
  velocidadMotor(MOTORDADELANTE,100);
  Serial.println("giro izquierda");
  delay(900);
  velocidadMotor(MOTORIADELANTE,100);
  velocidadMotor(MOTORDADELANTE,100);
}
//Función giro derecha
void giroDerecha(){
  velocidadMotor(MOTORDADELANTE,0);
  velocidadMotor(MOTORIADELANTE,100);
  Serial.println("giro Derecha");
  delay(900);
  velocidadMotor(MOTORIADELANTE,100);
  velocidadMotor(MOTORDADELANTE,100);
}

//Funcion que hace andar al cochecito hacia adelante
// Parametro 1 velocidad 
void adelante(int velocidad){
  velocidadMotor(MOTORIADELANTE,velocidad);
  velocidadMotor(MOTORDADELANTE,velocidad);
}

//Funcion que hace andar al cochecito hacia atras
// Parametro 1 velocidad 
void atras(int velocidad){
  velocidadMotor(MOTORIADELANTE,0);
  velocidadMotor(MOTORDADELANTE,0);
  velocidadMotor(MOTORIATRAS,velocidad);
  velocidadMotor(MOTORDATRAS,velocidad);
}

//funcion que recibe dos parametros y devuelve un entero que es la distancia
// parametro 1 el trig del sensor
// parametro 2 el eco del sensor

int sensor(int trig,int eco){
  int duracion=0;
  int distancia=0;
  digitalWrite(trig,HIGH);
  delay(1);
  digitalWrite(trig,LOW);
  duracion=pulseIn(eco,HIGH);
  distancia=duracion/58,2;
  if (distancia<=0){distancia=400;}
  return distancia;
}

// Función que controla los motores recibe dos parametros el motor y la velocidad
// parametro 1 el motor
// parametro 2 la velocidad
void velocidadMotor(int motor,int velocidad){
  //Si el motor izquierda va hacia adelante pare el giro hacia atras
  if (motor==MOTORIADELANTE){
    analogWrite(MOTORIATRAS,0);
    sentidoIzquierda=0;//guardo la variable para saber que sentido voy
    velocidadIzquierda=velocidad;//guardo la velocidad
  }
  //Si el motor izquierda va hacia atras pare el giro hacia adelante
  if (motor==MOTORIATRAS){
    analogWrite(MOTORIADELANTE,0);
    sentidoIzquierda=1;//guardo la variable para saber que sentido voy
    velocidadIzquierda=velocidad;//guardo la velocidad
  }

  //Si el motor derecha va hacia adelante pare el giro hacia atras
  if (motor==MOTORDADELANTE){
    analogWrite(MOTORDATRAS,0);
    sentidoDerecha=0;//guardo la variable para saber que sentido voy
    velocidadDerecha=velocidad;//guardo la velocidad
  }
  //Si el motor derecha va hacia atras pare el giro hacia adelante
  if (motor==MOTORDATRAS){
    analogWrite(MOTORDADELANTE,0);
    sentidoDerecha=1;//guardo la variable para saber que sentido voy
    velocidadDerecha=velocidad;//guardo la velocidad
  }
  
  //analogWrite(motor,0);
  analogWrite(motor,velocidad);
}
                
Descargar el archivo

Podeis descargar el archivo y subirlo a vuestro arduino, lo unico fijaros en el código fuente los pines que tiene conectados.

En el video se ve el resultado final.


Página creada por Félix Rojo Trueba