Toro Mecánico

Foto del proyecto final

Proyecto creado por el grupo 20 de la asignatura Diseño de Sistemas Empotrados compuesto por Manuel Alejandro Jiménez Fernández y Mario García Barrero.

Idea

Nuestra idea se basó en un robot que pudiera ayudar a las empresas a mover objetos de lado a lado sin necesidad de personal. Por eso pensamos en hacer un toro mecánico autónomo, este cogería todo tipo de pales u objetos para moverlos sin necesidad de que nadie tenga que controlarlo.


Materiales utilizados

MaterialPrecioPrestado
Pack ruedas y motores16.99 €No
Placa Arduino UNO
CablesMixto
BaseDe un integrante
Ultrasonidos7.99 €No
Infrarrojos5.29 €No
Puentes H6.99 €No
Tablón2.50 €No
Cinta adhesiva negra2.99 €No
TOTAL42.55 €

Hardware

Los componentes utilizados para hacer este proyecto han sido los siguientes:

  • 3 Motores dc
  • 1 Sensor de ultrasonidos
  • 2 Sensores de infrarrojos
  • 1 Placa Arduino UNO
  • 1 Placa protoboard
  • Muchos cables
  • 1 Portapilas de 4 pilas AA
  • 2 Puentes en H

Esquema de conexiones:

Esquema de conexiones

Problemas encontrados

Primero: Motores sin controladores

  -SOLUCIÓN: Comprar puentes H

Segundo: No poder controlar la velocidad de los motores

  -SOLUCIÓN: No hemos encontrado solución, se supone que a través de unos pines del puente H (ENA, ENB) se debería poder controlar pero no hemos sido capaces de solucionarlo

Tercero: Los infrarrojos no funcionaban correctamente, no detectaban el cambio de color de blanco a negro

  SOLUCIÓN: Usar otro que teníamos por casa

Cuarto: Problemas de espacio, la base que hemos usado es muy justa y nos ha costado bastante meter todo

  -SOLUCIÓN: Tener cuidado con los cables

Quinto: Problemas para pegar la pala

  -SOLUCIÓN: Loctite (pero teníamos que estar muy seguros de que no iba a ser modificada)

Sexto: Separación del infrarrojo

  -SOLUCIÓN: Líneas mas pequeñas pero mas difícil aún de controlar

Séptimo: Problema con el circuito debido a no poder controlar la velocidad de los motores

  -SOLUCIÓN: Hacer un circuito con curva agudas


Mejoras futuras

Mejoras del diseño:

  + Creación y diseño de componentes con impresora 3D

  + Más espacio para una mejor organización

  + Huecos específicos para los componentes

Mejoras del Hardware:

  + Mejores motores y controladores para poder controlar la velocidad y   que tengan mas potencia

  + Cables a medida

Mejoras del software:

  + Mapeo de la zona para que no sea necesario el uso de líneas(conlleva   añadir más sensores)


Video del funcionamiento


Video explicativo parte Hardware

Video Hardware

Video explicación Software/Código


Software/Código

El funcionamiento del código es simple aunque difícil de implementar debido al poco rango de fallo.

¿Como funciona? A traves de los infrarrojos que se encuentran detras de la pala detectamos si lo que tienen debajo(en el suelo) es negro o, por el contrario, blanco. Si ambos infrarrojos detectan blanco el toro avanza hacia delante, si el izquiero detecta negro y el derecho blanco gira a la izquiera porque el toro se esta desviando a la derecha y, al contrario si el infrarrojo derecho detecta negro y el izquierdo blanco. Si ambos infrarrojos detectan negro comprueban que haya un objeto delante a menos de 10 cm, si lo hay acciona la pala para que lo levante y continua recto, para dejarlo tiene que volver a detectar doble negro en los infrarrojos durante mas de 100 ms por si ha habido un false doble negro, cuando es correcto el doble negro baja la pala y suelta el objeto.


/* GRUPO 20: MARIO GARCIA BARRERO
             MANUELA ALEJANDRO JIMENEZ FERNANDEZ*/

// CONEXIONES DE LOS SENSORES DEL ULTRASONIDO
const int PinTrig = 13;
const int PinEcho = 12;

const int mpA= 10; // CONEXION MOTOR PALA A
const int mpB= 11; // CONEXION MOTOR PALA B

const int m1IA= 6; // CONEXION MOTOR IZQUIERDO A
const int m1IB= 7; // CONEXION MOTOR IZQUIERDO B

const int m1DA= 4; // CONEXION MOTOR PALA DERECHO A
const int m1DB= 5; // CONEXION MOTOR PALA DERECHO B


const int i1 = 3; // CONEXION INFRARROJO 1
const int i2 = 2; // CONEXION INFRARROJO 2

// CONSTANTE DE LA VELOCIDAD DEL SONIDO
const float VelSon = 34000.0;
float distancia;

int vd; // AQUÍ SE GUARDA EL VALOR DEL INFRARROJO DERECHO
int vi; // AQUÍ SE GUARDA EL VALOR DEL INFRARROJO IZQUIERDO
  
