Robótica y Animatrónica – Interfaz gráfica de usuario

Interfaz Gráfica de Usuario

La aplicación que sirve como interfaz de usuario fue desarrollada con el lenguaje Processing y la librería G4P para crear interfaces gráficas.

gui

Mediante ésta establecemos la comunicación con Arduino para mover cada articulación del robot a la posición deseada.

Se presenta un control para cada actuador, estos controles generan un valor que es enviado por el puerto serie, cada vez que se presiona el botón “Mover” en una secuencia de valores numéricos separados por coma de la siguiente manera:

“5,78,120,17,1”

El primer valor indica la cantidad de pasos que se moverá el motor PAP. Valores positivos lo hacen girar en un sentido y negativos en el otro, 0 no cambia de lugar.

El siguiente valor es el ángulo del servo de la base, lo mismo para el tercer valor, que corresponde al ángulo del hombro y el cuarto para el codo.

Por último, el quinto elemento puede ser 0 o 1 e indica si está apagado o encendido el indicador luminoso.

Archivo gui_brazo.pde

// Need G4P library
import g4p_controls.*;
import processing.serial.*;

Serial arduino;   // Create object from Serial class
String comando;   // Información ppara el movimiento de los actuadores
                  // int_motor,int_base,int_hombro,int_codo,bool_led\n

public void setup(){
  size(480, 320, JAVA2D);
  createGUI();
  customGUI();
 
  //Abre el puerto serie
  String portName = Serial.list()[0];
  arduino = new Serial(this, portName, 9600);

 
}

public void draw(){
  background(230);
 
  textbase.setText(base.getValueS());
  texthombro.setText(hombro.getValueS());
  textcodo.setText(codo.getValueS());
  comando = int(motor_slider1.getValueF()) + "," + int(base.getValueF()) + "," + int(hombro.getValueF()) + "," + int(codo.getValueF()) + ",1" + "\n";
 
}

// Use this method to add additional statements
// to customise the GUI controls
public void customGUI(){

}

Archivo GUI

/* =========================================================
 * ====                   WARNING                        ===
 * =========================================================
 * The code in this tab has been generated from the GUI form
 * designer and care should be taken when editing this file.
 * Only add/edit code inside the event handlers i.e. only
 * use lines between the matching comment tags. e.g.

 void myBtnEvents(GButton button) { //_CODE_:button1:12356:
     // It is safe to enter your event code here  
 } //_CODE_:button1:12356:
 
 * Do not rename this tab!
 * =========================================================
 */

public void mover_click1(GButton source, GEvent event) { //_CODE_:Mover:801388:
  println(comando);
  arduino.write(comando);
} //_CODE_:Mover:801388:

public void base_turn1(GKnob source, GEvent event) { //_CODE_:base:207891:
  //println("knob1 - GKnob >> GEvent." + event + " @ " + millis());
} //_CODE_:base:207891:

public void knob1_turn1(GKnob source, GEvent event) { //_CODE_:hombro:577945:
  //println("hombro - GKnob >> GEvent." + event + " @ " + millis());
} //_CODE_:hombro:577945:

public void codo_turn1(GKnob source, GEvent event) { //_CODE_:codo:306758:
  //println("codo - GKnob >> GEvent." + event + " @ " + millis());
} //_CODE_:codo:306758:

