Proyecto 47.3 Puente Grúa RC Bluetooth

23 de mayo de 2020

Siguiendo la tradición de este humilde blog, -do it, do it right & do it better- voy a actualizar el proyecto del puente grúa añadiendo dos mejoras: una reductora para los motores de tracción y un control remoto por bluetooth, de modo que controlaremos la grúa con un móvil Android.

El primer cambio viene a cuenta de que los motores que mueven el puente grúa -aunque tienen reductora- giran muy deprisa. Una solución es añadir control PWM para reducir la velocidad, pero para que se mueva con precisión, es decir, despacio, hay que bajar tanto los pulsos PWM que los motores no tienen fuerza para mover el puente. De modo que la mejor solución es añadir una reductora externa, que nos permitirá mover la grúa con precisión, sin reducir el par en los motores.

La segunda mejora en el diseño se hace necesaria para mejorar la movilidad de la grúa; como se aprecia en los diseños anteriores, el cableado entre los motores y la consola de control, dificulta la maniobrabilidad del puente. Al añadir un control remoto, podemos incluir en la propia estructura del puente, tanto la alimentación como los drivers de los motores, eliminando el cableado del joystick y dotando a la grúa de total libertad de movimientos.

Primera parte: Reductora

Para implementar la reductora, lo ideal hubiera sido disponer de un tren de engranajes o de una reductora planetaria, pero mis conocimientos de CAD no llegan a tanto y lo que he visto en los repositorios no se adapta a mis necesidades. Así que he tirado de ingenio y lo he solucionado a base de poleas y correas. No es una solución muy ortodoxa, pero es funcional y resuelve el problema, que es de lo que se trata.

Después de múltiples pruebas y ensayos, para montar la reductora voy a emplear tres poleas y dos correas GT2. La idea es la siguiente: el motor ataca una polea de 60 dientes que tiene solidaria otra polea pequeña de 20 dientes, a su vez, esta polea ataca otra polea mayor, también de 60 dientes. El funcionamiento es similar al cambio de una bicicleta, para reducir la velocidad colocamos un plato pequeño atacando un piñón grande. 

Dos de las poleas las he encontrado en thingiverse y la tercera la tenía por casa, desmontada de un viejo escáner.

La imagen siguiente muestra dos poleas, una de 20 dientes y otra de 60. Ambas las he modificado a partir del archivo stl original. A la polea pequeña la he añadido un soporte para poder fijarla y a la polea grande la he añadido un casquillo para reducir el diámetro del eje de 8 a 6 mm. Más info sobre como modificar un stl aquí

GT2 Pulleys courtesy of thingiverse.

Polea de 60 dientes desmontada de un escaner.

El conjunto va montado sobre un soporte de 4mm de espesor impreso en 3D. Todos los agujeros son ranurados para tensar adecuadamente las correas dentadas. 

Montaje de la reductora

Una vez impresas las poleas, procedemos a su montaje. La polea de 60 dientes la fijamos a la rueda con dos tornillos. Hacemos los taladros pertinentes para iniciar los agujeros...

...y atornillamos la polea a la rueda desde dentro. 

Para el montaje de la polea primaria solo hay que introducir la polea pequeña en el eje. 

Al final no tuve que atornillarla porque entra justa en el eje.

Disponemos todos los elementos sobre la mesa y procedemos a montar la reductora. 

Con dos tornillos M4 fijamos la polea primaria al soporte. De momento apretamos los tornillos a mano, para tener algo de juego a la hora de colocar los elementos en el soporte. 

A continuación montamos el motor… 

...y colocamos la correa. 

Con dos tornillos M6, montamos las dos ruedas en la pata de puente grúa. 

Luego montamos el conjunto motor + reductora y lo fijamos con una tuerca al mismo tornillo M6 que sujeta la rueda con la polea de 60 dientes. 

Vista trasera del conjunto. 

Por último colocamos la segunda correa, que transmite el movimiento a la rueda. Todos los agujeros de fijación son ranurados, de modo que tensamos las correas según corresponda y cuando todo esté en su lugar apretamos definitivamente los tornillos. 

Repetimos el proceso en el lado derecho del puente y con eso damos por finalizado el montaje mecánico. En la imagen siguiente podemos ver la vista trasera del puente grúa.

Puente grúa. Vista trasera.

Puente grúa. Vista frontal.

Segunda parte: Control Remoto