bool cogido = false; // VARIABLE QUE SE ACTIVA CUANDO SE COGE EL OBJETO

void setup()
{
  
  Serial.begin(9600);

  // INICIALIZAMOS LOS MOTORES COMO SALIDA
  pinMode(m1IA, OUTPUT);
  pinMode(m1IB, OUTPUT);
  pinMode(m1DA, OUTPUT);
  pinMode(m1DB, OUTPUT);
  pinMode(ENA, OUTPUT);

  pinMode(mpA, OUTPUT);
  pinMode(mpB, OUTPUT);

  // INICIALIZAMOS LOS INFRARROJOS COMO ENTRADA
  pinMode(i1, INPUT);
  pinMode(i2, INPUT);
  
  // INICIALIZAMOS EL ULTRASONIDO
  pinMode(PinTrig, OUTPUT);
  pinMode(PinEcho, INPUT);
  
}
void loop()
{
  
    vi = digitalRead(i1); // LEER INFRARROJO IZQUIERDO
    vd = digitalRead(i2); // LEER INFRARROJO DERECHO

  // DETECTA AMBOS BLANCOS
  while(vd == 1 && vi == 1 ){

     palante();
     vi = digitalRead(i1); 
     vd = digitalRead(i2);
  }

  // DETECTA DOBLE NEGRO
  while(vd == 0 && vi == 0 ){

    int us = medir();
    parado();

    // SI NO HA COGIDO AUN EL OBJETO, LO COGE
     if(us < 10 && cogido == false){
      
        parado();
        delay(1500);
        pala();
        palaparada();

        cogido = true;
        
        palante();
        delay(500);
     
     }else{

        palante(); 
      
     }

     // SI HA COGIDO EL OBJETO Y NO HA SIDO UN FALSO DOBLE NEGRO, LO SUELTA
    if(cogido == true){
      
      delay(100);
      vi = digitalRead(i1); 
      vd = digitalRead(i2);
      
      if(vd == 0 && vi == 0){

        parado();
        delay(1500);
        palain();
        palaparada();
        delay(10000);
      }
    }
     
     vi = digitalRead(i1); 
     vd = digitalRead(i2);
  }

 // SENSOR IZQUIERDO EN NEGRO
 while(vd == 1 && vi == 0 ){

     iz();
     vi = digitalRead(i1); 
     vd = digitalRead(i2);
  }

  // SENSOR DERECHO EN NEGRO
  while(vd == 0 && vi == 1 ){

     der();
     vi = digitalRead(i1); 
     vd = digitalRead(i2);
  }


}

// METODO PARA MEDIR LA DISTANCIA DEL ULTRASONIDO
float medir()
{
  // Ponemos el Triiger en estado bajo y esperamos 2 ms
  digitalWrite(PinTrig, LOW);
  delayMicroseconds(2);
  
  // Ponemos el pin Trigger a estado alto y esperamos 10 ms
  digitalWrite(PinTrig, HIGH);
  delayMicroseconds(10);
  
  // Comenzamos poniendo el pin Trigger en estado bajo
  digitalWrite(PinTrig, LOW);

  unsigned long tiempo = pulseIn(PinEcho, HIGH);
  distancia = tiempo * 0.000001 * VelSon / 2.0;

  return distancia;
}

// METODO PARA AVANZAR
void palante(){
  
  digitalWrite(m1DA, HIGH);  
  digitalWrite(m1DB, LOW);
  digitalWrite(m1IA, HIGH);  
  digitalWrite(m1IB, LOW);

}

// METODO PARA GIRAR A LA IZQUIERDA
void iz(){
  
  digitalWrite(m1DA, HIGH);  
  digitalWrite(m1DB, LOW);
  digitalWrite(m1IA, LOW);  
  digitalWrite(m1IB, LOW);

}

// METODO PARA GIRAR A LA DERECHA
void der(){
  
  digitalWrite(m1DA, LOW);  
  digitalWrite(m1DB, LOW);
  digitalWrite(m1IA, HIGH);  
  digitalWrite(m1IB, LOW);

}

// METODO PARA IR HACIA ATRAS
void atras(){
  
  digitalWrite(m1DA, LOW);  
  digitalWrite(m1DB, HIGH);
  digitalWrite(m1IA, LOW);  
  digitalWrite(m1IB, HIGH);

}  

// METODO PARA PARARSE
void parado(){
  
  digitalWrite(m1DA, LOW);  
  digitalWrite(m1DB, LOW);
  digitalWrite(m1IA, LOW);  
  digitalWrite(m1IB, LOW);

} 

// METODO PARA QUE LA PALA SUBA
void pala(){
  
  digitalWrite(mpB, HIGH); 
  digitalWrite(mpA, LOW);
  delay (165);
  return;
  }

// METODO PARA QUE LA PALA BAJE
void palain(){
  
  digitalWrite(mpB, LOW); 
  digitalWrite(mpA, HIGH);
  delay (90);
  return;
}

// METODO PARA PARAR LA PALA
void palaparada(){
  
  digitalWrite(mpB, LOW); 
  digitalWrite(mpA, LOW);
}

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *