Página principal

De Proyecto MA2000
Saltar a: navegación, buscar

Este trabajo describe brevemente las herramientas, técnicas y metodología empleada en la implementación de un nuevo sistema de control para el brazo manipulador MA2000, así como el desarrollo de un software de ajuste dinámico y programación de trayectorias. La intención de esta wiki es proporcionar la documentación acerca de este proyecto de una manera informal pero muy accesible y conveniente pues facilita al lector la posibilidad de usar esta información, mejorarla y ampliarla continuamente.

El MA2000 Es un brazo de 6 grados de libertad accionado por motores DC con escobillas. Se han empleado drivers L298 para manejar tres de los motores, los tres motores restantes se han reemplazado por motores de modelismo. Se ha implementado un sistema de control mediante el microcontrolador dsPIC30F3011 en el cual la la posición de cada articulación es medida mediante potenciómetros. Se ha implementado un controlador de posición PID independiente para tres articulaciones que utiliza el motor DSP del dsPIC mediante las librerías incluidas con el compilador C30 en su versión académica. Adicionalmente se ha desarrollado un software en el PC haciendo uso de las librerías Qt, una biblioteca muy utilizada en el desarrollo de aplicaciones multiplataforma. El software se comunica con el microcontrolador y permite el ajuste dinámico del controlador PID, también permite la visualización en tiempo real de la respuesta dinámica de cada articulación, esta característica se ha programado utilizando la librería QWT, el software tambien permite la programación de trayectorias mediante guiado o aprendizaje. El software es capaz de leer y guardar trayectorias en archivos de texto plano que pueden ser generados con otras herramientas tales como MATLAB y la Toolbox de robótica de Peter Corke.

Realizado por:

- Juan Marcano M. Estudiante de la Escuela de Ingeniería Eléctrica de la Universidad Central de Venezuela (Trabajo de grado 2013, EIE-UCV Caracas) email: juan@marcano.net.ve


Esquema general
Ejecución de una secuencia de movimiento programada mediante guiado pasivo o aprendizaje.

Contenido

Algunos conceptos y fundamentos

Manipulador Industrial

Definitivamente en general no existe un consenso sobre que máquinas pueden ser llamadas “robot”, pero en el ámbito de la industria el término robot industrial ó manipulador industrial está muy bien definido en diversas normas internacionales, la organización internacional de estándares ISO, define al robot industrial como: “Un manipulador multifuncional reprogramable con varios grados de libertad, capaz de manipular materias, piezas, herramientas o dispositivos especiales según trayectorias variables programadas para realizar tares diversas”. Otra definición, más completa es la establecida por la Asociación Francesa de Normalización (AFNOR), que define primero el manipulador y, basándose en dicha definición, el robot:

Distintos tipos de articulaciones para robots

- Manipulador: mecanismo formado generalmente por elementos en serie, articulados entre sí, destinado al agarre y desplazamiento de objetos. Es multifuncional y puede ser gobernado directamente por un operador humano o mediante dispositivo lógico.

Configuraciones típicas de los manipuladores

- Robot: manipulador automático servo-controlado, reprogramable, polivalente, capaz de posicionar y orientar piezas, útiles o dispositivos especiales, siguiendo trayectoria variables reprogramables, para la ejecución de tareas variadas. Normalmente tiene la forma de uno o varios brazos terminados en una muñeca. Su unidad de control incluye un dispositivo de memoria y ocasionalmente de percepción del entorno. Normalmente su uso es el de realizar una tarea de manera cíclica, pudiéndose adaptar a otra sin cambios permanentes en su material.


Por último, la Federación Internacional de Robótica (IFR, International Federation of Robotics) distingue entre robot industrial de manipulación y otros robots:


"Por robot industrial de manipulación se entiende una maquina de manipulación automática, reprogramable y multifuncional con tres o más ejes que pueden posicionar y orientar materias, piezas, herramientas o dispositivos especiales para la ejecución de trabajos diversos en las diferentes etapas de la producción industrial, ya sea en una posición fija o en movimiento".


Cada movimiento independiente que realiza cada articulación respecto a la siguiente se denomina grado de libertad (GDL), la cantidad de grados de libertad no debe confundirse con la cantidad de articulaciones de un manipulador, aunque en la mayoría de manipuladores industriales ambas cantidades coinciden, ello sucede porque las articulaciones más empleadas son de tipo prismática y de rotación, ambas de un grado de libertad. La figura (izquierda) ilustra distintos tipos de articulaciones empleadas y los grados de libertad de cada una.


Para posicionar y orientar un cuerpo de cualquier manera en el espacio se necesitan seis parámetros, tres para definir la posición y tres para la orientación, si se pretende colocar en una herramienta en cualquier posición y a la vez tener la capacidad de orientar esta herramienta, se necesitan de al menos seis grados de libertad. En la práctica, dependiendo de la tarea que realizan muchos robots emplean solo cuatro o cinco GDL.


Fuente:Barrientos A.,Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica ,2da edición. --McGraw-Hill.

Trayectorias Punto a Punto

Diferentes trayectorias articulares posibles para un robot de 2 grados de libertad. a) movimiento eje a eje. b) movimiento simultaneo de ejes. c) trayectoria coordinada. d) trayectoria continua rectilínea.

La función del control cinemático en un manipulador establece cuales son las trayectorias que debe seguir cada articulación del robot a lo largo del tiempo para lograr objetivos fijados por el usuario (punto de destino, trayectoria cartesiana del efector final del robot, tiempo invertido por el usuario, etc.). Estas trayectorias se seleccionarán atendiendo a las restricciones físicas propias de los accionamientos y a ciertos criterios de calidad trayectoria, como suavidad o precisión de la misma. Para realizar una tarea determinada el robot debe moverse desde un punto inicial a un punto final. Este movimiento puede ser realizado según infinitas trayectorias espaciales. De todas ellas hay algunas que, bien por su sencillez de implementación por parte del control cinemático o bien por su utilidad y aplicación a diversas tareas, son las que en la práctica incorporan robots comerciales. De este modo puede encontrarse que los robots dispongan de trayectorias punto a punto, coordinadas y continúas.

Para el caso de trayectorias punto a punto que es el que nos concierne, cada articulación evoluciona desde su posición inicial a la final sin realizar consideración alguna sobre el estado o evolución de las demás articulaciones. Normalmente cada actuador trata de llevar su articulación al punto destino en el menor tiempo posible, pudiéndose distinguir dos casos: movimiento eje a eje y movimiento simultaneo de ejes.

Para el movimiento eje a eje solo se mueve un eje a la vez. Comenzará a moverse la primera articulación y una vez que esta haya alcanzado su punto final lo hará la segunda, y así sucesivamente. Este tipo de movimiento da obviamente como resultado un mayor tiempo de ciclo, teniendo como única ventaja un menor consumo de potencia instantánea por parte de los actuadores.

Para el movimiento simultáneo de ejes todos los actuadores comienzan simultáneamente a mover las articulaciones del robot a una velocidad específica para cada una de ellas. Dado que la distancia a recorrer y las velocidades serán en general diferentes, cada una acabará su movimiento en un instante diferente. El movimiento del robot no acabará hasta que se alcance definitivamente el punto final, lo que se producirá cuando el eje que más tarde concluya su movimiento. De esta manera, el tiempo total invertido en el movimiento coincidirá con el del eje que más tiempo emplee en realizar su movimiento particular, pudiéndose dar la circunstancia de que el resto de los actuadores hayan forzado su movimiento a una velocidad y aceleración elevada, viéndose obligados finalmente a esperar la articulación más lenta.

La programación por guiado o aprendizaje consiste en hacer realizar al robot o a una maqueta del mismo la tarea, llevándolo manualmente al tiempo que se registran las posiciones adoptadas para su posterior repetición de manera automática.

Fuente:Barrientos A.,Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica ,2da edición. --McGraw-Hill.

Trayectorias coordinadas o isócronas

Para evitar que algunos actuadores trabajen forzando sus velocidades y aceleraciones, teniendo que esperar después de la conclusión del movimiento de la articulación más lenta, puede hacerse un cálculo previo, averiguando cual es la articulación y que tiempo invertirá. Se ralentizará entonces el movimiento del resto de los ejes para que inviertan el mismo tiempo en su movimiento, acabando todos ellos simultáneamente. De esta manera el tiempo total invertido en el movimiento es el menor posible y no se piden aceleraciones y velocidades elevadas a los actuadores de manera inútil. Desde el punto de vista del usuario la trayectoria que describe el extremo del robot no es significativa, siendo esta impredecible, aunque como es obvio, un conocimiento del modelo y control cinemático del robot permitirá su cálculo.


Fuente:Barrientos A.,Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica ,2da edición. --McGraw-Hill.

Trayectorias Contínuas

Cuando se pretende que la trayectoria (recta, arco o circulo) que sigue la herrmienta terminal del robot y conocidas previamente la posición inicial y de destino es preciso calcular de manera continua o por medio de un cálculo previo las coordenadas articulares. El resultado será que cada articulación realiza un movimiento con cambios bruscos de dirección y velocidad, sin embargo el resultado será que la herramienta o elemento terminal del robot seguirá la trayectoria deseada.


Fuente:Barrientos A.,Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica ,2da edición. --McGraw-Hill.

Programación por guiado

Para guiar al robot por las trayectorias o puntos deseados se utilizan diferentes soluciones. Si los actuadores del robot están desconectados y es el programador quien debe aportar directamente la energía para mover el robot se trata de un guiado pasivo. En este caso, el programador puede tomar un extremo del robot y llevar hasta el punto deseado siguiendo las trayectorias más adecuadas. La unidad de control del robot registrará, de manera automática, la señal de los sensores de posición de las articulaciones en todos los puntos recorridos. Este tipo de guiado se denomina guiado pasivo directo. La dificultad física de mover toda la estructura se resuelve con la utilización de guiado pasivo por maniquí. En este caso se dispone de un doble del robot mientras que este permanece fuera de línea. El maniquí posee idéntica configuración que el robot real, pero es mucho más ligero y fácil de mover. La programación se efectúa llevando de la mano a este doble, mientras que la unidad de control muestrea y almacenan con determinada frecuencia, los valores que toman los sensores de posición de las articulaciones, para su posterior repetición por el robot. Los robot, también de pintura, fabricados por Nordson se programan utilizando este procedimiento.

Frente a estos sistemas pasivos, otra posibilidad permite emplear el propio sistema de accionamiento del robot, controlado desde una botonera o un bastón de mando (joystick) para que sea éste el qu mueva sus articulaciones. Se dirá entonces que se trata de un guiado activo, Ejemplos de este tipo de encuentran en los robots de ABB o en los Cincinnati Milacron (T3). En este caso lo habitual es que la unidad de control registre aquellas configuraciones del robot que el programador le indique expresamente.

Los métodos de programación por guiado son muy útiles e imprescindibles en muchas ocasiones. Además presentan ventajas, como que son fáciles de aprender y que requieren un espacio de memoria relativamente pequeño para almacenar la información. Sin embargo, este método de programación presenta el inconveniente de la necesidad de utilizar el propio robot y su entorno para realizar la programación, obligando a sacar el robot de línea de producción e interrumpiendo esta.


Fuente:Barrientos A.,Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica ,2da edición. --McGraw-Hill.

Programación Textual

Como alternativa a la programación por guiado, el método de programación textual permite indicar la tarea al robot mediante el uso de un lenguaje de programación especifico. Un programa se corresponde ahora, como en el caso de un programa general, con una serie de datos que son editadas y posteriormente ejecutadas. Existe por lo tanto un texto para el programa.

Es importante destacar que, cada vez con mayor notoriedad, los sistemas de programación de robots tienden a combinar los dos modos básicos (guiado y textual), permitiéndose desarrollar el programa mediante la escritura de instrucciones, y utilizando la posibilidad de guiado en línea en aquellos momentos en que sea necesario. Sistemas como Rapid de ABB, VAL II de Staubli y V+ de Adept technology son ejemplos de esta ambivalencia.


Fuente:Barrientos A.,Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica ,2da edición. --McGraw-Hill.

Sistema de seguimiento

El siguiente documento brinda un ejemplo de un sistema de seguimiento, a pesar de que ejemplo trata un sistema totalmente analógico, ilustra el principio de funcionamiento del sistema implementado. [Sistema de seguimiento]

Controlador PID discreto

El siguiente documento brinda un ejemplo de la discretización de un controlador PID, se hallan los coeficientes de la ecuación en diferencias del controlador, [Controlador PID discreto]

DSP: Definición y características principales

Recibe el nombre de DSP (procesador digital de señales) un circuito integrado que contiene un procesador digital y un conjunto de recursos complementarios capaces de manejar digitalmente las señales analógicas del mundo real, como los sonidos y las imágenes. A principios de la década de los 80 del siglo pasado ya se comercializaban varios modelos de DSP, siendo pioneros los fabricantes Texas instruments, NEC e Intel. En la actualidad Texas Instruments mantiene el liderazgo en el mercado DSP, fabricando modelos cada vez más potentes para acoplarse a las aplicaciones más complejas y cambiantes. Los DSP pueden asemejarse a los clásicos microcontroladores, pero incorporando arquitecturas y recursos especiales para poder controlar de forma óptima los requerimientos específicos y los algoritmos manejados en el procesamiento digital de señales analógicas. Se destacan las siguientes prestaciones de lo DSP:

  • Los procesadores preferentemente son RISC, con un reducido juego de instrucciones que se ejecutan generalmente en un solo ciclo.
  • Utilizan la arquitectura Harvard y disponen de dos memorias independientes, una dedicada a contener las instrucciones y otras los datos, posibilitando el acceso simultaneo a ambas informaciones. Además, la memoria de datos suele dividirse en dos espacios independientes que aportan el acceso paralelo.
  • Disponen de recursos físicos complejos para soportar las operaciones específicas de los algoritmos DSP, Son imprescindibles un multiplicador rápido y un flexible registro de desplazamiento. Una operación DSP típica de la de ¨multiplicar y acumular¨ (x = a . b + x) y que la suele implementar la instrucción de nemónico MAC, ejecutándose en un solo ciclo. Se realizan varios accesos a memoria en un solo ciclo, para que el procesador pueda buscar una instrucción mientras realiza la búsqueda de operandos y/o almacena el resultado de la instrucción anterior. Esto es posible gracias a que la memoria de datos se divide en dos partes para posibilitar el acceso simultaneo de datos.
  • El repertorio de instrucciones contiene algunas específicas para resolver los algoritmos matemáticos habituales en el procesamiento de señales.
  • Los modos de son muy sofisticados, ya que localizan los datos y los almacenan los resultados de forma óptima para los algoritmos empleados.
  • Disponen de un conjunto de interrupciones muy amplio y veloz, con niveles de prioridad.
  • En el DSP se integran numerosos recursos y periféricos que minimizan el tamaño y simplifican el diseño del sistema.
  • Poseen módulos de control y optimización del consumo de energía.

Fuente: J, Angulo. DsPIC diseño práctico de aplicaciones. Prentice Hall, 2006.

Microcontroladores y DSP

Los microcontroladores clásicos, denominados de forma resumida MCU, son circuitos integrados que contienen un procesador digital completo junto a diversos periféricos auxiliares que facilitan el desarrollo de las aplicaciones a las que se dedican. Su parecido con los DSP es muy grande, pero las diferencias que los distinguen hacen que sus campos de aplicaciones sean diferentes.

Resumidamente los DSP son microcontroladores dotados de recursos físicos y lógicos necesarios para poder soportar las aplicaciones específicas del procesamiento digital de señales. Las instrucciones aritméticas complejas de los MCU se ejecutan en varios ciclos, mientras que las de los DSP sólo precisan uno. En los DSP siempre se dispone de convertidores analógico digitales rápidos y precisos. Dado el carácter marcadamente matemático de los programas para DSP, estos están preparados para ser programados en lenguajes de alto nivel, como el C. La velocidad y el rendimiento de los DSP son muy superiores a los habituales en los MCU.

que reúne las características de un microcontrolador de 16 bits y las de un DSP de gama La empresa Microchip Technology Inc. ® fabrica un circuito híbrido MCU/DSP, cuyo manejo es similar a los clásicos microcontroladores pero que incluye las principales prestaciones de los DSP. Surge así el controlador digital de señales, abreviadamente DSC® (Digital Signal Controller), baja. La primera generación de DSC, denominada dsPIC30F, constituyó un intento por parte de microchip del facilitar el acercamiento al mundo del procesamiento digital de señales a sus usuarios de MCU de 8 y 16 bits. Con esta intención se ha mantenido el entorno de la arquitectura y juego de instrucciones de los MCU tradicionales, pero añadiendo la funcionalidad y los principales requisitos de los DSP, para facilitar la transición a sus clientes habituales DSCs de la familia dsPIC30F específicamente el dsPIC30F3011 ha sido empleado como controlador digital PID en este trabajo.

Fuente: J, Angulo. DsPIC diseño práctico de aplicaciones. Prentice Hall, 2006.

El formato fraccional Q15 (1.15)

Representación de un número de N bits (n+m+1 bits) en formato Qn.m

Prestaremos especial atención a la representación numérica en formato fraccional. El formato fraccional (Qn.m) tiene una parte entera (n) y una parte fraccional (m) y el bit más significativo representa el signo, por lo tanto tiene (m+n+1) bits. Este representa el valor de mediante complemento a dos (complemento a la base). El formato Qn.m tiene un rango de datos de [-2n,(2n-2-m)] con resolución de 2-m. El valor viene dado por la ecuación:

Valor del número

En el formato Q15, el bit más significativo brinda el signo, y el punto decimal se coloca justo a la derecha de este, este formato es llamado comúnmente 1.15 o Q15, donde el uno indica la cantidad de bits utilizados para representar la porción entera y el número 15 representa la cantidad de bits utilizados para representar la porción fraccional del número.

Fracc3.jpg

El rango de un número de fraccional de N bits con su respectivo punto decimal es de -1 a (1-21-N). Para el caso de 16 bits, el rango de Q15 va de -1 (0x8000) a +0.999969842 (0x7FFF) con una precisión de 3.05176x10-5.Un número complemento a dos de N bits puede representar tanto un numero entero como un numero en formato fraccional. Por ejemplo: un número de 16 bits de rango [-32768,+32767] se corresponde con un rango en formato Q15 de [-1.0,+0.999969482], la siguiente figura ilustra la correspondencia entre ambas representaciones:

Representación fraccional

Ejemplo de conversión del número fraccional de 16 bits 0x4001(Hex):

Ejemplo de conversión de un número fraccional de 16 bits

Fuente: J, Angulo. DsPIC diseño práctico de aplicaciones. Prentice Hall, 2006.

El Hardware

Esquema General del Hardware

El MA2000 es un robot manipulador programable cuyo diseño data de la década de los 80, diseñado para ser empleado con fines académicos por la Universidad Abierta Británica (The Open University), El MA2000 fue diseñado por George Carter fundador de Labman Automation Ltd en el Reino Unido y fue comercializado por TecQuipment International Ltd, es de 6 grados de libertad y su propósito original consistió en emular las técnicas de programación de trayectorias de los robots manipuladores industriales así como experimentar el ajuste dinámico del mismo (controlador PID) todo ello desde el PC. Este robot manipulador emplea motores DC con engrane reductor como actuadores y como sensor de posición emplea potenciómetros acoplados en cada articulación, además cuenta con una pinza neumática como elemento terminal para sujetar objetos o herramientas. En la figura inferior se aprecian los bloques funcionales de hardware, el cuadro azul se correponde con la unidad de control que físicamente se correponde con el gabinete color Azul del MA2000 que contiene toda la electrónica de control y potencia, el cuadro amarillo representa el manipulador (de color amarillo y negro) que posee los motores, potenciometros, partes móviles y pinza neumática, el cuadro verde se correponde con el PC.

Unidad de control/Comunicación

La unidad de control se corresponde en la imagen con los bloques agrupados dentro del cuadro azul (imagen superior), y físicamente se corresponden con los módulos incorporados dentro del gabinete de control original del manipulador MA2000, fundamentalmente existen tres módulos:

  1. Módulo del microcontrolador.
  2. Módulo de los drivers.
  3. Módulo de potencia de la pinza neumática.

Fundamentalmente se no solo se ha diseñado el hardware de forma modular sino que se ha implementado de esta forma, en vez de implementar un único circuito impreso dentro de la unidad de control debido a las siguientes razones:

  1. El equipo está orientado al ámbito académico y es necesario diferenciar los bloques físicamente, del tal manera que si desea estudiar o emplear solo un bloque funcional en particular del hardware, no sea necesario el rediseño completo de un circuito impreso ni el ensamblaje del mismo, así pues permite el estudio de cada módulo como un bloque funcional, típico de los equipos utilizados para la enseñanza y aprendizaje.
  2. Cada módulo realiza una función en particular y desde el punto de vista físico y de diseño puede ser utilizado en cualquier otra aplicación, más aún si se considera que se suministran todos los diagramas y esquemáticos mediante la documentación online.
  3. Se facilita el rediseño de cada módulo, mejorar cada módulo, el reemplazo por módulos distintos y la eventual reparación en caso de ser necesaria, nuevamente sin necesidad el rediseño completo de un circuito impreso ni el ensamblaje del mismo, con todos los costos asociados.
  4. Son pocas las limitaciones de espacio en este proyecto en particular que requieran de un diseño de circuito impreso de dimensiones particularmente reducidas, pues la unidad de control original del MA2000 es de dimensiones físicas relativamente amplias y suficientes para contener, proteger y permitir la conexión y desconexión de los módulos empleados.

Módulo de drivers: Puentes H con L298

Nada mejor que la hoja de datos del L298 para comprender el funcionamiento de este bloque. Sin embargo podemos resumir que en muchas aplicaciones en las que se utilizan motores DC es necesario que estos giren en ambos sentidos, para ello se emplean los puentes-H. Un puente H muy popular es precisamente el L298, su descripción tomada de la hoja de datos es la siguiente:

Es un driver de puente completo dual que acepta niveles lógicos TTL estándar y maneja cargas inductivas como relés, solenoides motores DC y de paso. Tiene dos entradas de activación (enable) para activar o desactivar los dispositivos independientemente de las señales de entrada. Los emisores de los transistores bajos de cada puente están conectados juntos y el correspondiente terminal externo puede ser usado para la conexión de una resistencia externa de medición. Se ha provisto de una entrada adicional para la fuente así que la lógica funciona a menor voltaje. Prestaremos especial atención al manejo de motores DC con escobillas, la conexión empleada se observa en las siguientes imagenes tomadas de las hojas de datos, las imagenes mostradas corresponden con un solo solo driver y por lo tanto a un solo motor y articulación del manipulador, puede utilizarse en muchos proyectos similares y en general en cualquier motor DC mientras no se sobrepasen sus requerimentos de corriente y tensión.

Se puede apreciar el esquemático y el PCB en las imagenes superiores, si desea editar o realizar algún cambio, descargue el el archivo aquí. Puede descargar el proteus aquí

Módulo del microcontrolador: entrenadora para dsPIC30F3011/4011

Concebida como un soporte físico bastante conveniente para realizar las pruebas iniciales, evitar fallas de conexión, facilitar la programación del microcontrolador y la depuración se desarrolló una placa bastante sencilla que permite el acceso a todos los pines del microcontrolador. Utiliza terminales con tornillos de modo de facilitar la conexión y desconexión así como tambien se evita el uso de cables con terminales especiales. Estos terminales se utilizaron en tres pines del A/D: AN6, AN7 y AN8, en las salidas de PWM para motores y las salidas de Output/compare, que son precisamente las más utizadas en este proyecto. En resumen es una placa bastante simple pero que puede ser muy util para todo aquel que se inicia con los dsPIC30F3011 y dsPIC30F4011, bastaría conectar un potenciómetro y conectar un diodo led a una salida de PWM para realizar pruebas muy interesantes a la vez que se depura y se observan los valores de los registros con la ayuda del programador pickit2 y del software MPLAB.


El módulo del microcontrolador se dedica a las siguientes tareas:

  1. El módulo actúa como controlador PID dedicado, fundamentalmente el microcontrolador toma la muestra de la posición de la articulaciones A, B y C en forma alternada a intervalos regulares de tiempo, durante los cuales se ejecuta el algoritmo de control, se genera en consecuencia una señal de PWM la cual es amplificada por el modulo de drivers que genera a su vez un par en el motor correspondiente. El par produce un cambio en la posición de la articulación y se toma la muestra de la nueva posición, repitiéndose el ciclo una y otra vez según los intervalos de tiempo establecidos por defecto o seleccionados por el usuario. Como el manipulador posee acoplados potenciómetros en cada articulación es posible conocer la posición de la articulación midiendo la tensión en el potenciómetro correspondiente, estos se realiza mediante las entradas analógicas AN6 AN7 y AN8 (ver figuras) del dsPIC30F3011/4011 que se miden las tensiones de los potenciómetros de las articulaciones A, B y C del manipulador respectivamente. Desde la bornera del módulo se alimentan los potenciómetros como se indica en la figura (abajo). Por cada motor del manipulador se generan dos señales de PWM donde se han configurado de forma tal que una es la complementaria o negada de la otra, para el motor de la articulación A las señales de PWM se obtienen en los pines PWM1L y PWM1H, para el motor de la articulación B las señales de PWM provienen de los pines PWM2L y PWM2H y finalmente para el motor de la articulación C las señales de PWM provienen de los pines PWM3L y PWM3H. Estas señales de PWM se corresponden con las entradas de PWM de los drivers según la tabla (abajo), que amplifican la señal en tensión y aumentan la capacidad de la corriente.
  2. El módulo genera las señales de PWM necesarias para indicar establecer la posición los motores de modelismo, esto se realiza mediante los pines OC1, OC2 y OC3 del microcontrolador, que se corresponden con las articulaciones D, E y F respectivamente.
  3. El módulo genera la señal de ENABLE de los drivers L298, mediante las salidas digitales RB3, RB4 y RB5. La salida digital RB3 se corresponde con la entrada ENABLE del driver A del motor de la articulación A. La salida digital RB4 se corresponde con la entrada ENABLE del driver B del motor de la articulación B y de igual manera la salida digital RB5 se corresponde con la entrada ENABLE del driver C de la articulación C.
  4. El módulo genera la señal de ENABLE que permite el cierre de la pinza neumática del manipulador mediante un transistor de potencia TIP120 actuando como switch y una válvula solenoide, se emplea la salida digital RB3 del dsPIC para este fin.
  5. Por último pero no menos importante el módulo actúa como servidor de comunicación con el software en el PC el cual hace las veces de cliente, desde el software llamado ROBOCOM se realizan peticiones para realizar cualquiera de las acciones anteriormente citadas: configuración del PID, activación o desactivación de los drivers, pinza neumática, establecer las posiciones deseadas para cada articulación, realizar lecturas de la posición, etc. Para realizar la comunicación se emplean los pines U2TX y U2RX del dsPIC.

Puede descargar el PDF de la placa listo para imprimir aquí. Tambien puede decargar los archivos para editar el layout y el esquemático con el eagle aquí. Puede descargar el eagle de la página de cadsoft e instalarlo como freeware.

Importante: Si la impedancia de la fuente de la señal de entrada es alta (mayor de 10 Kohm). El sample and hold no podrá retener las muestras adecuadamente y se perderá precisión. Es necesario agregar un condesador de 0.1 uF que suplirá la corriente necesaria para cargar el capacitor de 4.4 pF del sample and hold. Asi se indica en la sección 17.27 página 17-57 del manual del A/D del dsPIC. En el caso particular del MA2000 es necesario agregar este condensador en cada una de las entradas del A/D de lo contrario las muestras del A/D serán poco precisas.

Nueva Versión 2013V1 del Módulo del microcontrolador

Se han añadido condensadores de filtrado las entradas de referencia del A/D (vref- y vref+) para reducir el ruido, tal como se indica en la hoja de datos en la figura 17-25. Se han añadido los capacitores de 0.1 uF (100nF) en las entradas, Asi se indica en la sección 17.27 página 17-57 del manual del A/D. Se han añadido pines de Vdd y GND en el pin header de comunicaciones., para que el cambio tenga efecto deben configurarse adecuadamente los registros del A/D. Se puede descargar el layout y esquemático en el siguiente enlace.

Módulo del regulador 7805/transistor TIP120 de la pinza neumática

Constituye el módulo de hardware más simple del proyecto realiza se puede dividir en dos partes que realizan las siguientes dos funciones:

  1. Un transistor de potencia BJT TIP120 actuando como switch suministra en el colector la corriente que requiere la válvula solenoide que permite el accionamiento de la pinza neumática del manipulador, la señal que permite el accionamiento alimenta la base del transistor y proviene del PIN RB2 del microcontrolador según se aprecia en la figura (abajo). La fuente DC del manipulador suministra la fuente de tensión como se aprecia en la figura inferior.
  2. Un clásico regulador de tensión 7805 proporciona la tensión de 5 V DC regulados al módulo del microcontrolador y a su vez a los potenciómetros de las articulaciones de las articulaciones A, B y C.

La figuras (arriba) ilustran cómo realizar la conexión del módulo de potencia de la pinza neumática, el regulador de tensión 7805 se conecta a la fuente DC del manipulador con salida de 15V mediante la bornera X1-1 (+15V) y X1-2 (GND), a la salida se obtienen 5 V regulados para alimentar el módulo del microcontrolador en los pines X2-2 (5V) y X2-1(GND). La otra parte del módulo específicamente la que se encarga de accionar la pinza neumática se utiliza de la siguiente manera: Se conectan los dos conductores que corresponden con la válvula solenoide del manipulador en la bornera X3 (no importa la polaridad). Se conecta en X3-2 la salida digital proveniente del modulo del microcontrolador que se corresponde con RB3.