El control remoto lo implementaremos con una aplicación para móviles Android. Esta app la hemos utilizado ampliamente en anteriores proyectos, por ejemplo aquí y aquí, así que no me voy a extender mucho en su funcionamiento. Consulta los enlaces anteriores para más información.

Lo primero es modificar el esquema original. Eliminaremos el joystick y añadiremos un módulo bluetooth HC-05. Alimentaremos la grúa con tres baterías 18650 y un regulador de 5V. Al prescindir del joystick el circuito se simplifica bastante.

A continuación montamos toda la electrónica en la propia grúa. Para tal menester he impreso un soporte donde irán montados todos los componentes. 

Disponemos los componentes sobre la mesa de trabajo…

Componentes electrónicos.

... y procedemos a su montaje y conexión. 

conexión de los componentes.

Para montar la placa de electrónica, voy a mecanizar dos roscas M4 en una de las patas, después atornillamos dos separadores hexagonales...

...y con dos tornillos M4 fijamos la electrónica. Después conectamos los motores, la alimentación y el servo. 

Todo el circuito se alimenta con tres baterías de litio 18650 que dan aproximadamente 12V. Para alojar las baterías he impreso un portapilas que encontré en Thingiverse -gracias a AnalogDan por compartir- y con unos portafusibles desoldados de una PCB hacemos los contactos. 

Así queda el portabaterías terminado. 

Las baterías van en el lado derecho. Para fijarlas he impreso una abrazadera que va atornillada a la pata con un tornillo M4. 

Sketch

Para terminar programamos el Arduino NANO con el nuevo código.

El código para el Arduino lo he picado partiendo del sketch del Proyecto 20.3 y añadiendo las funciones del sketch original de la grúa Proyecto 47.2.

Aquí se presenta un problema; tenemos más motores que pulsadores de control tiene la app. Es decir, con los cuatro pulsadores de la app, podemos subir y bajar la pinza y mover el carro de la grúa de derecha a izquierda ¿pero cómo movemos el puente?

Para solucionar este problema he añadido en el sketch una variable Y que corresponde con el botón de las luces de emergencia. Al pulsar en el icono del triángulo hacemos Y = 1. Cuando dicho pulsador está en reposo Y = 0. Entonces en función del valor de Y, al pulsar los botones principales, moveremos la grúa o el puente. Veamos un ejemplo:

Cuando pulsamos el icono del Warning el móvil envía por bluetooth el comando 'X' haciendo Y = 1; Si lo dejamos en reposo Y = 0;

case 'X':

 Y = 1;

 break;

 case 'x':

 Y = 0;

 break;

'F' es el comando que envía el móvil cuando pulsamos el botón de avanzar (Forward). Dependiendo del valor de Y el sketch invoca a una función u otra, así conseguimos controlar dos motores con un solo botón.

case 'F':

 if (Y==0) {

 subirGrua();

 }

 if (Y==1) {

 moverAdelante();

 }

 break;

La apertura y cierre de la pinza la controlamos con la barra deslizante que hay en la esquina superior derecha de la pantalla.

A continuación el código para Arduino:

/* 

   Puente Grúa Radiocontrol Bluetooth

   ver 2. todos movimientos OK con SERVO 

   Basado en el original de Andi.co https://sites.google.com/site/bluetoothrccar/

   Modificado por un servidor: Angel M. https://sites.google.com/site/angmuz/

*/


#include <Servo.h>

Servo myservo;


int Y = 0;


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 = 7;

int in2MotorY2 = 12;


char command = 'S';

 

void setup() {

  

  Serial.begin(38400);

  myservo.attach(3);

  myservo.write(90);

    

  // sets the pins as outputs:

  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

    

}


// Funciones


// si el comando es 'S' paramos todos los motores

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);

    

  } 

  

// si el comando es 'F' subimos la pinza

void subirGrua()

  {

    digitalWrite(in1MotorZ, HIGH);

    digitalWrite(in2MotorZ, LOW); 

  }


// si el comando es 'B' bajamos la pinza

void bajarGrua()

  {

    digitalWrite(in1MotorZ, LOW);

    digitalWrite(in2MotorZ, HIGH);

  }


// si el comando es 'R' movemos la pinza a la derecha

void moverDerecha()

  {

    digitalWrite(in1MotorX, LOW);

    digitalWrite(in2MotorX, HIGH); 

  }

// si el comando es 'L' movemos la pinza a la izquierda

void moverIzquierda()

  {

    digitalWrite(in1MotorX, HIGH);

    digitalWrite(in2MotorX, LOW);

  }

  

