viernes, 16 de octubre de 2015

Control de brazo robótico MeArm via Serial con programa en QT

Sebastian Wolter
16-10-2015

Buenos días con todos.
Este es mi primera publicación, por lo tanto es muy especial en ese sentido y por lo mismo espero ser claro en la explicación y poder ayudar a todos los aficionados a la robótica y programación que estén dando sus primeros pasos.

El dia de hoy les presento un sencillo programa realizado con el ide QT y programado con C++ para controlar via puerto serial el MeARM.





Las instrucciones de ensamblado del MeARM así como su fuente las pueden encontrar en:

Instructables - MeARM

Una vez armado y ajustado correctamente el brazo robotico, vamos a conectarlo a nuestra placa arduino, en mi caso, un arduino UNO.

La siguiente grafica muestra la conexion realizada entre el brazo y la placa:




El servo de la base se conecta al pin 11
El servo del lado izquierdo se conecta al pin 10
El servo del lado derecho se conecta al pin 9
El servo de la pinza se conecta al pin 6

También se puede hacer el uso de un sensor shield para el arduino, para facilitar la conexión, si es que lo disponen.

Una vez conectado todo, vamos a cargar el sketch a nuestro arduino, el código del sketch es el siguiente:


#include <Servo.h>

//MeArm HAS 4 SERVOS
Servo xServo;  // create servo object, arm base servo - left right motion
Servo yServo;  // create servo object, left side servo - forward backwards motion
Servo zServo;  // create servo object, right side servo - forward backwards motion
Servo clawServo;  // create servo object, end of arm srevo - open,close the claw hand

//servo positions values, expects 1-180 deg.
int xPos;
int yPos;
int zPos;
int clawPos;

//*************** INIT AT STARTUP *******************************************************************

void setup() {        // the setup function runs once when you press reset or power the board

  // assign servo to pin numbers
  xServo.attach(11);  // attaches the servo on pin 11 to the servo object
  yServo.attach(10);  // attaches the servo on pin 10 to the servo object
  zServo.attach(9);  // attaches the servo on pin 9 to the servo object
  clawServo.attach(6);  // attaches the servo on pin 6 to the servo object

  // initialize serial port
  Serial.begin(9600);

  // Debug only send serial message to host com port terminal window in Arduino IDE
  //Serial.print("*** MeCom Test V04 ***.");   // send program name, uncomment for debug connection test

xServo.write(90);
yServo.write(90);
zServo.write(90);
clawServo.write(90);

}

// ******************************************************************************************************
// ********************************** MAIN PROGRAM LOOP START *******************************************
// ******************************************************************************************************


void loop() {
  //serial in packet patern = xVal,yVal,zVal,clawVal + end of packet char 'x'
  while (Serial.available() > 0) {
    xPos = Serial.parseInt();
    yPos = Serial.parseInt();
    zPos = Serial.parseInt();
    clawPos = Serial.parseInt();
   
    if (Serial.read() == 'x') { // Detect end of packet char 'x', go ahead and update servo positions
      // UPDATE SERVO POSITIONS
      xServo.write(xPos);
      yServo.write(yPos);
      zServo.write(zPos);
      clawServo.write(clawPos);
    }
  }
}


Enlace del sketch:  sketch ino

El sketch de arduino no es de mi autoría y debo decirlo lo adquirí con un kit de brazo robótico MeARM comprado a través de amazon.

El programa espera recibir via serial una cadena conformada de la siguiente manera:

xPos,yPos,zPos,clawPosx

Que podría ser:

90,90,90,40x

El ultimo caracter 'x' indica al programa que es el fin de la cadena y que escriba los datos correspondientes a cada uno de los servos.

En mi caso, la pinza abre y cierra perfectamente entre 10 y 40 grados, es por ello, que podriamos modificar la siguiente linea del sketch:

clawServo.write(90);

Y ponerla de acuerdo a los limites de nuestro propio brazo asi:

clawServo.write(40);

En mi caso, 40 seria la posicion cerrada de la pinza. Los demas servos con un valor incicial de 90 (centro) estarian bien.

El paso final, es cargar el programa en el ide QT y compilarlo. Yo use el IDE QT con el compilador MinGW (gc++), la siguiente version:


que se lo pueden descargar de aqui -> http://www.qt.io/download-open-source/#section-2

Una vez instalado QT, abrimos el proyecto: codigo fuente proyecto QT



El programa tiene sliders para manejar la base, servos izquierdo y derecho asi como para la pinza.
Como mencione anteriormente, en mi caso particular, la pinza se abre y cierra completamente desde los 10 hasta los 40 grados de giro del servo, por lo tanto el programa esta con esos parámetros, pero pueden ser cambiados a gusto.

Una vez compilado el programa, al ejecutarlo:


 Recuerden tener conectada la placa arduino via puerto serial al PC, el programa buscara ls puertos COM y se podra conectar a la placa arduino.
El programa esta aun en desarrollo, pero ya tiene completamente funcionales las opciones basicas de manejo del brazo robotico, ademas de poder guardar y abrir archivos con rutas de movimientos y reproducirlas en forma automatica.

Espero les sea de utilidad.......

Sebastian Wolter
Octubre 2015

4 comentarios:

  1. Esta excelente el articulo. Sigue publicando mas.

    ResponderBorrar
  2. todo excelente solo me marca un error al compilarlo ya que me dice que la versión no es la misma al programa

    ResponderBorrar
    Respuestas
    1. hola. cual programa te da error, el de arduino o el de qt? que error te da?... que version de QT/Arduino usas?....

      saludos

      Borrar
  3. Este comentario ha sido eliminado por el autor.

    ResponderBorrar