Módulos de comunicación (interfaz USB serial basada en FT232)

Se ha empleado un módulo de interfaz USB/SERIAL, en sistemas operativos windows deben descargarse los controladores y configurar el módulo en la tasa de baudios adecuada. Los controladores se pueden descargar en la pagina de http://www.ftdichip.com/Drivers/VCP.htm. Solo se emplean en este proyecto los pines TXD, RXD y GND y deben conectarse con los pines RX, TX del microcontrolador y el GND se puede conectar a un pin de GND de la bornera de la tarjeta de los drivers.

El manipulador

Cableado del manipulador

Descripción del cableado proveniente del manipulador

El manipulador posee dos conductores uno de 18 hilos y uno de 12 hilos, el primero facilmente diferenciable del por ser ligeramente más grueso, los cuales conducen todas las señales que permiten el funcionamiento del manipulador y por tanto muchos de los hilos se emplean y deben conectarse en las borneras de los distintos módulos que posee la unidad de control. Los cables del manipulador están debidamente diferenciados mediante colores, la tabla inferior permite realizar la adecuada conexión del manipulador en caso que sea necesario realizar la re conexión o realizar alguna modificación en el hardware. Cada hilo empleado se debe conectar en alguno de los tres módulos de la unidad de control, para realizar la conexión se debe buscar para cada hilo el módulo en cual se debe conectar: modulo de los drivers, módulo del DSC o módulo de la pinza neumática, luego se debe buscar la documentación pertinente a cada módulo donde se indica cómo realizar la conexión.

Los servomotores de modelismo

Pruebas iniciales con los motores futaba s3802.

En analogía al brazo humano,las 3 articulaciones de la muñeca del manipulador encargadas de realizar movimientos de la pinza neumática emplean servomotores de modelismo estandar futaba s3802, las especificaciones pueden hallarse en el siguiente documento. Estos motores fueron adaptados tal como se expresa en el siguiente informe y reemplazaron a los motores originales. En la figura inferior se aprecia la conexión de los servos al microcontrolador, los servos estan alimentados con 5V desde la bornera de la tarjeta de drivers con los hilos color GRIS para los 5Vdc y Amarillo con franjas rojas para el GND.

El Software

Programa del microcontrolador (firmware)

En esta sección se estudiará el programa del microcontrolador, comentando brevemente el código, es necesario aclarar que para entender las configuraciones empleadas y/o modificarlas es necesaria la lectura de las hojas de datos del módulo o módulos involucrados y no se pretende en ningún momento repetir esa información sino mas bien asociarla de una manera resumida a esta aplicación en particular. Los manuales pueden ser descargados de la página web de michochip para el dsPIC30F3011, el dspic30f4011 es tambien compatible, solo difiere en la cantidad de memoria disponible, se ofrecen en esta wiki enlaces externos a la documentación a medida que el lector estudia cada módulo.

Programa Principal

El programa principal fundamentalente consiste en un ciclo while del que solo se podrá salir ante un evento de interrupción. Luego un reset del microcontrolador o luego del encendido del mismo se configuran los módulos utilizados en la aplicación,esto se realiza mediante una función C para cada módulo. En resumen, cuando se enciende el equipo se configuran los timers, módulos de PWM, convertidores analógicos digitales, se habilitan las interrupciones. Puesto que en las pruebas iniciales se utilizó solo la uart 1, esta aparece comentada. Son claramente diferenciables las funciones utilizadas y se estudiarán con mayor detalles en los apartados siguientes.

int main(void)
{
Configurar_PID();                       /*Derive the a,b, & c coefficients from the Kp, Ki & Kd */
Start_ouput_compare_PWM();              //función que configura el modulo output-compare para el manejo de los servomotores de modelismo
Start_motor_PWM_module();               //función que configura el módulo de PWM para el manejo de los motores DC.
Start_analog_digital_converter();       //función que configura el convertidor A/D
Configure_pins();                       //función que realiza la configuración de las entradas y salidas binarias
//Configure_UART_1();
Configure_UART_2();                     //función que realiza la configuración de la UART2
Start_timer1();                         //función que realiza la configuración del Timer 1 encargado del muestreo del PID
 
while (1)
{
}
}

Configuración del timer1: Periodo de muestreo del controlador

El timer 1 es un timer de 16 bits, los registros de configuración se describen muy claramente en el manual de microhip. Este timer está encargado de generar una interrupción que indica que se debe ejecutar el algoritmo de control de posición de las articulaciones inferiores del manipulador. El timer aumenta su cuenta con cada Fcy=Fosc/4 multiplicada por un factor que puede ser 1,8,64 ó 256. Es decir, como nuestro oscilador esta configurado para 120 Mhz. Fcy = 30 Mips por lo que ocurre un ciclo de máquina cada 33,33 ns aproximadamente. Se ha selecionado el factor de 8 como pre-escalador de forma de ampliar el rango máximo de tiempo del timer pues el usuario debe ser capaz de variar la frecuencia de muestreo desde el PC en un rango relativamente amplio. Como 8 * 33,33 ns = 266,64 ns entonces se tendrá un incremento del timer cada 266,64 ns (aprox). Puesto que el timer es de 16 bit seremos capaces de ejecutar el algoritmo de control hasta un tiempo máximo de 266,64 ns * 65535 = 0,01747 segundos (17,47 ms aprox.). Puesto que el algoritmo de control se realiza durante la interrupción del timer en forma alternada para cada uno de los 3 lazos de control de los 3 motores de las articulaciones inferiores del manipulador, tenemos que para una articulación podremos tener un tiempo de muestreo máximo de 3 * 17,3 ms = 51,9 ms y un tiempo de muestreo mínimo de 3*266,64 ns = 799,92 ns para cada articulación (teórico pero no posible en la práctica).

Si se desea cambiar el pre-escalador para cambiar el rango para cada lazo de control (son 3 lazos en nuestro caso), podemos entonces utilizar la ecuación siguiente para conocer el tiempo en el cual se ejecutará el algoritmo de control en cada lazo: Tmuestreo = 3 * preescalador * 33,33 ns * PR1 donde PR1 es el registro del periodo del timer, y se puede modificar a juicio del usuario si este desea modificar el periodo de muestreo.

//-----------------------------------
//TIMER 1        (se utiliza para generar las interrupciones que toman las muestras.)
 
void Start_timer1(void)
{
//PR1=60000;//(300 son 10 us) ,(60000 son 2000 us) //con prescaler 0
PR1=500;//
T1CON=0x8000;
T1CONbits.TCKPS=2;  //prescaler  aunmenta	timer cada 8 ciclos de reloj    	
IFS0bits.T1IF = 0;		// Limpia la bandera de la interrupcion
IPC0bits.T1IP = 7;      // INTERRUPCION DE MAS ALTA PRIORIDAD, EL CONTROLADOR PID (conversion y algoritmo controlador) TIENE  MAYOR PRIORIDAD que cualquier otra interrupcion.
IEC0bits.T1IE = 1;		// activa la bandera de interrupcion del timer 1
}
//--------------------------------------

Entonces podremos muestrear con la configuración actual uno de los 3 lazos de control con una frecuencia mínima de muestreo de 1/51,9 ms = 19,26 sps y para un valor del registro de PR1=5(decimal) se obtiene una frecuencia máxima de muestreo de 1/(5*799,92 ns) = 250 Ksps acorde con la tabla 17-9 del manual del timer para la configuración de nuestro hardware.

Configuración del UART: Comunicación serie con el PC

El manual del UART se encuentra dividido en parte 1 y parte 2. Sin embargo la UART se ha configurado de la manera más sencilla posible, con datos de 8 bits, sin paridad a una tasa 115000 baudios siguiendo los ejemplos que aparecen en el manual. La interrupción de recepción ocurre apenas se recibe un caracter.

void Configure_UART_2(void)
{
U2MODEbits.STSEL = 0;    // 1-stop bit
U2MODEbits.PDSEL = 0;    // No Parity, 8-data bits
U2MODEbits.ABAUD = 0;    // Autobaud Disabled
//U1MODEbits.ALTIO = 1;  //pins alternative
 
U2BRG=194;     //baud rate set to 9600
 
IEC1bits.U2TXIE = 1;    // Enable UART Transmit interrupt
U2STAbits.UTXISEL = 0;  // Interrupt for every data transfer
IPC6bits.U2TXIP=1;      // Priority for Tx interrupt
IFS1bits.U2TXIF = 0;    // Clear the Transmit Interrupt Flag
 
IEC1bits.U2RXIE=1;       //interrupcion de recepcion activada
U2STAbits.URXISEL = 0;   // Interrupt after a character is received
IPC6bits.U2RXIP=2;       // priority Rx interrupt
IFS1bits.U2RXIF = 0;     // Clear the Reception Interrupt Flag
 
U2MODEbits.UARTEN = 1;  // Enable UART
U2STAbits.UTXEN = 1;    // Enable UART Tx
}

Configuración del convertidor A/D

secuencia de muestreo/conversión

Los registros de configuración del convertidor analógico y una amplia gama de opciones de configuración se encuentran en la hoja de datos. Puesto que el muestreo se realizará de forma secuencial (ver página 17-12) y el periodo de muestreo es relativamente amplio (por tratarse de un sistema mecánico), se utilizará un solo sample and hold (CH0) de los 4 disponibles,en esta seccion nos limitaremos a explicar la función de configuración del módulo. En la descripción del evento de interrupción del timer 1 se trata con mayor detalle el funcionamiento del A/D en el caso particular de nuestra aplicación.

Se configuraron RB6, RB7 y RB8 como las entradas analógicas utilizadas pues son las que utiliza el módulo del microcontrolador, es importante resaltar que la data obtenida del analógico digital se obtendrá en formato fraccional Q15 (1.15) con signo, pues el algoritmo del controlador PID emplea este formato, se recomienda ver la página 17-46 de la hoja de datos, existen múltiples opciones de configuración de la secuencia de muestreo y conversion del analógico digital, en este caso tanto la muestra y la conversión se inician de forma manual de forma similar al ejemplo de la página 17-18 de la hoja de datos.

