BRAZO ARTICULADO
Introducción
Nuestro objetivo para este proyecto era la construcción de un brazo robot controlado mediante Arduino, que pudiese coger pequeños objetos de peso reducido, desplazarlos y soltarlos en otro lugar cercano. Para ello debía contar con la capacidad de rotar sobre sí mismo, contar con un par de articulaciones que permitiesen regular altura e inclinación, y una pinza que permitiera el agarre. Para lograrlo hemos tenido que adaptarnos a los medios de los que disponíamos, así como investigar sobre el funcionamiento de los componentes que hacen posible el movimiento del brazo.
Materiales
Material
Placa Arduino UNO
Protoboard
Cables
Motor paso a paso
Mini – Servomotor x 4*
Potenciómetro x 3
Cartón
Palos de madera
Módulo de alimentación MB-102
Botón x 2
Coste Total
Coste
0 €
0 €
6 €
6 €
15 €
5 €
1 €
2 €
1.82 €
0 €
36.82 €
Motor paso a paso
El motor paso a paso es el principal artífice de la rotación del brazo. Es un dispositivo electromecánico que convierte los impulsos eléctricos en desplazamientos angulares discretos, lo que significa que es capaz de girar una cantidad determinada de grados en función de sus entradas de control.
Nos hemos valido de la librería Stepper.h para hacer uso del motor, y tiene un funcionamiento muy sencillo en realidad: está conectado a un potenciómetro que, en caso de leer valores dentro de un rango determinado (< 23), esto es, cuando giramos el potenciómetro hacia la izquierda, el motor paso a paso girará hacia la izquierda; y cuando el potenciómetro lee valores dentro de otro rango (> 900), esto es, cuando giramos el potenciómetro hacia la derecha, el motor girará hacia esa dirección.
potVal0 = analogRead(pot0);
if (potVal0 < 23 ) {
motor.step(-100);
}
else if (potVal0 > 900) {
motor.step(100);
}
Servomotores
Los servomotores hacen la función de articulaciones, y se encargan de ajustar la altura e inclinación de la pinza, así como de abrirla y cerrarla. Un servomotor es un motor eléctrico que permite mantener una posición determinada, así como cambiar la posición a la que elijamos nosotros. En este caso, le indicaremos el valor mediante los potenciómetros a los dos primeros, del tercero se encargarán los botones.
* En los materiales hay cuatro porque durante la realización de la práctica rompimos uno, pero sólo se utilizan tres.
potVal1 = analogRead(pot1) / 11.4;
servomotor1.write(potVal1);
potVal2 = analogRead(pot2) / 11.4;
servomotor2.write(potVal2);
void ServicioBoton0(){
if (millis() > T0 + 1000){
for (int p = 0; p < 90; p++){
servomotor3.write(p);
}
T0 = millis();
}
}
void ServicioBoton1(){
if (millis() > T0 + 1000){
for (int p = 90; p > 0; p--){
servomotor3.write(p);
}
T0 = millis();
}
}
Botón
Hay dos botones que se encargan de manejar la pinza, uno para abrirla y otro para cerrarla. Ambos funcionan mediante interrupciones, y cuando detectan la pulsación ejecutan sus respectivas rutinas.
Potenciómetros
Los potenciómetros son el método elegido para controlar tanto el motor paso a paso como los dos primeros servomotores. Funcionan como un divisor de tensión o voltaje, y nos permite enviar señales entre 0 y 1024 muy cómodas de regular, lo cual hace que controlar el brazo articulado sea intuitivo y bastante preciso.
Módulo de alimentación MB-102
Investigando en Internet leímos que, si todos los motores se alimentan desde la placa de Arduino UNO, la corriente puede llegar a quemar la placa, y que era más correcto realizar las conexiones tal y como se observa en esta imagen, ya que la alimentación proviene del módulo MB-102, haciendo que la intensidad para alimentar los motores no pase por la placa de Arduino.
Código
#include <Servo.h>
#include <Stepper.h>
Servo servomotor3; //Servomotor pinza
Servo servomotor2; //Servomotor enmedio
Servo servomotor1; //Servomotor abajo
Stepper motor(2048, 4, 6, 5, 7);
int i;
int j;
const int pot0 = A0; //Potenciometro 1
int potVal0;
const int pot1 = A1; //Potenciometro 2
int potVal1;
int nuevoPotVal1;
const int pot2 = A2; //Potenciometro 3
int potVal2;
const int boton0 = 2;
const int boton1 = 3;
long T0 = 0;
void setup() {
pinMode(boton0, INPUT);
pinMode(boton1, INPUT);
attachInterrupt(0, ServicioBoton0, RISING);
attachInterrupt(1, ServicioBoton1, RISING);
servomotor1.attach(9);
servomotor2.attach(10);
servomotor3.attach(11);
motor.setSpeed(5);
Serial.begin(9600);
}
void loop() {
potVal0 = analogRead(pot0);
if (potVal0 < 23 ) {
motor.step(-100);
}
else if (potVal0 > 900) {
motor.step(100);
}
potVal1 = analogRead(pot1) / 11.4;
servomotor1.write(potVal1);
potVal2 = analogRead(pot2) / 11.4;
servomotor2.write(potVal2);
}
void ServicioBoton0(){
if (millis() > T0 + 1000){
for (int p = 0; p < 90; p++){
servomotor3.write(p);
}
T0 = millis();
}
}
void ServicioBoton1(){
if (millis() > T0 + 1000){
for (int p = 90; p > 0; p--){
servomotor3.write(p);
}
T0 = millis();
}
}
Controles
El brazo de controla mediante 3 potenciómetros y un botón
- El primer potenciómetro mueve el motor paso a paso y permite rotar el brazo
- El segundo potenciómetro mueve el primer servomotor y regula la altura
- El tercer potenciómetro mueve el segundo servomotor y regula la inclinación
Problemas
A lo largo del desarrollo hemos experimentado gran cantidad de problemas que nos han llevado a experimentar numerosos quebraderos de cabeza. Al principio la rotación vertical iba a funcionar también mediante un servomotor, sin embargo, un funcionaba como nosotros queríamos y al final investigando descubrimos el motor paso a paso, que si se parecía más a nuestra idea de poder girar sin límite.
La pinza también iba a funcionar mediante un potenciómetro, sin embargo, el que conseguimos para tal propósito no leía bien los valores, por lo que tuvimos que reemplazarlo por un botón. Este también nos dio bastantes problemas porque daba en ocasiones valores arbitrarios, aunque conseguimos paliarlo mediante software.
Otro problema importante que hemos tenido es que al brazo le daban espasmos de vez en cuando de forma aleatorio, y llegamos a la conclusión de que al estar leyendo continuamente todos los potenciómetros y escribiendo los valores en los servomotores el sistema se estaba sobrecargando y se escapaba algún valor que hacía que el brazo sufriese movimientos bruscos esporádicamente. Para ello optamos por tomar medidas orientadas a leer un potenciómetro y mover un servomotor cada vez.
Potenciales mejoras
Las principales mejoras que implementaríamos en la práctica serían:
- Mejorar tanto los materiales de construcción como la potencia de los servomotores (necesitarían probablemente una mejor fuente de alimentación) para que pudiesen mover elementos más pesados
- Implementar una interfaz bluetooth o Wi-Fi para facilitar y mejorar los controles