Proyecto 47.1 Puente Grúa

23 de mayo de 2020

En el siguiente tutorial veremos como hacer un puente grúa controlado con Arduino. 

Utilizaremos como es costumbre en este sitio, materiales y piezas reciclados de viejos equipos electrónicos. La grúa consiste en un perfil de aluminio con una cremallera dentada en una de sus caras. Esta pieza salió de una juke box para disco ópticos, un sistema de almacenaje de datos que está obsoleto. Las ruedas son los rodillos de arrastre de una vieja impresora de tinta y las patas del pórtico son unos perfiles de aluminio desechados de un equipo electrónico. 

Piezas para el montaje del Puente Grúa.

1. Montaje Mecánico

Para empezar, introducimos el carro por uno de los lados del perfil. En su función original, el perfil va en posición vertical, montado frente a una torre de grabadores de discos ópticos. Un motor se encarga de subir y bajar el carro y otro motor va introduciendo discos vírgenes y sacado los que ya están grabados. 

Del carro original sólo he conservado los engranajes, desechando el resto. Ahora se desplaza en horizontal.

A continuación montamos las patas, una a cada lado. 

Los motores también son reciclados. Se trata de cuatro motores de 12 Vdc con reductora. Los dos motores de la izquierda salieron del colimador automático de un Arco-C y los dos de la derecha de la bandeja de un viejo escáner dicomizador. 

Primero montamos el motor del eje X que mueve el carro de derecha a izquierda. 

En la parte frontal va el motor que sube y baja la pinza o el gancho de la grúa, dependiendo del útil que montemos. 

Las patas del puente grúa tienen mecanizadas dos roscas M6 que aprovecharemos para montar las ruedas. 

Como dije un poco más arriba, las ruedas las he sacado del mecanismo de arrastre de papel de una vieja impresora de tinta. El diámetro del eje de las ruedas es de 8 mm y el tornillo de fijación es M6, así que he impreso un casquillo de ajuste para que las ruedas giren sin holgura. 

La polea de transmisión de paso T2.5 está impresa en 3D y la he encontrado en Thingiverse.

La polea va atornillada desde dentro con tres pequeños tornillos. Ver rueda derecha en la imagen siguiente. 

Con dos tornillos M6 fijamos las ruedas. 

A continuación montamos el motor y la correa. Para sujetar el motor utilizamos dos tornillos M4x20 que roscan directamente en el perfil de aluminio. 

En la imágen siguiente vemos el sistema de transmisión visto desde atrás. 

Repetimos el proceso en el otro lado del puente grúa y finalizamos el montaje mecánico. 

Vista trasera del puente grúa. 

2. Consola de control

Para controlar el puente grúa voy a aprovechar componentes de otro proyecto mío. La consola consta de un joystick para el movimiento lateral (eje X) y para subir-bajar el útil que pongamos en la grúa. 

Con los botones movemos el puente adelante, atrás y girar a la derecha e izquierda. Con el potenciómetro abrimos y cerramos la pinza accionada con un micro servo tipo SG90. 

Consola de Control. Vista frontal. 

Consola de Control. Vista trasera. 

Para el montaje de la consola he utilizado dos listones unidos con una pieza de metacrilato que servirá para montar la electrónica. En la imagen de arriba vemos de derecha a izquierda, la tarjeta Optoswitches Interface, el Arduino NANO, los dos drivers L293D y el regulador de tensión. 

La pinza la he encontrado en Thingiverse - gracias a Laura Plourde por compartir-. 

Para montar el servo -de tipo SG90- he tenido que rebajar los laterales con una lima. Es posible que la pinza esté diseñada para un modelo de servo con otro sistema de fijación. En cualquier caso no supone mayor problema. 

3. Esquema

Todo el circuito se alimenta con una fuente de 12V y 1.5A de un viejo router.

Para no sobrecargar el regulador del Arduino Nano, voy a emplear un regulador externo para alimentar la electrónica de la Consola de Control, es decir, el Arduino Nano, la tarjeta de interface y los dos drivers L293D para los motores de CC.