//------------------------------
//CONVERITDOR ANALOGICO DIGITAL
 
void Start_analog_digital_converter(void)
 
{
ADPCFG = 0xFE3F;        //PARA ENTRENADORA  dspIC RB6,RB7 y RB8 son las entradas analógicas utilizadas, este registro determina cuales entradas son analógicas serán las que utilizaremos.
ADCON1=0x0000;          //Uno de los Registro de configuración del A/D, se ha dejado sin cambios.
ADCON1bits.FORM = 3;    //MODO FRACCIONAL (con signo).       
ADCON3 = 0x0009;        //Tad = internal 5 Tcy = 165 ns
ADCON2 = 0;
ADCHSbits.CH0SA = 6;    //configura AN0 como entrada inicial
ADCON1bits.ADON = 1;    //turn ADC ON
ADCON1bits.SAMP = 1;    //EMPIEZA A SAMPLEAR
}
 
//-------------------------------

Se requieren de un total de 12 Tad para completar una conversión el Tad es múltiplo del tiempo de ciclo máquina (33ns para nuestra configuración) y se especifica en el registro ACDCON3. Se recomienda ver la página 17-25.

Configuración del módulo de PWM

Registros PTMR y PDCx:
Una vez más se recomienda la lectura de la hoja de datos . En resumen el módulo se ha configurado en modo ¨free-running¨ pues además de ser el modo de configuración más simple satisface las necesidades de esta aplicación en particular. Se ha configurado el periodo la señal de PWM a una frecuencia de aprox. 29,328 KHz (esto depende del valor del registro PTPER=1023, de los pre y post-escaladores).

La resolución de la señal de PWM obtenida es de 11 bits, por lo tanto para obtener un duty cycle máximo es necesario que el registro PDCx tenga un valor de 2048. Los pines de salida de PWM se han configurado en modo complementario, por lo tanto para que la corriente promedio entregada al motor sea cero es necesario colocar PDCx=1023, para que el motor produzca par máximo el registro de duty cycle debe ser PDCx=0 para que gire en un sentido ó PDCx =2048 para que gire en el otro sentido.

//-------------------------------
//MODULO DE PWM
 
void Start_motor_PWM_module(void)
{
PTMRbits.PTMR = 0;          // valor inicial de conteo es cero
PTCONbits.PTMOD=0;          // modo free-running
PTCONbits.PTCKPS =0;        // pre-escalador ajustado a 1:1 para obtener 30 khz aprox.
PTCONbits.PTOPS = 6;        // post-escalador ajustado a 1:1
PTPER = 1023;               // base de tiempo del periodo
PTCONbits.PTEN = 1;         // base de tiempo activada
PWMCON1 = 0x00ff;           // pines configurados como salidas de PWM y en modo complementario
PWMCON2bits.IUE=1;          //Actulizacion imediata de duty cycle
//EN el robot no hay necesidad de aplicar tiempo muerto
 
PDC1=1023;
PDC2=1023;
PDC3=1023;
}
//-----------------------------------

Configuración del módulo de output-compare: PWM de los servomotores de modelismo

El módulo de output-compare se ha empleado para generar por hardware las señales que requieren los servomotores de modelismo, por lo tanto se han configurado para generar una señal de PWM tal como se indica en la hoja de datos en la página 14-10. En este caso el periodo de la señal de PWM viene dado por el timer 2, este timer se configura de forma analoga al timer 1,(el timer 2 es de uso general), se ha configurado el mismo para un periodo de 17,3 ms, para obtener una posición del servomotor centrada, que corresponde con un pulso 1,5 ms de duración el registro de duty cycle debe ser OCxRS=0x1632 (5682 en decimal). Es necesario generar un pulso desde los 1 ms hasta los 2ms por lo tanto los valores válidos del registro en esta aplicación van desde el 3788 hasta el 7576 (en sistema decimal), lo que permite obtener la posición deseada en dentro del rango de posiciones del servomotor.

//--------------------------------------
// MODULO DE OUTPUT/COMPARE    (se encarga de generar los pulsos PWM para los servos de modelismo) 
 
void Start_ouput_compare_PWM()
{  
 
OC1R=0x1632;
OC1RS=0x1632;
 
OC2R=0x1632;
OC2RS=0x1632;
 
OC3R=0x1632;  //2ms      1aa2 1,8ms
OC3RS=0x1632;
 
OC1CON=0x0000;
OC2CON=0x0000;
OC3CON=0x0000;
 
 
OC1CONbits.OCM=6;  //modo PWM timer 2
OC2CONbits.OCM=6; 
OC3CONbits.OCM=6;
 
// configuración del timer2
PR2=0xFFFF;//17,3 ms periodo timer 2
T2CON=0x0000;	  
T2CONbits.TCKPS=1;// pre escaler 8 del timer 2
T2CONbits.TON=1;  //timer 2 ON
}

Configuración de los pines entrada y salida

En esta función se configuran las entradas y salidas digitales, se utiliza el puerto B y estas salidas digitales activan o desactivan los puentes H y la pinza neumática. Cualquier otra salida o entrada digital adicional debe ser configurada en esta función. El manual de configuración de puertos de entrada y salida se puede descargar aquí. Puede identificar físicamente los pines del puerto B en la sección de módulo del microcontrolador.

//--------------------------------------
// CONFIGURACION DE PINES I/O.  (entrada-salida)
void Configure_pins(void)
{
TRISB=0x01C3;       //configurar salidas y entradas del puerto b
	            //Se configuran durante el incio el estado de los siguientes pines del puerto B:
LATBbits.LATB2=0;   //Pinza neumatica desactivada por defecto
LATBbits.LATB3=1;   //Enable puente H del motor A
LATBbits.LATB4=1;   //Enable puente H del motor B
LATBbits.LATB5=1;   //Enable puente H del motor C
}

Configuración del PID (Motor DSP)

El compilador C30 incluye una librerías C que incluye funciones para los DSP, funciones matemáticas, aritmética de punto fijo y de punto flotante, nos enfocaremos en las funciones para [1] específicamente en la funciones destinadas a la implementación de un controlador PID.

La librería de algoritmos proporciona un conjunto de funciones optimizadas para las aplicaciones más comunes en el procesamiento digital de señales. La librería DSP provee un aumento significativo de rendimiento en contraste a otras funciones equivalentes escritas en C y permite a los desarrolladores disminuir dramáticamente el tiempo de desarrollo. La librería DSP puede ser utilizada en cualquier dispositivo dsPIC. La librería DSP está escrita predominantemente en lenguaje ensamblador y hace uso del set de instrucciones de los DSP y los recursos de hardware, incluyendo direccionamiento en memoria X y Y. La librería DSP proporciona funciones para los siguientes tipos de operaciones:

  • Operaciones con vectores.
  • Operaciones con matrices.
  • Filtros.
  • Transformaciones.

La librería dsp provee de una función de controlador PID (tPID* ), para realizar las operación de un PID. La función utiliza una estructura de datos definida en la cabecera dsp.h, que se ve así:

typedef struct {
        fractional* abcCoefficients;  /* coeffs derived from Kp, Ki & Kd */
        fractional* controlHistory;   /* state variables (delay line)in Y-data
        fractional controlOutput;     /* PID Controller Output  */
        fractional measuredOutput;    /* Measured Output sample */
        fractional controlReference;  /* Reference Input sample */
} tPID;

Antes de invocar la función PID(), la aplicación debe inicializar la estructurade datos de tipo tPID. Esto se realiza siguiendo los siguientes pasos: 1. Se Calculan los coeficientes de los valores de las ganacias del PID.

El elemento abcCoefficients en la estructura de tipo tPID es un puntero a A, B y C, coeficientes que estan localizados en el espacio de datos X. Estos coeficientes se obtienen a partir de las ganancias Kp,Ki y Kd tal como sigue:

  • A =Kp + Ki +Kd
  • B = -(Kp + 2*Kd)
  • C = Kd

Para obtener los coeficientes A,B y C, la librería provee de la función PIDCoeffCalc.

2. Se limpian los coeficientes de las variables de estado del PID.

El elemento de la estructura controlHistory es un puntero a una historia de 3 muestras localizadas en el espacio-Y, con la primera muestra siendo la más reciente (la actual). Estas muestras constituyen una historia de las diferencias entre la referencia y la salida del sistema. La función PIDinit limpia los elementos apuntados por controlHistory. También limpia el elemento controlOutput de la estructura tPID.

Del documento 16Bit Language Tool Libraries página 76 se han tomado las descripción de las funciones utilizadas:

En el caso de nuestra aplicación se implementan 3 controladores PID que se ejecutan en forma secuencial (uno despues del otro), por lo tanto basta asignar varios alias a la misma estructura tPID, definimos los alias de la estructura tPID para cada controlador y las variables fuera de la función configurar_PID():

//VARIABLES ASOCIADAS AL CONTROLADOR PID UTILIZANDO EL DSP (tal como indica el instructivo para el PID de microchip )
 
tPID PID_A;
tPID PID_B;
tPID PID_C;
 
/* The fooPID data structure contains a pointer to derived coefficients in X-space and */
/* pointer to controler state (history) samples in Y-space. So declare variables for the */
/* derived coefficients and the controller history samples */
 
//ARTICULACION  A 
 
fractional abcCoefficient_A[3] __attribute__ ((section (".xbss, bss, xmemory")));
fractional controlHistory_A[3] __attribute__ ((section (".ybss, bss, ymemory")));
 
//ARTICULACION  B
 
fractional abcCoefficient_B[3] __attribute__ ((section (".xbss, bss, xmemory")));
fractional controlHistory_B[3] __attribute__ ((section (".ybss, bss, ymemory")));
 
//ARTICULACION  C
 
fractional abcCoefficient_C[3] __attribute__ ((section (".xbss, bss, xmemory")));
fractional controlHistory_C[3] __attribute__ ((section (".ybss, bss, ymemory")));
 
