Arduino, Rasperry y algo más

Categoría: Brazo robótico

Arduino como controlador de un brazo 4DOF manejado desde un ordenador.

El «Hola mundo» de mi brazo robótico

Conseguido el primer hito de este proyecto. He conseguido que el brazo responda a la acción de cuatro potenciómetros a través de un arduino. No tiene nada especial, ha sido casi un corta y pega de los ejemplos de la librería «servo» de arduino.

El esquema del montaje que he realizado es este:

No tiene ningún misterio. Los servos están controlados por salidas pwm y los potenciómetros son leídos por pines analógicos. He usado la alimentación del arduino por que no van a funcionar nunca dos servos a la vez.

Antes de empezar con el código, un consejo sobre el montaje: aseguraros de que montáis los servos de tal forma que coincida uno de sus topes de giro con los topes físicos del robot. Si se hace mal toca recolocar todo el servo para lo que suele hacer falta desmontar medio robot.

El código que he usado es este:

servo#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

float angulo1=90.0;
float angulo2=90.0;
float angulo3=90.0;
float angulo4=90.0;
float poten1;
float poten2;
float poten3;
float poten4;

void setup() {
    
    servo1.attach(9); // Base
    servo2.attach(10); // Brazo 1
    servo3.attach(11); // Brazo 2
    servo4.attach(12); // Pinza
    set_servo();
}

void loop() {
    poten1 = analogRead(A0); // Base
    poten2 = analogRead(A1); // Brazo 1
    poten3 = analogRead(A2); //Brazo 2
    poten4 = analogRead(A3); // Pinza

    angulo1 = map(poten1, 0, 1023, 0, 180);
    if(angulo1 >= 180){
        angulo1 = 180;
    }else if(angulo1 <= 0){
        angulo1 = 0;
    }

    angulo2 = map(poten2, 0, 1023, 0, 180);
    if(angulo2 >= 180){
        angulo2 = 180;
    }else if(angulo2 <= 0){
        angulo2 = 0;
    }

    angulo3 = map(poten3, 0, 1023, 0, 180);
    if(angulo3 >= 180){
        angulo3 = 180;
    }else if(angulo3 <= 0){
        angulo3 = 0;
    }
    
    angulo4 = map(poten4, 0, 1023, 0, 180);
    if(angulo4 >= 180){
        angulo4 = 180;
    }else if(angulo4 <= 0){
        angulo4 = 0;
    }

    set_servo();
}

void set_servo(){
    servo1.write(angulo1);
    servo2.write(angulo2);
    servo3.write(angulo3);
    servo4.write(angulo4);
}

El código es sumamente sencillo. Una vez definidos los pines, solo nos queda leer la posición de los potenciómetros, mapear su resultado del rango 0 – 1024 a 0 – 180 (180 son los grados de movimiento de los servos que yo he usado) y llevar los servos a la posición indicada.

En este punto podemos reducir el ángulo de giro de los servos. Por ejemplo, la pinza no usa el giro completo del servo. Podemos recolocar el servo para que la pinza use, un rango medio del giro del servo (de 15º a 105º). Lo conseguimos mapeando la lectura del potenciómetro en el rango de 10º a 105º, logrando poder ejercer presión (a costa de vida útil del servo) manteniendo su apertura.

Y eso es todo. El brazo se muevo como esperaba. Podría haber usado un control mas adecuado, con botones o un par de joysticks, pero el objetivo final es manejarlo desde un ordenador.

Brazo Robótico

Me han regalado un brazo robótico. Y si te regalan un juguete, lo mas correcto es jugar con el juguete. El brazo es este:

Brazo

Como se ve es de metacrilato y muy sencillo. Funciona con 4 servos SG90, pero no busco potencia, busco divertirme. Usa uno para controlar el giro, otro para la pinza y otros dos para el acionamiento del brazo:

Mi objetivo final es manejarlo desde un ordenador con linux, posiblemente una raspberry, por medio de un arduino usando el puerto USB. Para ello me pongo unos hitos:

  • Control del brazo por medio de arduino con unos potenciometros. Sobre todo para comprobar que todo funciona y refamiliarizarme con el código de Arduino.
  • Control del brazo con un mando de consola o similar. Necesito aprender como dirigir de forma efectiva el brazo. Aprender como llevarlo a unas coordenadas concretas.
  • Control desde el ordenador con el puerto serie, dando las ordenes de forma manual. Puede que la acometa directamente, saltándome el paso anterior.
  • Control del brazo desde un ordenador. No he decidido como hacerlo. Se me ocurren varias opciones:
    • Una web con php de fondo.
    • Una aplicación con python.

Funciona con WordPress & Tema de Anders Norén