Tanto el joystick como los pulsadores se podrían conectar directamente al Arduino poniendo un resistencia pull-down de 10K y un condensador de 100nF para eliminar el debounce, pero como lo tenía así conectado de proyectos anteriores -ver  aquí y aquí- he decidido utilizarlo tal cual. 

Para controlar los motores he utilizado dos drivers L293D de Deek-Robot ya soldados en placa con sus conectores correspondientes. 

Para los motores Z, X he conectado las señales Enable 1 y 2 directamente a +5V, porque los motores se mueven lo suficientemente despacio y no necesitan control PWM, además andamos justos de pines en el Arduino y liberamos dos que pueden servir a otros propósitos.

Sin embargo los motores que mueven el puente sí necesitan control PWM, ya que no queremos que una estructura grande y pesada se desplace a toda velocidad. Con un switch conmutamos entre velocidad media-baja para estos motores.

4. Sketch

El sketch para el Arduino no tiene mayor dificultad.

Con una estructura switch-case monitorizamos que pulsador se acciona en cada momento e invocamos la función que corresponda.

El servo para la pinza lo controlamos con un potenciómetro conectado en A7. El código para el servo es el del ejemplo Servo Knob que viene con la librería Servo.h

A continuación el código:

/*

Proyecto xx - Puente Grua

Written by Angel M

ver 3 con switch High / Low Speed

https://sites.google.com/site/angmuz/

Public domain

*/


#include <Servo.h> 

 

Servo myservo;

int potpin = A7;  // analog pin used to connect the potentiometer

int val;


int in1MotorX = 11;

int in2MotorX = 10;


int in1MotorZ = 9;

int in2MotorZ = 8;


int enableMotorY1 = 6;

int in1MotorY1 = 4;

int in2MotorY1 = 2;


int enableMotorY2 = 5;

int in1MotorY2 = 0;

int in2MotorY2 = 1;


int speedSwitch = 7;

int speedControl = 0;

int PWM = 0;


int command = 0;


void setup()

{

  //Serial.begin(9600);

  

  // Entradas

  pinMode(7, INPUT);  // Speed Control Switch

  pinMode(12, INPUT); // girar puente a la derecha   

  pinMode(13, INPUT); // girar puente a la izquierda

  pinMode(14, INPUT); // mover grua a la derecha   A0 = pin 14

  pinMode(15, INPUT); // mover grua a la izqda     A1 = pin 15

  pinMode(16, INPUT); // subir pinza               A2 = pin 16

  pinMode(17, INPUT); // bajar pinza               A3 = pin 17

  pinMode(18, INPUT); // mover puente adelante     A4 = pin 18

  pinMode(19, INPUT); // mover puente atrás        A5 = pin 19


  myservo.attach(3);

  myservo.write(90);


  //Salidas

  pinMode(0, OUTPUT); // in1MotorY2

  pinMode(1, OUTPUT); // in2MotorY2

  pinMode(2, OUTPUT); // in2MotorY1

  pinMode(4, OUTPUT); // in1MotorY1

  pinMode(5, OUTPUT); // enableMotorY2

  pinMode(6, OUTPUT); // enableMotorY1

  pinMode(8, OUTPUT); // in2MotorZ

  pinMode(9, OUTPUT); // in1MotorZ

  pinMode(10, OUTPUT); // in2MotorX  

  pinMode(11, OUTPUT); // in1MotorX

 

}

 

void loop()

{


  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)

  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)

  myservo.write(val);                  // sets the servo position according to the scaled value

  delay(15);

  

if (digitalRead(12)==HIGH)

    {

      command=12; // girar a la derecha

    }

if (digitalRead(13)==HIGH)

    {

      command=13; // girar a la izquierda

    }

if (digitalRead(14)==HIGH)

    {

      command=14; // mover grua a la derecha

    }

if (digitalRead(15)==HIGH)

    {

      command=15; // mover grua a la izquierda

    }

if (digitalRead(16)==HIGH)

    {

      command=16; // subir pinza

    }

