TOYMACHINE

TOYMACHINE 
Grupo 14:
Sara Lucas Hernández
Ernesto Pedrero Real
Ioana Peperigeanu

1. Introducción 

     Nuestro
proyecto se trata de una máquina con un gancho que es manejado a través de un
joystick en un tiempo determinado con el objetivo de poder agarrar un objeto
contenido en la máquina para que pueda ser expendido si el usuario es capaz de
alcanzarlo correctamente.

2. Presupuesto

Motor Arduino x3
7,5 €
Caja de cartón
0 €
Joystick
14,45 €
Pilas de petaca
0 €
Tablas de madera
14,19 €
Tablón de madera
3,50 €
Caja de madera a medida
2,5 €
Rodamientos de monopatín
8 €
Palillos de helado
1,2 €
Pinchos de metal
1 €
Bridas
0 €
Tornillos y tuercas
3,60 €
Hilo de tejer
0 €
Pintura
0 €
Arandelas
0 €
Varilla redonda de 1 cm
1,19 €
Pajita
0 €
Bandas elásticas
1 €
Papel de lija
0 €
Herramientas
0 €
Pulsador
1,65 €
Papel de regalo x2
0,9 €
Papel transparente
0,6 €
Puente H x3
9 €
Cable
2,55 €
Escuadras x4
0,6 €
TOTAL
  73,43 €

  3. Construcción


     Empezamos la construcción de nuestro proyecto con la elaboración de
la garra mecánica, ya que no encontramos ninguna en Internet
 que se adaptara a
nuestras necesidades y que llegara en un tiempo razonable. Por lo tanto,
decidimos hacerla nosotros manualmente con palillos de helado y utilizamos el
hilo de tejer para articular los movimientos. Consta de dos hilos, uno para
abrir la garra y otro para cerrarla. Una vez concluida su construcción la
pintamos con temperas. 


     Después construimos la
parte de arriba de la maquina ya que es la que lleva los ejes que dirigen la
garra para así hacer ir haciendo el circuito y manejar los motores. Montamos
primero los tablones de madera con los rodamientos de monopatín y los hilos que
nos proporcionan el movimiento por la caja, después diseñamos unas poleas de
cartón para cada uno de los dos ejes y las pegamos encima de los rodamientos. 




















Montamos la estructura de
la caja y la base con tablones y aglomerado de madera respectivamente. En la
parte delantera colocamos una caja diseñada a medida de aglomerado de madera
para posicionar en ella el joystick, la pantalla y el pulsador. También la utilizamos
para contener todo el circuito del proyecto, tanto cables como protoboard, etc.

      A continuación, elaboramos unas poleas de cartón para hacer subir y
bajar la garra, estructura que va sujeta en la parte superior del proyecto,
sobre los ejes que son manejados por el joystick.

     Hecho todo esto,
empezamos a decorar nuestro proyecto forrándolo con papel de regalo por los
bordes de madera y utilizamos plástico para los laterales de la máquina y así
obtener el efecto de cristal de las máquinas de juguetes normales. 

4. Implementación

     La tabla
adjuntada continuación corresponde con las señales que reciben los motores en
función de la acción que marquemos con el joystick, para INX (donde x es
1,2,3,4), o con el botón de subida y bajada de la garra, para INXG (donde x es
1,2) :



Abajo
Arriba
Derecha
Izquierda
IN1
High
Low
IN2
Low
High
IN3
Low
High
IN4
High
Low
IN1G
High
Low
IN2G
Low
High


El
circuito resultante es el siguiente:
Y, por último, se proporciona el código
Arduino del proyecto. Este consta de estados simulados mediante booleanos, pues
solo se debe permitir la activación de una serie de componentes en función del
tiempo transcurrido desde el inicio de la máquina. Haciendo uso de la pantalla
LCD, se le transmitirá al usuario la acción permitida en ese momento, “Mover
joystick”, “Pulsa el botón para bajar” …

En cuanto a detalles a comentar de la
programación:

  •   Uso de los
    puertos analógicos como digitales para el módulo L298N.
  •    Uso de la función
    millis () para simular multitarea: el uso de esta función permite evaluar el
    tiempo transcurrido desde que se inicia el circuito, haciendo así la distinción
    de si ha expirado el tiempo suficiente para una acción u otra.
  • Enlazando con el
    punto anterior, se toma como margen de interferencias entre componentes unos
    250 ms.