void moverAdelante()

  {

    analogWrite(enableMotorY1, 64);

    analogWrite(enableMotorY2, 64);

    digitalWrite(in1MotorY1, LOW);

    digitalWrite(in2MotorY1, HIGH);     

    digitalWrite(in1MotorY2, LOW);

    digitalWrite(in2MotorY2, HIGH); 

  }


void moverAtras()

  {

    analogWrite(enableMotorY1, 64);

    analogWrite(enableMotorY2, 64);

    digitalWrite(in1MotorY1, HIGH);

    digitalWrite(in2MotorY1, LOW);

    digitalWrite(in1MotorY2, HIGH);

    digitalWrite(in2MotorY2, LOW);

  }

void girarIzquierda()

 {

    analogWrite(enableMotorY1, 64);

    analogWrite(enableMotorY2, 64);

    digitalWrite(in1MotorY1, LOW);

    digitalWrite(in2MotorY1, HIGH);     

    digitalWrite(in1MotorY2, HIGH);

    digitalWrite(in2MotorY2, LOW);

 }


void girarDerecha()

 {

    analogWrite(enableMotorY1, 64);

    analogWrite(enableMotorY2, 64);

    digitalWrite(in1MotorY1, HIGH);

    digitalWrite(in2MotorY1, LOW);     

    digitalWrite(in1MotorY2, LOW);

    digitalWrite(in2MotorY2, HIGH); 

 }


void loop() {  

  

    //if some date is sent, reads it and saves in command

    if(Serial.available() > 0){

      command = Serial.read();

      Serial.print(command);

      

        switch(command){

          case 'X':

            Y = 1;

            break;

          case 'x':

            Y = 0;

            break;

          case 'S':

            parar();

            break;

          case '0':

            myservo.write(180); ;

            break;

          case '1':

            myservo.write(162); ;

            break;

          case '2':

            myservo.write(144); ;

            break;

          case '3':

            myservo.write(126);

            break;

          case '4':

            myservo.write(108); 

            break;  

          case '5':

            myservo.write(90); 

            break;           

          case '6':

            myservo.write(72); ;

            break;

          case '7':

            myservo.write(54); ;

            break;

          case '8':

            myservo.write(36); ;

            break;

          case '9':

            myservo.write(18);

            break;

          case 'q':

            myservo.write(0); 

            break;

          case 'F':

          if (Y==0) {

            subirGrua();

            }

          if (Y==1) {

            moverAdelante();

            }

            break;

          case 'B':

          if (Y==0) {

            bajarGrua();

            }

          if (Y==1) {

            moverAtras();

            }

            break;

          case 'R':

          if (Y==0) {

            moverDerecha(); 

            }

          if (Y==1) {

            girarDerecha();

            }

            break;

          case 'L':

          if (Y==0) {

            moverIzquierda();

            }

          if (Y==1) {

            girarIzquierda();

            }

            break;

           }

          }  

}


Aplicación Bluetooth RC Car

Descarga la App Bluetoot RC CAR desde Play Store.

Sube el código al Arduino, abre la aplicación Bluetooth RC Car y clic en Settings.

Seleccionar Connect to car, en la lista de dispositivos, seleccionamos HC-05 y ponemos el PIN 1234.

Si el módulo HC-05 que estás utilizando es nuevo, es posible que el móvil se vincule con la configuración que éste trae por defecto, pero si al segundo intento no se conecta, quizás debas configurar los parámetros del módulo HC-05 como explico en el Proyecto 20.3.

Una vez el móvil se vincula con el módulo HC-05, el icono rojo pasa a verde y al pulsar sobre los mandos, el puente grúa actuará en consecuencia.

Si el botón de Warning está desactivado, lo que movemos es el carro de la grúa.

Si activamos el botón de Warning, al pulsar sobre las flechas lo que movemos será el puente grúa. A continuación puedes ver un vídeo demostrativo del funcionamiento.

Como en proyectos anteriores en los que hemos utilizado esta App para controlar coches teledirigidos, sería muy fácil añadir unos ledes y un zumbador a la grúa. Pero eso os lo dejo como tarea.

Espero que os haya gustado y hasta pronto.

Links

Consulta los precedentes de este proyecto en los siguientes enlaces.

Proyecto 47.1 - Puente Grúa v1

Proyecto 47.2 - Puente Grúa v2

Tutorial oficial Bluetooth RC car. (Thanks to Andi. Co)


Descargas

Puedes descargar el esquema, los archivos SketchUp y .STL y el código para Arduino en el siguiente enlace.