Mano robótica Arduino con tres servomotores y piezas LEGO

Os presentamos una sencilla mano robótica, motorizada con tres servomotores, controlada con Arduino / Genuino, y construida con piezas LEGO.

Está programado para realizar una secuencia de movimientos predeterminada.

Esperamos que os guste.

Aquí te explicamos paso a paso el diseño, los componentes, los códigos, etc. Si quieres aprender y tienes un proyecto en mente y voluntad, encontrarás fácilmente la información que te ayudará a realizar tu proyecto y ejecutarlo fácilmente.





Componentes, materiales y funcionamiento

Este prototipo está compuesto por los siguientes materiales:

  • Placa Arduino NANO
  • 3 Servomotores
  • Bateria 9V
  • Piezas LEGO
  • Cables de conexión
  • Tuercas y tornillos

Si deseas conocer mas sobre el funcionamiento de los servomotores puedes visitar Sencillo “Brazo-robotizado” con 2 servos y controlado con Arduino | Tutorial paso a paso

Como controlar un servomotor con Arduino

colores-ServoMotor

Los servomotores tienen tres cables: VCC, GND y Señal. El cable de alimentación VCC es típicamente rojo, y debe ser conectado al pin 5V de la placa Arduino. El cable de tierra, GND, suele ser negro o marrón y debe estar conectado a un conector de tierra de la placa Arduino. El cable de señal es normalmente de color amarillo, naranja o blanco y debe ser conectado a un pin digital en la placa Arduino. Tenga en cuenta que algunos servos pueden tener un consumo de energia considerable, por lo que si tienes que utilizar más de uno o dos, es recomendable una fuente de alimentación independiente, es decir, no conectados al pin + 5V en la placa Arduino. Asegúrese de conectar los GND del Arduino y de la fuente de alimentación externa juntos.




Los servomotores hacen uso de la modulación por ancho de pulsos (PWM) para controlar la dirección o posición de los motores de corriente continua. La mayoría trabaja en la frecuencia de los cincuenta hertz, así las señales PWM tendrán un periodo de veinte milisegundos. La electrónica dentro del servomotor responderá al ancho de la señal modulada. Si los circuitos dentro del servomotor reciben una señal de entre 0,5 a 1,4 milisegundos, éste se moverá en sentido horario; entre 1,6 a 2 milisegundos moverá el servomotor en sentido antihorario; 1,5 milisegundos representa un estado neutro para los servomotores estándares.

Para controlar los servomotores con Arduino disponemos de la Biblioteca “Servo”, que deberemos incluir en nuestros códigos. Esta biblioteca permite a una placa Arduino controlar servomotores. Los servos están formados por engranajes y un por eje que puede ser controlado con precisión. Los servos estándar permiten que el eje pueda ser posicionado en varios ángulos, por lo general entre 0 y 180 grados. Los servos de rotación continuas permiten la rotación del eje para ajustarse a diversas velocidades.

La Biblioteca Servo admite hasta 12 motores en la mayoría de las placas Arduino y 48 en el Arduino Mega. En las placas que no sean los de Mega, el uso de la biblioteca desactiva la funcionalidad analogWrite en los pines 9 y 10, si existe o no es un servo en ellos. En los Mega, hasta 12 servos pueden ser utilizados sin interferir con la funcionalidad PWM, el uso de 12 a 23 servos desactivará PWM en los pines 11 y 12.

Montaje

El primer paso ha sido acoplar los servomotores a las piezas LEGO.

Esquema

esquema mano robot

Como podemos ver en el esquema, conectamos los cables de los servos a +5V, a GND, y a los pines 7, 8 y 9 respectivamente.

 

Código/Sketch Arduino para la Mano Robótica Arduino

Nuestro código esta basado en el ejemplo básico de Ardino para servomotores “Sweep“, que utiliza la función “for” para hacer pasar a los servomotores desde una posición inicial a una posición final paso a paso.

#include <Servo.h>

Servo servo_1;  // Definimos el nombre de los servo que vamos a usar
Servo servo_2;
Servo servo_3;