/* The abcCoefficients referenced by the fooPID data structure */
/* are derived from the gain coefficients, Kp, Ki and Kd */
/* So, declare Kp, Ki and Kd in an array */
 
fractional kCoeffs_A[] = {0,0,0};
fractional kCoeffs_B[] = {0,0,0};
fractional kCoeffs_C[] = {0,0,0};

La función Configurar_PID() tan solo asigna los valores de inicialización de las variables: referencias, y ganacias del controlador.

//--------------------------------------
// CONFIGURACION DEL PID      
 
void Configurar_PID()
{  
 
//ARTICULACION  A 
PID_A.controlReference = Q15(0.0);               //referencia de control por defecto
PID_A.abcCoefficients = &abcCoefficient_A[0];    /*Set up pointer to derived coefficients */
PID_A.controlHistory = &controlHistory_A[0];     /*Set up pointer to controller history samples */
PIDInit(&PID_A);                                 /*Clear the controler history and the controller output */
kCoeffs_A[0] = Q15(0.5);						//termino proporcional por defecto de articulación A
kCoeffs_A[1] = Q15(0.0035);						//termino integral por defecto de articulación A
kCoeffs_A[2] = Q15(0.0);						//termino derivativo por defecto de articulación A
 
tmpvar=kCoeffs_A[1]; // Ki
coef_integral_A=tmpvar;
 
PIDCoeffCalc(&kCoeffs_A[0], &PID_A);  
 
//ARTICULACION  B 
PID_B.controlReference = Q15(0.25);
PID_B.abcCoefficients = &abcCoefficient_B[0];    /*Set up pointer to derived coefficients */
PID_B.controlHistory = &controlHistory_B[0];     /*Set up pointer to controller history samples */
PIDInit(&PID_B);                                 /*Clear the controler history and the controller output */
kCoeffs_B[0] = Q15(0.75);						//termino proporcional por defecto de la articulacion B
kCoeffs_B[1] = Q15(0.0035);						//termino integral por defecto de la articulacion B
kCoeffs_B[2] = Q15(0.0);						//termino deriviativo por defecto de la articulacion B
 
tmpvar=kCoeffs_B[1]; // Ki
coef_integral_B=tmpvar;
 
PIDCoeffCalc(&kCoeffs_B[0], &PID_B);  
 
//ARTICULACION  C 
PID_C.controlReference = Q15(-0.25);
PID_C.abcCoefficients = &abcCoefficient_C[0];    /*Set up pointer to derived coefficients */
PID_C.controlHistory = &controlHistory_C[0];     /*Set up pointer to controller history samples */
PIDInit(&PID_C);                                 /*Clear the controler history and the controller output */
kCoeffs_C[0] = Q15(0.75);						//termino proporcional por defecto de la articulacion C
kCoeffs_C[1] = Q15(0.0035);						//termino intergral por defecto de la articulacion C
kCoeffs_C[2] = Q15(0.0);						//termino derivativo por defecto de la articulacion C
 
tmpvar=kCoeffs_C[1]; // Ki
coef_integral_C=tmpvar;
 
PIDCoeffCalc(&kCoeffs_C[0], &PID_C); 
}


Es necesario acotar que todos los archivos necesarios para utilizar la libreria están en la carpeta del compilador C30 que deberia tener instalado, el ejemplo [2] de Microchip explica claramente con un ejemplo como se emplea la librería y que archivo debe añadir y en general todas las instrucciones a seguir.

Interrupción del timer 1: Ejecución del algoritmo de control

Algoritmo que se ejecuta durante un evento de interrupción del timer 1
Diagrama de tiempo de una secuencia de eventos de interrupción

El microcontrolador o DSC Actúa como controlador PID dedicado de las articulaciones A,B y C para ello a intervalos regulares de tiempo (que se pueden modificar desde la interfaz de usuario en el PC), se ejecuta un evento de interrupción , se realiza la conversión A/D para tomar la lectura de la tensión en el potenciómetro respectivo, luego haciendo uso del motor DSP y utilizando la librerías que proporciona MICROCHIP para implementación de un PID se ejecuta el algoritmo de control, la posición deseada, entrada de referencia o setpoint, no es más que una variable establecida por defecto en el microcontrolador y que el usuario puede modificar externamente desde el PC vía comunicación serie.

Fundamentalmente al ocurrir una interrupción cada cierto tiempo determinado por el Timer 1 se ejecuta el siguiente algoritmo.

Al ocurrir la interrupción se ejecuta la conversión y el cálculo del controlador con la articulación que se venia muestreando desde que ocurrió la interrupción anterior, durante la interrupción actual y una vez se ha realizado la conversión, se comienza a muestrear la tensión en el potenciómetro de la siguiente articulación, con el dato de la conversión (almacenado temporalmente en una variable) se ejecuta el calculo del controlador PID, cuya salida será una señal de PWM. Entonces en la primera interrupción se ejecuta el controlador PID de la articulación A del manipulador, a la siguiente interrupción se ejecuta el el controlador PID de la articulación B, luego la articulación C y se repite el ciclo una y otra vez. Esta multiplexación resulta evidente en el uso del CASE en el lenguaje C (ver código abajo) donde el case 1 se corresponde con la articulación A, el case 2 con la B y el case 3 con la C. El diagrama de tiempo también ilustra este comportamiento.

void __attribute__((__interrupt__,__no_auto_psv__)) _T1Interrupt(void)
{
//T1CONbits.TON=0;  //detiene el timer 1
TMR1=0;     //timer 1 igual a cero
switch(pin)
{
//-------------------------------------------------------------------------------------------
case 1:               //   VAMOS CON LA ARTICULACION A
{
ADCON1bits.SAMP = 0; // EMPIEZA A CONVERTIR 
while (!ADCON1bits.DONE); // CONVERSION LISTA?
/*Typically the measuredOutput variable is a plant response*/
PID_A.measuredOutput = ADCBUF0;
ADCHSbits.CH0SA = 7; //SELECIONA EL SIGUIENTE PIN DE ENTRADA
ADCON1bits.SAMP = 1; //  EMPIEZA A SAMPLEAR LA SIGUIENTE ARTICULACION (La B). 
 
PID(&PID_A);
PIDresult_A = (PID_A.controlOutput);
PIDresult_A=-PIDresult_A;
Duty_cycle_A=PIDresult_A+1023;
 
if ((Duty_cycle_A<65535)&&(Duty_cycle_A>32767))
{
kCoeffs_A[1]=0; // Eliminamos el termino integral si existe saturación.
Duty_cycle_A=0;
}
if ((Duty_cycle_A<32767)&&(Duty_cycle_A >(2048)))
{
kCoeffs_A[1]=0; // Eliminamos el termino integral si existe saturación.
Duty_cycle_A =2048;
}
if ((Duty_cycle_A<2048)&&(Duty_cycle_A >(0)))
{
kCoeffs_A[1]=coef_integral_A; // Eliminamos el termino integral si existe saturación.
}
 
PDC1=Duty_cycle_A;
PIDCoeffCalc(&kCoeffs_A[0], &PID_A);
ADCvalueA=PID_A.measuredOutput;
pin=2;
break;
}
//--------------------------------------------------------------------------------------------
case 2:        //  VAMOS CON LA ARTICULACION B    (se repite lo mismo, se puede mejorar pero solo ahorraria memoria de programa) 
{
 
break;
}
//--------------------------------------------------------------------------------------------
case 3:        //  VAMOS CON LA ARTICULACION C   (se repite lo mismo, se puede mejorar pero solo ahorraria memoria de programa) 
{
 
break;
}
//--------------------------------------------------------------------------------------------
}
}
T1CONbits.TON=1;  //arranca el timer 1
IFS0bits.T1IF = 0; //clear interrupt flag
}

Descripción del Protocolo de Comunicación

Protocolo de Comunicación

El protocolo de comunicación permite modificar los registros del DSC que necesitan modificarse por el usuario, de esta manera se modifican los parámetros del controlador PID, y salidas digitales. Se ha utilizado una arquitectura cliente/servidor, una PC con el software Robocom hace las veces de cliente (dispositivo maestro), y tiene por lo tanto un papel activo en la comunicación, el software en el PC que interactúa directamente con el usuario inicia siempre las solicitudes o peticiones y recibe las respuestas dependiendo de la solicitud realizada. El DSC hace las veces de servidor y por lo tanto juega un papel pasivo en la comunicación. Para establecer la comunicación se emplea la UART del DSC con la configuración mostrada abajo, por lo tanto la UART del cliente debe cumplir con las mismas características.

  • Tasa de baudios: 115200
  • Bits de datos: 8 bits
  • Bits de parada: 1
  • Paridad: Sin paridad.
  • Control de flujo: Ninguno.

Toda trama que envía o recibe el cliente consta de tres bytes, el primero indica el comando o la acción a realizar con la data contenida en los dos bytes restantes los cuales forman juntos un registro de 16 bits pues el DSC (servidor) maneja datos de esta longitud. La tabla siguiente indica la codificación en hexadecimal para las tramas de solicitud del cliente y de respuesta del servidor.

Robocom: Guía del Usuario

Interfaz de RoboCom

El software RoboCom 1.1 compilado para windows se puede descargar desde el siguiente enlace:[DESCARGAR]. El software proporciona una interfaz de usuario que consiste en una serie de ventanas, en su mayoría relocalizables que se pueden cerrar y abrir en función de las necesidades del usuario, cada ventana realiza ciertas funciones:

Ventana de Entradas de Referencia

Ventana de entradas de referencia