#include
<LiquidCrystal.h>
LiquidCrystal
lcd (8, 9, 10, 11, 12, 13);
int
pulsadorAbajo=4;
int
pulsadorIzq=5;
int
pulsadorArriba=6;
int
pulsadorDch=7;

int
pulsadorGarra=3;
int
pulsadorGarraState=LOW;
int
pulsadorArribaState = LOW;
int
pulsadorDchState = LOW;
int
pulsadorAbajoState = LOW;
int
pulsadorIzqState = LOW;
int
IN3=A2;
int
IN4=A3;
int
IN2=A1;
int
IN1=A0;
int
IN2G=A4;
int
IN1G=A5;
bool
estado1=false;
bool
estado0=true;
bool
estado2=false;
bool
estado3=false;
bool
estado4=false;
bool
estado5=false;
unsigned
long previousMillis1 = 0;
unsigned
long previousMillis2 = 0;
unsigned
long previousMillis3 = 0;
unsigned
long previousMillis4 = 0;
unsigned
long previousMillisEstado2 = 0;
long
OnTime1 = 250;
long
OffTime1 = 300;
long
OnTime2 = 300;
long
OffTime2 = 300;
long
OnTime3 = 250;
long
OffTime3 = 250;
long
OnTime4 = 300;
long
OffTime4 = 300;
void
setup() {
  Serial.begin(9600);
  pinMode(pulsadorAbajo, INPUT); 
  pinMode(pulsadorArriba, INPUT);
  pinMode(pulsadorDch, INPUT); 
  pinMode(pulsadorIzq, INPUT);
  pinMode(pulsadorGarra, INPUT);
  pinMode (IN1, OUTPUT);    
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);    
  pinMode (IN4, OUTPUT);

  pinMode(IN1G,OUTPUT);

  pinMode (IN2G, OUTPUT);
  lcd.begin(16, 2);
  lcd.print(“Bienvenido”);
}
void
loop() {
 
  estadoCero();
}
void
estadoCero(){
  while(estado0){
    delay(1000);
    lcd.setCursor(0,0);
    lcd.print(“Mueva joystick”);   
    estado0=false;
  }
  estado1=true;   
  estadoUno();
}
void
estadoUno(){
  while(estado1){
   
    while(30000-millis()>0){
      moverGarra();      
    }
    estado2=true;
    estado1=false;   
  }
  estadoDos();
}
void
estadoDos(){
  while(estado2){
    lcd.setCursor(0,0);
    lcd.print(“Pulse el boton”);
    lcd.setCursor(0,1);
    lcd.print(“Abajo”);
    //previousMillis2=7000+millis();
    while(37000-millis()>0){
      bajarGarra();
    }
    estado3=true;
    estado2=false;
  }
    estadoTres();
}