if (digitalRead(17)==HIGH)

    {

      command=17; // bajar pinza

    }

if (digitalRead(18)==HIGH)

    {

      command=18; // mover puente adelante

    }

if (digitalRead(19)==HIGH)

    {

      command=19; // mover puente atras

    }


 switch(command)

 {


  case 12: girarDerecha();   break;

  case 13: girarIzquierda(); break;

  case 14: moverDerecha();   break;

  case 15: moverIzquierda(); break;

  case 16: subirGrua();      break;

  case 17: bajarGrua();      break;

  case 18: moverAdelante();  break;

  case 19: moverAtras();     break;

  default: parar();          break;

 }

 command=0;


}


void girarDerecha()

 {

    analogWrite(enableMotorY1, 16);

    analogWrite(enableMotorY2, 16);

    digitalWrite(in1MotorY1, HIGH);

    digitalWrite(in2MotorY1, LOW);     

    digitalWrite(in1MotorY2, HIGH);

    digitalWrite(in2MotorY2, LOW);

 }


void girarIzquierda()

 {

    analogWrite(enableMotorY1, 16);

    analogWrite(enableMotorY2, 16);

    digitalWrite(in1MotorY1, LOW);

    digitalWrite(in2MotorY1, HIGH);     

    digitalWrite(in1MotorY2, LOW);

    digitalWrite(in2MotorY2, HIGH); 

 }


void moverAdelante()

  {

    speedControl = digitalRead(speedSwitch);

    if (speedControl==HIGH){

      PWM=32;

    }

    else{

      PWM=16;

    }

    analogWrite(enableMotorY1, PWM);

    analogWrite(enableMotorY2, PWM);

    digitalWrite(in1MotorY1, HIGH);

    digitalWrite(in2MotorY1, LOW);     

    digitalWrite(in1MotorY2, LOW);

    digitalWrite(in2MotorY2, HIGH); 

  }


void moverAtras()

  {

    speedControl = digitalRead(speedSwitch);

    if (speedControl==HIGH){

      PWM=32;

    }

    else{

      PWM=16;

    }

    

    analogWrite(enableMotorY1, PWM);

    analogWrite(enableMotorY2, PWM);

    digitalWrite(in1MotorY1, LOW);

    digitalWrite(in2MotorY1, HIGH);

    digitalWrite(in1MotorY2, HIGH);

    digitalWrite(in2MotorY2, LOW);

  }

void moverDerecha()

  {

    digitalWrite(in1MotorX, LOW);

    digitalWrite(in2MotorX, HIGH); 

  }


void moverIzquierda()

  {

    digitalWrite(in1MotorX, HIGH);

    digitalWrite(in2MotorX, LOW);

  }

  

void subirGrua()

  {

    digitalWrite(in1MotorZ, HIGH);

    digitalWrite(in2MotorZ, LOW); 

  }


void bajarGrua()

  {

    digitalWrite(in1MotorZ, LOW);

    digitalWrite(in2MotorZ, HIGH);

  }


void parar()

  {

    digitalWrite(in1MotorX, LOW);

    digitalWrite(in2MotorX, LOW);

    digitalWrite(enableMotorY1, LOW);

    digitalWrite(in1MotorY1, LOW);

    digitalWrite(in2MotorY1, LOW);

    digitalWrite(enableMotorY2, LOW);

    digitalWrite(in1MotorY2, LOW);

    digitalWrite(in2MotorY2, LOW);

    digitalWrite(in1MotorZ, LOW);

    digitalWrite(in2MotorZ, LOW);

    

  }


En el siguiente vídeo puedes ver una demostración del funcionamiento del puente grúa.

Podemos mover el puente hacia adelante y hacia atrás, girar a la derecha e izquierda y jugar a coger pequeños objetos con la pinza. También podemos sustituir la pinza por un gancho, colocar una pequeña cesta o lo que a cada uno se le ocurra.

Espero que os haya gustado.

¡Hasta pronto!

Descargas

Descarga el esquema y el código aquí abajo.