Esta ventana del software, permite establecer manualmente las entradas de referencia, posiciones o coordenadas angulares para cada articulación, es útil para experimentar el ajuste dinámico del controlador pues desde el punto de vista de control cada cambio de la posición de referencia equivale a una entrada escalón. La entrada de referencia o posición angular puede modificarse ya sea utilizando las barras de desplazamiento con ayuda del mouse, mediante las teclas (q, w, e, a, s, d, u, i, k, l, m, n) del teclado. Es importante resaltar que los ángulos indicados en la ventana de entrada de referencia no se corresponden con los ángulos θi según la convención de Denavit y Hartenberg. Los ángulos θi según la convención DH pueden observarse en la ventana de cinemática directa en la pestaña de parámetros DH al mover las barras de desplazamiento o realizar cualquier cambio de las entradas de referencia. La ventana de entradas de referencia permite introducir el ángulo deseado en grados y este puede visualizarse en radianes. Deben modificarse las entradas de referencia o ángulos deseados con gran precaución pues un uso imprudente puede conducir a movimientos bruscos o “choques” y por lo tanto a daños en el equipo. Las barras de desplazamiento correspondientes a cada articulación se identifican según la convención de Denavit-Hartenberg. En el caso de las articulaciones 1, 2 y 3 se indica el número (decimal) enviado al DSC al realizar cualquier cambio de las entradas de referencia una vez se ha habilitado la comunicación.

Ventana de Ajuste Dinámico

Pestaña de ajuste del los parámetros P,I y D de la ventana de Ajuste Dinámico
Pestaña de ajuste del periodo de muestreo de la ventana de Ajuste Dinámico

Esta ventana permite modificar con libertad los parámetros del controlador PID de las articulaciones A, B, C ó 1, 2 y 3 (según la convención DH). Se pueden modificar los parámetros proporcional, integral y derivativo así como el periodo de muestreo del sistema. Cualquier modificación debe realizarse con muchísima precaución y cualquier modificación debe ser poco brusca, esto es especialmente cierto para usuarios con poca experiencia con el equipo. Cambios en el controlador pueden conducir a comportamientos inestables que conducen a stress mecánico, oscilaciones bruscas y en el peor de los casos a choques del manipulador.

Ventana de Comunicación

Ventana de Comunicación

Por defecto siempre se encuentra visible, permite seleccionar el puerto de comunicaciones adecuado ya sea en sistemas operativos Linux o Windows, una vez se ha seleccionado el puerto de comunicaciones debe habilitarse la comunicación para que sea posible la comunicación entre la unidad de control del manipulador y el PC. Los puertos de comunicación deben configurase según las especificaciones señaladas en la tabla 7.

Ventana de Gripper (pinza)

Ventana de Gripper

Dentro de esta ventana un botón permite el accionamiento de la pinza neumática del manipulador, se escuchará un sonido “click” al ser presionado proveniente de la válvula solenoide dentro del manipulador. Para que la pinza funcione debe emplearse un compresor neumático.

Ventana de Habilitación de los Puentes H

Ventana de Habilitación de los Puentes H

Permite la habilitación o des habilitación de los puentes H que manejan los actuadores de las articulaciones A, B y C. Por defecto se encuentra activado y debe utilizarse con muchísima precaución pues al deshabilitar los actuadores de las articulaciones B y C las articulaciones resultaran libres, caerán al suelo por simple gravedad y se producirá un choque. Por lo tanto al desactivar los actuadores el usuario debe tener la previsión de sostener las articulaciones del manipulador o de llevarlas a un sitio seguro donde no se producirá algún choque antes de desactivar los actuadores. De igual manera al habilitar nuevamente los actuadores debe tenerse muchísima precaución especialmente si se modificó manualmente la posición de las articulaciones, pues el controlador llevará el manipulador hasta las posiciones dadas por las ventanas de entradas de referencia.

La ventana de habilitación resulta especialmente útil si se desea realizar programación de trayectorias mediante guiado pasivo, pues evidentemente para llevar las articulaciones manualmente hasta las posiciones deseadas se deben deshabilitar los actuadores que el programador considere conveniente, en general se recomienda que al realizar programación mediante guiado pasivo se deshabiliten todos los actuadores: A, B y C utilizando el botón que convenientemente permite hacerlo de forma simultánea, y al hacer esto sostener el manipulador para evitar que se produzca un choque con el suelo.

Botón de Configuración por Defecto

Botón de Configuración por Defecto

Cuando se presiona este botón el controlador PID toma los valores estándar por defecto por lo que resulta muy útil en caso de que se haya modificado la dinámica del sistema y se desee retomar la configuración original. También al presionar el botón el manipulador toma las coordenadas articulares por defecto.

Ventana de Configuración del Gráfico

Botón de Configuración del Gráfico

Esta ventana permite configurar la gráfica de error de posición, es posible visualizar el error de posición de las articulaciones q1,q2 y q3 de forma simultánea o independiente marcando las casillas correspondientes, también permite disminuir o ampliar el eje y. La visualización del error resulta muy útil para experimentar el ajuste dinámico del controlador. El eje y muestra el error en bits, por lo tanto para realizar la conversión a grados se debe tener en cuenta la constante “Kpro” en la ventana de calibración, la constante “Kpro” es una constante de proporcionalidad en grados/bits, por lo tanto es posible relacionar el error en bits con el error de posición angular en grados. Para establecer la frecuencia con que se visualizan los valores del registro del A/D del dsc se puede modificar el “tiempo de sondeo”, el tiempo de sondeo es el tiempo de espera durante el cual el software Robocom realiza peticiones al DSC, el sondeo o “poll” se activa durante las siguientes circunstancias: cuando se desea visualizar la gráfica de error y cuando se desea realizar programación por guiado pasivo al presionar el botón rojo del programador de trayectorias. Modificando el tiempo de sondeo se modifica la velocidad con la que se adquiere la data. El sondeo fundamentalmente realiza la petición al DSC del valor del registro de la última medición del A/D de la articulación correspondiente, las peticiones se realizan de forma alternada para las articulaciones A, B y C (1,2, 3 según DH).

Ventana de Calibración

Ventana de Calibración

Esta ventana permite modificar la relación entre la posición espacial real de cada articulación (medidas en grados) con el numero medido por el A/D de la articulación correspondiente. Para realizar la calibración se hace uso de dos constantes: “Kpro” y “Koffset” la primera es una constante de proporcionalidad y la segunda añade un pedestal u offset para poder relacionar adecuadamente el ángulo en grados con el numero resultante de la medición del A/D en bits. La calibración evidentemente resulta muy importante para garantizar que efectivamente cuando el error en estado estacionario sea nulo y el usuario seleccione en la ventana de entradas de refencia un angulo de 90°, se logre alcanzar esta posición. La calibración resulta evidentemente necesaria cuando el manipulador sufre modificaciones mecánicas, y puede ser necesaria la modificación de las constantes especialmente la de Koffset en caso que el mismo sea desensamblado, ya que el entre el eslabon y el potenciómetro de la articulación correspondiente puede sufrir un desplazamiento y por lo tanto un pedestal que es necesario corregir. La constante Koffset puede requerir modificaciones si se modifican las tensiones de referencia del A/D DSC.

En ángulo en grados en función del la magnitud en bits N viene dada por la siguiente ecuación:

θ (grados°)= Kpro ×(Koffset+N)

Procedimiento de Calibración:

El procedimiento de calibración se realiza por separado para las articulaciones A, B y C y consiste fundamentalmente en hallar las constantes “Kpro” y “Koffset”. Para ello se empleará la ventana de entradas de referencia. Se tomará como ejemplo la articulación A:

Obtención de la constante de pedestal (Koffset):

Seleccionar en la ventana de entradas de referencia un ángulo de 0° y presionar “enter”, verificar físicamente que el ángulo de la cadena de eslabones del manipulador es el adecuado, para ello se toma como referencia el eslabón anterior o en el caso de la articulación A se toma como referencia la base rectangular del manipulador, para ello debe emplear un escuadra u otra herramienta que permita verificar que el ángulo de físico es apropiado. Si el ángulo no es el correspondiente evidentemente el manipulador no se encuentra calibrado, se debe pues corregir con un pedestal, para ello se debe utilizar la barra de desplazamiento de la articulación correspondiente hasta que el ángulo se físicamente de 0° y 90° y se toma como referencia la base del manipulador (base de forma rectangular). Una vez se ha alcanzado físicamente la posición que debería corresponder con 0° para la articulación A, se debe visualizar el numero deseado medido en bits (digital) a la izquierda de la ventana de entradas de referencia, este número será colocado en la ventana de Koffset, de la articulación correspondiente pero con signo opuesto. Cuando se realiza este procedimiento el controlador debe estar bien ajustado o en todo caso ajustado por defecto de forma que el error en estado estacionario converja y sea nulo. Una vez obtenida la constante Koffset de la articulación correspondiente al seleccionar 0° en la ventana de entrada de referencia y presionar “enter” la articulación debería posicionarse físicamente en 0°.

Obtención de la constante de proporcionalidad (Kpro):

Para realizar el ajuste de la constante Kpro es indispensable haber realizado la calibración de la constante Koffset. Una vez se ha realizado el ajuste anterior, se debe llevar la articulación desde 0° hasta un ángulo que convenientemente tomaremos como 90° positivo, escribir 90° en la ventana de entrada de referencia y presionar “enter”. Nuevamente se debe verificar que el ángulo se efectivamente de 90° respecto al ángulo de 0° inicial. Si no es así debe modificarse la constante Kpro. Para ello solo debemos utilizar nuevamente la barra de desplazamiento correspondiente en la ventana de entradas de referencia hasta que la posición sea la físicamente apropiada para 90°, una vez se logre esto solo resta aplicar la ecuación siguiente:

Kpro= (θ (grados°))/(Koffset+N)

Donde θ se selecciona convenientemente de 90° y el denominador Koffset +N es conocido pues ya se determinó la constante de offset y N viene señalado por la ventana de entrada de referencia (zona izquierda titilada “digital” de la articulación correspondiente).

Ventana de Programación de Trayectorias

Ventana de Programación de Trayectorias