void
estadoTres(){
while(estado3){
    lcd.setCursor(0,1);
    lcd.print(“Arriba”);
    //previousMillis2=7000+millis();
    while(44000-millis()>0){
      subirGarra();
    } 
    estado4=true; 
    estado3=false;
  }
    estadoCuatro();
}
void
estadoCuatro(){
  while(estado4){
    //previousMillis2=10000+millis();
    lcd.setCursor(0,0);
    lcd.print(“Mueva joystick”);
    lcd.setCursor(0,1);
    lcd.print(”      “);
    while(60000-millis()>0){
      moverGarra();
    }
    estado5=true;
    estadoCinco();  
    estado4=false;
  }
 
}
void
estadoCinco(){
  while(estado5){
    lcd.setCursor(0,0);
    lcd.print(“Pulse el boton”);
    lcd.setCursor(0,1);
    lcd.print(“Abajo”);
    //previousMillis2=7000+millis();
    while(67000-millis()>0){
      bajarGarra();
    }
    estado5=false;
    lcd.setCursor(0,1);
    lcd.print(”     “);
    lcd.setCursor(0,0);
    lcd.print(”             “);   
   
  }
  lcd.print(“Fin”);

  digitalWrite(IN1,LOW);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,LOW);
  digitalWrite(IN1G,LOW);
  digitalWrite(IN2G,LOW);
}
void
moverGarra(){
  unsigned long currentMillis = millis(); 
  pulsadorAbajoState=digitalRead(pulsadorAbajo); 
  pulsadorDchState=digitalRead(pulsadorDch);
 
pulsadorArribaState=digitalRead(pulsadorArriba);
  pulsadorIzqState=digitalRead(pulsadorIzq);
 
//_____________________________________________________________________________________________________
  if((pulsadorAbajoState == HIGH) &&
(currentMillis – previousMillis1 >= OnTime1))
  {   
    while(digitalRead(pulsadorAbajo) ==
HIGH){ 
      previousMillis1 = currentMillis; //
Remember the time 
      digitalWrite(IN1,HIGH); // Update the
actual MOTOR
      digitalWrite(IN2,LOW);
    }
  }
  else if ((pulsadorAbajoState == LOW)
&& (currentMillis – previousMillis1 >= OffTime1))
  {
     // turn it on
    previousMillis1 = currentMillis; //
Remember the time
    digitalWrite(IN1,LOW);
   
    // Update the actual MOTOR
    // Update the actual MOTOR
  }
 
//_____________________________________________________________________________________________________
  if((pulsadorIzqState == HIGH) &&
(currentMillis – previousMillis2 >= OnTime2))
  {
    // Turn it on
    while(digitalRead(pulsadorIzq) == HIGH){
      previousMillis2 = currentMillis; //
Remember the time
      digitalWrite(IN3,HIGH); // Update the
actual MOTOR
      digitalWrite(IN4,LOW);
    }

  }
  else if ((pulsadorIzqState == LOW) &&
(currentMillis – previousMillis2 >= OffTime2))
  {
     // turn it off
    previousMillis2 = currentMillis; //
Remember the time
    digitalWrite(IN3,LOW);
    // Update the actual MOTOR
    // Update the actual MOTOR
  }
//_____________________________________________________________________________________________________
  if((pulsadorArribaState == HIGH) &&
(currentMillis – previousMillis3 >= OnTime3))
  {
    // Turn it on
    while(digitalRead(pulsadorArriba) == HIGH){
      previousMillis3 = currentMillis; //
Remember the time
      digitalWrite(IN2,HIGH); // Update the
actual MOTOR
      digitalWrite(IN1,LOW);
    }
  }
  else if ((pulsadorArribaState == LOW)
&& (currentMillis – previousMillis3 >= OffTime3))
  {
     // turn it off
    previousMillis3 = currentMillis; //
Remember the time
    digitalWrite(IN2,LOW);
    // Update the actual MOTOR
    // Update the actual MOTOR
  }
 
//_____________________________________________________________________________________________________
  if((pulsadorDchState == HIGH) &&
(currentMillis – previousMillis4 >= OnTime4))
  {
    // Turn it on
    while(digitalRead(pulsadorDch) == HIGH){
      previousMillis4 = currentMillis; //
Remember the time
      digitalWrite(IN4,HIGH); // Update the
actual MOTOR
      digitalWrite(IN3,LOW);
    }
  }
  else if ((pulsadorDchState == LOW) &&
(currentMillis – previousMillis4 >= OffTime4))
  {
     // turn it off

    previousMillis4 = currentMillis; //
Remember the time
    digitalWrite(IN4,LOW);
    // Update the actual MOTOR
    // Update the actual MOTOR
  }
}
void
subirGarra(){
  //unsigned long currentMillis =
millis(); 
  pulsadorGarraState=digitalRead(pulsadorGarra);
  if(pulsadorGarraState == HIGH)
  {
    digitalWrite(IN2G,HIGH); // Update the
actual MOTOR
    digitalWrite(IN1G,LOW);
  }else if (pulsadorGarraState == LOW)
  {
    digitalWrite(IN2G,LOW);
  }
}
void
bajarGarra(){
  //unsigned long currentMillis =
millis(); 
 
pulsadorGarraState=digitalRead(pulsadorGarra);
  if(pulsadorGarraState == HIGH)
  {
    digitalWrite(IN1G,HIGH); // Update the
actual MOTOR
    digitalWrite(IN2G,LOW);
  }else if (pulsadorGarraState == LOW)
  {
   
digitalWrite(IN1G,LOW);
  }

}


5. Problemas
encontrados

·  Rodamientos
y ejes.
Este sistema consiste en un conjunto de
tornillos y tuercas junto a rodamientos de patín con lija y estaño, simulando
el tope del carril.
Las principales dificultades fueron:
Ø 
El estaño no se adhería correctamente al
rodamiento, lo que ocasionaba que la cuerda no circulase correctamente.
Ø 
Las cuerdas debían de tener un orden, tanto para
su correcto movimiento, como para su unión con las barras. Además de que la
tensión de las mismas debía ser lo suficientemente fuerte como para no resbalar
en la polea y el rodamiento.

