Beruflich Dokumente
Kultur Dokumente
TESIS
PARA OBTENER EL GRADO DE
MAESTRO EN
SISTEMAS INTELIGENTES MULTIMEDIA
PRESENTA
I
Pienso, luego existo.
René Descartes (1596-1650)
I
A mis padres y esposa
II
AGRADECIMIENTOS
A mis padres María Luisa y Jesús por haberme apoyado en todo momento, por sus
consejos, sus valores, por la motivación constante que me ha permitido ser una
persona de bien, pero más que nada por su amor.
A mis maestros quienes influyeron con sus lecciones y experiencias en formarme como
una persona de bien y preparada para los retos que pone la vida.
A mi asesor de tesis Dr. Héctor Torres por su valiosa ayuda al escribir esta tesis.
III
RESUMEN
Los resultados son satisfactorios ya que con este sistema se redujo el costo hasta un 70%
debido a que no requiere de memoria adicional, así como también fueron reducidas
las dimensiones de impresión, con una reducción no aparente en la precisión de la
superficie de la impresión.
IV
ÍNDICE DE CONTENIDO
Cita……………..…………………………………………………………………………………I
Dedicatoria…..……………………………………………………………………………...….II
Agradecimientos……..……………………………………………………………………….III
Resumen……………………...……………………………………………………………...…IV
Índice de contenido………………..………………………………………………………...V
Glosario…………….....………………………………………………………………………..VII
Capítulo 1 introducción…………….………………….……………………………………..1
1.1 Antecedentes………………………….………………………….……………….1
1.3 Justificación…………………………………………………..…………………….1
1.4 Objetivos.………………………………………………………………………...….2
1.5 Hipótesis……………………………………..……………………………………….2
2.3 Conclusión………………………………………………………………………..…6
V
3.2 Segmentador………………………………………………….……………………7
Capítulo 4 resultados……………………………………………………...………………..…9
5 Conclusiones……………………………………………………………...………………...17
6 Recomendaciones……………………………………………………...…………………18
7 Referencias bibliográficas………………………………………………………………..19
8 Anexos………………………………………………………………………………………..21
VI
GLOSARIO
Robot Delta.- Es un tipo de robot paralelo de tres grados de libertad conformado por
dos bases unidas por tres cadenas cinemáticas basadas en el uso de Paralelogramos.
La base superior se encuentra fija mientras la base inferior, donde se ubica el efector
final, es móvil y siempre está paralela a la base fija.
RepRap.- Es una iniciativa con el ánimo de crear una máquina autorreplicable que
puede ser usada para prototipado rápido y manufactura.
Firmware.- Es un programa informático que establece la lógica de más bajo nivel que
controla los circuitos electrónicos de un dispositivo de cualquier tipo. Está fuertemente
integrado con la electrónica del dispositivo, es el software que tiene directa interacción
con el hardware, siendo así el encargado de controlarlo para ejecutar correctamente
las instrucciones externas.
Robot SCARA.- Acrónimo que responde por sus siglas en inglés a Selective Compliant
Assembly Robot Arm o Selective Compliant Articulated Robot Arm, es un robot de
cuatro grados de libertad con posicionamiento horizontal. Los Robots SCARA se
conocen por sus rápidos ciclos de trabajo, excelente repetitividad, gran capacidad de
carga y su amplio campo de aplicación.
Robot PUMA.- Acrónimo que responde por sus siglas en inglés Programmable Universal
Machine for Assembly, o Programmable Universal Manipulation Arm, es un brazo robot
industrial desarrollado por Victor Scheinman en la empresa pionera en robótica
Unimation. Inicialmente desarrollado para General Motors, el brazo robot PUMA nació
de los diseños iniciales inventados por Scheinman mientras se encontraba en el MIT y en
la Stanford University.
VII
Memoria EEPROM.- ROM programable y borrable eléctricamente. Es un tipo de
memoria ROM que puede ser programada, borrada y reprogramada eléctricamente.
Son memorias no volátiles.
Memoria ROM.- La memoria de sólo lectura, conocida también como ROM (acrónimo
en inglés de read-only memory), es un medio de almacenamiento utilizado en
ordenadores y dispositivos electrónicos, que permite solamente la lectura de la
información y no su escritura, independientemente de la presencia o no de una fuente
de energía.
PWM.- La modulación por ancho de pulsos (también conocida como PWM, siglas en
inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en
la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una
cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de
comunicaciones o para controlar la cantidad de energía que se envía a una carga.
Ciclo de trabajo.- Es el porcentaje o relación que existe entre el tiempo en que la señal
se encuentra en estado activo y el periodo de la misma.
Kernel.- Es un software que constituye una parte fundamental del sistema operativo, y
se define como la parte que se ejecuta en modo privilegiado (conocido también
como modo núcleo). Es el principal responsable de facilitar a los distintos programas
acceso seguro al hardware de la computadora o en forma básica, es el encargado de
gestionar recursos, a través de servicios de llamada al sistema.
VIII
Microcontrolador.- Es un circuito integrado programable, capaz de ejecutar las
órdenes grabadas en su memoria. Está compuesto de varios bloques funcionales, los
cuales cumplen una tarea específica. Un microcontrolador incluye en su interior las tres
principales unidades funcionales de una computadora: unidad central de
procesamiento, memoria y periféricos de entrada/salida.
IX
CAPÍTULO 1 INTRODUCCIÓN
1.1 ANTECEDENTES
El uso del sistema cartesiano en las impresoras 3D genera altos costos de manufactura y
ensamble, debido al alto número de piezas que conlleva este sistema.
1.3 JUSTIFICACIÓN
1
por las que la impresión 3D todavía no puede ser de consumo masivo. El problema del
alto costo podrá ser solucionado con la implementación del sistema delta para
impresión 3D, desarrollando un algoritmo de conversión cartesiana y segmentación de
vectores para impresoras 3D en configuración delta [6] [7].
1.4 OBJETIVOS
1.5 HIPÓTESIS
2
CAPÍTULO 2 MARCO TEÓRICO
2.1 Impresoras 3D
3
2.1.3 impresora SCARA
Los desarrollos más utilizados para el control de impresoras delta son los que se
describen a continuación:
4
AT91SAM, STM32F4 y NXP (antes Freescale) MK20. Ofrece soporte para arquitecturas
tipo delta, delta rotativo y CoreXY. Se pueden utilizar otras configuraciones si se
implementan las transformaciones de coordenadas directa e inversa, siempre que el
microcontrolador disponga de suficiente memoria RAM. Utiliza temporizadores
hardware separados para cada motor, por lo que tiene una alta precisión [8].
•Diferentes interfaces graficas de usuario, entre ellos uno para pantallas táctiles.
•Interprete para G-code.
•Puede controlar simultáneamente hasta 9 ejes y soporta variedad de interfaces.
•El control puede operar tanto con servos analógicos como PWM con el lazo de
realimentación cerrado y también con motores de pasos.
•Las características del control de movimiento incluyen compensación de radios y de
longitud, desviación de trayectoria limitada a una tolerancia específica, roscado
sincronizado para el torno, sincronización de ejes, avance de trabajo adaptativo,
control de avance por el operario o control de velocidad constante.
5
así como son diseñados multi-plataforma y por consecuente requieren mas memoria, lo
que limita su aplicabilidad y encarece el proyecto [11].
2.3 Conclusión
La finalidad del desarrollo del modelo de algoritmos embebidos para un sistema delta
de impresión 3D es lograr el mismo nivel de control de una manera más sencilla. Con el
algoritmo propuesto se puede utilizar una menor cantidad de recursos y que por lo
tanto se puede implementar en un mayor número de equipos con microcontroladores
con recursos limitados. En el caso del desarrollo en cuestión se utilizó un
microcontrolador Kinetis k20 con un CPU de 120 MHz, 512 KB de memoria flash y 128 KB
de SRAM. Este microcontrolador fue seleccionado por cumplir con las características
necesarias para el control de la impresora (Memoria, comunicación, velocidad de
procesamiento y temporización) su bajo costo y porque ha sido utilizado para
proyectos anteriores comprobando así su confiablidad, esta elección quedo a cargo
del equipo de desarrollo electronico y su elección queda fuera del alcance de este
desarrollo.
6
CAPÍTULO 3 PROCEDIMIENTOS DE INVESTIGACIÓN
3.2 SEGMENTADOR
Las pruebas de movimiento del cabezal de impresión fueron realizadas para constatar
que el área de impresión previsto pudiera ser alcanzado, se utilizaron vectores con
altura en eje Z=0, al ejecutar los movimientos vectoriales se pudo observar el
7
movimiento de péndulo ocasionando que el cabezal de impresión se bajara
posicionándose en valores negativos en el eje Z (Figura 4).
8
CAPÍTULO 4 RESULTADOS
CONSTANTES
Las cuales están basadas en las mediciones de la impresora como se puede observar
en la figura 5.
9
Figura 5: Mediciones de una impresora tipo delta.
10
Figura 6: Mediciones de una impresora tipo delta.
Las posiciones de los pivotes véase figura 7, se calculan usando los datos contenidos en
la tabla 2.
11
Figura 7: Posiciones de los pivotes de un impresora delta.
Las distancias del plano x-y de los pivotes de los puntales son proporcionados por:
Y por lo tanto las alturas de los carros por encima del pivote son:
12
ℎ! = !" ! – !! !
ℎ! = !" ! – !" !
ℎ! = !" ! – !" !
Por lo que las alturas de los carros sobre el piso de la impresora finalmente son:
13
Figura 8: Diagrama de flujo del segmentador de vectores.
14
Donde X2, Y2 es la coordenada actual y X1, Y1 es la coordenada anterior, en el caso
de tratarse de la primera línea leída la coordenada anterior es X=0, Y=0 ya que la
impresión comienza en el centro.
Una vez obtenida la distancia se verifica si sobrepasa el segmento máximo, que en este
caso se trata de 5mm, si la distancia es mayor se calcula el número de veces que se
segmentara con la siguiente formula:
Con los valores obtenidos anteriormente (x, y, z, e) se genera la nueva línea a insertar
en el archivo de salida y se guardan los valores temporales de la siguiente manera:
lineatemp = "G" + g + " F" + f + " X" + x.ToString("f3") + " Y" + y.ToString("f3") + " Z" +
z.ToString("f3") + " E" + e.ToString("f5");
xtemp = x; ytemp = y; ztemp = z; etemp = e;
15
Finalmente una vez recorrido todo el archivo de entrada obtenemos un archivo muy
similar al de entrada pero con los trayectos mayores a 5mm divididos en segmentos no
mayores a 5mm véase figura 9.
16
5 CONCLUSIONES
17
6 RECOMENDACIONES
Además de las mejoras definidas por las pruebas al desarrollo se listan a continuación,
tareas pendientes y áreas de oportunidad para mejorar, corregir y extender el
proyecto planteado en esta tesis.
18
7 REFERENCIAS BIBLIOGRÁFICAS
[2] Hui Wang & Masami Sano. (2013) A Study of Spreading 3D Image Technology in
Medical Industry. (49), 75-88, 2013-07 Information Research, Bunkyo University.
[3] Pîrjan, A., & Petroşanu, D. M. (2013). THE IMPACT OF 3D PRINTING TECHNOLOGY ON
THE SOCIETY AND ECONOMY. Journal of Information Systems & Operations
Management, 7(2), 360-370.
[4] Celi, R., Sempértegui, A., Morocho, D., Loza, D., Alulema, D., & Proaño, M. (2015,
October). Study, design and construction of a 3D printer implemented through a delta
robot. In Electrical, Electronics Engineering, Information and Communication
Technologies (CHILECON), 2015 CHILEAN Conference on (pp. 717-722). IEEE.
[5] Pierrot, F., Reynaud, C., & Fournier, A. (1990). DELTA: a simple and efficient parallel
robot. Robotica, 8(02), 105-109.
[6] Wu, C., Yi, R., Liu, Y. J., He, Y., & Wang, C. C. (2016, October). Delta DLP 3D printing
with large size. In Intelligent Robots and Systems (IROS), 2016 IEEE/RSJ International
Conference on (pp. 2155-2160). IEEE.
[8] MARTÍNEZ MARTÍNEZ, A. B. E. L. (2015). Mejora del sistema de control para impresoras
3D.
19
[9] Tajti, F., Szayer, G., Kovács, B., & Korondi, P. (2013, November). Universal rt-
middleware robot controller. In Industrial Electronics Society, IECON 2013-39th Annual
Conference of the IEEE (pp. 7862-7867). IEEE.
[10] Wijnen, B., Anzalone, G. C., Haselhuhn, A. S., Sanders, P. G., & Pearce, J. M. (2016).
Free and open-source control software for 3-D motion and processing. Journal of Open
Research Software, 4(1).
[12] Dimitrov, D., Van Wijck, W., Schreve, K., & De Beer, N. (2006). Investigating the
achievable accuracy of three dimensional printing. Rapid Prototyping Journal, 12(1), 42-
52.
20
8 ANEXOS
21
8.1 ANEXO A
Delta.c
22
#include "Delta.h"
#include "math.h"
#include "localmath.h"
float Z_HeightA;
float Z_HeightB;
float Z_HeightC;
float Z_auxHA;
float Z_auxHB;
float Z_auxHC;
23
float Z_Init;
typedef struct
{
float cx;
float cy;
float cz;
}Carriage_t;
typedef struct
{
float px;
float py;
float pz;
}Pivot_t;
Carriage_p Carriage_A;
Carriage_p Carriage_B;
Carriage_p Carriage_C;
Pivot_p Pivot_A;
Pivot_p Pivot_B;
Pivot_p Pivot_C;
24
/*****************************************************************************
*****************************************************************************
* Calculate Pivot A
*
*
****************************************************************************/
Pivot_C.py = tool_X + pivote_offset;
Pivot_C.px = tool_Y;
Pivot_C.pz = tool_Z + tool_offset;
/*****************************************************************************
*****************************************************************************
* Calculate Pivot B
*
*
****************************************************************************/
Pivot_B.py = tool_X + (pivote_offset*(COSSENVAL));
Pivot_B.px = tool_Y + (pivote_offset*(SENPVAL));
Pivot_B.pz = tool_Z + tool_offset;
/*****************************************************************************
*****************************************************************************
* Calculate Pivot C
*
*
****************************************************************************/
Pivot_A.py = tool_X + (pivote_offset*(COSSENVAL));
Pivot_A.px = tool_Y + (pivote_offset*(SENNVAL));
Pivot_A.pz = tool_Z + tool_offset;
/*****************************************************************************
*****************************************************************************
* Calculate Carriage A
*
*
25
****************************************************************************/
Carriage_C.cy = strut_pitch;
Carriage_C.cx = 0;
/*****************************************************************************
*****************************************************************************
* Calculate Carriage B
*
*
****************************************************************************/
Carriage_B.cy = strut_pitch * COSSENVAL;
Carriage_B.cx = strut_pitch * SENPVAL;
/*****************************************************************************
*****************************************************************************
* Calculate Carriage C
*
*
****************************************************************************/
26
*****************************************************************************
* Calculate Heights of carriages above the pivot
*
*
****************************************************************************/
HeightA =(sqrt((arm_lenght * arm_lenght)-(pAtostrut * pAtostrut)));
HeightB =(sqrt((arm_lenght * arm_lenght)-(pBtostrut * pBtostrut)));
HeightC =(sqrt((arm_lenght * arm_lenght)-(pCtostrut * pCtostrut)));
/*****************************************************************************
*****************************************************************************
* Calculate Heights of carriages above the floor (bed)
*
*
****************************************************************************/
Z_HeightA = tool_Z + tool_offset + HeightA;
Z_HeightB = tool_Z + tool_offset + HeightB;
Z_HeightC = tool_Z + tool_offset + HeightC;
/*****************************************************************************
*****************************************************************************
* Calculate Total Heights
*
* V1: step motors under the bed
* V2: step motors in the top with Acrylics
*
*
****************************************************************************/
//Z_Init = TOTAL_HIGH - ZERO_POS;//Z_HeightA;
//Z_Init = 330.95 - 168.2;// @New Home V1 tested
//Z_Init = 330.95 - 143.9;// @New Home V2 tested
//Z_Init = 330.95 - 149.5; // @New Home V? Calibration undergoing
//Z_Init = 327.70 - 149.5; // @New Home V? Calibration undergoing
//Z_Init = 331.70 - 150.0;
27
Z_Init = 331.00 - 150.0;
Z_HeightA = (Z_Init - Z_HeightA); //* -1;
Z_HeightB = (Z_Init - Z_HeightB); //* -1;
Z_HeightC = (Z_Init - Z_HeightC); //* -1;
/*printf("HeightA:%f\n",Z_HeightA);
printf("HeightB:%f\n",Z_HeightB);
printf("HeightC:%f\n",Z_HeightC);*/
28
8.2 ANEXO B
Delta.h
29
#ifndef DELTA_H_
#define DELTA_H_
#endif /* DELTA_H_ */
30
8.3 ANEXO C
Segmentador.cs
31
using System.Data;
using System.Text;
using System.IO;
namespace ProyectoSegmentador {
public class Segmentador {
//metodo que lee un archivo (ArchivoEntrada) gcode segmenta los vectores en
pedazos menores o iguales que segmentoMaximomm (se recomienda 5mm) y genera
un nuevo Gcode segmentado (ArchivoSalida)
//se declara static ya que no es necesario generar un objeto para utilizar el
metodo
public static void segmentaVectores(string ArchivoEntrada, string ArchivoSalida,
segmentoMaximomm) {
StreamReader sr = new StreamReader(ArchivoEntrada);
StreamWriter sw = new StreamWriter(ArchivoSalida);
string temp = sr.ReadToEnd();
string[] arreglo = temp.Split(new string[] { Environment.NewLine },
StringSplitOptions.None);
double g = 0, f = 0, x = 0, y = 0, z = 0, e = 0;
double xant = 0, yant = 0, zant = 0, eant = 0;
double xact = 0, yact = 0, zact = 0, eact = 0;
int numeroDeSegmentacion = 0;
string lineatemp = "";
bool zCambio = false;
32
if (seg != "") {
switch (seg.ToCharArray()[0]) {
case 'G':
g = double.Parse(seg.Substring(1));
break;
case 'F':
f = double.Parse(seg.Substring(1));
break;
case 'X':
xact = double.Parse(seg.Substring(1));
break;
case 'Y':
yact = double.Parse(seg.Substring(1));
break;
case 'Z':
zact = double.Parse(seg.Substring(1));
zCambio = true;
break;
case 'E':
eact = double.Parse(seg.Substring(1));
break;
}
}
}
if (xact == 0 && yact == 0 && zact == 0 && eact != 0) {
sw.WriteLine(cadena);
eant = eact;
}
else if (xact != 0 || yact != 0 || zact != 0 || eact != 0) {
double dist = Math.Sqrt(Math.Pow(xact - xant, 2) + Math.Pow(yact -
yant, 2));
numeroDeSegmentacion = (int)Math.Floor(dist / segmentoMaximomm);
if (numeroDeSegmentacion == 0)
33
numeroDeSegmentacion = 1;
double xtemp = xant, ytemp = yant, ztemp = zant, etemp = eant;
if (numeroDeSegmentacion == 1) {
sw.WriteLine(cadena);
if(zact!=0)
zant = zact;
xant = xact; yant = yact; eant = eact;
}
else {
for (int i = 0; i < numeroDeSegmentacion; i++) {
lineatemp = "";
x = xtemp + ((xact - xant) / numeroDeSegmentacion);
y = ytemp + ((yact - yant) / numeroDeSegmentacion);
z = ztemp + ((zact - zant) / numeroDeSegmentacion);
e = etemp + ((eact - eant) / numeroDeSegmentacion);
if (zCambio) {
if (eact == eant) {
if (f == 0)
lineatemp = "G" + g + " X" + x.ToString("f3") + " Y" +
y.ToString("f3") + " Z" + z.ToString("f3");
else
lineatemp = "G" + g + " F" + f + " X" + x.ToString("f3") + " Y" +
y.ToString("f3") + " Z" + z.ToString("f3");
}
else {
if (f == 0)
lineatemp = "G" + g + " X" + x.ToString("f3") + " Y" +
y.ToString("f3") + " Z" + z.ToString("f3") + " E" + e.ToString("f5");
else
lineatemp = "G" + g + " F" + f + " X" + x.ToString("f3") + " Y" +
y.ToString("f3") + " Z" + z.ToString("f3") + " E" + e.ToString("f5");
}
}
34
else {//z no cambio
if (eact == eant) {
if (f == 0)
lineatemp = "G" + g + " X" + x.ToString("f3") + " Y" +
y.ToString("f3");
else
lineatemp = "G" + g + " F" + f + " X" + x.ToString("f3") + " Y" +
y.ToString("f3");
}
else {
if (f == 0)
lineatemp = "G" + g + " X" + x.ToString("f3") + " Y" +
y.ToString("f3") + " E" + e.ToString("f5");
else
lineatemp = "G" + g + " F" + f + " X" + x.ToString("f3") + " Y" +
y.ToString("f3") + " E" + e.ToString("f5");
}
}
sw.WriteLine(lineatemp);
xtemp = x; ytemp = y; ztemp = z; etemp = e;
}
z=Math.Round(z, 5);
if(z!=0)
zant = z;
xant = x; yant = y; eant = e;
}
}
else {
sw.WriteLine(cadena);
if(zact!=0)
zant = zact;
xant = xact; yant = yact; eant = eact;
}
35
//lineatemp = lineatemp.Substring(0, lineatemp.Length - 1);
//sw.WriteLine(lineatemp);
g = 0; f = 0;
xact = 0; yact = 0; zact = 0;
}
zCambio = false;
}
}
sw.Close();
MessageBox.Show("Conversión terminada");
}
}
}
36
37