Esta ventana permite la programación tanto mediante guiado activo como guiado pasivo, así como de forma textual haciendo uso de las coordenadas articulares, por lo tanto el sistema se puede considerar híbrido (textual y por guiado), ya que la programación mediante guiado genera un archivo de texto, la programación se puede realizar de las siguientes maneras:

  1. Trasladando el manipulador manualmente a las posiciones deseadas con lo cual se genera el texto del programa automáticamente (guiado pasivo), la ventaja de esta técnica es que se almacenan gran cantidad de puntos de las trayectorias de forma muy rápida, el movimiento al ejecutar el programa resulta suave, y no existe necesidad de conocer las coordenadas cartesianas o articulares en ningún momento, la principal desventaja es que requiere interactuar físicamente con el manipulador y se pueden cometer errores mientras se traslada manualmente la cadena de eslabones.
  2. Trasladando el manipulador hasta las posiciones deseadas utilizando sus propios actuadores, se pueden almacenar estas posiciones particulares en texto y reproducirlas en intervalos de tiempo que se consideren convenientes. Mediante esta técnica se toman solo pocos puntos de las trayectorias, se lleva el manipulador a su posición de destino y se registran las coordenadas articulares. Puesto que solo importan las posiciones de destino y el actuador intentará alcanzar la posición en el menor tiempo posible los movimientos son rápidos y bruscos con lo cual se pueden producir sobre elongación durante la transitoria, ello depende del ajuste dinámico, la ventaja fundamental es que permite que el programa sea muy corto y permite alcanzar las posiciones de destino en el menor tiempo posible, sin embargo que el equipo estará sometido a un mayor stress mecánico.
  3. Escribir o generar las trayectorias a partir del modelo cinemático utilizando convenientemente herramientas externas, específicamente lenguajes de programación de alto nivel tales como Matlab junto a la Robotics Toolbox.
  4. Editar el programa, específicamente el archivo de texto que almacena la trayectoria combinando las técnicas anteriores.

La programación de trayectorias apunta a la creación de un archivo de texto donde cada línea se ejecuta a breves intervalos de tiempo que pueden ser modificados por el usuario, en cada línea se anotan las instrucciones seguidas de su argumento separadas por un espacio, tenemos el siguiente programa a modo de ejemplo:

  • q1 45
  • wait 5000
  • q1 -45
  • wait 5000

El texto anterior, un ejemplo de programación textual, indica que la articulación q1 se posicionará en 45°, luego se esperan 5000 milisegundos (5 segundos) y luego se posicionará en -45°, se esperan 5 segundos nuevamente antes de ejecutar la siguiente instrucción y si no existe se ejecutará la primera línea y se repetirá el movimiento. El texto se puede editar directamente en el software RoboCom en la pequeña ventana del editor de texto de la ventana de programación de trayectorias.

Si bien el archivo de texto debe cumplir con características particulares, la data generada mediante guiado pasivo puede ser perfectamente extraída sin demasiadas complicaciones para su procesamiento, con lenguajes como Matlab, para realizar procesamiento, análisis, filtrado, gráficos y simulaciones. De igual manera se puede generar archivos de texto que cumplan con los requerimientos del software RoboCom, por ejemplo, para generar interpolación de trayectorias con cinemática inversa a partir del modelo cinemático mediante el uso de las poderosas herramientas que proporciona la Toobox de Robótica de Peter Corke para Matlab, se incluye en la documentación en línea ejemplos algoritmos (scripts de extensión .m) de Matlab que permiten tanto importar como exportar los archivos de texto compatibles con RoboCom.

Procedimiento de programación mediante guiado activo de trayectorias punto a punto.

  1. Trasladar el manipulador hasta alguna posición deseada haciendo uso de la ventana de entradas de referencia.
  2. Almacenar la posición en la ventana de texto del programador de trayectorias, ya sea escribiendo la instrucción y el ángulo ó utilizando convenientemente el botón “todos” en la ventana de programación de trayectorias, que escribe las coordenadas articulares de todos los eslabones del manipulador en el archivo de texto.
  3. Escribir el comando “wait” ya sea mediante el teclado o haciendo uso del botón del mismo nombre en la ventana de texto de la ventana del programador de trayectorias.
  4. Llevar el manipulador hasta la siguiente posición de destino y repetir el paso 1.
  5. Guardar el archivo de texto para su posterior ejecución o edición en el botón “archivo”.

Procedimiento de programación mediante guiado pasivo.

  1. Llevar el manipulador hasta alguna posición deseada haciendo uso de la ventana de entradas de referencia.
  2. Presionar el botón rojo de la ventana del programador de trayectorias.
  3. Desactivar los puentes H de las articulaciones, a la vez que se sostiene el manipulador para evitar que caiga al suelo.
  4. Con movimientos suaves y continuos llevar el manipulador hasta las posiciones deseadas.
  5. Presionar nuevamente el botón rojo para detener el registro de la posición.
  6. Guardar el archivo de texto para su posterior ejecución o edición en el botón “archivo”.

Uso de Matlab y la Robotics Toolbox

Generación de trayectorias desde la Robotics Toolbox.
La Robotics Toolbox para Matlab, desarrollada por Peter Corke de la Universidad de Melbourne proporciona una herramienta muy poderosa que provee muchas funciones que son útiles en el estudio y simulación de manipuladores con configuraciones clásicas, tales como cinemática, dinámica y generación de trayectorias. La Toolbox está basada en un método general para representar la cinemática y dinámica de los manipuladores, estos parámetros están encapsulados como objetos de Matlab. Cada robot es un objeto que puede ser creado por el usuario para casi cualquier manipulador y un número significativo de ejemplos se proveen para robots conocidos como el Puma 560, el manipulador Stanford y otros. La Toolbox también provee funciones para manipular y convertir entre tipos de datos como vectores, transformaciones homogéneas y cuaterniones, que son necesarios para representar la posición y orientación de un manipulador.
Ejecución desde Robocom de una trayectoria generada con la Robotics Toolbox para MATLAB.

Resulta muy conveniente, que obtenidos los parámetros del manipulador MA2000 es posible crear un objeto con las características del MA2000 al menos en primera instancia desde el punto de vista cinemático. Es posible entonces realizar simulaciones, efectuar cálculos y generar trayectorias con la ayuda de esta herramienta.

Se logró generar trayectorias mediante el método “seriallink.jtraj()” de la Robotics Toolbox, especificando la posición y orientación, iniciales y finales de la herramienta terminal del manipulador: q = R.jtraj(T1, T2, k) ,al aplicar el método resulta una matriz q de seis columnas (cada columna se corresponde con cada una de las posiciones angulares de las seis articulaciones) , la matriz q obtenida tiene k filas, donde k es el numero de pasos de la trayectoria, T1 y T2 son matrices T que indican la posición y orientación inicial (T1) y final (T2) de la herramienta terminal. Una vez obtenida la matriz q resultó necesaria su exportación a un archivo de texto capaz de ser interpretado por RoboCom.

Es útil la importación a Matlab de la data generada de la programación por guiado pasivo, una de las pruebas realizadas fue la aplicación de un filtro sobre las trayectorias generadas manualmente mediante guiado pasivo, el propósito fue eliminar el ruido de las trayectorias obtenidas para evitar que cuando las trayectorias sean ejecutadas por el software y por lo tanto por el manipulador, las referencias de posición a ejecutar no contengan el ruido obtenido durante la programación, además el programador (quien traslada el manipulador manualmente) puede cometer errores tales como movimientos bruscos mientras traslada el manipulador, se aplicó un filtro FIR ruido constante de orden 40 con la ayuda de la FDATOOL de Matlab sobre la data obtenida en un ensayo de programación de guiado pasivo, la única dificultad estuvo en lograr extraer la data del archivo de texto generado por RoboCom así como realizar el procedimiento inverso es decir, exportar la data generada por Matlab a un archivo interpretable por RoboCom, esta tarea se llevó a cabo con éxito por lo que se logró extraer y procesar la data como se aprecia en las imágenes inferiores:

Recomendaciones

En base a la experiencia con el proyecto se pueden establecer las siguientes recomendaciones:

- En el caso del ajuste dinámico, el modelo del sistema cambia dependiendo de las coordenadas articulares. Podrían experimentarse estrategias de control adaptativo, cambiando los parámetros del controlador de acuerdo a la zona de operación del manipulador y de la carga manipulada.

- Determinar un modelo aproximado del manipulador: momentos de inercia, fricción viscosa, etc. Con el objeto de ensayar estrategias de ajuste basadas en el modelo y contrastar el comportamiento real con simulaciones en el PC.

- Especificar una rutina de mantenimiento periódica que incluya la calibración del manipulador, especificando en el método de calibración, las herramientas o instrumentos que deben emplearse a partir del procedimiento de calibración indicado en este proyecto.

- Establecer una estrategia para cuantificar el error de posición calculado mediante cinemática directa respecto a la posición real de la pinza o elemento terminal.

- Incluir en el firmware del DSC la compatibilidad con protocolos de comunicación habituales en la industria.

- Complementar y mejorar continuamente la documentación en línea (página wiki).

Bibliografía

Aníbal, Ollero. Robótica: manipuladores y robots móviles. Marcombo, 2001.

Anónimo. Aprenda Qt desde hoy mismo. Versión de distribución libre., Octubre de 2010.

Barrientos A., Peñin L.,Balaguer C.,Santoja R. Fundamentos de robótica. segunda edición. McGraw-Hill, 1997.

Corke, Peter I. Robotics Toolbox for Matlab. release 8. under LGPL3, 2008.

Corke, Peter. Robotics Toolbox for Matlab. Release 9. under LGPL, Febrero 2013.

H., Richard C. Dorf & Robert. Sistemas de Control Moderno. 10ma Edición.

J, Angulo. DsPIC diseño práctico de aplicaciones. Prentice Hall, 2006.

K., Ogata. Ingeniería de control moderna. 4ta edición. Prentice Hall, 2003.

K., Ogata. Sistemas de control en tiempo discreto. Prentice Hall, 1996.

Kelly Rafael, Santibáñez Victor. Control de movimiento de robots manipuladores. Prentice Hall, 2003.

Mark W. Spong, Seth Hutchinson, M. Vidyasagar. Robot Dynamics and control. second edition.

Paul, Richard P. Robot Manipulators: Mathemathic, programming and control. The MIT press series in artificial intelligence, 1981.

Yu, Cheng-Ching. Autotuning of PID controllers: A Relay Feedback Approach.