Ø 
Las barras debían de haber sido más largas pues
estas se enganchan con la cuerda de algún eje como consecuencia del movimiento
de la garra.
·  Conexión de la garra mediante la cuerda.
El sistema de poleas que se encarga del
movimiento de subida y bajada de la garra, consta de 3 poleas y dos topes de
metal (trozo de varilla de aluminio).
Los problemas con este mecanismo fueron:
Ø 
La presión ejercida sobre las poleas no fue la
suficiente en un principio y estas no se movían adecuadamente.
Ø 
Es importante tanto el sentido como la cantidad
de cuerda enrollada que se debe colocar previamente antes de pegar la cuerda
con pegamento a la polea. 1 vuelta de diferencia en la polea grande antes de
pegar en la pequeña concretamente.
·  Código
(delay y multitarea).
En un principio, y como novatos en
la programación de Arduino, se intentaron programar los componentes con la
función delay(). Más tarde y en consecuencia de que los componentes no
respondían de manera adecuada a las señales, se hizo uso de millis(), como se
comenta en el apartado anterior de implementación.

·   La
pantalla.

La pantalla LCD posee unos contactos
de tamaño reducido y demasiado próximos unos a otros, esto ocasiono que en
primer momento se visualizaran mensajes incomprensibles en lugar de los
correctos. Como solución, soldamos con estaño fino los cables a los contactos.
·  Integrar
todo.
Tanto el montaje de todos los
componentes juntos, como la programación de los mismos en su conjunto. Lo
primero debido a que se debe de medir el tamaño de los cables y tener una idea
previa de la colocación de los componentes en la estructura. Lo segundo, en
relación al gran numero de componentes y señales empleadas en el código,
conseguir que todo funcionase adecuadamente fue resultado de múltiples ajustes.

·   Puente
H y consumo de energía

El
joystick y la respuesta correcta de los motores se probo en un primer momento
sin la goma elástica que conecta la polea y el motor. Esta respuesta era
correcta pero al incorporar la goma elástica el motor perdía potencia y no era
capaz de mover adecuadamente el Sistema de ejes. Mediante el multímetro
comprobamos que el Puente H no le enviaba el voltaje suficiente a los motores
puesto que este sin razón aparente descendía debido al rozamiento de la goma
elastica. Como solución, comprobamos el amperaje de las pilas que teníamos en
posesión y colocamos en serie las de mayor amperaje. Gracias a esto nos fuimos
conscientes de que aunque nuestras pilas eran de nueve voltios, las que usamos
en un primer momento no poseían el amperaje, y la potencia, suficiente.

6. Conclusiones

Haciendo un balance de todo, la primera conclusión que sacamos en cuanto a la relación del precio en el mercado nos damos cuenta de que una maquina de este estilo sale más barata comprarla aunque diseñar la tuya propia también le aporta mucha originalidad. 
En cuanto a la lista de posibles mejoras, destacamos :
  • Barras de ejes más grandes. En la parte del diseño y del montaje debíamos de haber hecho los ejes unos centímetros más largos ya que uno de los problemas que teníamos era que no se deslizaban bien porque se quedaban sin superficie, es decir, debíamos de haberles dado algo más de margen en cuanto al tablero que los contiene. 
  • Mejorar la colocación de la caja de mandos. Hacerla más grande ya que los cables no caben y e quedan en la superficie de movimiento de la garra. 
  • Cuerda de los ejes más resistentes. Encontrar un tipo de cuerda (o material similar) mejor para que los ejes de deslicen con mayor facilidad. Esto de debe a las numerosas ocasiones en las que hemos tenido que cambiar las cuerdas porque se aflojaban, se deshilaban o simplemente el material no era el adecuado por lo que los ejes no se podían mover. 
  • Estabilizar el problema de la garra con un contrapeso. Es decir, ponerle algo para que no se enreden las cuerdas que la sujeten, pero que a la vez no sea muy pesado ya que en caso contrario las poleas no tendrían la fuerza necesaria para tirar de ella. 

7. Vídeo demostrativo 


También te podría gustar...

Deja un comentario

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