int pos_servo_1 = 0;    // definimos lasvariables de posición
int pos_servo_2 = 0;
int pos_servo_3 = 0;

int tiempo = 20; // definimos el tiempo entre pasos del servo (velocidad)
int pasos = 2;

void setup() {
  
servo_1.attach(7);  // conectamos el servo_1 al pin 7
servo_2.attach(8);  // conectamos el servo_2 al pin 8
servo_3.attach(9);  // conectamos el servo_3 al pin 9
}


void loop()
{
  servo_1.write(80); // ajustamos la posición inicial de cada servo
  servo_2.write(90);
  servo_3.write(90);

  delay(5000); 
  
    // Bajar brazo 90-20
    for (pos_servo_2 = 90; pos_servo_2 >= 20  ; pos_servo_2 -= pasos) { 
    servo_2.write(pos_servo_2);              
    delay(tiempo);//                       
  }
    // Cerrar mano 90-20
    for (pos_servo_3 = 90; pos_servo_3 >= 20  ; pos_servo_3 -= pasos) { 
    servo_3.write(pos_servo_3);
    delay(tiempo);//
  }  
    // Subir brazo 20-90
    for (pos_servo_2 = 20; pos_servo_2 <= 90; pos_servo_2 += pasos) {
    servo_2.write(pos_servo_2);
    delay(tiempo);//
  }
    // Girar izda 79-180
    for (pos_servo_1 = 79; pos_servo_1 <= 180; pos_servo_1 += pasos) { 
    servo_1.write(pos_servo_1);
    delay(tiempo);//
  }    
    // Bajar brazo 90-10
    for (pos_servo_2 = 90; pos_servo_2 >= 10  ; pos_servo_2 -= pasos) { 
    servo_2.write(pos_servo_2);              
    delay(tiempo);//                       
  }
    // Abrir mano
    for (pos_servo_3 = 20; pos_servo_3 <= 90; pos_servo_3 += pasos) { 
    servo_3.write(pos_servo_3);
    delay(tiempo);
  }
    // Subir brazo 10-90
    for (pos_servo_2 = 20; pos_servo_2 <= 90; pos_servo_2 += pasos) {
    servo_2.write(pos_servo_2);
    delay(tiempo);//
    }
    // Girar dcha
    for (pos_servo_1 = 185; pos_servo_1 >= 79  ; pos_servo_1 -= pasos) { 
    servo_1.write(pos_servo_1);
    delay(tiempo);
  }
    // Bajar brazo 90-10
    for (pos_servo_2 = 90; pos_servo_2 >= 10  ; pos_servo_2 -= pasos) { 
    servo_2.write(pos_servo_2);              
    delay(tiempo);//                       
  }
  
    // Cerrar mano
    for (pos_servo_3 = 90; pos_servo_3 >= 20  ; pos_servo_3 -= pasos) { 
    servo_3.write(pos_servo_3);
    delay(tiempo);
  }
    // Subir brazo 10-90
    for (pos_servo_2 = 20; pos_servo_2 <= 90; pos_servo_2 += pasos) {
    servo_2.write(pos_servo_2);
    delay(tiempo);//
    }
     // Girar izda 79-180
    for (pos_servo_1 = 79; pos_servo_1 <= 180; pos_servo_1 += pasos) { 
    servo_1.write(pos_servo_1);
    delay(tiempo);//
  }  
      // Bajar brazo 90-20
    for (pos_servo_2 = 90; pos_servo_2 >= 20  ; pos_servo_2 -= pasos) { 
    servo_2.write(pos_servo_2);              
    delay(tiempo);//                       
  }   
    // Abrir mano
    for (pos_servo_3 = 20; pos_servo_3 <= 90; pos_servo_3 += pasos) { 
    servo_3.write(pos_servo_3);
    delay(tiempo);
  }
      // Subir brazo 10-90
    for (pos_servo_2 = 20; pos_servo_2 <= 90; pos_servo_2 += pasos) {
    servo_2.write(pos_servo_2);
    delay(tiempo);//
    }
    delay(5000); 
}

Deja un comentario

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