public void motor_slider1_change1(GCustomSlider source, GEvent event) { //_CODE_:motor_slider1:807276:
  //println("motor_slider1 - GCustomSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:motor_slider1:807276:

public void textbase_change1(GTextField source, GEvent event) { //_CODE_:textbase:325465:
  //println("textbase - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:textbase:325465:

public void texthombro_change1(GTextField source, GEvent event) { //_CODE_:texthombro:661687:
  //println("texthombro - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:texthombro:661687:

public void textfield1_change1(GTextField source, GEvent event) { //_CODE_:textcodo:999372:
  //println("textcodo - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:textcodo:999372:

// Create all the GUI controls.
// autogenerated do not edit
public void createGUI(){
  G4P.messagesEnabled(false);
  G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);
  G4P.setCursor(ARROW);
  surface.setTitle("Sketch Window");
  Mover = new GButton(this, 180, 280, 80, 30);
  Mover.setText("Mover");
  Mover.addEventHandler(this, "mover_click1");
  base = new GKnob(this, 60, 170, 60, 60, 0.8);
  base.setTurnRange(110, 70);
  base.setTurnMode(GKnob.CTRL_HORIZONTAL);
  base.setSensitivity(1);
  base.setShowArcOnly(false);
  base.setOverArcOnly(false);
  base.setIncludeOverBezel(false);
  base.setShowTrack(true);
  base.setLimits(90.0, 0.0, 180.0);
  base.setShowTicks(true);
  base.setOpaque(false);
  base.addEventHandler(this, "base_turn1");
  hombro = new GKnob(this, 190, 170, 60, 60, 0.8);
  hombro.setTurnRange(110, 70);
  hombro.setTurnMode(GKnob.CTRL_HORIZONTAL);
  hombro.setSensitivity(1);
  hombro.setShowArcOnly(false);
  hombro.setOverArcOnly(false);
  hombro.setIncludeOverBezel(false);
  hombro.setShowTrack(true);
  hombro.setLimits(90.0, 0.0, 180.0);
  hombro.setShowTicks(true);
  hombro.setOpaque(false);
  hombro.addEventHandler(this, "knob1_turn1");
  codo = new GKnob(this, 320, 170, 60, 60, 0.8);
  codo.setTurnRange(110, 70);
  codo.setTurnMode(GKnob.CTRL_HORIZONTAL);
  codo.setSensitivity(1);
  codo.setShowArcOnly(false);
  codo.setOverArcOnly(false);
  codo.setIncludeOverBezel(false);
  codo.setShowTrack(true);
  codo.setLimits(90.0, 0.0, 180.0);
  codo.setShowTicks(true);
  codo.setOpaque(false);
  codo.addEventHandler(this, "codo_turn1");
  motor_slider1 = new GCustomSlider(this, 70, 40, 310, 50, "grey_blue");
  motor_slider1.setShowValue(true);
  motor_slider1.setLimits(0, -5, 5);
  motor_slider1.setNbrTicks(11);
  motor_slider1.setStickToTicks(true);
  motor_slider1.setShowTicks(true);
  motor_slider1.setEasing(2.0);
  motor_slider1.setNumberFormat(G4P.INTEGER, 0);
  motor_slider1.setOpaque(false);
  motor_slider1.addEventHandler(this, "motor_slider1_change1");
  textbase = new GTextField(this, 60, 240, 60, 20, G4P.SCROLLBARS_NONE);
  textbase.setOpaque(true);
  textbase.addEventHandler(this, "textbase_change1");
  texthombro = new GTextField(this, 190, 240, 60, 20, G4P.SCROLLBARS_NONE);
  texthombro.setOpaque(true);
  texthombro.addEventHandler(this, "texthombro_change1");
  textcodo = new GTextField(this, 320, 240, 60, 20, G4P.SCROLLBARS_NONE);
  textcodo.setOpaque(true);
  textcodo.addEventHandler(this, "textfield1_change1");
  etmotor = new GLabel(this, 180, 10, 80, 20);
  etmotor.setText("Motor");
  etmotor.setOpaque(false);
  etbase = new GLabel(this, 60, 140, 60, 20);
  etbase.setText("Base");
  etbase.setOpaque(false);
  ethombro = new GLabel(this, 190, 140, 60, 20);
  ethombro.setText("Hombro");
  ethombro.setOpaque(false);
  etcodo = new GLabel(this, 320, 140, 60, 20);
  etcodo.setText("Codo");
  etcodo.setOpaque(false);
}

// Variable declarations
// autogenerated do not edit
GButton Mover;
GKnob base;
GKnob hombro;
GKnob codo;
GCustomSlider motor_slider1;
GTextField textbase;
GTextField texthombro;
GTextField textcodo;
GLabel etmotor;
GLabel etbase;
GLabel ethombro;
GLabel etcodo;

Robótica y animatrónica – Introducción

Trabajo Final

Objetivos

  • Diseñar un brazo robótico antropomorfo de 4 grados de libertad
  • Construir la estructura de un brazo robótico de 4 grados de libertad
  • Aplicar los conocimientos sobre drivers, servomotores y motores paso a paso.
  • Establecer una interfaz de comunicación amigable del usuario con el robot para su control.
  • Desarrollar los modelos matemáticos del robot para aplicar las herramientas de análisis a un caso real.

Introducción

En la actualidad el uso de robots se ha extendido para tareas muy diversas, desde la realización de labores peligrosas para un humano hasta su utilización en trabajos domésticos, pasando por la producción industrial.

El contenido de la materia es multidisciplinar, permitiendo trabajar a un equipo diverso de estudiantes avanzados de ingeniería, para concretar el proyecto desde su concepción a su fase de prototipo.

En este trabajo se diseña y construye un brazo robótico antropomorfo de 4 grados de libertad, con el fin de aplicar los conceptos sobre cinemática, la utilización de motores paso a paso y de servos.

Boceto del prototipo

Boceto del prototipo

Desarrollo

Diagrama de bloques

El control está a cargo de una placa de prototipado rápido, Arduino UNO, el envío de coordenadas al robot se realiza mediante por interfaz USB conectado al Arduino y a través de una aplicación con Interfaz Gráfica de Usuario, especialmente desarrollada para dicha esta finalidad.

Las señales de control generadas por el controlador, son mandadas a Drivers específicos para poder comandar los actuadores en cada articulación.

Diagrama de bloques

Cinematica directa de un pantografo

<script language=”javascript”>
cenx = 100;
ceny = 100;
//angulos de las articulaciones
a = 0;
b = 0;
//Largo de los segmentos
l1 = 70;
l2 = 30;
function setup() { 
    createCanvas(200, 200);
    sliderA = createSlider(0, 100, 50);
    sliderB = createSlider(0, 100, 50);
}
function draw(){
    background(100);
    fill(0);
    text(“Pantografo”,10,10);
    a = 6.28*sliderA.value()/100;
    b = 6.28*sliderB.value()/100+a-3.14;
    stroke(0,0,200);
    strokeWeight(3);
    line(cenx, ceny, cenx + l1*cos(a), ceny + l1*sin(a));
    line(cenx + l1*cos(a), ceny + l1*sin(a), cenx + l1*cos(a) + l2*cos(b), ceny + l1*sin(a) + l2*sin(b));
    textSize(8);
    fill(255, 220,0);
    strokeWeight(0);
    text(“a = ” + a, 20, 160);
    text(“b = ” + b, 20, 170);
    x = cenx + l1*cos(a) + l2*cos(b);
    y = ceny + l1*sin(a) + l2*sin(b)
    text(“x = ” + x, 20, 180);
    text(“y = ” + y, 20, 190);
}
</script>
« Older Entries