You are on page 1of 313

Universidad de la República

Facultad de Ingenierı́a

Plataforma de posicionamiento
modular para impresión 3D, fresado y
otras aplicaciones

Memoria de proyecto presentada a la Facultad de


Ingenierı́a de la Universidad de la República por

Guillermo Airaldi, Guillermo Antúnez, Nicolás Lamath


en cumplimiento parcial de los requerimientos
para la obtención del tı́tulo de
Ingeniero Electricista.

Tutor
Gabriel Eirea . . . . . . . . . . . . . . . . . . . . . . . . . Universidad de la República
Rafael Canetti . . . . . . . . . . . . . . . . . . . . . . . . Universidad de la República

Tribunal
Gabriel Eirea . . . . . . . . . . . . . . . . . . . . . . . . . Universidad de la República
Rafael Canetti . . . . . . . . . . . . . . . . . . . . . . . . Universidad de la República
Álvaro Gómez . . . . . . . . . . . . . . . . . . . . . . . . Universidad de la República
Julián Oreggioni . . . . . . . . . . . . . . . . . . . . . . Universidad de la República

Montevideo
jueves 14 mayo, 2015
Plataforma de posicionamiento modular para impresión 3D, fresado y otras apli-
caciones, Guillermo Airaldi, Guillermo Antúnez, Nicolás Lamath.

Esta tesis fue preparada en LATEX usando la clase iietesis (v1.1).


Contiene un total de 305 páginas.
Compilada el jueves 14 mayo, 2015.
http://iie.fing.edu.uy/
Agradecimientos

Nuestro principal agradecimiento es a nuestras familias, novias y amigos que


nos apoyaron a lo largo del todo el proyecto.
También queremos darles las gracias a los funcionarios del instituto que nos
ayudaron, principalmente a Sergio (Sergio Beheregaray) y Tito (Roberto Rodrı́guez)
por la gran ayuda brindada con el trabajo en el taller.
Por último agradecer a José Basualdo por el trabajo hecho en el proyecto de
SISEM, a Celmar Moreira por los trabajos de tornerı́a y a Carlos Briozzo por ser
un apoyo moral en todo momento.
Esta página ha sido intencionalmente dejada en blanco.
Resumen

El presente proyecto trata sobre el diseño, implementación y testeo de una


plataforma posicionadora de coordenadas cartesianas que pueda cumplir funciones
de impresión 3D y fresado. Las temáticas involucradas en el mismo involucran
conocimientos de mecánica, electrónica y software.
En particular, se realizó el diseño y montaje de la estructura del posicionador
y se seleccionaron los actuadores mecánicos. Se eligió el hardware necesario y se di-
señaron e implementaron aquellos circuitos necesarios para completar el diagrama
de la solución general a nivel fı́sico.
A nivel de software, se diseñó y programó una arquitectura de software para ob-
tener un firmware para controlar el prototipo y además se resolvió la comunicación
con el usuario.
Como adelanto de los resultados, se puede mencionar que se logró cumplir con
las especificaciones de “performance”, en el posicionamiento, control de tempera-
tura y volumen de trabajo.
Se realizaron simulaciones de impresión donde se verificó que la geometrı́a del
modelo resultante se correspondı́a con la del modelo esperado.
Posteriormente, en cuanto a las aplicaciones del posicionador: se realizaron
tareas de calibración e impresión. Se comprobó una correspondencia entre el patrón
obtenido en la impresión del modelo de un cubo, con el resultado de una simulación
previa del mismo. No se alcanzaron a realizar pruebas sobre la función de fresado.
Las lecciones aprendidas a la fecha han enriquecido a los integrantes del equipo
en el conocimiento en varias áreas, como también en el actuar en grupo sorteando
constantemente distintas dificultades surgidas; con lo que se espera que los alumnos
encargados de realizar este proyecto se desempeñen muy bien como profesionales.
Esta página ha sido intencionalmente dejada en blanco.
Tabla de contenidos

Agradecimientos I

Resumen III

1. Introducción 1
1.1. Descripción del proyecto . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.3. Definición del problema y antecedentes . . . . . . . . . . . . 2
1.1.4. Objetivos especı́ficos . . . . . . . . . . . . . . . . . . . . . . 2
1.1.5. Alcance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.6. Criterios de éxito . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Estructura del Documento . . . . . . . . . . . . . . . . . . . . . . . 3

2. Antecedentes 5
2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Tecnologı́as de posicionadores . . . . . . . . . . . . . . . . . . . . . 5
2.3. Tecnologı́as de impresión . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4. Extrusores de impresión 3D . . . . . . . . . . . . . . . . . . . . . . 10
2.5. Materiales de construcción . . . . . . . . . . . . . . . . . . . . . . . 12
2.6. Escáneres 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.7. Motores paso a paso (PAP) . . . . . . . . . . . . . . . . . . . . . . 15
2.7.1. Principio básico de funcionamiento . . . . . . . . . . . . . . 15
2.7.2. Modos de operación . . . . . . . . . . . . . . . . . . . . . . 17
2.7.3. Parámetros de los motores paso a paso . . . . . . . . . . . . 17
2.7.4. Ventajas y desventaja de motores paso a paso . . . . . . . . 18
2.8. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.8.1. Código de máquina . . . . . . . . . . . . . . . . . . . . . . . 19
2.8.2. Generadores de G-code y firmware . . . . . . . . . . . . . . 22
2.9. Electrónica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3. Visión General del Proyecto 27


3.1. Descripción de la solución . . . . . . . . . . . . . . . . . . . . . . . 27
Tabla de contenidos

4. Mecánica 31
4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2. Criterios de diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3. Dimensionado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.4. Extrusor de impresión 3D . . . . . . . . . . . . . . . . . . . . . . . 36
4.5. Armado de un eje . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.6. Interconexión entre ejes . . . . . . . . . . . . . . . . . . . . . . . . 43
4.7. Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.8. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5. Electrónica 47
5.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.2. Controlador de los motores paso a paso . . . . . . . . . . . . . . . 50
5.2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.2. Descripción de los integrados . . . . . . . . . . . . . . . . . 50
5.2.3. Funcionamiento general del driver de motores PAP . . . . . 57
5.3. Interfaz con el usuario . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.3.1. Elección de los elementos que componen la interfaz . . . . . 72
5.4. Heated Bed Platform . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.4.1. Condiciones de uso . . . . . . . . . . . . . . . . . . . . . . . 73
5.4.2. Como se implementa . . . . . . . . . . . . . . . . . . . . . . 73
5.4.3. Análisis de funcionamiento . . . . . . . . . . . . . . . . . . 76
5.4.4. Primer prototipo . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.5. Diseño heated bed . . . . . . . . . . . . . . . . . . . . . . . . 76
5.5. Comentarios generales . . . . . . . . . . . . . . . . . . . . . . . . . 77

6. Software 79
6.1. Arquitectura general y descripción . . . . . . . . . . . . . . . . . . 79
6.2. Raspberry Pi: Configuración red inalámbrica y comunicación con
Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.2.1. Comunicación inalámbrica . . . . . . . . . . . . . . . . . . . 81
6.3. Comunicación Computador-Microcontrolador . . . . . . . . . . . . 84
6.3.1. Descripción general . . . . . . . . . . . . . . . . . . . . . . . 84
6.3.2. Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.3.3. Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3.4. Robustez de la comunicación . . . . . . . . . . . . . . . . . 87
6.4. Software para microcontrolador Arduino . . . . . . . . . . . . . . . 87
6.4.1. Control de bajo nivel de los motores PAP . . . . . . . . . . 87
6.4.2. Control de temperatura . . . . . . . . . . . . . . . . . . . . 106
6.4.3. Intérprete de comandos . . . . . . . . . . . . . . . . . . . . 108
6.4.4. Ejecutador . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.4.5. Interfaz con el usuario . . . . . . . . . . . . . . . . . . . . . 121
6.5. Simulador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
6.5.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
6.5.2. Funcionamiento lógico . . . . . . . . . . . . . . . . . . . . . 126

vi
Tabla de contenidos

7. Testeos y medidas 129


7.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.2. Posicionador XYZ . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.2.1. Experimento de detección de pérdida de Pasos 1 . . . . . . 129
7.2.2. Experimento de detección de pérdida de pasos 2 . . . . . . 131
7.2.3. Cuantificación de la repetibilidad: . . . . . . . . . . . . . . 131
7.3. Control de la temperatura . . . . . . . . . . . . . . . . . . . . . . . 146
7.3.1. Heated Bed Platform . . . . . . . . . . . . . . . . . . . . . 146
7.3.2. Extrusor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
7.4. Simulación Software e Impresión . . . . . . . . . . . . . . . . . . . 152
7.4.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
7.4.2. Resultados e interpretación . . . . . . . . . . . . . . . . . . 153

8. Conclusiones y trabajo a futuro 157


8.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
8.2. Trabajo a futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

Apéndices 163

A. Doxygen de las interfaces del Código 163

B. Selección de los motores paso a paso 243


B.1. Descripción del sistema . . . . . . . . . . . . . . . . . . . . . . . . 243
B.2. Cálculos teóricos referentes a la selección del motor . . . . . . . . . 244
B.3. Resultados de la selección de los motores . . . . . . . . . . . . . . . 250

C. Gestión de tiempos 253


C.1. Cambios en la planificación . . . . . . . . . . . . . . . . . . . . . . 253
C.2. Dedicación mensual . . . . . . . . . . . . . . . . . . . . . . . . . . 254

D. Gestión de gastos 255


D.1. Distintos gastos previstos e imprevistos . . . . . . . . . . . . . . . 255

E. Manuales 257
E.1. Manual de uso y mantenimiento . . . . . . . . . . . . . . . . . . . 257
E.1.1. Impresión 3D . . . . . . . . . . . . . . . . . . . . . . . . . . 257
E.1.2. Movimiento Manual . . . . . . . . . . . . . . . . . . . . . . 266
E.1.3. Calibración . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
E.1.4. Mantenimiento . . . . . . . . . . . . . . . . . . . . . . . . . 269
E.2. Manual de construcción . . . . . . . . . . . . . . . . . . . . . . . . 270
E.2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . 270
E.2.2. Piezas necesarias . . . . . . . . . . . . . . . . . . . . . . . . 270
E.2.3. Armado de un eje genérico . . . . . . . . . . . . . . . . . . 273
E.2.4. Diferencias entre los distintos ejes . . . . . . . . . . . . . . 276
E.2.5. Interconexión . . . . . . . . . . . . . . . . . . . . . . . . . . 278
E.2.6. Cabezal de impresión . . . . . . . . . . . . . . . . . . . . . 279
E.2.7. Tensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

vii
Tabla de contenidos

E.3. Armado de driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

Referencias 283

Glosario 289

Índice de tablas 290

Índice de figuras 292

Contenido del CD 294

Índice de temas 296

viii
Capı́tulo 1

Introducción

1.1. Descripción del proyecto


1.1.1. Motivación
El interés del grupo en realizar este proyecto surge con la gran tendencia que
hoy se está viviendo en el mundo en torno a la tecnologı́a de impresión 3D y el
uso que tienen los routers CNC en la industria. En el caso de las impresoras 3D,
se consideran como objetos que se podrán encontrar en cualquier hogar en un
futuro cercano; estamos presenciando el auge de las impresoras 3D en el mundo y
es por eso que cada vez surgen más y más modelos. En el inicio de este proyecto no
existı́an máquinas que combinaran impresoras 3D y routers CNC, resultando en un
único dispositivo capaz de realizar ambas tareas. Hoy en dı̀a se pueden encontrar
algunos ejemplos en internet, lo que demuestra el interes que existe en desarrollar
estas tecnologı́as.
Creemos que Uruguay no puede estar excluido de esto, por lo que incentivar
el desarrollo de estas tecnologı́as en la industria nacional es vital. Por lo tanto,
como se introdujo anteriormente, este proyecto busca resolver esa problemática de
integración, implementando un prototipo con fines educativos que sirva de base.
Una vez allı́, la misma podrı́a usarse para fabricar repuestos diversos, como un
pestillo, tapas, ganchos para pared, incluso llaves, además de modelos a escala de
cualquier objeto del cual se posea un modelo 3D.
A nivel más profesional, se podrı́a usar la fresa para hacer el ruteo de un circuito
impreso, e incluso hay una clara incursión en el campo de la medicina [1], como
por ejemplo el posible uso de la impresión 3D para crear prótesis. Cabe resaltar
que los usos mencionados son solo una muestra del gran potencial que encierran
estas tecnologı́as.

1.1.2. Objetivo general


Diseñar y construir una plataforma consistente en un posicionador XYZ con
punteros intercambiables que pueda funcionar como impresora 3D, fresadora y
escáner 3D.
Capı́tulo 1. Introducción

1.1.3. Definición del problema y antecedentes


En la actualidad las impresoras 3D han cobrado una gran popularidad a partir
de movimientos “Open Source” [2]. Uruguay no queda excluido de esta tendencia
pero hay ciertos factores que conspiran para que tanto la fabricación casera como
la compra de una impresora 3D, se encuentren por fuera de las posibilidades de un
hogar con un alto nivel económico. No existe al presente en el Uruguay una fuente
de referencia que actúe de soporte en la fabricación, servicio y mantenimiento.
Además existen distintas máquinas que funcionan a base de un posicionador
en 2 ó 3 dimensiones, por ejemplo routers CNC, prototipadoras, scanners 3D pero
muy pocos o casi ninguno que integre todas estas funciones. El presente proyecto
busca resolver esta problemática con la implementación de una plataforma adap-
table a distintas tareas, haciendo un uso eficiente del espacio mediante la incor-
poración de las funciones de impresora 3D, fresadora y scanner 3D en la misma
máquina.

1.1.4. Objetivos especı́ficos


Diseñar un posicionador XYZ.

Poner en funcionamiento el posicionador XYZ.

Verificar del correcto funcionamiento el sistema de control de posición.

Implementar y verificar el correcto funcionamiento del cabezal impresora


3D.

Implementar y verificar el correcto funcionamiento del cabezal fresadora.

Integrar los componentes en una unidad funcional.

1.1.5. Alcance
Se diseñará y construirá la mecánica del posicionador XYZ.

Se construirá el hardware necesario para el escáner 3D, mas no ası́ el software


para procesar las imágenes obtenidas.

Se evaluará la posibilidad de comprar algunos de los elementos que componen


la electrónica del proyecto.

Se estudiará el código que ejecutará el sistema de control, de origen “Open


Source”, y se modificará a nuestro criterio.

Se evaluará la posibilidad de comprar los cabezales, tanto de impresión como


de fresado.

2
1.2. Estructura del Documento

1.1.6. Criterios de éxito


A continuación se presentan los indicadores de éxito junto a los correspondien-
tes medios de verificación:

Volumen de trabajo y precisión: Verificar el posicionamiento del puntero con


un error menor que 0,15mm dentro del volumen de trabajo de 250x250x250mm3.

Capacidad de leer un archivo en G-code y capacidad de comandar el posi-


cionador: Verificar la lectura de un archivo G-code y comandar el posiciona-
miento del puntero con un error menor al especificado.

Precisión y temperatura: Verificar la deposición del plástico con un espesor


menor que 0,5mm y la temperatura del mismo con un error menor a 5◦ C.

Calibración e impresión de un modelo de prueba: Verificar calidad de im-


presión 3D de un modelo de prueba.

1.2. Estructura del Documento


El documento se organiza en ocho capı́tulos. En el segundo capı́tulo se resumen
los antecedentes en lo que respecta a las impresoras 3D y routers CNC. Se resalta
especialmente los diferentes tipos de estructuras mecánicas, mostrando sistemas
de coordenadas utilizados, materiales de construcción y tecnologı́as de extrusión.
Se comentan también las opciones de software empleados, tanto generadores de
comando G-codes, como firmwares utilizados en los microcontroladores.
El capı́tulo tercero presenta la descripción general de la solución implementada
en el presente proyecto, se hace énfasis sobre la arquitectura general del hardwa-
re, su relación con la mecánica desarrollada y las funciones principales que debe
realizar el software a programar. Se brinda una idea general de la mecánica, la
electrónica y el software.
El cuarto capı́tulo explica en detalle el desarrollo progresivo de la estructura del
prototipo. Se describen los criterios de diseño. Se brinda una descripción minuciosa
de la implementación de cada eje y el montaje del conjunto. Se describe el cabezal
de impresión desde el punto de vista del mecanismo utilizado para traccionar el
filamento. Se tratan algunos problemas y sus respectivas soluciones.
En el quinto capı́tulo el lector se encontrará con el detalle de la electrónica desa-
rrollada. Se comienza por la descripción y conexionado general de los diferentes
bloques que componen el hardware. Se detalla el funcionamiento de los motores
paso a paso (PAP) como introducción a la descripción de los controladores pa-
ra dichos motores. Se comentan problemas ocurridos durante el desarrollo y sus
soluciones.
El sexto capı́tulo trata sobre la implementación de los diferentes bloques que
componen el firmware en el microcontrolador Arduino, los generadores de G-code,
software implementado para la placa “Raspberry Pi”, simulador y otros códigos
que hayan resultado relevantes para la implementación del prototipo. Se brindan
conclusiones al respecto y ofrecen alternativas.

3
Capı́tulo 1. Introducción

En el séptimo capı́tulo se describen las pruebas realizadas y los diferentes


resultados obtenidos. Se hacen comparaciones con los criterios de éxito.
Finalmente, en el capı́tulo octavo, se resumen todas las conclusiones obtenidas
a lo largo del presente proyecto y puntos a atacar en trabajos futuros.

4
Capı́tulo 2

Antecedentes

2.1. Introducción
El presente proyecto enfoca su objetivo hacia un prototipo de una máquina
que permita desarrollar varias tareas en el mismo espacio, es decir, brindar la
posibilidad de tener una máquina multifunción que realice trabajos en 3D.
El mercado en esta área no presenta una máquina que permita la multifun-
cionalidad, debido a esto es que para poder dar información sobre cada módulo
funcional se comenzará con la familiarización tomando como tema la impresión
3D, para luego completar con aspectos referentes a las fresadoras (más conocidas
en el área por control numérico computarizado, CNC por sus siglas en inglés) y a
los escáners 3D.
Las impresoras 3D se presentan como una reciente innovación. La evolución en
el tiempo de esta tecnologı́a se puede apreciar en las Figuras 2.1 y 2.2, que en la
actualidad debido a su alto costo económico es accesible casi exclusivamente para
un público que se profesionalice en el área.

2.2. Tecnologı́as de posicionadores


En cuanto a la estructura general de los posicionadores XYZ, existen varias
opciones. Los criterios que abren el abanico son principalmente dos: la elección
del sistema de coordenadas en las cuales se va a definir el movimiento del cabezal
de impresión y la definición de cuáles serán las partes fijas y las móviles de la
estructura. Luego se determinará el material principal de la estructura diseñada.
Sobre el primer punto se han visto ejemplos que trabajan en coordenadas
esféricas, como pueden ser los mostrados en las Figuras 2.3(a) y 2.3(b). Luego
se han observado impresoras trabajando en coordenadas polares, como la de la
Figura 2.4. Finalmente, la principal elección para los diseñadores, es realizar los
movimientos razonando sobre un sistema de ejes cartesianos; el ejemplo de la
Figura 2.5 muestra un sistema con esta elección de diseño.
En cuanto al segundo punto, la elección de las partes móviles dependen en
gran medida de la elección del punto anterior. Para las primeras (coordenadas
Capı́tulo 2. Antecedentes

Figura 2.1: Historia de las impresoras 3D, primera parte. Imagen modificada de [3].
2.2. Tecnologı́as de posicionadores

Figura 2.2: Historia de las impresoras 3D, segunda parte. Imagen modificada de [3].

7
Capı́tulo 2. Antecedentes

(a) Ejemplo 1. Imagen extraı́da de (b) Ejemplo 2. Imagen extraı́da de


[4]. [5].

Figura 2.3: Diseño de impresora 3D basado en coordenadas esféricas.

Figura 2.4: Diseño de impresora 3D basado en coordenadas polares. Imagen extraı́da de [6].

Figura 2.5: Diseño de impresora 3D basado en coordenadas cartesianas. Imagen extraı́da de [7].

8
2.3. Tecnologı́as de impresión

esféricas), casi la totalidad de los diseños determinan los movimientos solo con el
puntero. Las impresoras que trabajan en coordenadas polares, en general, poseen
una mesa móvil, este movimiento puede ser giratorio y vertical. Si realiza ambos
movimientos, entonces el puntero solo se mueve en forma radial; luego, si se elige
que la mesa cancele alguno de estos movimientos, el cabezal deberı́a satisfacer el
movimiento en altura o giratorio. En cuanto a las impresoras de ejes cartesianos,
el gran tema es elegir qué parte realiza el movimiento de cada eje. Existen varias
impresoras en que la mesa cumple con los movimientos en el plano horizontal,
mientras que el cabezal se desplaza en la dirección vertical. Otra opción es quitarle
a la mesa uno de los movimientos horizontales y éste se encarga al puntero (como
se ve en la Figura 2.5).

2.3. Tecnologı́as de impresión


Sobre las distintas tecnologı́as de impresión, puede decirse que es el tema don-
de se está enfocando más atención con el objetivo de renovar constantemente los
métodos de impresión, de todas formas el de extrusión sigue siendo el más elegi-
do para los diseñadores. Este método se basa en la tecnologı́a de modelado por
deposición fundida (FDM por sus siglas en inglés).
En este método lo que se hace es ir depositando un material termoplástico en
sucesivas capas que juntas componen el objeto a imprimir. Dicho material puede
ser PLA (acido poliláctico) o ABS (estireno butadieno acrilonitrilo). El procedi-
miento es el siguiente: un filamento del material a utilizar (suele venir en rollos)
es conducido por un extrusor cuya punta trabaja a una temperatura que permita
derretir el filamento, con lo cual el filamento que sale del extrusor en un estado
blando es depositado en distintas capas para formar el objeto. Esta tecnologı́a
tiene una importante etapa de control, la cual impone una fuerte relación entre
la temperatura del extremo del extrusor, la temperatura del ambiente de impre-
sión, la velocidad con la que el filamento es dirigido hacia dentro del extrusor y
la de la velocidad relativa entre en punto de depósito y el cabezal. Es aquı́ donde
se da un importante desarrollo a nivel de programación de un microcontrolador,
que permita controlar con éxito la relación o relaciones recientemente mencionadas.
Obviamente, dependiendo del material a extruir las variables de diseño cambiarán.
Otra tecnologı́a que se conoce es la de formar las piezas mediante la unión
de materiales granulares. Las impresoras que desempeñan esta tecnologı́a poseen
una cama llena de material granulado; este material es fundido en general a través
de lásers (sintetización selectiva por láser o SLS) para ir formando las distintas
capas de la pieza a imprimir. Luego se superponen dichas capas, en general por
fusión selectiva de láser (SLM) hasta llegar a construir el objeto. Dentro de este
método hay una variante importante: en lugar de usar lásers, usar fusión por haz
de electrones (EMD). Esta opción permite lograr objetos densos, sin huecos y más
fuertes.
Continuando con las diferentes tecnologı́as utilizadas en la impresión 3D, se
encuentra el método de fabricación de objetos por láminas (LOM). Éste consiste
en un sistema que logra ir superponiendo láminas ya sean de papel, plástico o

9
Capı́tulo 2. Antecedentes

Figura 2.6: Sistema que muestra cómo trabaja la impresión por laminado. Imagen extraı́da
de [8].

metal las cuales son cortadas por un láser según el modelo CAD del objeto que
lo define. El sistema puede verse en la Figura 2.6: hay una cinta (sustrato) sobre
la cual se encuentra el material, que luego de pasar por un rodillo caliente es
transportado hacia el área de impresión, aquı́ será cortada la lámina de material
correspondiente, luego la mesa sobre la cual se va realizando la impresión baja para
darle lugar a la colocación de la siguiente capa. Es común que el presente método
de impresión tenga una etapa de fresado para dejar mas prolijas y homogeneizar
las terminaciones.
La siguiente tecnologı́a a presentar, es la de fotopolimeración. Básicamente
estas impresoras poseen un recipiente cuyo contenido es un polı́mero lı́quido. Éste,
a través del procesamiento digital de luz (DLP), es expuesto a los rayos de luz de
un proyector de la reciente tecnologı́a mencionada. Como consecuencia de esto, el
polı́mero se endurece. Luego, esta capa ya sólida se sumerge en el polı́mero lı́quido,
quedando sobre ésta otra nueva cantidad de polı́mero en estado no sólido, con lo
cual repitiendo el procedimiento se genera una nueva capa que quedará sobre la
anterior. Siguiendo con el procedimiento reiteradas veces se llega al objeto final.
Para terminar con la “impresión”, el polı́mero lı́quido se extrae del recipiente
y el polı́mero sólido se cura con luz ultravioleta. En caso de realizar estructuras
complicadas (con varios huecos, etc.) se coloca un gel con la forma que se le quiere
dar a dicha parte, sin afectar el procedimiento descrito. Luego de finalizado, este
gel se retira a mano con ayuda de agua.

2.4. Extrusores de impresión 3D


El cabezal de impresión 3D es una pieza fundamental del presente proyecto.
El mismo posibilita la deposición de material PLA o ABS para el modelado de
alguna pieza a imprimir. El cabezal se coloca en el puntero del posicionador para
que este trabaje como impresora 3D.
El cabezal 3D, también denominado extrusor o extruder en inglés, se compone
de una serie de piezas dedicadas a traccionar el filamento del material termoplástico

10
2.4. Extrusores de impresión 3D

a depositar y de otra denominada hot end o final caliente en español, cuyo objetivo
es llevar al material a la temperatura necesaria para su deposición. En la Figura
2.7 podemos apreciar un ejemplo de montaje del cabezal 3D.

Figura 2.7: Esquema de un cabezal de impresión 3D por deposición fundida. Imagen extraı́da
de [9]

De la Figura 2.7 podemos observar que el extrusor se compone básicamente


de:
Motor paso a paso (stepper motor ).
Juego de engranajes (large gear, small gear ).
Tornillos, tuercas y arandelas
Rulemanes (bearing).
Final caliente (hot end )
Algún soporte para las piezas mencionadas
En el esquema de ejemplo, el filamento de termoplástico es traccionado por
acción de motor sobre los engranajes de forma que deslice sobre el ruleman y se
introduzca en el hot end donde se fundirá. El final caliente, posee un calefactor
necesario para elevar su temperatura y además se debe implementar un control de
temperatura para llevarla a un punto de referencia. Para ello es necesario en prin-
cipio poder medir la temperatura y esto se logra mediante el uso de un termistor
o termocupla.
Es importante mencionar, que la velocidad de deposición de material es una
limitante para la velocidad de desplazamiento de los distintos ejes, salvo cuando
se requiera moverse a cierta posición sin depositar material. Por ejemplo, si se
efectuaran movimientos en la coordenada X más rápido de lo que se deposita el
material, el trazo no será del grosor deseado.

11
Capı́tulo 2. Antecedentes

Figura 2.8: Estructura de impresora 3D que usa partes impresas y guı́as de acero pulido. Imagen
extraı́da de [10]

Figura 2.10: Estructura de impresora en madera liviana. Imagen extraı́da de [12]

2.5. Materiales de construcción


Existe una gran variabilidad en cuanto a qué material se utiliza para construir
las distintas plataformas. Se pueden observar diseños en los cuales casi la totalidad
de las piezas son impresas por otra impresora 3D, que con la utilización de guı́as
de acero pulido completan la estructura. Por ejemplo, los distintos modelos de
Reprap [2] se basan en esta idea; puede verse en las Figuras 2.8 y 2.9 la estructura
de una impresora y también al cabezal impreso. Obviamente, hay piezas que no
pueden ser plásticas como son las ya mencionada guı́as y la punta caliente del
cabezal, entre otras.
El tipo de estructuras recién presentadas permi-
ten hacer la impresora casi replicable, ya que luego
de tener una impresora, se pueden imprimir las par-
tes plásticas, adquirir las distintas piezas no plásti-
cas y proceder al armado de una nueva impresora.
Luego, están los diseños de estructuras efectua-
dos en madera liviana (obviamente siguen siendo Figura 2.9: Cabezal utilizado en
insustituibles las guı́as de movimiento), se ve en la la impresora mostrada en la figu-
Figura 2.10 un ejemplo de este tipo de estructura. ra 2.8. Imagen extraı́da de [11]

12
2.5. Materiales de construcción

(a) Estructuras de fresado- (b) Estructuras de fresado- (c) Estructura de impreso-


ra en aluminio. Imagen ex- ra en aluminio. Imagen ex- ra en aluminio. Imagen ex-
traı́da de [13] traı́da de [14] traı́da de [15]

(d) Estructura de impreso-


ra en aluminio (impresora
de la figura 2.11(c) termina-
da). Imagen extraı́da de [16]

Figura 2.11: Estructuras en aluminio.

Para impresoras 3D es conveniente usar los ma-


teriales presentados antes, pero para fresadoras o cuando el volumen de trabajo es
mayor sı́ es una buena opción el uso de aluminio. Es un material más fuerte y ro-
busto que los anteriores, también tiene una relación favorable entre peso, precio y
fortaleza. Esto combinado a que da una estética positiva a la máquina construida.
Otra ventaja es la gran variedad de perfiles de aluminio existentes que facilitan el
diseño y posterior armado de la estructura. Las Figuras 2.11 muestran platafor-
mas construidas con este material; pueden verse tanto para impresoras como para
fresadoras.
Como se ha podido ver en el análisis complementado con las imágenes, el diseño
de la estructura de una impresora 3D y de una fresadora pueden verse similares, lo
que cambia son los materiales, que dependerán de la robustez que se le necesite dar
a cada máquina. Toda la etapa estructural se basa en el diseño de una plataforma
consistente en un posicionador XYZ cuyos materiales son las variables entre la
impresora y la fresa.

13
Capı́tulo 2. Antecedentes

Figura 2.12: Scanner 3D. Imagen extraı́da de [17]

2.6. Escáneres 3D
Vale la pena mencionar las distintas tecnologı́as usadas en la parte de hardware
de un escáner 3D. Es un área en la cual se están buscando alternativas, es decir,
se está en una etapa de investigación que se supone en poco tiempo abrirá un gran
abanico de estrategias de diseño. En la actualidad, casi la totalidad de los escáneres
se basan en la adquisición de imágenes del perfil del objeto a escanear. Esto se logra
con la utilización de dos o más cámaras de registro, un láser que ilumine al objeto
y un sistema de movimiento rotacional. De esta forma el objeto se hace girar, el
láser va iluminando de forma tal de ir remarcando el perfil del objeto instante a
instante, luego el registro de esto es adquirido por las cámaras. Después esta la
etapa de software que utiliza esta información para llegar al resultado final del
escaneo. Un ejemplo del sistema descrito, puede verse en la Figura 2.12.

14
2.7. Motores paso a paso (PAP)

Figura 2.13: Ejemplo de motor paso a paso.

2.7. Motores paso a paso (PAP)


Un motor paso a paso es un actuador electromagnético rotatorio, capaz de
realizar un incremento angular preciso a partir de una señal digital que representa
el estado de cada fase (energizada o no). Las señales de fase se generan a partir de
un driver que tiene como principal entrada un tren de pulsos (señal de reloj). La
cantidad de pulsos y la frecuencia controlan la posición y la velocidad del eje [18].
Los motores paso a paso realizan una discretización de los desplazamientos
angulares en un rango que puede ser entre 0,72 a 90 grados. La resolución de los
incrementos angulares equivale a realizar un paso, producto de la llegada de un
pulso bajo del reloj. En la Figura 2.13 podemos apreciar un tı́pico motor paso a
paso.
Estos motores pueden clasificarse de acuerdo a sus diferencias constructivas en:
imán permanente, reluctancia variable e hı́bridos. Los primeros poseen un rotor de
imán permanente sin dientes, tienen pasos de ángulo entre 45 y 90 grados. Se ca-
racterizan por poseer un alto par, baja velocidad y un buen amortiguamiento. Los
segundos presentan a diferencia de los de imán permanente un rotor dentado. El
ángulo por paso en éstos varı́a entre 5 y 15 grados. Los motores hı́bridos combinan
cualidades de los anteriores, destacándose que pueden operar a altas velocidades
de pasos y tienen una resolución de entre 0,9 a 5 grados.
Otra clasificación está dada por el número de polaridades que pueden tomar las
bobinas: unipolares y bipolares. En la Figura 2.14 podemos apreciar un esquema
de ambos motores.

2.7.1. Principio básico de funcionamiento


La Figura 2.15 muestra el concepto mediante el cual operan los motores paso
a paso.
El estator se compone de bobinas que se enrollan sobre un núcleo de hierro
dulce. Este material se imanta cuando las bobinas son recorridas por una corriente.

15
Capı́tulo 2. Antecedentes

Figura 2.14: Esquema de motores PAP (unipolares y bipolares). Imagen extraı́da de [18]

Figura 2.15: Principio de funcionamiento de un motor paso a paso. Imagen extraı́da de [19]

16
2.7. Motores paso a paso (PAP)

La polaridad de los núcleos dependerá del sentido de la corriente. El rotor lo


representamos por un imán que puede girar libremente solidario al eje del motor.
Partiendo con el imán en cualquier posición, al circular una corriente por los
bobinados, se polarizan los núcleos, alcanzando el eje del motor la posición mos-
trada en la Figura 2.15(a). La secuencia continúa cuando una de las bobinas L1 o
L2 cambia el sentido de la corriente, por ejemplo en la Figura 2.15(b) se produce
un giro de 90 grados en sentido anti horario al cambiar el sentido de la corriente
por L1. Para completar el ciclo se debe cambiar el sentido en L2 y finalmente en
L1. La secuencia descrita muestra como se produce cada paso en el motor y la
equivalencia con giros de ángulo recto.
Los distintos modos de operación que se mencionaran más adelante se obtienen
al variar la secuencia anterior. Haciendo circular corrientes con forma distinta a
una corriente DC, se puede realizar microstepping [18].

2.7.2. Modos de operación


Los modos de operación de un motor paso a paso son los siguientes [18]:

Normal o doble fase.

Full-step o paso completo.

Half-step o medio paso.

Microstepping o micro paso.

El controlador de motores será el encargado de generar las señales adecuada-


mente para obtener los diferentes modos de operación. De los primeros tres modos
se ofrecen más detalles en el Capı́tulo 5.
El microstepping es un modo de operación que permite dividir en ángulo de
paso natural de un motor. El rango de división de éste normalmente va de 10 a
1,8◦
256. Por ejemplo, en un motor de resolución pasos se podrı́a alcanzar 51200 pasos
por revolución. Para lograr esto en un motor, es necesario establecer la corriente
en las bobinas con forma sinusoidal, un seno en una fase y coseno en otra. La
principal utilidad es suavizar el movimiento atenuando el efecto de resonancia y/o
conseguir mayores resoluciones.

2.7.3. Parámetros de los motores paso a paso


Este tipo de motores se caracterizan a partir de una serie de parámetros que
es de interés mencionarlos. Los más destacables se listan a continuación [18]:

Par dinámico máximo: Es el par máximo que el motor puede imponer sin
perder pasos.

Par de mantenimiento: Es el momento requerido estando en régimen de


excitación, para apartarse en un paso cuando la posición anterior es estable.

17
Capı́tulo 2. Antecedentes

Figura 2.16: Curva Par-velocidad: fenómeno de resonancia, imagen tomada de [20]

Par de detención: Es un par de freno, producto de la acción del rotor cuando


se desenergizan las bobinas.

Ángulo de paso: Es la resolución del movimiento angular.

Número de pasos por vuelta: Se define como la cantidad de pasos para com-
pletar un giro de 360 grados.

Frecuencia máxima de pasos: Es la máxima cantidad de pasos que un motor


puede realizar en un segundo.

2.7.4. Ventajas y desventaja de motores paso a paso


Los motores paso a paso permiten un control preciso en lazo abierto de la
posición (si no se pierden pasos) facilitando la electrónica necesaria. En cambio,
con un motor de corriente continua (DC) la posición se controla mediante un
lazo cerrado y conseguir posicionamientos muy precisos y de pocos grados puede
resultar muy difı́cil.
Este tipo de motores no posee escobillas para realizar contacto a diferencia de
los motores DC. Lo mismo los hace muy confiables, y no requieren mantenimiento.
Como principal desventaja está el fenómeno de resonancia cuando los motores
no son adecuadamente controlados. En la Figura 2.16 se aprecia cómo afecta a la
curva Par-velocidad para los modos Full-step y Half-step. Por otro lado, resulta
dificultoso emplearlos en altas velocidades.

18
2.8. Software

Figura 2.17: Unas de las primeras máquinas de control numérico. Imagen extraı́da de [22].

En la Figura 2.16 se observa que en modo de paso completo, si se desea realizar


un control de velocidad, se debe evitar tener una velocidad que se traduzca en la
frecuencia de resonancia.

2.8. Software
2.8.1. Código de máquina
El resultado obtenido con el uso de una máquina de control numérico compu-
tarizado (CNC), es la traducción entendible por la máquina de un lenguaje llamado
código de maquina o lenguaje G-code, el cual representa el diseño del usuario. El
presente lenguaje forma la base de la comunicación con las máquinas CNC.
El control numérico en máquinas industriales data de la década de 1950 [21].
En la Figura 2.17 puede apreciarse una maq́uina de esta época, la cual se programó
en base a tarjetas perforadas.
La invención propiamente dicha del lenguaje surge alrededor del año 1958 en
el laboratorio de servomecanismos del MIT. En los años 60 llegó la estandarización
del lenguaje por la EIA (Electronic Industries Alliance). La versión final de ésta
fue aprobada en 1980 para el uso en EEUU, denominada RS274D [21].
Dicho estándar que trabajaba con tarjetas perforadas, fue reemplazado por el
uso de computadoras y caracteres ASCII. En el año 2000, el NIST ( The National
Institute of Standards and Technology) lanzó un proyecto con el objetivo de crear
el sistema de control de una máquina CNC de código abierto. No coincidentemente
la estandarización NIST RS274N GC es la más conocida en la actualidad para el

19
Capı́tulo 2. Antecedentes

desarrollo propio de este tipo de máquinas. En particular, los firmwares presenta-


dos por la comunidad Reprap se encuentran basados en la estandarización recién
mencionada.
El lenguaje G-code está basado en un sistema de coordenadas cartesiano de
tres dimensiones. El código está formado por lı́neas de caracteres que poseen un
determinado formato, el cual se describirá en breve. El código le informa a la
máquina a dónde debe mover la herramienta (cabezal) y el trabajo a realizar en
cada punto que recorre.
Los datos referidos al movimiento en tres dimensiones pueden estar organiza-
dos tanto en un sistema absoluto como relativo. Las coordenadas absolutas están
referidas al punto (0, 0, 0), siendo éste un origen de coordenadas determinado, y en
coordenadas relativas (incremental) se miden las distancias desde el punto anterior.
Los G-codes están escritos en lı́neas de código que poseen un formato de máqui-
na especı́fico. Originalmente y en su forma más general, el código es escrito como
N (número de una secuencia, 001 - 100+), G (funciones preparatorias), eje X, eje
Y , eje Z, F (velocidad de avance) y M (funciones variadas).
Las funciones de preparación (G) son comandos de configuración, las cuales
deben informar a la máquina antes de comenzar a trabajar. Por ejemplo, dan aviso
de si los valores de los parámetros están en milı́metros o pulgadas, y si se trabaja en
un sistema absoluto o en relativo. F indica la velocidad en milı́metros o pulgadas
por minuto. Las funciones variadas (M ) dan las órdenes de encendido y apagado,
tanto del trabajo de la máquina como de dispositivos auxiliares (ventiladores y
partes calientes), entro otras acciones.
A continuación se presentan una serie de instrucciones de este código en su
forma general a modo de ejemplo:
N000 M04
N001 G01
N002 G90 X3.73 Z2.5 F1
..
.
N056 X0 Z375 F6
N057 M02

Como se mencionó existe un estándar para máquinas CNC que también es


base para impresoras 3D y es en éste que se basan los firmware que se sugieren
en la comunidad de Reprap (NIST RS274N GC). A continuación se presenta una
parte de código de máquina generado por un programa cuya base es el mencionado
estándar, en los “;” comienzan comentarios presentes en el código que sirven para
conocer el objetivo de cada instrucción y que no son interpretados por la máquina:
M140 S70.000000
M109 T0 S220.000000
M190 S70.000000
M190 S70 ;Uncomment to add your own bed temperature line
M109 S220 ;Uncomment to add your own temperature line
G21 ;metric values
G90 ;absolute positioning

20
2.8. Software

M107 ;start with the fan off


G28 X0 Y0 ;move X/Y to min endstops
G28 Z0 ;move Z to min endstops
G1 Z15.0 F9000 ;move the platform down 15mm
G92 E0 ;zero the extruded length
G1 F200 E3 ;extrude 3mm of feed stock
G92 E0 ;zero the extruded length again
G1 F9000
;Put printing message on LCD screen
M117 Printing...
M107
G0 F3600 X139.48 Y141.20 Z0.30
;TYPE:SKIRT
G1 F2400 E0.00000
G1 F1200 X140.25 Y140.59 E0.01396
G1 X141.11 Y140.15 E0.02763
G1 X142.01 Y139.89 E0.04079
G1 X142.71 Y139.83 E0.05073
G1 X143.26 Y139.82 E0.05841
G1 X143.59 Y139.82 E0.06315
G1 X143.64 Y139.82 E0.06377
G1 X144.39 Y139.82 E0.07444
G1 X144.78 Y139.82 E0.07984
G1 X145.10 Y139.82 E0.08445
.................

En el extracto anterior, que corresponde al de un modelo a imprimir en 3D, se


aprecian una serie de G-codes y M-codes que realizan las configuraciones iniciales:
métrica a usar, sistema de coordenadas, configuración de setpoints para las tem-
peraturas del extrusor y cama caliente, llevar el puntero al origen de coordenadas.
Luego comienzan una serie de comandos para indicar las posiciones a las que
tiene que moverse el extrusor mientras extruye. Estas lı́neas pueden ser varios
miles, dependiendo del objeto a crear y de las caracterı́sticas que se configuren en
el programa generador de G-code (Sección 2.8.2) y terminan cuando se ejecuten
las lı́neas correspondientes a la finalización del proyecto.
Una diferencia notable de este estándar frente a la generalización presentada
anteriormente es que las funciones básicas de movimiento se enmarcan como otras
funciones G, es decir, X, Y y Z no representan acciones, sino que anticipan datos
a utilizar en la acción G1 (en este caso). Tampoco aparece la secuencia de números
precedida por la letra N .
Básicamente este código describe los puntos que se deben ir recorriendo en
cada plano XY (en el total del código también aparecen incrementos en Z) junto
con una serie de configuraciones como las mencionadas y otras como la velocidad
de avance, necesarias para el correcto funcionamiento del sistema. Este hecho es
el que hace a los comandos G y M de tan valioso uso en este tipo de máquinas,

21
Capı́tulo 2. Antecedentes

ya que con el estudio y comprensión de los mismos, se puede iniciar una etapa de
desarrollo de un software que deberá entender cada uno de los códigos que reciba
para ejecutar las directivas necesarias y ası́ comandar la máquina. Componiendo
de esta manera el firmware especı́fico de la máquina.

2.8.2. Generadores de G-code y firmware


Cuando en las máquinas de control numérico computarizado se menciona el
software, puede referirse a distintas herramientas que se diferencian principalmente
por la etapa en la que cumplen sus cometidos. Cuando un usuario tiene en mente
llevar a cabo la realización de una determinada pieza puede comenzar de 2 maneras:
puede buscar si ya existe el modelo 3D de esa pieza en una especie de repositorio
[23] [24] [25], o puede diseñar dicha pieza en un determinado software [26].
Luego de tener el modelo 3D, este debe pasarse a un formato que sea entendible
por la maquina. Los programas que realizan esta tarea son conocidos como genera-
dores de G-code o CAM (por su sigla en inglés, Computer Aided Manufacturing),
debido a que toman como entrada el archivo del modelo y dan como salida un
archivo .gcode. Cada lı́nea de archivo de salida es una instrucción que la máquina
debe realizar.
Los generadores de G-code más utilizados son “Open Source”, por ejemplo:

CURA software [27]

Slic3r [28]

Skeinforge [29]

Teacup [30]

RepRap Host software [31]

La tercer y última herramienta de software que cumple un papel fundamental


en el proceso es el firmware. Éste software corre en el microcontrolador de la
máquina y es el que realiza todo el control de posicionamiento y temperatura
(caso de impresora 3D) a partir de los comandos expresados en el archivo .gcode.
De la opciones existentes las más utilizadas son:

Marlin: El código del mismo se implementa en lenguaje C++ y su objetivo


va más allá de la realización del control de los movimientos. Implementa
también la comunicación con la máquina, el control de temperatura del ex-
trusor y de la heated bed (superficie de impresión), manejo de un display,
etc.

Sprinter: Esta escrito mayormente en lenguaje C++ pero posee un porcen-


taje importante en C. Al igual que Marlin realiza el manejo general de la
máquina.

22
2.8. Software

Teacup: Al igual que en los casos anteriores apunta al manejo general de la


máquina. Su implementación se llevo a cabo en lenguaje C que se enfoca en
la eficiencia, flexibilidad y de código limpio.

ReplicatorG: Es un firmware realizado a partir de Sprinter cuya versión 0.91


se lanzo el 30/12/2013. Se implementa parcialmente en C++ y C. Implemen-
ta varias de las mismas caracterı́sticas que los anteriormente mencionados.

Por más información sobre la anterior lista de firmwares y otros disponibles se


puede consultar la página de Reprap [32].

23
Capı́tulo 2. Antecedentes

Figura 2.18: Esquema genérico de electrónica necesaria para el control de movimiento y tem-
peratura de una impresora 3D.

2.9. Electrónica
En la presente sección se da una idea global de los bloques de electrónica que
son usuales en aplicaciones de impresión 3D y routers CNC. En la Figura 2.18 se
puede apreciar un diagrama de dichos bloques y cómo se relacionan para el caso
de una impresora. No difiere mucho del caso de un Router CNC, salvo por los blo-
ques de control de temperatura. En primer lugar, se necesita un microcontrolador,
una interfaz con el usuario, drivers y motores para el movimiento. Los anteriores
bloques son básicos; la interfaz brinda al usuario un medio de comunicación con
la máquina, en el microcontrolador se implementa el firmware para el funciona-
miento lógico, se reciben y se generan las señales necesarias para el funcionamiento
general. Los drivers de los motores manejan y dan potencia a éstos para realizar
los movimientos.
La pieza fundamental de la electrónica es la inteligencia (controlador), don-
de convergen todas las señales de entrada, salida y procesamiento necesario para
el adecuado funcionamiento de la máquina. En el rubro de las impresoras 3D son
ampliamente utilizadas las placas controladoras de la familia Arduino, destacándo-
se en los modelos comerciales el Arduino Mega, probablemente porque se ajustan
perfectamente a las necesidades (ya sea capacidad de procesamiento, tamaño flash,
cantidad de puertos). En la siguiente lista se resumen éstas y otras placas electróni-
cas con utilidad en el área.

Arduino: Mega 1280 [33], Mega 2560 [34], Mega ADK [35], DUE [36], TRE
[37]

BeagleBoard: BeagleBone Black [38]

24
2.9. Electrónica

Raspberry Pi [39]

Recientemente modelos más potentes como Arduino DUE ya se usan para


proyectos de este estilo, incluso el modelo TRE se proyecta con gran utilidad en
el área. Además, incluso modelos de otras empresas están ganando terreno, como
ejemplo citamos a la BeagleBone Black [40] y Raspberry Pi [41] que son placas
capaces de ejecutar un sistema operativo del estilo Linux.
Dependiendo del tipo de motores que se utilicen surgen varias posibilidades en
cuanto a los drivers a utilizar. En general se utilizan motores paso a paso sobre
todo en el desarrollo de impresoras 3D, sin embargo los motores de tipo DC como
los servomotores tienen aplicación en máquinas que requieran un posicionador [42]
de precisión.
Para el manejo de motores PAP con un microcontrolador Arduino es común el
uso de placas (shield ) que resuelven la generación de fases para las bobinas de los
motores y la etapa de potencia [43]. Esta tendencia se repite con otras placas [44]
e incluso se ha ido más lejos con el diseño de placas basadas en microcontrolador
Arduino o BeagleBone que integran la inteligencia con los drivers. Ejemplos de
esto son las placas que se listan a continuación:

Alligator Board: basada en Arduino DUE [45]

Duet Board: basada en Arduino DUE [46]

Lo anterior tiene como ventaja la reducción de espacio dedicado a la electrónica.


Sin embargo, no es la única posibilidad. Existen los conocidos Pololu [47] o Easy-
Driver [48], que resuelven el manejo de las bobinas de los motores. Pero siempre
está la opción de que el usuario diseñe su propio controlador a partir de integra-
dos: uno que genere las fases y/o un puente H para dar potencia. Un ejemplo es
la combinación L297 con L298 [20], y otra opción es usar el DRV8811 [49]que a
diferencia del anterior integra ambas funciones y permite microstepping.
En lo que refiere a la interfaz con el usuario, se puede encontrar desde equipos
conectados a un PC con un software host, que se utiliza para realizar la calibración
y el seguimiento de un trabajo, por ejemplo el CURA [27], hasta opciones más
básicas donde se cuente con una pantalla LCD y una botonera o joystick. En el
primer caso, el archivo .gcode se transmite desde el PC y en el segundo se carga
en una memoria SD de donde el firmware obtiene el mismo.
Hasta aquı́ tenemos una descripción general de los distintos bloques básicos
para desarrollar una impresora 3D o router CNC.
Falta mencionar, sin embargo el uso de heated bed, la cual permite imprimir
las piezas en una superficie que se encuentre a una determinada temperatura,
permitiendo una mejor adherencia del material. El requerimiento de la misma
depende del material de impresión, que recordamos son PLA o ABS. En el primer
caso, se pueden encontrar opiniones diferentes respecto a la necesidad de usar
una heated bed. Entre los que sostienen que no es necesario se pueden encontrar
alternativas muy sencillas como por ejemplo emplear una lámina adhesiva o incluso
trabajar directamente sobre vidrio. En cambio, con el ABS es necesario tener una

25
Capı́tulo 2. Antecedentes

heated bed que alcance alrededor de 110◦ C; además hay grupos que consideran
necesario agregar algún material adherente, como fijador de cabello o lámina que
soporte las temperaturas de trabajo.
Otro detalle que no se mencionó pero es fundamental para el control y protec-
ción mecánica es el uso de algún mecanismo para determinar los lı́mites fı́sicos de
la máquina. Pueden ser mecánicos u ópticos.

26
Capı́tulo 3

Visión General del Proyecto

Como se mencionó en el Capı́tulo 1, el objetivo del proyecto es diseñar y cons-


truir un posicionador en tres dimensiones, el cual mediante cabezales intercam-
biables cumplirá con las funciones de fresado y de impresión 3D por deposición
fundida. El objetivo de este capı́tulo es presentar al lector un resumen de la solución
propuesta, remarcando los conceptos claves para su desarrollo.

3.1. Descripción de la solución


Comenzando por el sistema de coordenadas a utilizar, en la Figura 3.1 se
observa la elección de un sistema de ejes cartesianos para la implementación de la
estructura. Se muestran los distintos ejes y partes móviles.
Se escogieron motores paso a paso como actuadores sobre los grados de libertad
para realizar los movimientos. En la Figura 3.2 se resume el flujo que sigue la
información en los diferentes bloques de hardware hasta que los mismos se traducen

Figura 3.1: Estructura mecánica basada en sistema de ejes cartesianos.


Capı́tulo 3. Visión General del Proyecto

Figura 3.2: Diagrama de bloques de Hardware y relación con mecánica.

a un movimiento.
Los equipos basados en control numérico como los que se tratan en este pro-
yecto basan su funcionamiento en comandos G-code provenientes de un archivo
.gcode que describe el recorrido que debe efectuar el posicionador y otras funcio-
nes necesarias que se describirán. El archivo mencionado, se genera a partir de un
software denominado generador de G-code, que recibe como entrada un archivo
.stl que describe la geometrı́a del objeto que se pretende sea el producto final de
una impresión o fresado. El proyecto descrito tiene como punto de partida el ar-
chivo .gcode, pero no descuida el uso de herramientas como CURA o Slic3r para
la obtención de los mismos.
El flujo de trabajo en la Figura 3.2 comienza con el archivo .gcode. El primer
paso es alojar el archivo en la memoria SD de placa Raspberry PI conectándose
mediante una red inalámbrica a la misma. Luego de esto, la placa Raspberry Pi
auspicia como transmisora de cada lı́nea del archivo anterior que corresponde a un
G-code.
El Arduino Mega 2560 y la placa anterior entablan una comunicación serial
donde el microcontrolador solicita al Raspberry Pi una lı́nea y éste la envı́a al
receptor. En el Arduino se implementan todos los bloques de software necesarios
para realizar un correcto funcionamiento de la máquina. Para ello es necesario
realizar una interpretación de cada comando G-code y tomar acciones de control
que deriven en la generación de señales apropiadas a los drivers de los motores
paso a paso. El software que corre sobre la plataforma de Arduino se le denominará
firmware. Para fijar ideas en la Figura 3.3 se observa un esquema cuya intención
es mostrar un poco más de detalle, resaltando las funciones más importantes que
se deben llevar a cabo.
Es importante mencionar en este punto que en el caso de impresoras 3D se
tiene un cabezal de impresión como los descritos en el Capı́tulo 2. Estos cabezales
de impresión utilizan un motor PAP para traccionar el filamento de PLA o ABS
y además requieren un control de temperatura. Por otro lado se implementó una
heated bed, la utilización de la misma requiere de electrónica adicional para el

28
3.1. Descripción de la solución

Figura 3.3: Esquema hardware y bloques internos básicos.

control de temperatura.

Para la implementación de la fresadora es necesario agregar el control de un


motor DC por lo que se necesita un controlador de motor distinto al de los motores
stepper. Una posibilidad es realizar un control PWM para la velocidad del motor
DC. El Arduino será el encargado del manejo de estos elementos. En la Figura 3.4
se aprecia la ubicación del cabezal de impresión o de fresado. La idea es que sean
intercambiables.

29
Capı́tulo 3. Visión General del Proyecto

Figura 3.4: Esquema de ubicación cabezal impresión o fresador.

Figura 3.5: Menú principal circular.

La interfaz como se ve en la Figura 3.3 se implementa mediante un joystick, un


botón y un display, y le brinda al usuario un menú de opciones de forma circular
como se ve en la figura 3.5 y optando por las distintas posibilidades se puede entrar
a otros sub-menú o darle órdenes al prototipo. Por otro lado, el display se mantiene
mostrando información en tiempo real como puede ser la ubicación del puntero o
la temperatura del mismo.
En los próximos capı́tulos se brinda mayor detalle sobre las temáticas relacio-
nadas al presente proyecto, mecánica del prototipo, electrónica y software.

30
Capı́tulo 4

Mecánica

4.1. Introducción
En el corriente capı́tulo se describe el proceso de diseño y fabricación de la
estructura mecánica. Se detalla la elección de los criterios de diseño en los que
se basó para llegar a la solución, las dimensiones para cumplir con los objetivos
del proyecto y el armado. Se comentan los diferentes problemas y sus respectivas
soluciones.

4.2. Criterios de diseño


Como se vio en el Capı́tulo 2 un posicionador puede fabricarse de diferentes
materiales, basarse en distintos sistemas de coordenadas o responder a diversas
maneras de implementar los movimientos. Como objetivo de esta sección se busca
determinar estas elecciones y otras pertinentes.
Desde el comienzo se optó por realizar la estructura con aluminio, este material
predominó por encima del MDF y el hierro por una cuestión de solidez mecánica
frente al primero y por un tema económico y de facilidad a la hora de trabajarlo
frente al segundo.
Se comenzó con dos grandes pautas en el diseño, primero que la mesa se en-
cargarı́a de los dos movimientos en el plano horizontal, para liberar de estos al
cabezal. A éste solo le corresponderı́a el movimiento a lo largo del eje Z para no
sobre exigirlo con más de un movimiento, debido a que se le encomendarı́an las
funciones de impresión, fresado y escaneado. Esta elección derivarı́a en problemas
mecánicos, dado que esto cuadriplicarı́a la superficie que ocuparı́a el prototipo, lo
que resultarı́a en una magnitud considerable debido a la intención de tener una
área de impresión mayor a lo estándar.
Además, el cabezal deberı́a trabajar en el centro de dicha superficie, por lo
cual su ubicación y la del mecanismo encargado de su movimiento presentarı́a una
complicación a la hora de implementarse. Como solución se decidió que la mesa
efectuara un solo movimiento, dejando los restantes dos para el cabezal.
Capı́tulo 4. Mecánica

La segunda gran pauta fue que las partes de la máquina serı́an diseñadas por
quienes suscriben, comprando piezas a medida o encargándoselas a un tornero. Se
pensó que la opción de utilizar grandes láminas de aluminio dobladas según criterio
propio permitirı́a implementar de buena forma la estructura. Esto atentarı́a contra
uno de los objetivos del proyecto, más precisamente el de diseñar un prototipo que
sea, dentro de lo posible, fácil de replicar. Por esto se optó por utilizar piezas
con caracterı́sticas estándar y se consideró con fuerza la opción de usar perfiles de
aluminio. Los perfiles seleccionados inicialmente son de una forma determinada y
se muestran en la Figura 4.1.
Estos perfiles presentaban dos ventajas intere-
santes, la primera es que el uso de los mismos le
hubiera proporcionado al prototipo un buen aca-
bado desde el punto de vista estético. Y como se-
gunda ventaja la facilidad que presentaban para la
conexión, tanto entre ellos como a otros partes que
tendrı́a el prototipo. A la hora de buscar la dispo-
nibilidad en el mercado local se encontró que estos Figura 4.1: Perfil de uso común
en router CNC. Imagen extraı́da
perfiles no se comercializan en el Uruguay, y bajo
de [50].
la posibilidad de comprarlos en el exterior se dieron
con precios demasiado altos para el presupuesto del
presente proyecto. Debido a esto se optó por una
nueva opción: trabajar con perfiles de aluminio que se encuentren en el mercado
local, más precisamente perfiles de sección cuadrada o rectangular. Esto amplió el
margen económico pero agregó una etapa extra en el diseño debido a la dificultad
de conectar las partes de la estructura. El uso de estos perfiles brindó una ventaja
a la hora de ubicar los cables, los cuales se pueden colocar por dentro de éstos,
dado que son huecos.
Además, para ser coherentes se decidió que la gran mayorı́a, y en caso de ser
posible todas las piezas, fuesen de carácter estándar, y que se posean datos técnicos
de las mismas para que ante la incapacidad de encontrar tales piezas se pueda optar
por otras equivalentes.
Para efectuar los movimientos mecánicos del posicionador se utilizaron moto-
res, los tipos de motores que emplean la mayorı́a de los routers CNC e impresoras
3D son motores paso a paso o motores servo. Vale la pena aclarar que ambos mo-
tores pueden cumplir con las tareas deseadas, y en diversos foros de routers CNC
y de impresoras 3D se encontraron discusiones sobre la elección de los motores,
existiendo simpatizantes de ambas opciones. Las ventajas que presentan los mo-
tores paso a paso son que son más baratos, como también son más sencillos de
controlar, principalmente porque se pueden utilizar en lazo abierto, haciendo más
barata la electrónica necesaria para su uso.
Una de las principales decisiones que se tuvo que tomar fue elegir qué tipo de
mecanismo se encargarı́a de trasladar el movimiento que efectúan los motores. De
esto podrı́an encargarse tornillos sin fin o correas dentadas, la elección se decantó
por los tornillos sin fin dado que estos presentan una mayor inercia, lo que resulta
beneficioso para la tarea del fresado por ejemplo. Como contrapartida los tornillos

32
4.2. Criterios de diseño

presentan una desventaja llamada backlash. Este fenómeno se debe a que la tuerca
que se mueve por el tornillo, a no ser que sea fabricada especialmente para dicho
tornillo, no se encuentra simultáneamente apoyada por ambos lados, presentando
un tiempo muerto cuando se mueva hacia la cara donde no está haciendo contacto.
Como se dijo, los tornillos presentan como una de sus caracterı́sticas la inercia,
esto significa la capacidad de mantener fija su posición cuando se aplica una fuer-
za. El parámetro del que depende ésto es la inclinación que poseen los hilos del
tornillo. Aquı́ se debió tomar una decisión dado que grandes ángulos de inclinación
proporcionarán una mayor velocidad, mientras que ángulos que se acerquen a ser
perpendiculares al largo presentarán mayor inercia y precisión. Se optó por elegir
tornillos con estas últimas caracterı́sticas.
Se decidió implementar el movimiento a través del eje Z mediante dos rectángu-
los de idénticas caracterı́sticas salvo por la diferencia de que uno no tendrı́a tornillo,
o sea que solo soportarı́a los esfuerzos con sus guı́as. Haciéndole honor al nombre
del proyecto se decide implementar cada eje de la misma manera y que a su vez
sean independientes del resto, esto le dio al prototipo un carácter modular.
Tomando en cuenta todas las consideraciones previas se decide implementar
cada eje como un rectángulo formado por los perfiles, en el que se encuentra cen-
trado con respecto a su ancho el tornillo sin fin, con dos guı́as de acero pulido
situadas paralelamente al tornillo, que soporten las fuerzas perpendiculares a éste.
El diseño en forma de rectángulo introdujo un problema denominado “efecto pa-
ralelogramo”, que surge debido al alto impacto que tienen las deformaciones en las
diagonales.
Además el diseño modular brinda la ventaja de poder trabajar con cada módulo
por separado, por ejemplo cada eje se puede testear por separado, como también
se puede reemplazar un eje por otro de mayores dimensiones (siempre y cuando
esto sea posible) y se verá aumentado el volumen de impresión. Cumpliendo con
las pautas ya mencionadas se pudo formular un primer diseño, el cual se puede ver
en la Figura 4.2.
Se resumen las ventajas y desventajas de las elecciones antes descritas en la
Tabla 4.1.

33
Capı́tulo 4. Mecánica

Figura 4.2: Primer diseño.

Elemento Ventajas Desventajas


Aluminio Bajo costo Baja resistencia
mecánica
Fácil manipulación
Partes móviles Repartidos los esfuerzos
Mitad de superficie de impresión que si
la mesa se moviera en 2 dimensiones
Tornillo Alta precisión Baja velocidad
Buena inercia
Perfiles Ubicación de los cables
Estructura modular Permite implementación independiente
Diseño rectangular Efecto paralelogramo

Tabla 4.1: Ventajas y desventajas de las elecciones tomadas.

4.3. Dimensionado
Antes de empezar con la construcción del primer eje se debieron elegir las
especificaciones técnicas de los materiales, para esto se debieron elegir por ejemplo
las dimensiones de todo el modelo.
Las dimensiones totales del prototipo se eligieron básicamente con el cometido
de cumplir con el requisito del volumen de impresión marcado como objetivo. Para

34
4.3. Dimensionado

esto se sabe que la mesa debe ocupar aproximadamente el doble del largo objetivo
y un ancho similar al objetivo. En cuanto a las dimensiones de los restantes ejes
estos deben diferir de los objetivos el espacio no útil que determinan las mesas que
se mueven a través de éstos. Teniendo en cuenta esto se decidió realizar los ejes de
aproximadamente las medidas mostradas en la Tabla 4.2.

Eje Largo útil (cm) Ancho útil (cm)


X 60 40
Y 35 20
Z 50 30

Tabla 4.2: Tabla con los valores aproximados de los ejes.

De las medidas totales se deducen las de los distintos elementos que componen
los ejes, ası́ como lo son los perfiles, las guı́as de acero o los tornillos. En lo que
respecta a los perfiles de sección cuadrada se encontró en el mercado local una
gran variedad de secciones, concluyendo que las más sencillas de obtener son las
de 4cm × 4cm o las de 3cm × 3cm. Se optó por estas últimas debido a que eran
más pequeñas y además poseen un espesor menor lo que se traduce en una menor
resistencia mecánica.
El largo de los tornillos no presentó una limitan-
te debido a que se comercializan por unidad con un
metro de largo, permitiendo luego cortarlos del lar-
go necesario. Fue necesario decidir el paso de los tor-
nillos, entendiendo esto como la distancia entre las
crestas, o como la distancia que recorre una tuerca
al dar una vuelta completa (Figura 4.3). Esta carac-
terı́stica determina la precisión en los movimientos,
esto es porque una vuelta consta de un determina-
do número de pasos (N ) entonces la precisión va
Figura 4.3: Paso de un tornillo.
a ser: paso delNtornillo . Los motores de paso de hoy Imagen modificada de [51].
en dı́a poseen como valores usuales 1,8◦ por paso, o
sea que se llega a N = 400 trabajando en modo half
step, lo cual se explicará en el Capı́tulo 5. Por esta
razón y por la estandarización de la relación entre diámetro y paso de los tornillos
sin fin se concluyó utilizar tornillos de media pulgada de diámetro y de 12 pasos
por pulgada. Se decidió utilizar tornillos iguales para todos los ejes con el objetivo
de mantener la relación entre número de vueltas y avance.
Para las guı́as no se calculó en profundidad los esfuerzos que deberı́an soportar,
sino que se eligió guı́as de acero pulido que posean un diámetro que facilite encon-
trar cojinetes que sirvan en estas, y que se pudiera encontrar una buena oferta por
el conjunto de todas las guı́as necesarias. Se optó por guı́as de 8mm de diámetro y
como confirmación de que cumplirı́an los requisitos mecánicos se tomó la opinión
de los tutores, los cuales constan de una experiencia mayor que los integrantes.

35
Capı́tulo 4. Mecánica

Para la selección adecuada de los motores PAP se realizó un script de matlab,


por más detalles Apéndice B. Los valores de las medidas con las que se construyeron
los ejes se pueden apreciar en la Figura 4.4.

4.4. Extrusor de impresión 3D


Se decidió comprar el extrusor en exterior debido a las escasas opciones que
brinda el mercado local, y la gran diferencia de precios en esta área. El cabezal de
impresión adquirido se puede apreciar en la Figura 4.5, donde se pueden ver sus
partes y dimensiones.

Figura 4.5: Cabezal de extrusión adquirido.

Dicho cabezal presenta como ventajas que la tracción del filamento la realiza
un motor de pasos con caracterı́sticas similares (tensión de alimentación, ángulo
por paso, etc) a los utilizados para implementar los movimientos. Además entre
el motor y el filamento no se utilizan engranajes intermedios, sino que se hace de
forma directa, con ésto se evita introducir backlash en el movimiento.
También la resistencia de potencia encargada de calentar el hot end se alimenta
en 24V.
Otra de las caracterı́sticas que impulsó la compra del cabezal es la capacidad de
trabajar tanto con ABS como con PLA, ésto es debido a la capacidad de manejar
las temperaturas necesarias de ambos materiales.
Otras caracterı́sticas del extrusor son:

36
4.4. Extrusor de impresión 3D

(a) Eje X.

(b) Eje Y.

(c) Eje Z.

Figura 4.4: Medidas reales de los ejes (cm).

37
Capı́tulo 4. Mecánica

Grosor del filamento soportado: 1,75mm.

Diámetro del extrusor: 0,3mm.

Sensor de temperatura: termocupla tipo K.

Potencia de calentamiento: 40W.

Máxima temperatura de trabajo: 255◦ C.

Por más información sobre el cabezal adquirido ver [52].

4.5. Armado de un eje

Figura 4.6: Detalle de un eje.

En la presente sección se detallará el armado de un eje, el cual se ve en la


Figura 4.6, que como ya se explicó es prácticamente análoga para todos los demás.
Además se explicará el diseño de las mesas que se deslizan por los ejes, y el detalle
de todas las piezas de invención propia que fueron necesarias para efectuar el
armado.
Para colocar las guı́as en el rectángulo se realizaron en los perfiles cortos, que
componen los anchos, perforaciones de 8mm de diámetro y se cortaron las guı́as a
la medida de forma tal que el largo de la varilla Lv cumpliera: Lv = Lext − eperf il ,
siendo Lext los largos exteriores del rectángulo, y eperf il el espesor de las caras del
perfil.
La colocación de las guı́as es sencilla dado que las guı́as tienen un movimiento
bastante acotado. Pero para los tornillos no se puede optar por la misma solución

38
4.5. Armado de un eje

Figura 4.7: Pieza de invención propia para la colocación del tornillo.

Figura 4.8: Diferencia de altura.

debido a que el tornillo tiene un movimiento rotatorio que es la base de su fun-


cionalidad, por esto debe fijarse el mismo de forma tal que se le permita efectuar
dicho movimiento, mediante un ruleman. Por esto se realizó una pieza, que se pue-
de apreciar en la Figura E.19, con una plancha de hierro con el mismo espesor que
los rulemanes, donde se encastrarı́a el ruleman a fuerza, y luego se fija dicha placa
al lado interior del rectángulo. Para realizar esta pieza se necesitó de la ayuda de
un tornero que llevara el diámetro del tornillo al diámetro interno del ruleman.
La altura a la que se ubican las guı́as y el tornillo se ve en la Figura 4.8, la
diferencia se explica en que la distancia que imponen los cojinetes entre las guı́as
y la mesa y la que impone la tuerca entre el tornillo y la mesa no son iguales, para
compensar esta diferencia se agrega una placa de aluminio de 4mm como ajuste
grueso y el ajuste fino se realiza colocando a distintas alturas las guı́as y el tornillo
en el perfil corto.
Los motores se acoplaron a los tornillos de formas distintas dependiendo de la
ubicación más conveniente de éstos según se proyectó en el diseño general. Como se
ve en la Figura 4.9 en el eje X se coloca a continuación del tornillo pero en el Z y en
el Y esto no es posible. En el caso del eje X se debe acoplar el tornillo directamente
al eje del motor mediante un acople como el que se ve en la Figura 4.10(a), para
esto se debe fijar una distancia entre el motor y el tornillo mediante una pieza

39
Capı́tulo 4. Mecánica

(a) Ubicación del motor en el eje X. (b) Ubicación del motor en el eje Y y Z.

Figura 4.9: Ubicación de los motores.

Eje Largo (cm) Ancho (cm)


X 35 36
Y 8 21
Z1 22 22
Z2 22 22

Tabla 4.3: Tabla de medidas de las mesas.

realizada a partir de un perfil de aluminio de sección cuadrada de 4cm × 4cm,


dicha pieza se puede apreciar en la Figura 4.10(b).
En el caso de los ejes Y y Z se debe ubicar el eje del motor en paralelo al
tornillo y trasladar el movimiento mediante un correa como se ve en la Figura
4.10(c). Para afirmar el motor se construye una pieza similar a la utilizada para
efectuar el acoplamiento lineal; para lograr que la correa esté tensionada se ponen
separadores entre esta pieza y el perfil que contiene el tornillo.
La unión entre los perfiles y el problema del paralelogramo se solucionaron en
conjunto por medio de una placa de aluminio, a la cual se le fijaron los perfiles;
esto se realizó mediante tornillos y tuercas. La placa utilizada puede abarcar la
superficie exterior completa o se pueden utilizar dos, esto se puede ver en la Figura
4.11.
Las mesas son placas de aluminio de 3mm de espesor, donde las dimensiones
dependen de a cuál eje pertenecen y se pueden ver en Tabla 4.3. En dichas mesas se
coloca una tuerca estándar, que cumpla las especificaciones del tornillo, de forma
tal que cuando el tornillo se encuentre colocado éste quede paralelo al largo de la
mesa. El punto más importante en esta etapa es colocar los cojinetes y la tuerca de
forma que las guı́as y el tornillo queden paralelas. El correcto funcionamiento de
este sistema depende de que las guı́as y el tornillo no realicen esfuerzos de forma
perpendicular a este último.
Es aquı́ que surge el primer problema dado que el uso de elementos estándar
derivó en el uso de tornillos que no eran rectos sino que presentaban una cur-
vatura, esto significa que la distancia entre el tornillo y la mesa no se mantiene
constante. Para solucionarlo se decidió crear una pieza, que se puede apreciar en

40
4.5. Armado de un eje

(a) Acople lineal flexible (b) Pieza diseñada para realizar el


[53]. acoplamiento tornillo-motor en el eje
X.

(c) Pieza diseñada para realizar el acoplamiento


tornillo-motor en el eje Y y Z.

Figura 4.10: Acoples.

la Figura 4.12, que corrija este problema. Esta pieza tiene el nombre de collar
de empuje, y la idea es que la tuerca pueda moverse perpendicular al tornillo sin
efectuar esfuerzos a la mesa, siempre teniendo en cuenta que estos movimientos
sean los suficientemente pequeños como para que la tuerca no gire en relación a
la mesa. Estos movimientos se deben dar en todos las direcciones para soportar la
excentricidad del tornillo. Como esto no se habı́a contemplado salvo para el eje Z
se agregó un pequeño margen entre la mesa y la tuerca realizando una canaleta
en la placa de aluminio añadido. Además vale la pena destacar que este problema
exige un correcto torneado de las puntas de tornillo dado que por mas que esto no
lo corrige, si se puede ver amplificado. Es importante que la tuerca calce justo en el
perfil U para no agregar tiempos muertos en el movimiento, para esto se adquirió
un perfil U ligeramente menor al espesor de la tuerca y se limó ésta hasta llevarla
a la medida exacta.

41
Capı́tulo 4. Mecánica

Figura 4.11: Placas que protegen del efecto paralelogramo.

Figura 4.12: Collar de empuje.

42
4.6. Interconexión entre ejes

Figura 4.13: Solución backlash.

Como se ve en la Figura 4.13 se instaló en los tornillos resortes de un diámetro


interior ligeramente mayor al diámetro del tornillo para solucionar el problema del
backlash, dicho resorte quedará comprimido entre la tuerca del collar de empuje y
otra tuerca que se agrega sólo para cumplir este fin. Gracias a la fuerza restauradora
del resorte la tuerca que traslada el movimiento a la mesa siempre se encuentra
haciendo contacto con la misma cara del tornillo eliminando el problema.

4.6. Interconexión entre ejes

Uno de los pilares de la interconexión entre ejes es el de determinar la perpen-


dicularidad entre éstos. El armado se puede resumir como la colocación de los ejes
Z a los lados del eje X, y la del eje Y sobre las mesas de los ejes Z, dado que el eje
Y es el único que se mueve. Sobre la mesa del eje Y se colocan los punteros. Las
imágenes del diseño final se pueden ver en la Figura 4.14.

43
Capı́tulo 4. Mecánica

Figura 4.14: Diseño CAD final.

4.7. Problemas
En un primer prototipo de la máquina con sus ejes ensamblados se detectó
un problema en el movimiento del eje Z. Se apreciaba una vibración del eje Y
(que corre sobre el Z) y particularmente del lado sin tornillo el movimiento no era
continuo, se presentaban saltos en el desplazamiento. Estos problemas seguramente
provocarı́an imperfecciones en el resultado final. Por ésta razón se decidió colocar
un segundo tornillo para efectuar el movimiento en el eje Z, esto significa que
los dos rectángulos que se encargan de estos movimientos se harán exactamente
iguales. Para que esto funcione correctamente es esencial que al ser los dos tornillos
de las mismas dimensiones éstos se muevan exactamente igual. Para lograr esto
hay dos posibilidades.
La primera es utilizar un motor y trasladar el movimiento del tornillo que se
encuentra acoplado al motor al otro a través de una correa con una relación 1:1,
la segunda opción es colocar un segundo motor acoplado al tornillo agregado y
excitar ambos motores con las mismas señales. Se consideró que la segunda opción
puede introducir más errores que la primera.
Para implementar la primera solución es importante lograr que la correa se
encuentre tensada, lo ideal hubiese sido encontrar una correa de la medida exacta

44
4.8. Conclusiones

para acoplarla directamente. Por más que se buscó, esto no fue factible entonces
se optó por utilizar una correa más extensa y colocarle un tensor, el cual consta
de una parte móvil por la que pasa la correa para formar un triángulo (un pı́vot).
La figura del tensor y su ubicación se pueden apreciar en la Figura E.31.
Para realizar el tensor se buscaron en primera instancia los acoples dentados.
El pase obtenido fue de XL, con lo cual, luego de poseer los acoples se adquirió
una correa con ese pase de 49 pulgadas de perı́metro. Finalmente, en la colocación
de la máquina se ubicó el pı́vot dejando una tensión adecuada en la correa. Los
cálculos para determinar la distancia h a la que debe quedar ubicado el pı́vot se
desprenden de imponer que:
54, 2cm + 2x = 49 ∗ 2, 54cm
h2 + (54, 2cm/2)2 = x2
De lo que se deduce que h = 22, 35cm.

Figura 4.15: Geometrı́a usada para el calculo de la ubicación del tensor.

4.8. Conclusiones
La principal conclusión es que se desarrolló un prototipo funcional de un po-
sicionador XYZ, el cual en teorı́a tendrá la capacidad de ubicar su puntero con
una repetibilidad que cumple con los objetivos. En el Capı́tulo 7 se reportarán las
medidas de repetibilidad reales.
Se concluye que no fue una buena idea comprar algunos materiales de baja
calidad, más especı́ficamente tornillos sin fin, guı́as de acero y cojinetes dado que
estos resultaron en una complicación y un gran gasto de horas que se podrı́an
haber ahorrado aumentando un poco el presupuesto.

45
Esta página ha sido intencionalmente dejada en blanco.
Capı́tulo 5

Electrónica

5.1. Introducción
El capı́tulo que aquı́ se presenta trata sobre el diseño e implementación global
de la electrónica. Se detalla la relación entre los diferentes bloques y se hace especial
énfasis en el desarrollo de los drivers para motores paso a paso. En la Figura 5.1
se observa un esquema general de conexionados entre bloques. El mismo intenta
brindar una idea clara de los bloques que intervienen en el prototipo, más no es
exactamente un reflejo fiel de las conexiones.
El esquema anterior resume la electrónica necesaria para el prototipo desarro-
llado en el presente proyecto.
La inteligencia del prototipo fabricado se compone de un computador encar-
gado de la recepción y comunicación del archivo G-code al microcontrolador en-
cargado de procesar cada lı́nea. Como computador se decidió usar una Raspberry
Pi y como microcontrolador el Arduino MEGA ADK.
La Raspberry Pi es una placa computadora, es decir tiene todo lo que engloba
una computadora en el mismo circuito impreso. En la Tabla 5.1 se presentan las
principales caracterı́sticas.
La presente placa no presenta ningún dispositivo de almacenamiento fı́sico. Se
trabaja con una tarjeta SD extraı́ble. No posee una fuente de alimentación interna.
El sistema operativo que corre en dicho computador es una distribución de
Linux exclusiva para este computador, conocida como Raspbian (derivada de la
distribución Debian). Se utiliza el entorno y lenguaje Python para su programa-
ción.

Especificación
Procesador central (CPU) ARM1176JZF-S 700M Hz
Procesador gráfico (GPU) Broadcom VideoCore IV
Memoria RAM 512M b

Tabla 5.1: Caracterı́sticas principales de la placa computadora Raspberry Pi.


Capı́tulo 5. Electrónica

48
Figura 5.1: Diagrama de electrónica.
5.1. Introducción

Especificación
Tensión de operación 5V
Tensión de entrada recomendada 7 − 12V
Pines digitales (I/O) 54
Pines Analógico (I) 16
Corriente continua por pines (I/O) 40mA
Memoria flash 256Kb
Memoria SRAM 8Kb
Memoria EEPROM 4Kb
Frecuencia de reloj 16M Hz

Tabla 5.2: Caracterı́sticas principales de la placa microcontroladora Arduino MEGA ADK.

Es de destacar que al poseer solo dos puertos USB, es casi segura la utilización
de un HUB USB para aumentar la cantidad de este tipo de puertos. Esto se debe a
que con la simple y básica conexión de un mouse y un teclado ya no restan puertos
libres. En particular en el presente proyecto se debe conectar un adaptador de red
inalámbrica, con lo cual al menos durante la etapa de diseño se hace esencial el
uso de un HUB.
Otro punto a tener en cuenta también para la etapa de diseño es la necesidad
de conectarle una pantalla. Esta placa posee un puerto HDMI y uno RCA.
El microcontrolador Arduino elegido esta basado en los integrados ATme-
ga2560 (8-bit microcontrolador Atmel con 64KB In-System Programmable Flash
[54]), ATmega8U2 (8-bit AVR microcontrolador con 8 Bytes de ISP flash y contro-
lador USB [55]) y MAX3421e (USB host chip [56]). En la Tabla 5.2 se presentan
las principales especificaciones de la placa microcontroladora.
Cada pin digital posee una resistencia de pull-up (20 − 50KΩ) desconectada
por defecto. Provee cuatro hardware UARTs (8 pines digitales), 6 pines para inte-
rrupciones externas, 15 pines con PWM, 4 pines correspondientes a comunicación
SPI (ver uso de estos en [57], subsección Interfaz ICSP). Por otro lado posee 16
entradas analógicas que van a un conversor ADC de 10 bits, dando lugar a una
resolución con 1024 niveles diferentes.
Esta placa viene por defecto con el reset por software automático habilitado,
pero tiene una traza que puede ser cortada para deshabilitar dicho reset. La traza
aparece claramente identificada en la placa como RESET-EN.
Se decantó por el uso de las placas mencionadas debido a la buena relación
entre precio y robustez, complementada con la gran comunidad de usuarios que
poseen en el mundo que demuestran casos de éxito en este tipo de prototipos
( [58], [59], [60]). Además una importante ventaja era que ya habı́a de estas en
el instituto. En la elección del Arduino a utilizar el gran punto de decisión fue la
cantidad de pines que se debı́an tener disponibles para el prototipo, en un principio
se necesitaban aproximadamente 42.
La placa Raspberry Pi se conecta mediante el puerto USB y entabla una co-

49
Capı́tulo 5. Electrónica

municación serial con el Arduino.


En las siguientes secciones se presentará el diseño de los drivers de los motores
paso a paso y DC. Se trata la fabricación de la heated bed o cama caliente, la
implementación fı́sica de la medición y control de temperatura para el extrusor y
cama caliente, interfaz con el usuario y alimentación del prototipo.

5.2. Controlador de los motores paso a paso


5.2.1. Introducción
Luego de haberse tomado la decisión de usar motores de paso a paso, se pro-
cedió a buscar una solución para el control de éstos.
Se decidió como primer prototipo de “driver” desarrollar el mismo, basado
en dos circuitos integrados (CI): el L297 (Stepper motor controller [20]) y el L298
(Dual full-bridge driver [61]). La esencia del circuito controlador, viene como ejem-
plo de aplicación en las hojas de datos de éstos circuitos integrados [62].
Como se adelantó, el driver se basa en dos CI, el L297 que es el que oficia de
controlador y el L298 que proporciona la potencia de forma eficiente que es nece-
saria transmitirle a las bobinas del motor para que éste pueda funcionar. Además
se utiliza un regulador de tensión para alimentar la parte lógica del circuito. Para
la parte de potencia, la alimentación será directa de la fuente de la máquina.
En la figura 5.2, puede observarse un diagrama general del diseño final del
controlador de motores paso a paso que se utiliza en la máquina fabricada y cómo
se enmarca.

Figura 5.2: Solución general de diseño y marco del controlador de los motores paso a paso del
presente proyecto.

5.2.2. Descripción de los integrados


Se presenta una breve descripción de los CI utilizados.

50
5.2. Controlador de los motores paso a paso

Nombre Pin Descripción


CLOCK 18 Pulsos de reloj
CW/CCW 17 Dirección de giro
HALF/F U LL 19 Paso entero o medio paso
ENABLE 10 Habilitación
RESET 20 Reset
Vref 15 Referencia
CONTROL 11 Control de chopper
SENS1 14 Sensado (corriente de carga A,B)
SENS2 13 Sensado (corriente de carga C,D)

Tabla 5.3: Entradas del integrado de control (L297 ) del driver de los motores PAP.

Nombre Pin Descripción


A, B, C y D 4, 6, 7 Y 9 Señales de control de las fases del motor
IN H1 y IN H2 5y8 Habilitación de las salidas de control

Tabla 5.4: Salidas generadas por el integrado de control (L297) del driver de los motores PAP.

L297

El circuito integrado L297 es el encargado de generar las señales de fase que


luego serán amplificadas para llegar a las bobinas de los motores. Para esto utiliza
las entradas que se detallan en la Tabla 5.3 y se generan las salidas presentadas
en la Tabla 5.4.
El L297 genera cuatro señales de control de fase, las cuales se pueden utilizar
para controlar motores bipolares o unipolares. Permite operar el motor en los
siguientes modos:

Fase simple: sólo está energizada una bobina en un momento determinado.


La secuencia se puede apreciar en la Figura 5.3(a).

Normal o Doble Fase: se alimentan dos bobinas a la vez. La secuencia se


puede apreciar en la Figura 5.3(b).

Medio paso: en este modo se busca alternar los 2 modos ya mencionado


obteniendo pasos intermedios. La secuencia se puede apreciar en la Figura
5.3(c) y en la Figura 5.4 se observan las señales de fase respectivas.

51
Capı́tulo 5. Electrónica

Figura 5.4: Diagrama de tiempos donde se muestran las fases al motor según la señal de reloj
para el modo de medio paso. A y B bornes de una bobina, C y D de la restante.

(a) Secuencia Modo Fase Simple.

(b) Secuencia Modo Fase Doble.

(c) Secuencia Modo Medio Paso.

Figura 5.3: Secuencias para los distintos modos de funcionamiento de un motor bipolar. Figura
tomada de [20].

En términos generales, el presente CI es un traductor de señales entre el mi-


crocontrolador y la etapa de potencia.
Funcionando en los modos fase simple y medio paso, se generan dos señales que
deshabilitan la energización de las bobinas, provocando un control discreto sobre

52
5.2. Controlador de los motores paso a paso

Nombre Pin Descripción


Input1 5 Señal a ser potenciada (A)
Input2 7 Señal a ser potenciada (B)
EnableA 6 Habilitación del puente de entradas 1-2 (puente A)
Input3 10 Señal a ser potenciada (C)
Input4 12 Señal a ser potenciada (D)
EnableB 11 Habilitación del puente de entradas 3-4 (puente B)

Tabla 5.5: Entradas del CI L298.

Nombre Pin Descripción


Output1 2 Señal potenciada (A)
Output2 3 Señal potenciada (B)
Output3 13 Señal potenciada (C)
Output4 14 Señal potenciada (D)
SENSE A 1 Corriente de emisor del puente A
SENSE B 15 Corriente de emisor del puente B

Tabla 5.6: Salidas del CI L298.

las corrientes que fluyen hacia éstas.

L298

Con este CI se pueden controlar motores paso a paso de tipo bipolar. El in-
tegrado L298 está compuesto en esencia por dos puentes clase H. Ésto permite
comandar dos bobinas independientemente, da lugar a un control de habilitación
y de dirección, es decir, se puede hacer girar un motor en un sentido o en otro y
también se lo puede detener.
En las Tablas 5.5 y 5.6 se presentan las entradas y salidas referentes del men-
cionado integrado.
Las entradas son TTL compatibles (los elementos de entrada son transistores
bipolares).
Con respecto al puente H, como se muestra en la Figura 5.5, su denominación
proviene de la disposición que presentan los transistores que lo componen. Tı́pica-
mente, el funcionamiento se basa en el encendido y/o apagado de los transistores
mencionados, dependiendo de las entradas (tensiones en las bases de los transis-
tores) que exciten al puente. Según qué transistores conducen (llaves cerradas), se
determinará si la bobina esta energizada o no y en qué sentido.

53
Capı́tulo 5. Electrónica

Figura 5.5: Puente H tı́pico.

En particular, cuando las entradas 1, 4 están en alto y las 2, 3 en bajo, el tran-


sistor Q1 conduce entonces pondrá a un extremo de la bobina a fuente, mientras
que Q4 que también conducirá pondrá el otro extremo a tierra energizándose de
esta manera la bobina. En cambio si las entrada 2, 3 son las que están en alto, la
bobina quedará energizada en el sentido opuesto.
Observado el circuito de la Figura 5.5 puede verse que si todas las entradas
están en nivel alto, quedan los cuatro transistores en conducción lo que produce un
camino directo de fuente a tierra (cortocircuito), produciendo una corriente muy
alta que podrı́a dañar los transistores como también la fuente de alimentación.
En el CI utilizado, la etapa de entrada es un circuito combinatorio que pro-
tege al puente del posible problema recién mencionado. Se añade otra entrada
(ENABLE) que junto a las dos ya mencionadas anulan la posibilidad de que se dé
un cortocircuito entre fuente y tierra. Esto permite tener estados en los cuales la
bobina puede estar des-energizada.
En la Figura 5.6 se aprecia la disposición de los 2 puentes H junto a la lógica
combinatoria a la entrada de éstos.

Regulador de voltaje
En el diseño inicial como regulador de voltaje se utilizó el circuito integrado
LM317 [63]. La configuración en la cual se utiliza el mencionado dispositivo es
dada por la hoja de datos del mismo y puede observarse en la Figura 5.7.
En funcionamiento, el CI tiene voltaje de referencia Vref = 1, 25V entre los
bornes de la tensión de salida (Vout ) y el pin de ajuste (ADJ).
La transferencia de dicha configuración para tener la tensión de salida deseada
dependiendo de los demás parámetros se muestra en (5.1).
 
R2
Vout = Vref 1 + + R2 Iadj (5.1)
R1

54
5.2. Controlador de los motores paso a paso

Figura 5.6: Diagrama de bloques interno del CI L298. Figura tomada de [61].

Figura 5.7: Configuración del regulador de voltaje. Figura tomada de [63].

Observando la ecuación (5.1) se concluye que para determinar el voltaje de


salida se deben de fijar las resistencias R1 y R2 , asumiendo despreciable la corriente
max = 100µA) , la cual es mı́nima y constante ante cambios en la
de ajuste (Iadj
alimentación o en la carga.
Es de destacar que la presente configuración solo es aplicable para cargas que
demanden al menos 4mA de corriente. Esto se debe a que el término que se agrega
en la tensión de salida dependiente de la Iadj debe ser despreciable para que el
voltaje a obtener se calcule en función de R1 , R2 y Vref . Lo anterior se da si Iadj
es despreciable frente a la corriente de salida (el error conocido que se comete no
debe ser apreciable).
Esto provoca que si la carga demanda poca corriente, la tensión de salida tiende
a crecer. Observando el diagrama de bloques interno del CI (Figura 5.8) en cuestión
y sin perder de vista la Figura 5.7, se entiende por qué ocurre lo recién mencionado.

55
Capı́tulo 5. Electrónica

Figura 5.8: Diagrama de bloques interno del integrado LM317. Figura tomada de [63].

Al no estar presente la carga, la corriente se va en su totalidad por R1 , con lo cual


la diferencia de potencial entre la entradas de amplificador operacional aumenta, lo
que provoca un incremento en la corriente a través de la configuración Darlington,
con lo cual la corriente a la salida aumenta. Es ası́ que se hace todavı́a mayor la
caı́da de tensión en R1 , viéndose ası́ una realimentación positiva que provoca el
incremento en la tensión de salida, la cual se terminará cortando por el circuito de
protección presente en el integrado.
En la configuración utilizada también se agregan capacitores de bypass tanto
en la entrada como en la salida del regulador con el objetivo de reducir pequeños
ripples en las tensiones.
Como se mencionará en breve, éste regulador no fue el utilizado en la versión
final. En su lugar se utiliza el LM7805 que se describirá más adelante en la presente
sección.

Diodos
En el driver diseñado se observa la presencia de 8 diodos (Figura 5.13. Estos
diodos tienen como objeto proteger al circuito. Las bobinas de los motores luego de
energizadas, se descargarán. Se genera una tensión inducida la cual va a dar lugar
a una corriente que tomará algún camino hacia el circuito. Es aquı́ que actuán
estos diodos, dándole un camino seguro a la corriente de descarga de las bobinas.
Además es importante la utilización de diodos de recuperación rápida, es decir,
que el tiempo de reverse recovery 1 (ver Figura 5.9) sea lo más bajo posible (menor
a 200ns); un diodo común como puede ser el 1n4004 tiene un trr de 30µs. El
1
Cuando un diodo esta en directo y repentinamente se pasa a estado inverso, existe un

56
5.2. Controlador de los motores paso a paso

Figura 5.9: Gráfico donde se indica el “reverse recovery time” (trr ).

tiempo mencionado debe ser despreciable en comparación con el tiempo en que la


bobina esta energizada o descargada.
Es ası́ que se decidió por el uso de los diodos Schottky IN5819 (en lugar de ser
una tı́pica juntura entre semiconductores p-n, es metal-semiconductor).

5.2.3. Funcionamiento general del driver de motores PAP


L297 +L298
El driver diseñado que tiene por objeto controlar los distintos motores, está
configurado básicamente en dos etapas (ver Figura 5.10). Una etapa, la cual con-
tiene al CI L297. Este integrado es el encargado de generar las señales periódicas
(salidas A, B, C, D) que excitan a la segunda etapa (o directamente a las fases de
un motor), la cual se explicará en breve. En la Figura 5.11 se presenta un diagrama
de bloques del CI, principalmente contiene el generador de señales para cada fase,
un conmutador PWM doble y el circuito lógico de salida.
Se observa un bloque el cual está controlado por dos entradas: la de sentido de
giro (CW-/CCW)y la elección de modo (HALF-/FULL), además posee el reloj de
pasos (CLK).
Esta primer etapa también genera otras dos salidas (/INH1 y /INH2) si se lo
hace funcionar en modo de medio paso. Estas señales de salida de la primer etapa
son de habilitación, usadas para habilitar o no a la excitación que provocan las
señales A, B, C y D en la segunda etapa. Además ayudan a acelerar el decaimiento
de la corriente cuando se deja de alimentar una bobina del motor. Dichas señales
son generadas por compuertas OR: /IN H = A + B y /IN H2 = C + D. En modo
de paso completo estas señales no se generan.
Otras señales de entrada a destacar es la de RESET, señal usada para resta-
blecer las salidas a la posición de base (ABCD = 0101) y ENABLE, señal que si
está en estado bajo apaga todo el driver.

tiempo en el cual el diodo permite el pasaje de corriente en inverso. Éste es el trr .

57
Capı́tulo 5. Electrónica

Figura 5.10: Diagrama de bloques genérico del driver. Figura modificada de [64].

Figura 5.11: Diagrama de bloques interno del integrado L297. Figura tomada de [20].

El oscilador en el PIN16 se encarga de resetear los flip-flops presentes en la


Figura 5.11 al comienzo de cada perı́odo de oscilación, las dos salidas de estos
flip-flops se suman a las otras cuatro entradas del circuito lógico de salidas, juntas
determinan el control de las señales enviadas a la segunda etapa.
Con respecto a la segunda etapa, como ya se sabe, ésta basa su funcionamiento

58
5.2. Controlador de los motores paso a paso

en el integrado L298. Éste consiste en dos puentes H de potencia ya descritos en


la Sección 5.2.2. Éstos son excitados por las señales de salida (A, B, C, D) de
la primer etapa, tanto las que prenden los transistores como las de protección
(/INH1, /INH2) que evitan caminos directos de fuente a tierra. A las salidas de
éste se conectan las bobinas de los motores y los diodos usados para la rápida
desenergización de éstas. Las corrientes entregadas a las bobinas son sensadas por
dos resistencias de 0,5Ω conectadas entre los pines 1 y 15 del L298 y tierra, también
los bornes de mayor tensión se encuentran conectados los pines 13 y 14 del L297,
siendo éstos las entradas SENS1 y SENS2. Observando la Figura 5.6, se nota que
dichas resistencias están ubicadas en los emisores de los transistores inferiores del
puente, con lo cual la corriente del puente en cada instante circula por éstas (ver
cálculo en (5.2), (5.3) y diagrama de tensiones por fase en el transcurso de un
incremento 5.12).

< P >= RSEN SE . < I >2 (5.2)


Z 3T
1 8 3
< I >= 2 × Imax dt = Imax (5.3)
T 0 4

Figura 5.12: Diagrama de tiempos que muestra la forma de onda de la tensión aplicada a los
bornes (A y B) de una bobina (utilización de un puente H) en el tiempo. La parte sombreada
es el perı́odo de tiempo que se demora en dar un incremento en el motor (T = 8TM CLK ).

Tomando un peor caso de IM AX = 2A (corriente máxima por bobina), resulta


< PdisipadaRSEN SE =0,5Ω >= 1,125W . Con lo cual, se decide utilizar dos resistores
en paralelo de 1Ω/1W (< PdisipadaRSEN SE =1Ω >= 0,56W ). La corriente de fase
i
en las bobinas del motor depende principalmente de dos puntos: de la tensión de
referencia presente en el PIN15 (Vref ) del L297 y de las resistencias de sensado
previamente presentadas; siendo IL = V ref /RSi . Mayor corriente de fase significa
un aumento de torque, pagando el precio de un mayor consumo. Entonces, variando
Vref se puede regular el torque de los motores.
Es bueno disponer de capacitores de 100nF entre las fuentes de alimentación
del L298 y tierra ubicados lo más cerca posible a el pin de GND en el circuito
impreso, para satisfacer picos de corriente consumidos por el CI (cuando el camino
entre el integrado y la fuente de corriente es largo, se debe colocar un capacitor
más pequeño cerca del integrado para satisfacer la demanda instantánea).

59
Capı́tulo 5. Electrónica

Figura 5.13: Esquemático del driver versión 0.0. Figura tomada de [65].

Versión 0.0
Se realizó un primer prototipo del driver, basado en un proyecto presente en
[65], cuyo esquemático se presenta en la Figura 5.13.
Luego de realizado el circuito impreso correspondiente al esquemático de la
Figura 5.13 se comenzó con las pruebas de funcionamiento utilizando distintos
motores de paso a paso de dos bobinas y el microcontrolador Arduino UNO, el
cual genera el clock, determina el sentido de giro y maneja las entradas ENABLE
y RESET del L297.
En dichos testeos se observó que el torque aplicado a los motores era mı́nimo,
a una mı́nima carga mecánica el motor se frenaba o perdı́a pasos. Ésto dio paso
a realizar un análisis más profundo del diseño del driver tomado como base el
anterior, con objetivo de efectuar mejoras que solucionen este inconveniente o
rediseñarlo en su totalidad.
Localizando el trabajo en dar solución al presente problema, se investigó en la
relación de la tensión de referencia (aplicada en el pin 15 del integrado de control)
con el torque explicada en la Sección 5.2.3.

60
5.2. Controlador de los motores paso a paso

Figura 5.14: Realimentación para control de torque automático. Figura tomada de [62].

Versión 0.1
Se modificó la versión anterior, se agregó un divisor de tensión resistivo cuyo valor
de salida se conecta al PIN15 (Vref ) del L297. Esta tensión de salida se la puede
hacer variar entre 0V y 2V gracias a un potenciómetro presente en el divisor.
Puesto en funcionamiento, se observó claramente como con la presente modifi-
cación el torque era considerable y como se lo podı́a aumentar o disminuir variando
el potenciómetro.
En esta versión se trató de hacer variar la velocidad de giro. Para esto se fue
modificando el reloj creado a través de un script en Arduino. En resultado de ésto,
se pudo ir lo bastante lento como para ver paso a paso como giran los motores,
luego se fue incrementando la velocidad correctamente. Como problema, surge
que luego de determinado umbral de velocidad, a pesar de seguir aumentando la
frecuencia de reloj, la velocidad no aumentaba quedando permanentemente en ese
umbral.
Versión 1.0 Se procedió a fabricar un nuevo circuito impreso, el cual, debido a
todas las modificaciones que se agregaron incrementó en gran medida la dificultad
del diseño del PCB.
Las principales diferencias del presente driver en comparación con el de la
versión de serie 0 son: la posibilidad de elegir a través del microcontrolador qué
modo de operación (medio paso o paso completo), la utilización de un lazo de
realimentación entre los integrados principales del circuito, más especı́ficamente,
se realizó dicha realimentación compuesta por una compuerta AND, un transistor
y un divisor de tensión resistivo con el objeto de crear un control automático de
torque (ver Figura 5.14).
Dicha realimentación solo tiene sentido si el modo de operación es medio paso.
Con la ayuda de las señales de habilitación del L297 (/INH1, /INH2 -estado bajo:
bobina desenergizada-), la cuales son prendidas alternadamente en el modo de
medio paso, el voltaje de referencia (PIN15 del L297 ) es reducido por un factor de
1,41 al instante en que ambas bobinas están energizadas. La presente configuración

61
Capı́tulo 5. Electrónica

logra tener dos estados de torque dependiendo del estado de las bobinas, con lo
cual, hace que el comportamiento sea más homogéneo ante la conmutación de las
bobinas.
El objetivo principal es restituir el torque que se tendrı́a en modo de paso
completo pero sin perder las ventajas obtenidas por trabajar en modo de medio
paso (eliminación del fenómeno de resonancia y gran reducción √de ruido). Incre-
mentando la corriente que va a la bobina activa en un factor de 2, se llega ası́ a
tener alrededor de un 95 % del torque correspondiente al modo de paso completo.
La Figura 5.15 presenta la comparación del torque en función de la frecuencia
para los distintos modos de operación, donde se aprecia que con el agregado de
la variación de torque (HALF STEP WITH-SHAPPING) se restaura éste casi al
máximo obtenido en modo de paso completo. Además en la Figura 5.16 se muestra
la forma de onda de la corriente de una bobina en modo de medio paso tanto sin
(5.16(a)), como con (5.16(b)) control de torque, donde se aprecia el incremento en
la amplitud de la corriente para el segundo caso.

Figura 5.15: Gráficos comparativos de los modos de operación. Torque-frecuencia: paso com-
pleto vs medio paso vs medio paso (2 estados de torque). Figura tomada de [66].

(a) Corriente vs tiempo: de (b) Corriente vs tiempo: de una


una bobina en medio paso. bobina en medio paso (2 estados
de torque).

Figura 5.16: Gráficos comparativos de los modos de operación. Figura tomada de [66].

El comportamiento del lazo de realimentación mostrado en la Figura 5.14 es


el siguiente: mientras las señales de habilitación están en estado alto (bobinas
energizadas), la salida de la compuerta AND esta también en estado alto, debido
a ésto el transistor esta prendido, con lo cual levanta el cero y se forma un divisor
de tensión resistivo que reduce en un factor la tensión en el PIN 15.

62
5.2. Controlador de los motores paso a paso


En particular, dicho factor es 1, 41 ( 2). La salida del divisor es la tensión de
1000
referencia Vref aplicada al PIN 15 del controlador L297 (Vref = 1000+410 VREFin =
1
1,41 VREFin ).
Cuando al menos una de las señales de habilitación baja su estado (se apaga
una bobina), la salida de la compuerta AND conmuta, apagando ası́ el transistor,
entonces, no circula corriente por el divisor. Quedando la tensión en el PIN 15
igual al valor de la tensión en el punto REF (valor generado con el divisor resistivo
mencionado en la Subsección 5.2.3). Ésto incrementa la corriente por la bobina ac-
tiva proporcionalmente al voltaje de referencia (como ya se mencionó en la Sección
5.2.3), compensando el torque perdido en esta situación.
También se realizó la correcta ubicación de los capacitores mencionados en
la Sección 5.2.3. Además se agregaron capacitores electrolı́ticos en paralelo a los
cerámicos ya existentes a la entrada y salida del regulador, con el objeto de com-
plementar el filtro de ruido de la fuente.
En la Figura 5.17 se presenta tanto el esquemático como el layout de la nueva
versión del controlador de los motores descrita en la presente subsección. Cabe
destacar que a partir de la presente versión existen 2 jumpers que permiten tomar
la decisión de trabajar utilizando o no el control de torque.
Al realizar las pruebas de este circuito, las señales que se observaron a través
del osciloscopio sin un motor de prueba conectado eran de la forma esperable. Pero
se detectó una componente grande de ruido en los pines de entrada del L297 en
especial en la señal de reloj. También eran notoriamente ruidosas las señales de
fase (A, B, C y D) con lo cual las señales amplificadas a las salidas de los puentes
se veı́an afectadas. Con señales de reloj de baja frecuencia se comprobaba que
la generación era correcta a pesar del ruido (ver Figura 5.18, se aprecian señales
periódicas de T ≈ 16s), pero al ir aumentando la frecuencia el ruido era mucho
más considerable, deformando de tal manera las señales que era imposible esperar
que el motor fuera excitado correctamente.
Al observar el diseño para lograr establecer porque el presente circuito era
tan vulnerable a interferencias, se detectaron algunas prácticas no recomendadas
en un circuito impreso. Por ejemplo, las compuertas AND que no se utilizaban no
poseı́an conectadas a tierra ni las entradas ni las salidas. Luego, las trazas de tierra
recorrı́an todo el circuito, en lugar de tener varios caminos (uno correspondiente a
cada bloque) y que se conecten en “estrella” a un punto.
Versión 2.0 Se decidió realizar el “PCB” nuevamente, corrigiendo las malas
prácticas mencionadas. Una imagen del circuito fabricado puede verse en la Figura
5.19.
Con esta versión se iniciaron las pruebas de los distintos ejes de la estructura.
Al trabajar bajo carga hubo que prestarle atención al tema de la disipación tanto
en el regulador de voltaje como en el L298. Es ası́ que se colocaron disipadores
de un tamaño que no estaba previsto en el circuito impreso mencionado (ésto
claramente se aprecia en la Figura 5.19. Para esta etapa no se usó el control de
torque.

63
Capı́tulo 5. Electrónica

(a) Esquemático driver - versión 1.0

(b) Layout driver - versión 1.0

Figura 5.17: Esquemático y layout del driver versión 1.0.

Versión 3.0
Luego de haber trabajado en varias pruebas en distintas condiciones con el dri-
ver de la versión descrita en la Subsección 5.2.3, se concluyó que hasta el momento
cumplı́a con los requisitos para ser utilizado en el prototipo a construir. La tensión
de alimentación que se decidió utilizar es de 24V , siendo la tensión máxima que

64
5.2. Controlador de los motores paso a paso

(a) OUT 1. (b) OUT 2.

(c) OUT 3. (d) OUT 4.

Figura 5.18: Gráficos de las señales de salida del driver fabricado (f = 0,5Hz; DC = 50 %) -
versión 1.0.

Figura 5.19: Fotografı́a tomada durante los primeras pruebas realizadas al eje X utilizando la
versión 2.0 del driver.

soportan los motores adquiridos.


Se realizaron distintas pruebas, ahora sı́ utilizando el control de torque donde
realmente se vieron los resultados esperados, reducción notoria de vibraciones, de
ruido y además los arranques, frenados y cambios de dirección se observaron más
suaves.
Para esta versión final se cambió el regulador de voltaje, ya que en las compras
realizadas al exterior el que se consiguió a mejor precio fue el LM7805 [67], éste
tiene distinto el “patillaje” al regulador presentado en la sección 5.2.2. Además,

65
Capı́tulo 5. Electrónica

Figura 5.20: Configuración utilizada para generar la alimentación lógica del driver en la versión
final. Figura tomada de [67].

el nuevo regulador tiene la salida ya establecida en 5V , para cualquier voltaje de


entrada en un rango aceptado. La configuración utilizada se muestra en la Figura
5.20. De todas formas se colocaron también capacitores electrolı́ticos en paralelo a
los cerámicos para complementar la robustez frente al ruido de la fuente.
Es aquı́ que se terminó de planificar la ubicación de la electrónica en la máquina
para ası́ poder concretar la última versión del driver de motores. De acuerdo a la
mencionada planificación, se observó que perfectamente los cuatro driver de mo-
tores paso a paso podı́an ser iguales. Para ésto se pensó en colocar los disipadores
de forma tal que cuando estén los cuatros ubicados como se definió, la ubicación
total de la electrónica permita colocar (atornillar) sobre los disipadores uno o dos
ventiladores. Además, se estableció la idea de poner los dos integrados que necesi-
tan disipador compartiéndolo. Se pretendió dejar de fácil acceso y con conectores
robustos las salidas hacia los motores y con conectores que solo permitieran una
posición de conexión correcta para las entradas de señales y para la conexión de
fuente. También se dejaron varios jumpers que dan la posibilidad de trabajar con
o sin control de torque, que permiten elegir el modo de funcionamiento y otros
que dependiendo de las anteriores decisiones deben modificar algunos valores de
entrada al integrado de control (L297 ).
Luego del comienzo de las pruebas de integración, realizando directamente
movimientos en la máquina con el software de bajo nivel que excita al driver
para que éste controle los motores se observaron distintas opciones para lograr el
correcto funcionamiento. Se debe asegurar que por parte de la interacción entre
software y electrónica la cantidad de pasos de cada movimiento sea la esperada.
Casos crı́ticos son los cambios de movimiento, ya que luego de terminando el
movimiento las fases quedan en determinado estado, el cual no debe perderse. Ası́
cuando llega una nueva orden, el giro del motor comienza sincronizado desde ese
estado.
En esos momentos hay que tener cierto cuidado de como se configura el ac-
cionar. Si no se toma ninguna acción particular, se puede dañar el motor. Ésto
puede suceder debido a que cuando el movimiento termina algún borne de alguna
de las bobinas queda a 24V y el otro a tierra. Al ser la resistencia de la bobina
muy pequeña la corriente que circula por ésta es muy alta y si pasa determinado
tiempo puede determinar el corte de dicha bobina, dañándose el motor.

66
5.2. Controlador de los motores paso a paso

Figura 5.21: Circuito de chop. Figura tomada de [64].

El controlador diseñado presenta dos posibilidades para resolver dicho proble-


ma. En el integrado de control (L297 ) hay presente una entrada CONTROL. Si
en el pin 11 correspondiente a esta entrada se aplica 5V , hace que haya un control
de corriente que actúa directamente sobre las salidas de fase.
Este control tiene como fin hacer que no se pierda el estado de las bobinas
entre distintos movimientos, logrando que haya un torque de mantenimiento. Para
lograr esto evitando el problema mencionado, lo que hace es mantener alimentadas
las bobinas pero con un nivel más bajo de corriente.
El L297 tiene dos controladores de corriente de carga en forma de dos PWM
choppers, en el presente prototipo es una para cada bobina de un motor PAP
bipolar [64]. Cada chopper es compuesto por un comparador, un flip flop y una
resistencia de sensado externa (ya mencionadas anteriormente). Luego hay un os-
cilador que genera pulsos para ambos choppers. La frecuencia de este oscilador se
ajusta con una resistencia y un capacitor externos, cuyo valor queda determinado
1
por: 0,69×RC , recomendando no usar resistencias menores a 10kΩ. La determina-
ción de ésta frecuencia es un compromiso entre que quede fuera del rango audible
(mayor a 20kHz) y la disipación en los motores durante el reposo (a mayor fre-
cuencia de chop, mayor calentamiento). En la Figura 5.21 se presenta un esquema
del circuito de “chopeo”.
El funcionamiento básico es el siguiente: el flip flop es seteado por cada pul-
so proveniente del oscilador, habilitando la salida y permitiendo que la corriente
hacia la bobina aumente. Ésto provoca que la tensión en la resistencia de sensado
se incremente, y cuando dicha tensión sobrepasa a Vref el flip flop se resetea, des-
habilitando la salida antes del próximo pulso de reloj. Entonces, la salida de este
circuito (Q en el flip flop) es una señal PWM de velocidad constante.
Como ya se dijo, estando la entrada CONTROL en nivel alto, el razonamiento
presentado actúa sobre las salidas de fase (A, B, C, D), que como se debe recordar
son la entradas a los dos puentes tipo H presentes en el CI L298.
Ahora se presenta un ejemplo para describir el funcionamiento con un caso real.
Observando la Figura 5.22, se tiene la configuración del puente H correspondiente

67
Capı́tulo 5. Electrónica

Figura 5.22: Esquema de razonamiento para el control de corriente en un bobina. Figura


tomada de [64].

a una de las bobinas, cuyas señales generadas por el integrado de control son A
y B. Las referencias X, Y, Z presentes en la figura son tres corrientes que sirven
para comprender el funcionamiento.
Tomando como instante base cuando A esta en alto y B en bajo (10). La
corriente fluye por Q1 , bobina , Q4 y RS (corriente X). Cuando la tensión en RS
sobrepasa a Vref el circuito de chop levanta a B, ası́ la bobina (11).
La energı́a almacenada en ésta es disipada por la corriente de recirculación (Y)
por Q1 y D3 . La bajada de corriente en éste momento es lenta debido a que la
Q1
tensión en la bobina es muy baja (VCE sat
+ VD3 ). Esto puede irse apreciando en la
Figura 5.23. Con el presente control también lo que se logra es reducir notoriamente
la disipación en las resistencias de sensado, ya que solo circula corriente por éstas
cuando las bobinas son excitadas.
Haciendo pruebas solo con solución recién descrita, se notó su funcionamiento,
pero alternadamente no se “ejecutaba” el control, resultando en una alta corriente
circulando por algunas de las cargas en el reposo. Un indicio de éste problema
aleatorio es que sea un falla debida al ruido de conmutación. Como se lee en [64],
cuando se tiene varios drivers, serı́a una buena práctica usar un solo oscilador
de “choppeo” y sincronizar los distintos controladores a través del uso del pin de
SYNC presente en los integrados de control L297.
El otro camino, que soluciona el problema que surge cuando se termina un
movimiento y resuelve el inconveniente de la primera opción de solución reciente-
mente presentada, es habilitar los drivers de los motores cuando se debe realizar un

68
5.2. Controlador de los motores paso a paso

Figura 5.23: Señales destacables obtenidas con el control de corriente de carga. A y B señales
de fase para una bobina, señal de inhabilitación, corriente por resistencia de sensado y corriente
de carga (diente de sierra, debido a que con la bobina se logra un integrador). Figura tomada
de [64].

movimiento y deshabilitarlos al terminar. La ventaja de esto es que solo circulará


corriente a las bobinas de los motores en los instantes de movimiento, teniendo
un control total de la corriente de carga, evitando un pasaje de corriente por las
bobinas en reposo. Al llevar a nivel bajo la entrada ENABLE del controlador, las
salidas de fase bajan su estado. Como la combinación 0000 aplicada a los bornes
de las bobinas no es ningún estado del motor, no se está cambiando el estado de
éste, es decir, no se está perdiendo la coherencia entre la cantidad de pasos que
lleva el software y la posición real.
Para elegir esta segunda solución hay que tener ciertos cuidados. Cuando se
deshabilita el controlador de motores PAP, éste baja instantáneamente las salidas,
con lo cual, luego que se manda realizar el último paso, se debe esperar un tiempo
antes de deshabilitar a éste para que realmente se dé el último incremento (paso).
Para ésto, se debe tener el cuidado en el software que haga que el incremento se
dé antes de bajar la señal de ENABLE.
Para tener la seguridad de que este procedimiento hace en la realidad lo que se
espera, se realizaron alrededor de 1000 iteraciones de movimiento que se describen
en el Capı́tulo 7. Donde no se observó que la cuenta de pasos que lleva el software
difiera de la posición real esperada. De aquı́ se concluyó que realizando el manejo de
la corriente de carga manipulando la entrada de ENABLE satisface las necesidades
para desplazar correctamente cada eje.
Cuando se inicializa el sistema, es decir al prender la alimentación, se quiere
que no fluya corriente hacia los motores. Para esto se realizó la colocación de una
resistencia de pull down en cada una de las entradas de ENABLE de los controla-
dores de los motores. Luego de terminar la inicialización pasa el microcontrolador
a tener el control de dicha entrada.
En la Figura 5.24 se presenta el esquemático, el PCB en la Figura 5.25, el

69
Capı́tulo 5. Electrónica

Figura 5.24: Esquemático driver versión final.

Figura 5.25: PCB driver versión final (escala 1:1).

layout en la Figura 5.26 y una fotografı́a del primero en la Figura 5.27 de los
cuatro drivers fabricados por los integrantes del grupo del presente proyecto.

70
5.3. Interfaz con el usuario

Figura 5.26: Layout driver versión final.

Figura 5.27: Fotografı́a de unos de los driver fabricados.

5.3. Interfaz con el usuario


Se entendió pertinente tanto por los integrantes del equipo como para los tu-
tores que el prototipo contara con una interfaz gráfica que cumpliera con los si-
guientes objetivos:

Mostrar en tiempo real información relevante del funcionamiento del prototipo.

Mostrar alarmas o mensajes que informen de un incorrecto funcionamiento.

Mostrar las opciones con las que cuenta el usuario para ingresarle comandos
al prototipo, por ejemplo cuando se navega por un menú.

71
Capı́tulo 5. Electrónica

5.3.1. Elección de los elementos que componen la interfaz


La interfaz diseñada consta de 2 bloques, uno de salida y otro de entrada. Para
el primero se optó por un display LCD, y para el segundo un Joystick.

(a) Display.

(b) Joystick.

Figura 5.28: Elementos que componen la interfaz con el usuario.

Display

Para el manejo del display no se utilizó un driver, sino que se hizo uso de
la biblioteca LiquidCristal del Arduino [68], la cual brinda varias funciones para
manejar el display, como por ejemplo posicionamiento del puntero en la pantalla,
la impresión de códigos ASCII, y la creación de nuevos comandos. Las dimensiones
del display, que se eligió es de 20 × 4, lo que significa que tiene 4 filas, y en cada
fila entran 20 caracteres, y se puede ver en 5.28(a). Además vale destacar que el
display elegido permite regular el contraste variando la tensión en unos de sus
pines, esta tensión debe variar entre 0V y 5V por eso se conecto un potenciómetro
para variar el contraste a conveniencia. Como también se utilizo un switch para
encender y apagar la iluminación de fondo.

72
5.4. Heated Bed Platform

Joystick
Con el objetivo de contar con un movimiento manual del posicionador, se
entendió que serı́a una buena idea utilizar un joystick, el cual funcionara como
dos potenciómetros, con lo cual se lograrı́a variar la velocidad del movimiento
dependiendo del ángulo determinado por el joystick.
Debido a las limitaciones del mercado local se tuvo que trabajar con un joystick
que funciona como botones. Esto implicó dos variantes en lo que se proyectaba, pri-
mero que la velocidad del movimiento resultará constante y predefinida, y segundo
como todo botón se necesita diseñar un sistema de anti rebotes.
El sistema anti rebote puede implementarse por software, como se realizó, o
por hardware. La tecnologı́a del joystick son 5 botones, de los cuales cuatro son
las direcciones y el quinto un botón que se nombró ENTER. Se entendió que para
que la navegación sea sencilla y amigable con el usuario era útil tener un botón
que se denominó EXIT. Todos estos botones se alimentaron con 5V y se les realizo
un pulldown con una resistencia de un alto valor conectada a tierra.

5.4. Heated Bed Platform


El prototipo de impresora 3D que se desarrollo en el proyecto, funciona por
deposición, lo que significa que se deposita un filamento plástico caliente que al
enfriarse se endurece y forma las piezas impresas. Para que estas piezas se formen
correctamente, no se deformen y no se despegue de la mesa de trabajo puede
resultar necesario que la base donde se imprimen se caliente a una determinada
temperatura.

5.4.1. Condiciones de uso


Los materiales que utiliza una impresora 3D por deposición, llamados ter-
moplásticos, son generalmente 2, estos son ABS o PLA, aunque también se pueden
encontrar impresoras que utilicen otros termoplásticos como el HDPE. El prototipo
elaborado se diseño de modo que pueda usar los dos primeros, pero estos no tra-
bajan en las mismas condiciones. Cada uno de ellos impone distintas condiciones
en la temperatura del extrusor, ası́ como en la velocidades máximas y mı́nimas de
extrusión, pero además imponen una temperatura en la base donde se imprimirán
las piezas.
Para trabajar con el PLA se recomienda mantener heated bed a 60◦ C pero
para utilizar el ABS esta temperatura asciende a 110◦ C. También se encontraron
opiniones que dicen que el uso de la heated bed para el PLA no es necesario.

5.4.2. Como se implementa


La heated bed consta principalmente de cuatro partes:

Printed Circuit Board (PCB)

73
Capı́tulo 5. Electrónica

Vidrio

Fuente de corriente - MOSFET

Realimentación - Medición de la temperatura (LM35)

Printed Circuit Board y Vidrio

Figura 5.29: Primer prototipo realizado de heated bed.

El PCB será el elemento que se calentará, esté es un circuito impreso en una


placa de cobre con forma de laberinto, como se ve en la Figura 5.29. Por este
circuito circulará una alta corriente que provocará un aumento de temperatura
para disipar la potencia eléctrica suministrada. La potencia estará determinada
por la tensión con la que se alimente la heated bed y la resistencia eléctrica de la
misma.
La resistencia de la cama caliente dependerá de las dimensiones de la superficie
de impresión, del ancho de las pistas y de la distancia entre estas, siendo estas dos
últimas las variables que se calcularán. Para este cálculo se programó un script
en Matlab, que necesita como entradas el largo y el ancho útil de la mesa, y la
resistencia buscada. A partir de estos valores, constantes y alguna estimación se
realiza la cuenta como:

ρ×L×n
R= (5.4)
S
Siendo n la cantidad de trazas que entran en el ancho, esto responde a una
estimación. S es el ancho de la traza por el espesor del cobre. El largo y el ancho
se pueden ver en la Figura 5.30.
El vidrio cumple tanto con la función de aislar eléctricamente el PCB de cual-
quier material que se apoye sobre la mesa de impresión, como con la función de
realizar una transferencia de calor más estable y mejor distribuida. Además, el
vidrio brinda una superficie lisa donde la pieza impresa se verá libre de posibles
imperfecciones que podrı́an surgir por una superficie con irregularidades. El vidrio
se afirma al PCB con pinzas.

74
5.4. Heated Bed Platform

Figura 5.30: Diseño de la heated bed platform.

Figura 5.31: Circuito de control de la heated bed.

75
Capı́tulo 5. Electrónica

5.4.3. Análisis de funcionamiento


En la Figura 5.31 se puede apreciar el hardware necesario para el uso de la
heated bed, el MOSFET funciona como llave, cuando la salida digital del arduino
arroja un “OFF” el VG = 0V , VG < VT H y el MOSFET se encuentra en zona de
corte. Y en “ON” el VG = 5V , VG > VT H , lo que significa que el MOSFET ya no
se encuentra en zona de corte. El MOSFET que se eligió utilizar es el STP60NF06
[69]. El sistema de control consta con una realimentación para asegurarnos de ser
capaces de controlar la temperatura de la ‘heated Bed, para esto se usa el circuito
integrado LM35 [70], el cual presenta las siguientes ventajas:

Bajo consumo (< 60µA)

Calibrado directamente en grados Celsius

Escala lineal con factor de 10mV /◦ C

Rango dinámico desde −55◦ C a 150◦ C.

Bajo autocalentamiento

Baja impedancia de salida

5.4.4. Primer prototipo


El primer prototipo se diseñó para que tuviera una impedancia de 1,2 Ω, con el
objetivo que disipará unos 120 Watts, ya que era lo máximo que se podı́a obtener
de la fuente con la que se contaba, la potencia responde a la siguiente fórmula:

U2 122
P = = = 120W (5.5)
R 1,2

Como ya se dijo primero se probó con un sistema de control de ON/OFF, en este


caso con un setpoint de 60◦ C se pueden apreciar los resultados en el Capı́tulo 7.
Como ya se dijo se diseño la heated bed para disipar una potencia de 120 Watts,
por razones desconocidas que pueden deberse a una diferencia con el espesor del
cobre el prototipo elaborado tenı́a un impedancia de 3 Ω lo cual redujo la potencia,
además la fuente con la que se trabajo entregaba 9V en lugar de 12V . Por lo que
la potencia disipada por el primer prototipo de heated bed fue de unos 27W . Para
esta potencia no se pudo superar una temperatura mayor a los 85◦ C cuando se le
puso un setpoint de 110◦ C como se mostrará en el Capı́tulo 7.

5.4.5. Diseño heated bed


Se diseñó la heated bed para que abarcará una superficie de 36cm × 33cm, lo
que significa que cubrirá la totalidad de la mesa del eje X a no ser por un pequeño
margen, utilizado para colocar los tornillos. Utilizando el script del Matlab se

76
5.5. Comentarios generales

Figura 5.32: Diseño de la heated bed platform.

proyecto un ancho de pistas de 6mm con una separación entre ellas de 1mm. Con
estas medidas se deduce una resistencia de 1,3Ω, que con una alimentación de 12V
disipará una potencia de 110W , potencia suficiente para llegar a los 60◦ C y que
llega casi al máximo de la potencia de la fuente de computadora que se pensaba
utilizar, la cual puede entregar 10A en 12V . El PCB al ser demasiado grande se
dividió en cuatro para su construcción, el diseño de cada uno se puede apreciar en
la figura 5.30 y el armado de los cuatro en la Figura 5.32.

5.5. Comentarios generales


En este capı́tulo se mostró tanto el diseño de la electrónica propia como la
inteligencia utilizada, detallando los distintos criterios y elecciones.
En el siguiente capı́tulo se detalla el software a implementarse por la inteligen-

77
Capı́tulo 5. Electrónica

cia de la máquina, y que interactúa con el resto de la electrónica.

78
Capı́tulo 6

Software

6.1. Arquitectura general y descripción


En las siguientes secciones se realizará una descripción del software desarrollado
que no busca ser exhaustiva mas sı́ clara y precisa ayudando a la compresión del
lector. Con este fin es que se presenta en la Figura 6.1 un diagrama de bloques de los
módulos de software programados, en qué plataforma corren y cómo se relacionan
entre sı́ y con la electrónica y la mecánica del presente proyecto. Antes de empezar
se aclara al lector que los módulos implementados en Arduino se desarrollaron en
lenguaje C, conformándose ası́ cada uno por un archivo nombre.cpp(la extesnsión
de C++ es necesaria para levantar los .c en Arduino) y nombre.h. Por otro lado,
es software de en la placa Raspberry Pi se desarrollo en Python
Las principales tareas que debe cumplir la plataforma XYZ son la de impresión
3D y fresado. Para alcanzar dicho objetivo, se implementaron dos módulos, denomi-
nados “main de impresión” y “main de fresado”. Los algoritmos que implementan
los anteriores módulos resultan similares, gracias a la similitud del funcionamiento
entre routers CNC e impresoras 3D.
Para poder llevar a cabo una impresión o fresado, se debe emplear la inter-
faz usuario-máquina, para elegir la opción correcta. Ésta última está constituida
por un display para visualizar mensajes, un joystick y dos botones para realizar
selecciones. El bloque de software que monitorea entradas y da salidas a estos
componentes de la electrónica se implemento como display.cpp y display.h.
El proceso de impresión o fresado sigue el siguiente camino. Partiendo de la
placa Raspberry Pi, con el archivo en el formato obtenido a la salida del software
generador de G-code, se inicia la transmisión del mismo hacia el Arduino. Este
proceso se desencadena mediante un pedido del Arduino y los G-code se van al-
macenando en un buffer hasta que éste se llene. Como siguiente paso, comienza el
procesamiento de los comandos G-code almacenados. El flujo que sigue la infor-
mación es el indicado en la Figura 6.1 por las flechas indicadas con un 1 o 3 en la
según el caso.
Por lo tanto, por cada comando G-code obtenido del buffer, el mismo se inter-
preta en el módulo formado por interprete.cpp y interprete.h obteniéndose un
Capı́tulo 6. Software

Figura 6.1: Diagrama de bloques del software e interacción con electrónica y mecánica.

resultado en el sub-main de impresión o fresado. El resultado anterior, es la en-


trada necesaria al módulo cuya interfase es ejecutador.h para finalizar la acción
que provoca el comando G-code. Éste último interactúa con el software de bajo
nivel (control de motores y de control de temperatura), que a su vez controlan el
hardware de la máquina.
El mencionado proceso se repetirá hasta que se termine de procesar todas las
lı́neas del archivo .gcode, que se transmite desde la Raspberry Pi al Arduino por
comunicación serial UART. El archivo a transmitir desde Raspberry Pi se debe

80
6.2. Raspberry Pi: Configuración red inalámbrica y comunicación con Arduino

depositar en un directorio de la misma a través de una red wireless que establece


esta placa.
El software implementado permite además otro par de funcionalidades: una es
el movimiento manual y la otra, realizar parte de la calibración. Para la primera
se aprovecha la posibilidad de interpretar y ejecutar comandos G-code. El flujo
señalado en el diagrama por las flechas de numeración 4 se corresponde con ésta
función. Por otro lado, es necesario poder realizar una calibración de la máquina
en general. La calibración consiste en determinar algunos parámetros para mejorar
el desempeño. El camino de la información se indica con un 2 sobre las flechas en
la Figura 6.1.

6.2. Raspberry Pi: Configuración red inalámbrica y co-


municación con Arduino
6.2.1. Comunicación inalámbrica
Antecedentes

Como ya se ha mencionado en el Capı́tulo 2, la gran mayorı́a de la impresoras


3D implementadas con Arduino hacen el manejo de archivos gracias al uso de
tarjetas SD. Ésto se debe a que la plataforma Arduino no contempla el manejo de
archivos a no ser por la anterior vı́a. Para trabajar con tarjetas SD, se utiliza la
librerı́a SD [71].
En el presente proyecto, surgió la idea de no tener que depender especı́ficamente
de un medio fı́sico de almacenamiento como lo es una tarjeta SD. Además, se quiso
brindar una solución actual, en particular surgió la idea de poder enviar el archivo
de trabajo mediante una red inalámbrica. Para llevar a cabo esta tarea, luego de
observar distintas posibilidades, se decidió usar el pequeño computador Raspberry
Pi (por más información sobre éste, Sección 5.1).
En la Figura 6.2 puede observarse el flujo de información del cual forma parte
esencial la comunicación, cuya configuración se presenta en la corriente sección.
El usuario puede diseñar el proyecto en distintos programas como lo pueden ser
Sketchup [72], Blender [73] y Autocad [74], luego se debe extraer el archivo con la
extensión .stl. Si el programa de diseño no da la posibilidad de extraer dicho tipo
de archivos, se agrega una etapa en la cual mediante el uso de otro software se
debe convertir el archivo a la extensión .stl. Después, como se observa en la Figura
6.2 el archivo con esta extensión se carga en un programa que generará el código
de máquina equivalente al diseño CAD del proyecto. Ejemplos de estos programas
son: CURA [27], Slic3r [28] y Replicator g [75]. Finalmente el archivo de salida de
estos programas será de extensión .gcode y es el archivo final que se envı́a desde el
dispositivo personal de trabajo al computador Raspberry Pi mediante la conexión
inalámbrica establecida.

81
Capı́tulo 6. Software

Figura 6.2: Diagrama de flujo de información que presenta el marco de la red inalámbrica a
configurar.

Objetivo
Configurar a dicho computador como punto de acceso inalámbrico (WAP por
sus siglas en inglés: Wireless Access Point) de la máquina a construir. Es decir, se
deberá crear una red, la cual debe estar publicada de forma inalámbrica y a través
de este punto de acceso se debe dar conexión a los dispositivos que deseen mandar
un trabajo a imprimir o fresar.

Solución
Para poder llevar a cabo el objetivo presentado, se tomó como base el artı́culo
“Setting up a Raspberry Pi as a WIFI access point” [76].
A continuación se presentará una serie de pasos a seguir, por más detalles ver
[76]. En estos pasos se destacarán datos que sean especı́ficos de nuestra máquina.
En primer lugar, se procedió a instalar un adaptador de red inalámbrica TP-
LINK TL-WN725N [77] debido al que el computador no lo tiene incluido. Éste se
eligió por estar en la lista de los recomendados para usar con la Raspberry ( [78])
y además por ser de los más económicos y robustos presentes en el mercado local.
Luego de configurado dicho adaptador, se verifica el correcto funcionamiento
conectando a alguna red inalámbrica el computador Raspberry Pi. Antes de seguir
adelante hay que asegurar conexión cableada a alguna red con salida a internet.
Esto se debe a que cuando se configure el computador como punto de acceso de
la red interna, no se podrá conectar el computador inalámbricamente a ninguna
otra red, con lo cual para no dejar al computador aislado se lo deja conectado vı́a
cable ethernet.
Después de haber probado ambos tipos de conexión, se está seguro que el
adaptador funciona correctamente y que se tiene salida a internet. Se procede a

82
6.2. Raspberry Pi: Configuración red inalámbrica y comunicación con Arduino

Dato Valor
Subred 192.168.19.0 máscara 255.255.255.0
Rango 192.168.19.10 a 192.168.19.60
Dirección de broadcast 192.168.19.255
router 192.168.19.3

Tabla 6.1: Datos configurados para el servidor de DHCP.

Dato Valor
Interface wlan0
Driver rtl8818eu
SSID DIRECT-modular3D printer
Hardware mode g
Seguridad WPA2
Seguridad password modular3D
Canal 6

Tabla 6.2: Datos configurados para el punto de acceso.

instalar el software en el computador para poder funcionar como punto de acceso


anfitrión (el software se descarga automáticamente) Después se debe configurar
como servidor DHCP para que los dispositivos cliente puedan obtener una dirección
IP (y DNS en caso de ser necesario). Para la presente máquina se setearon los datos
presentados en la Tabla 6.1.

A continuación se setean los datos del punto de acceso, los datos más repre-
sentativos se presentan en la Tabla 6.2.

El usuario que decide enviar un proyecto a imprimir o fresar para poder hacer
dicho envı́o primero debe detectar con su dispositivo la red inalámbrica identificada
con el SSID DIRECT-modular3D printer y luego debe introducir la contraseña
modular3D.

Finalizando con la configuración, se debe setear el programa instalado al inicio


(hostapd ) como demonio (daemon), esto es para que se ejecute apenas levante
el sistema operativo y que se mantenga en dicho estado hasta un corte en la
alimentación del punto de acceso.

Terminada la configuración se debe tomar un dispositivo con el wifi activado


y observar si se detecta la red del host access point (ver Figura 6.3).

83
Capı́tulo 6. Software

Figura 6.3: Vista de un dispositivo que encuentra la red de la máquina (SSID recuadrado).

Trabajo futuro
Actualmente, luego de establecer la conexión inalámbrica, para el envı́o de ar-
chivos a la plataforma se necesita utilizar algún software adicional de transferencia
de archivos en redes, para cumplir el objetivo de que el archivo de trabajo que-
de almacenado en el computador en el directorio correcto. En particular, para el
sistema operativo Windows se ha utilizado el programa winSCP. Éste es un soft-
ware libre, cuya función principal es facilitar la transferencia segura de archivos
entre dos sistemas informáticos, el local (dispositivo del usuario) y uno remoto que
ofrezca servicios SSH (computador configurado como punto de acceso) [79].
El programa recién mencionado da una solución correcta y sencilla pero poco
amigable con el usuario. Por esto es que serı́a recomendable realizar alguna aplica-
ción que facilite el envı́o y el guardado del archivo en una ubicación de destino del
computador. Una propuesta es que al establecerse la conexión, en el dispositivo
del usuario se despliegue una ventana donde se pueda escribir la ruta de origen
del archivo y que se guarde correctamente en determinado directorio en la RPi
(destino) configurado por defecto.

6.3. Comunicación Computador-Microcontrolador


6.3.1. Descripción general
La comunicación entre el computador RaspberryPi y el microcontrolador Ar-
duino es una comunicación Serial. Fı́sicamente se conecta un cable a uno de los
puertos USB del computador y al conector USB principal del microcontrolador.

84
6.3. Comunicación Computador-Microcontrolador

Establecer esta comunicación tiene por objetivo poder ir leyendo el primer


archivo de la cola de trabajo (impresión o fresado) y que a medida que el mi-
crocontrolador pida G-codes, el computador le responderá enviando lı́nea a lı́nea
el contenido del archivo. Un esquema representativo de la presente comunicación
puede observarse en la figura 6.4.

Figura 6.4: Diagrama que representa la comunicación entre el computador y el microcontrola-


dor.

La cola de trabajo debe ser FIFO (First Input First Output -el primero que
entró, será el primero en ser atendido-) con lo cual el computador deberá poder
levantar el archivo que hace más tiempo esta en el directorio de trabajo.
Se buscó que la solución que implementa la presente comunicación sea robusta
frente a problemas de comunicación Serial. Aspectos de este tipo se presentarán
en las subsecciones 6.3.2, 6.3.3 y principalmente 6.3.4.

6.3.2. Raspberry Pi
En la Raspberry Pi, se realizó un script de Python con el nombre de main.py
en el cual mediante el uso de excepciones se logra conocer el puerto donde se
encuentra conectado el microcontrolador Arduino. Dicho dato es esencial para
poder entablar una comunicación Serial entre ambos dispositivos.
Se parte de conocer que la versión de Linux instalada en el computador (De-
bian) entiende al Arduino como un dispositivo tty (teletype), en particular si se
lo conecta a través de un HUB USB, lo ve como ttyACM y si se conecta directo
a uno de los puertos USB del computador, lo ve como ttyUSB. Dependiendo del
conexionado hay que cambiar en el script qué tipo de dispositivo es con el que se
quiere establecer conexión.

85
Capı́tulo 6. Software

Luego de definido lo anterior, se debe recorrer el listado de los dispositivos de


este tipo e ir probando establecer comunicación, aquı́ es donde aparece el manejo
de excepciones ya que si el computador trata de establecer comunicación y no
puede, da error de ejecución y se sale del programa. Con las excepciones se capta
cada uno de los errores y se trata de establecer comunicación con otro dispositivo,
hasta encontrar al microcontrolador Arduino. La confirmación de que se estableció
la comunicación con el dispositivo correcto se da cuando el computador recibe un
string particular pre establecido.
La ejecución presentada hasta el momento en el computador se corre apenas
se levanta el sistema operativo y se queda ejecutando (como daemon) hasta recibir
el aviso del Arduino de que se va a comenzar a imprimir. Recién ahı́ se da paso
al llamado de otro script denominado imprimir.py , cuyo comportamiento se
describe a continuación. En la implementación de otra aplicación de la plataforma,
como podrı́a ser el fresado, se llamarı́a a otro script coherente.
Primero se manda un reconocimiento (ACK) al microcontrolador. Luego, se
busca en el directorio de trabajo cuál es el archivo que hace más tiempo está en
el directorio. Esto se hace a través de la función time.ctime(file) la cual otorga
datos del archivo con respecto al sistema de archivos del presente computador (es
decir no son datos genéricos del archivo), en particular brinda el tiempo UNIX de
cuando se guardó en el directorio de trabajo.
Luego de establecida la comunicación y determinado el archivo de trabajo, se
pasa a escuchar al microcontrolador para saber cúando enviarle un G-code.
El programa entra en un for, en el cual el computador levanta la primera
lı́nea del archivo, si no es un comentario (no comienza con “;”) espera a que el
microcontrolador pida un G-code, cuando le llega esta solicitud escribe en el puerto
Serie la lı́nea que es enviada al Arduino. Luego sigue realizando las repeticiones
establecidas por el for reiterando lo anterior para las siguientes lı́neas del archivo.

6.3.3. Arduino
En el otro extremo se tiene al microcontrolador, en particular, están presente
los módulos MainImprimiendo.cpp (interfaz MainImprimiendo.h) y buf-
fer.cpp (interfaz buffer.h).
Luego de la inicialización del sistema y de la preparación de la máquina para
el proyecto (calibración, nivelado correcto de mesa, origen alto nivel), se llama a
la función void MainImprimiendo(void).
En esta función se entra en un loop del cual se saldrá al terminar el programa.
En un principio se manda el string ya mencionado, que le confirma al computador
que el mismo encontró al dispositivo (microcontrolador) correcto. A continuación
el microcontrolador se queda esperando un ACK de la RPi.
Finalmente, al ya tener totalmente confirmada e inicializada la comunicación
empieza el intercambio de información para ahora sı́ tratar al archivo de trabajo.
En caso de que el buffer de entrada no esté lleno, se envı́a por el puerto Serial
el carácter de solicitud de G-code hacia la RPi. Luego se llama a la función char
*LeoGcode() la cual devuelve un puntero a carácter.

86
6.4. Software para microcontrolador Arduino

Esta función es la encargada de recibir la lı́nea enviada por la Raspeberry Pi


de forma correcta y sólo capta comandos tipo G-code (lı́neas comienzan con G o
con M).
Después de registrado el string, al salir de la función anterior, el mismo se
guarda en el buffer implementado en el módulo homónimo. Luego se vuelve a
repetir la secuencia hasta que se llena dicho buffer, en el momento en que éste
se llenó, se comienzan a ejecutar los G-code almacenados en el mismo. Luego se
repiten todos los pasos hasta llenarlo nuevamente. El final se da cuando llega desde
la RPi el G-code que indica final del código, siendo éste M 84.

6.3.4. Robustez de la comunicación


Para evitar que cualquier problema en la comunicación derive en una pérdida
del proyecto, surgió la idea de que ante un corte en la comunicación, el computador
pueda re establecerla en un minuto. Esto se lleva a cabo mediante el manejo de
excepciones, más especı́ficamente la excepción SerialException. Si se da un error
con esta excepción el criterio que se toma es quedarse con la última lı́nea leı́da
desde el archivo y esperar a que el microcontrolador pida un Gcode. Retomando
ası́ el funcionamiento normal ya descrito.
También se puede dar que se haya perdido el dato de solicitud de G-code o el G-
code propiamente dicho. Para ambos casos en la función char *LeoGcode() presente
en los módulos del microcontrolador, se implementó un contador que aumenta su
valor reiteradas veces dentro de la función y un delay de un microsegundo. Ésto
se razonó para que si el Arduino en 20 segundo no recibe el G-code que solicitó,
asume que no va a llegar y lo pide nuevamente. En este caso lo que puede pasar
es que la RPi sı́ lo halla enviado con lo cual al pedirse otro G-code hay uno que
no será ejecutado (se levanta una lı́nea nueva desde el archivo).
Otro detalle que hubo que acomodar fue el deshabilitar mediante el cortado
de una traza el reset automático al microcontrolador, debido a que si la comuni-
cación se ve interrumpida, al reiniciarla, el Arduino se resetea automáticamente al
establecer una nueva comunicación Serial.
Finalmente se llega a una solución para la comunicación entre el computador
y el microcontrolador robusta para las necesidades de la máquina fabricada.

6.4. Software para microcontrolador Arduino


6.4.1. Control de bajo nivel de los motores PAP
El objetivo del módulo de control de bajo nivel, es realizar el control de po-
sicionamiento y extrusión del proyecto descrito. Se apuntó a que el mismo sea
relativamente portable, para ser implementado en distintas clases de microcon-
troladores. Por otro lado, se consideró importante implementar un cierto nivel de
seguridad que permita evitar cualquier tipo de daño a la máquina ante un desper-
fecto. El sistema de control de bajo nivel utilizado en el proyecto Modular3D es
básicamente el del proyecto CtrlMotors3D de la asignatura Sistemas Embebidos

87
Capı́tulo 6. Software

edición 2014 [57] al que fue necesario realizar una serie de modificaciones para el
proyecto de grado.

Especificación
El módulo de control de bajo nivel trabaja en un universo de pasos para la
posición y cantidad de pulsos de un Master Clock (MCLK) que define velocidad.
Por lo tanto, las entradas al módulo que se definieron son la posición absoluta
en pasos referida a un cero mecánico y la velocidad en cantidad de pulsos de
MCLK para cada eje y extrusor. Para fijar ideas, esas entradas surgen desde las
capas superiores de software, pero además existen entradas provenientes desde el
hardware. Estas entradas hacen referencia a cambios de estado en los finales de
carrera y/o botón de emergencia. En cuanto a las salidas del módulo, éstas deben
ser las entradas a los controladores de los motores paso a paso:

Enable: señal encargada de habilitar o no el funcionamiento de cada uno de


los driver ; cuando está en nivel bajo no se generan salidas hacia los motores.
Sentido: señal que da el sentido de giro del motor.
/Reset: señal activa por nivel bajo. Lleva las salidas al motor a un estado
inicial (home).
Clock: por cada pulso bajo de esta señal el motor se mueve un paso o medio
paso (ver Capı́tulo 5). La señal tiene un ciclo de trabajo elevado, debido a
que la parte baja del perı́odo de reloj es cercana a los 5µs.

Para la generación de las salidas se deben tener en cuenta algunas limitaciones


fı́sicas de la electrónica. En la Figura 6.5 se puede apreciar un diagrama de tiempo
de la señales de entrada al integrado L297 presente en los drivers. La Tabla 6.3
resume los valores que deben ser respetados para la generación de las señales.

Figura 6.5: Diagrama de tiempos de las entradas al integrado de control presente en el driver.
Figura tomada de [20].

Se especifica también que el bajo nivel sea el módulo responsable de dar res-
puesta al alto nivel sobre la posición actual, posición objetivo y velocidad. Lo

88
6.4. Software para microcontrolador Arduino

Referencia Denominación del tiempo Tiempo mı́nimo (µs)


tCLK reloj 0.5
tS “set up” 1
tH “hold” 4
tR reseteo 1
tRCLK retardo reloj-reseteo 1

Tabla 6.3: Limitaciones de tiempos impuestas por el integrado de control (L297 ) de los drivers.

anterior se desprende naturalmente al ser el módulo que maneja el registro confia-


ble de dichas magnitudes. Se implementará explı́citamente funciones de consulta,
que serán utilizadas por los módulos superiores para tomar distintas acciones. Se
encargará de atender el sistema de seguridad formado por los seis fines de carrera
correspondientes a los extremos de cada uno de los tres ejes del posicionador y por
un pulsador de emergencia.
Por ser el sistema de bajo nivel un sistema crı́tico y esencial para el desarrollo
de la máquina, siempre debe dar respuesta hacia el alto nivel reportando cual es
el estado luego de cada movimiento. Por ejemplo deberá retornar un “ok” si el
movimiento se ejecutó correctamente, o retornar un aviso de que algún final de
carrera se accionó pudiendo también brindar la identificación de éste. En tanto
que si el botón de emergencia es pulsado deberá tomar algunas acciones y reportar
la situación al alto nivel para que complete la atención con otras acciones. La
forma de brindarle la robustez descrita al módulo será implementando un retorno
de errores a las capas de software más altas.

Diseño e Implementación
En la Figura 6.6 se aprecia el diagrama de bloques del control de bajo nivel de
los motores y cómo se relaciona con las capas superiores de software y el hardware
(drivers, finales de carrera).
La comunicación de la información entre en alto nivel y el bajo nivel en esen-
cia se hace mediante la escritura y lectura de registros para la posición actual,
la posición objetivo y la velocidad. Dichos registros se implementan en el módulo
ControlXYZ E.cpp con sus respectivas funciones para manejarlos y consultarlos.
El movimiento se realiza cuando se hace un llamado a la función error *stepper()
del módulo stepper.cpp. El detalle de su funcionamiento e implementación se
explica más adelante, pero básicamente lee los registros que se escriben desde el
alto nivel y actúa respecto a la información brindada. Hace uso de la baterı́a de
funciones implementada en layerHW.cpp (la capa hardware del proyecto impor-
tante para la portabilidad) para manejar adecuadamente los puertos de salida y
recibir información de los de entrada. Devuelve un posible código de error que se
define en la interfaz error.h. El alto nivel tomará una decisión dependiendo de
este código.
Para implementar el movimiento de cada motor se debe generar un reloj como

89
Capı́tulo 6. Software

Figura 6.6: Diagrama de bloques bajo Nivel e interacción con Alto Nivel.

se detalla en la especificación. Cada pulso bajo del mismo equivale a un incremen-


to angular que realiza el motor. El diseño que se propone se basa en el uso de
un MCLK para determinar los instantes en que se debe atender cada uno como
submúltiplos de la frecuencia del mismo. Para ello, se implementa a partir del
mismo cuatro timers virtuales; contadores de pulsos del reloj principal (el Master
Clock ) para cada motor. Cuando llegan a la cuenta seteada, se debe realizar un
paso. En la Figura 6.7 se puede observar el reloj principal y como se generan los
relojes para cada motor a partir del mismo.

Figura 6.7: Generación de Relojes para cada motor a partir de Timers virtuales comandados
por un Master Clock.

En la figura anterior se muestra como se genera un pulso para el driver del


motor X con cada pulso bajo del MCLK, en el caso del eje Y cada dos pulsos y en
el Z cada tres. Para resolver la atención de los motores se utilizó una estructura
de Round Robin con interrupciones comandadas por el MCLK, donde se ejecutan

90
6.4. Software para microcontrolador Arduino

diferentes procesos de manera concurrente, mediante una utilización equitativa de


los recursos del equipo [80].
La idea principal para darle uso a la arquitectura elegida en el diseño es atender
las necesidades de cada motor por realizar un incremento angular en el momento
indicado. Cada incremento que realiza un motor puede ser de un paso si se tra-
baja en FULL STEP o medio paso si se trabaja en HALF STEP. A continuación
se muestra un pseudocódigo con el objetivo de describir e implementar lo recien-
temente mencionado. La rutina de atención a la interrupción del MCLK será la
encargada de habilitar las banderas cuando el timer virtual correspondiente a cada
motor llegue a la cuenta configurada en el registro de velocidad.
while (posición actual ! = posición objetivo) do

if (flag X) then
moverMotorX()
..
.

if (flag E) then
moverMotorE()
Realizada la presentación básica del control de posicionamiento, se vuelve con-
veniente presentar al lector la implementación completa de la atención a los mo-
tores en la función error *stepper(). El diagrama de flujos de la Figura 6.8 resume
la lógica que fue presentada durante la sección corriente junto con la atención a
los finales de carrera e interrupción externa del botón de emergencia. Se resalta
que el diagrama presentado sufrió una modificación necesaria para la operación de
los motores utilizando la salida de ENABLE, lo mismo se explica en los párrafos
siguientes.
El algoritmo implementado con la metodologı́a de Round Robin comienza con
una inicialización de variables donde se determina qué ejes deben moverse y en
qué sentido. Se habilitan timer virtuales, se configuran puertos de salida del mi-
crocontrolador, se inicia el Master Clock y habilitan interrupciones.
La condición de entrada al loop, es que alguno de los motores deba realizar un
movimiento; que no esté presionado ningún final de carrera relevante al movimiento
que se plantea realizar(en otras palabras en la dirección y sentido pertinente) y no
exista emergencia.
Los finales de carrera se chequean para cada eje antes de consultar por la
bandera que indica si se debe realizar un incremento en la cuenta de pasos. El
método usado para ésto es simplemente hacer un Polling de los mismos en la vuelta
del Round Robin. Si el fin de carrera que es relevante para el movimiento que se está
llevando a cabo no se encuentra en nivel bajo (no presionado) se consulta por la
bandera que indica el instante en que se debe realizar un incremento. Aquı́ entra en
juego el cambio realizado en la lógica para operar con ENABLE a los motores. En
una primera versión se realizaba un paso y actualizar la cuenta. Hecho lo anterior
se actualizaba el estado de ese motor, para determinar si debı́a seguir moviéndose.
Si no, se inhabilita su timer virtual, por lo que su bandera de atención no volverı́a

91
Capı́tulo 6. Software

Figura 6.8: Diagrama de flujo, donde se observa la implementación del Round Robin con el
control de los motores, los finales de carrera y el botón de emergencia.

92
6.4. Software para microcontrolador Arduino

a pasar a estado alto.


En la actual versión, se debe asegurar que el último paso sea realizado, ya que
bajar la salida ENABLE significa apagar las fases del motor, poniendo tierra en
ambos extremos de cada bobina. Para ello, primero se actualiza el estado (variable
que almacena valor booleano, indica si se terminó el movimiento o debe continuar)
y luego se consulta por el mismo, si el valor es verdadero, deshabilito el timer
virtual y apago el motor (ENABLE ). Si no se llego, muevo un paso y se aumenta
el contador de pasos. Por último se vuelve a configurar el timer virtual. Para
mostrar que la lógica resuelve el problema se plantea la siguiente situación:
Sea Xn−1 el estado actual de la posición y el objetivo Xn . Cuando llegue el
instante de mover el motor X, el estado resultante va a ser que dicho motor no ha
llegado al objetivo. Por lo que se mueve un paso y se cuenta. El estado ahora el
Xn , pero como no se deshabilita el timer virtual, se espera nuevamente al próximo
instante como para realizar el paso Xn+1 . Pero luego de actualizar el estado, el
resultado es que se terminó del movimiento y no se realiza el paso, se apaga el
motor y desactiva el timer virtual. De esta forma se asegura la realización del paso
Xn al esperar el tiempo que llevarı́a hacer un paso más para apagar las fases del
motor.
Antes de terminar la vuelta, se consulta por el botón de emergencia, el cual
se implementa con una interrupción externa encargada de levantar la bandera
correspondiente, desactivar el movimiento y deshabilitar la interrupción del Master
Clock. Cuando todos los motores salgan del estado de movimiento se cumple la
condición de salida y se retorna un error nulo, “ok”. Se sale antes de terminar el
movimiento si se presiona algún final de carrera relevante, o existe emergencia.
Es importante resaltar que la lógica permite la recuperación del movimiento si el
siguiente llamado a ( error *stepper()) implica que se realiza en el sentido opuesto
en el eje afectado, para el caso en que se habı́a presionado un final de carrera.

Algunas Pruebas y resultados


En esta sección se pretende comentar algunas pruebas realizadas a los módulos
programados para verificar su correcto funcionamiento.

Prueba de generación de señales de reloj, clocks, para cada motor.

Prueba de la lógica de los finales de carrera

• Detención de un movimiento al activarse un final de carrera.


• Continuación del movimiento anterior en sentido opuesto al final de
carrera activado.
• Devolución de errores múltiples (por ejemplo, si se presiona más de un
final de carrera)

Prueba de botón de emergencia

• Devolución de error

93
Capı́tulo 6. Software

(a) Comparación reloj de motor X (b) Comparación reloj de motor X


con reloj para motor Y. con reloj para motor Z.

(c) Comparación reloj de motor X


con reloj para motor E.

Figura 6.9: Señales de Clock a 22KHz para cada driver del motor paso a paso.

• Bloqueo de motores

Verificación del resto de señales al “driver” de los motores

Empezando por el primer punto, dicha prueba consistió en la generación de


cuatro ondas rectangulares para el caso de exigencia máximo, el caso de cuatro
ondas con frecuencia del Master Clock, el cual se llego a fijar en 22KHz sien-
do éste un lı́mite impuesto por la capacidad de procesamiento y la metodologı́a
implementada para la solución.
Los relojes generados se observaron mediante el osciloscopio siempre en com-
paración con el generado para el driver del motor X, o sea, se observo para X
e Y, para X y Z, y para X y E. Es importante resaltar que en este punto fue
necesario inhibir la salida del Round Robin por llegada al setpoint para no tener
un tiempo lı́mite de observación de dichas señales. En las Figuras 6.9(a),6.9(b) y
6.9(c) podemos observar los resultados obtenidos.
Una observación que podemos realizar de forma cualitativa al observar las
imágenes anteriores, es que el retardo de las señales para Y, Z y E aumentan con
respecto a X en este orden. Éste hecho es de esperar por dos motivos, el primero es
que se mueven a la misma velocidad, lo que produce que requieran atención todos
en simultáneo y segundo, por el orden de atención impuesto en el Round Robin,
donde X es el primer motor en ser atendido y E el último.

94
6.4. Software para microcontrolador Arduino

En cuanto a los restantes puntos, no hubo mayores sorpresas, obteniéndose


resultados positivos. Se logró verificar el funcionamiento de los finales de carrera,
el botón de emergencia y la correcta generación del resto de las señales a los
controladores de los motores.

Problemas y soluciones
Como se adelantaba al inicio de ésta sección el control de bajo nivel desarrollado
en el proyecto CtrlMotors3D, no satisfacı́a en su totalidad las necesidades del
presente proyecto de grado. Los problemas más relevantes producto de dichas
necesidades se introducen a continuación.

Migración de entorno de desarrollo: el presente proyecto planteo como en-


torno de desarrollo de software el IDE de Arduino, y el mismo se implementó
en AVR IAR.

Nuevas funciones: algunas funcionalidades nuevas surgieron conforme avan-


zaba el proyecto.

Wachtdog Timer : la necesidad de agregar robustez hizo necesario evitar el


bucle infinito para ciertas entradas poco comunes al bajo nivel

Control de velocidad: alcanzar ciertas velocidades necesita de un control de


velocidad, como puede ser un control lineal de velocidad.

En los próximos párrafos se brindará al lector el detalle y solución para cada


punto anterior.
Migración de entorno de desarrollo
La versión del control de bajo nivel de los motores paso a paso se implementó
en primera instancia bajo el entorno AVR IAR, una herramienta muy potente al
momento de programar, brindando un gran abanico de posibilidades para el debug
de la misma, ésta cualidad fue vital para llevar a cabo la versión presentada en
el proyecto CtrlMotors3D. Sin embargo, en el proyecto de grado Modular3D
se apuntó a utilizar el entorno de Arduino, el cual no cuenta con herramientas de
debug poderosas, pero complementa con la disponibilidad de librerı́as que han de
ser de utilidad para la programación de más alto nivel, facilitando algunas tareas.
En principio ambos entornos usan compiladores diferentes (AVR GCC y AVR
IAR C/C++ compiler), pero además al estar Arduino pensado para trabajar a muy
alto nivel algunas de las soluciones que brinda son en principio implementadas de
forma desconocida para el usuario. Antes de avanzar en el detalle de estos cambios
se listan las partes del código que debieron ser revisadas.

Macros del código 1 .

Librerı́as.

Declaración de interrupciones.
1
Los macros definen una secuencia de instrucciones.

95
Capı́tulo 6. Software

Manejo y uso de Timers.

La Tabla 6.4 resume los macros del entorno AVR IAR que se debieron cambiar
por compatibilidad con compilador de Arduino IDE. Además para que el cambio
resultara exitoso se debió agregar la librerı́a util/delay basic.h.

Macro AVR IAR Equivalencia en Arduino IDE Función


delay cycles(a): delay loop 1(b): Pausar el microcontrolador
enable interrupts(): interrupts(): Habilitar interrupciones
disable interrupts(): noInterrupts(): Deshabilitar interrupciones

Tabla 6.4: Resumen de Macros en AVR IAR y equivalencia en Arduino IDE

Para la declaración de las interrupciones se agrego una librerı́a denominada


avr/interrupt.h y se cambio de la declaración de las mismas como se muestra a
continuación.
#pragma vector = TIMER1 COMPA vect
interrupt void ticsMasterClocks(void)(
...
...
)
A realizarse de la siguiente forma:
ISR(TIMER3 COMPA vect)(
...
...
)
En cuanto al TIMER 1 de 16 bits que se utilizaba para generar el Master Clock
que rige el movimiento de los ejes, se debió cambiar por el TIMER 3 también de 16
bits. Lo anterior fue necesario ya que el TIMER 1 es utilizado en el macro delay(t)
y delaymicrosecond(t) de Arduino los cuales podrı́an ser de utilidad en alto nivel.
Por otro lado, se descubrió que al configurar los diferentes bits de los registros de
control del TIMER como TCCR3A, TCCR3B y TIMSK3 2 , se deben configurar
todos los bits y no asumir que aquellos no seteados tendrán valor bajo.
Nuevas funciones
Para cumplir con todas las funcionalidades requeridas por el alto nivel, se
comentan aquellas particularmente importantes.
Se realizó una función para setear la posición actual de cada eje a un valor
determinado por el alto nivel. Dicha función se denominó setPosicion(eje k eje,
unsigned long int val) y recibe como entrada el eje al que se desea setear su posición
y el valor en cantidad de pasos para ésto. La necesidad de esta función radica en
cómo realiza el control de bajo nivel para determinar el sentido del movimiento, el
2
Registros de control: TCCR3A y TCCR3B. Registro de configuración de interrupcio-
nes: TIMSK3

96
6.4. Software para microcontrolador Arduino

mismo se hace por comparación de los registros de setpoint y posición actual que se
escriben antes de llamar a error *stepper(). Por lo tanto, para poder automatizar
algunas pruebas pudiendo realizar movimientos en ambos sentidos es conveniente
poder cambiar estos registros. Es de resaltar que no existe otra ocasión en que
los mismos deban ser cambiados, en cualquiera de los modos de funcionamiento
normal, el bajo nivel debe preservar la posición verdadera referida al cero mecánico,
salvo por el extrusor que no tiene relevancia en el posicionador.
Para el funcionamiento normal del posicionador XYZ es necesario determinar
un origen, e iniciar la cuenta de los movimientos referidas al mismo. Dicho origen,
queda determinado mecánicamente y se halla realizando movimiento en los tres
ejes hasta que se accionen los finales de carrera que definen el origen mecánico de
nuestro sistema de coordenadas cartesianas. Para que el sistema de posicionamien-
to encuentre los mismos se programó una función denominada home all axis() en
el módulo stepper.cpp, la cual es llamada antes de iniciar cualquier operación.
La lógica que sigue la función es muy sencilla, se setea cada eje del sistema
cartesiano en una posición en cantidad de pasos que sobrepasa la excursión en cada
eje y se configura como origen la posición nula. El siguiente paso es programar la
velocidad en cada eje e iniciar el movimiento dentro de un bucle, del que no se
sale sin que todos los ejes hayan alcanzado el final de carrera correspondiente. Si
se alcanza la posición en un eje, se detecta cual fue, se lleva a cero el contador
de pasos, se lo mueve en sentido opuesto apenas dos milı́metros (400 pasos) y se
vuelve a presionar el final de carrera a una velocidad aún menor y se lleva a cero
la cuenta de pasos nuevamente. La razón de esta implementación es amortiguar la
variación del cero mecánico debido a vibraciones mecánicas en el final de carrera.
La Figura 6.10 resumen la lógica implementada.
Para la implementación del control de velocidad, que como se mencionará más
adelante se integra al control de bajo nivel, es necesario contar con funciones
de consulta dedicadas exclusivamente a cada motor para ahorrar tiempo en ins-
trucciones del tipo if o swicht case. Por lo tanto, se implementaron funciones de
consulta para la posición actual, la posición objetivo y velocidad de cada motor.
Sin embargo, se consideró una buena idea mantener la función unsigned long int
consulta(eje k e, int propiedad) para uso de capas superiores de software donde no
existe problemas de procesamiento.
Watchdog Timer y salida por timeout
En el presente proyecto de grado, se optó por lograr un sistema robusto, que
detecte, informe posibles fallas y no entre en bucle infinito. Resulta interesante
proveer al bajo nivel de una salida que se accione si expira un cierto tiempo lı́mite,
tal que transcurrido el mismo significarı́a que el sistema entró en un bucle infi-
nito. En general, el recurso que tienen los sistemas embebidos para lograr evitar
ésta condición es hacer uso del periférico conocido como watchdog timer (WDT)
presente en general en todo tipo de microcontroladores. Su principal función es
generar un reset del sistema embebido cuando se expira un cierto tiempo, el cual
es programable. Dentro de las razones por las que un programa, particularmente
en un sistema embebido, puede entrar en loop están:

Bugs en la rutina.

97
Capı́tulo 6. Software

Figura 6.10: Flujo de función void home all axis()

Conjunto de entradas no usuales.

En sistemas con realimentación, al no llegar a un setpoint.

En nuestro caso, el control sobre el posicionador opera en lazo abierto. Esto


significa que los contadores de pasos, aumentan su cuenta con un perı́odo determi-
nado por la velocidad del movimiento aún cuando perfectamente podrı́a no estarse
realizando ningún movimiento. Por lo tanto, no ocurrirá que quede en loop in-
finito dentro del Round Robin debido a no alcanzarse el setpoint deseado, salvo
para un conjunto especı́fico de entradas. El conjunto de entradas que se halló en
la práctica que provocan un loop infinito, son aquellas que establecen una entrada
nula de velocidad para cualquier posición objetivo. Dichas entradas no son válidas
y solo podrı́an obtenerse mediante aproximación en los cálculos para determinar
la cantidad de pulsos de Master Clocks que fijan la la cadencia de los incrementos
angulares de los motores. Para evitar éste problema, y otras posibles carencias del
software no descubiertas se opto por emplear el WDT para reforzar robustez.

98
6.4. Software para microcontrolador Arduino

Como ya se mencionó, el WDT se puede utilizar para hacer un reseteo del


microcontrolador. Pero en algunos micros de la familia AVR como lo es en el caso
del Arduino Mega 2560, el WDT tiene otra opción de funcionamiento además
del system reset. Esta alternativa es utilizar este temporizador para generar una
interrupción, lo que resulta útil para poder reportar un error y tomar una acción
en lugar de reiniciar el sistema. La solución adoptada sigue este último camino y
aprovecha el Round Robin para revisar una bandera manejada por la rutina de
interrupción del WDT. Si en la vuelta del Round Robin dicha bandera esta en
alto, se registra un error de timeout y luego se saldrá del loop, retornando al main
que corresponda donde se deberá tomar una acción, por ejemplo, continuar con el
procesado del siguiente G-code o dar por fallida la tarea actual.
Para la implementación del WDT, se debe tener en cuenta que el mismo, en
funcionamiento normal debe ser reseteado periódicamente para evitar que llegue
a la cuenta programada. Se decidió entonces hacerlo en el instante que alguno
de los motores deba realizar un paso, dicho instante se determina dentro de la
rutina de interrupción del Master Clock. El siguiente paso a seguir es entonces
determinar cuánto es en teorı́a el máximo tiempo que puede transcurrir entre dos
pasos consecutivos de un motor paso a paso, como se ve en la Ecuación 6.1.

#pulsosM clk 65535


∆tmax = = = 3s (6.1)
FM clk 22000
Por lo tanto, considerando un margen amplio, se programa el WDT para que
interrumpa cada 8s. En la práctica se realizaron varios intentos por configurar
adecuadamente el WDT, para lo cual se debió tener una serie de cuidados que se
encuentran detallados en la hoja de datos del microcontrolador Atmega 2560 [54].
La idea consistió en realizar la configuración del mismo previo al bucle principal
de la función error *stepper() y refrescar su cuenta (llevarla a cero) para que no
llegue a interrumpir de forma periódica dentro de la rutina de interrupción del
Master Clock siempre que alguno de los contadores de los Timer Virtuales llegase
a cero. Con este razonamiento, siempre que algún motor realice un paso, se reinicia
la cuenta del WDT. De lo contrario, se evita el loop infinito saliendo por TimeOut.
No se logro un funcionamiento correcto del mismo por lo que los resultados al
respecto no son concluyentes y se optó por dejar en el código comentado las lı́neas
de software involucradas para retomar en trabajo futuro.

Algoritmo para Control de velocidad de motores paso a paso


En esta sección se explica la necesidad de realizar un control lineal de velocidad
en los motores stepper.
Como se afirma en [81], con motores DC, aumentar el voltaje (o el ciclo de
trabajo si se usa PWM) controla qué tan rápido el eje del motor alcanza una
velocidad dada. En cambio, con motores paso a paso, cambiar el voltaje de ali-
mentación no tiene efecto sobre la velocidad de movimiento. Por otro lado, en el
mismo artı́culo el autor afirma, que se puede aumentar el rango de velocidades que
alcanza el motor stepper si se alimenta en un voltaje mayor. Lo anterior se debe

99
Capı́tulo 6. Software

a que se cambia la tasa de conmutación de la corriente por los bobinados, lo cual


determina a qué velocidad podrá girar el motor.
Esto podrı́a llevar a pensar que no serı́a necesario realizar un control de velo-
cidad con este tipo de motores. Sin embargo, existen razones por la cual se debe
realizar. En la Figura 6.11 podemos apreciar la dependencia del torque con la velo-
cidad y además el fabricante proporciona un valor de frecuencia fs que determina
un lı́mite para la velocidad inicial del motor.

Figura 6.11: Curva de torque velocidad para un motor bipolar. Imagen extraı́da de [81].

Se recuerda al lector, que cada pulso enviado al driver del motor PAP resulta
en un paso del mismo, por lo tanto, la velocidad en pasos por segundo equivale a
la frecuencia de la onda cuadrada que excita al controlador. Entonces, si se supera
inicialmente este umbral declarado por el fabricante del motor, es de esperar un mal
funcionamiento debido a perdida de sincronización. Este problema es crı́tico para el
posicionamiento pero es solucionable realizando un control lineal de velocidad, de
otra forma aplicando una aceleración constante para alcanzar velocidades incluso
mayores a fs . Es importante mencionar, como en secciones anteriores y como se
observa en la Figura 6.11, que el torque depende de la velocidad y se ve disminuido
a mayores velocidades.
Por otro lado, también existen motivos para realizar un control de velocidad
con desaceleración constante antes de terminar un movimiento. La principal razón
que se menciona en [81] es que se debe llevar la velocidad del motor a un nivel al
cual se pueda detener despreciando la inercia del eje. De lo contrario se realizaran
pasos que podrı́an llevar a un error considerable en los contadores de pasos del
software de control. Lo anterior es particularmente crı́tico cuando se controlan en
lazo abierto, como es el caso del presente proyecto. En la Figura 6.12, podemos
apreciar un perfil de velocidad trapezoidal tı́pico, el mismo es una versión ideal
de lo que ocurre en la realidad, donde realmente la rampa es formada a partir de
escalones. Se puede apreciar en la Figura 6.13.

100
6.4. Software para microcontrolador Arduino

Figura 6.12: Perfil trapezoidal de velocidad. Imagen extraı́da de [82].

En el caso de un motor stepper, el área debajo de la curva en la Figura 6.13


equivale a la cantidad de pasos necesarios para llevar el mecanismo de una posición
inicial a la posición objetivo, a partir de ellos se puede obtener la distancia recorrida
aplicando una conversión a través de los parámetros mecánicos de los grados de
libertad.

Figura 6.13: Perfil de velocidad vs. velocidad (pulso/sec) motor stepper. Imagen extraı́da
de [83].

Existen diferentes algoritmos para la obtención de un perfil de velocidad ade-


cuado. En [84] por ejemplo, se plantea el uso de la realización del control de
velocidad en tiempo real para microcontroladores de mediano porte mediante el
uso de una aproximación que ahorra recursos del sistema.
En el presente proyecto no se optó seguir ningún algoritmo en particular e im-
plementar una versión que pueda resolver las necesidades para el posicionamiento
de manera básica, buscando un perfil de velocidad que cumpla con las siguientes
hipótesis:

Durante la impresión o fresado los movimientos en más de un eje tienen la


misma duración, por lo tanto se requiere un control de velocidad para ace-
lerar/desacelerar que permita realizar un aumento de velocidad coordinado
entre los motores involucrados.

101
Capı́tulo 6. Software

La anterior afirmación implica que incluso el motor del extrusor deberá


poseer un perfil de velocidad adecuado, para evitar sobre extrusiones al
principio y menor cantidad de deposición al final de un movimiento.

El algoritmo debe soportar al menos tres ejes en simultáneo, ya que durante


una extrusión se mueven hasta tres, X Y E ; Z se mueve durante un trabajo
solo, pero sin extruir puede darse un movimiento en X Y Z.

Las anteriores consideraciones en lo referente a la simultaneidad de operación


de los distintos grados de libertad son tı́picas de las máquinas de control numérico,
ya que el objeto a imprimir o fresar se realiza mediante capas a lo largo del eje Z.
Solución
Para lograr que los motores que intervienen en un movimiento simultáneo in-
crementen su velocidad de forma que la duración de cada movimiento separado
sea la duración del movimiento completo, se debe aplicar una misma aceleración
a los motores. En el caso de un perfil trapezoidal serı́a misma pendiente. El razo-
namiento es el mismo para la desaceleración.
La ventaja de poseer un único Timer que gobierne el movimiento de todos los
motores, es posible variar la frecuencia del mismo afectando de manera igualitaria
a todos los grados de libertad. Lo anterior se hace variando la cuenta con que se
programa el MCLK (registro OCR3A del Timer 3 ) para que el mismo realice sus
interrupciones. Se deben fijar entonces dos lı́mites, una cuenta mı́nima que deter-
mina la frecuencia nominal del Master Clock y una cuenta máxima que determina
la cadencia mı́nima con la cual se interrumpe.
La velocidad con que se realizan los incrementos angulares (pasos) en cada
motor se determinan fijando una cuenta de pulsos del MCLK, en otras palabras un
Timer Virtual para cada motor como ya se ha explicado antes. Por lo tanto, si un
motor se mueve a una fracción entera de la frecuencia del MCLK, este alcanzará su
velocidad de crucero (régimen) cuando el reloj principal alcance la cuenta mı́nima.
Si se mueve más de un motor, el efecto transitorio de aceleración y desaceleración
afecta a todos los motores con igual proporción.
La cuenta mı́nima que se manejaba al momento de la implementación era
OCR3A = 0 × 378 = 889, lo que determinaba un MCLK nominal de 18KHz.
El lı́mite inferior, se situó arbitrariamente en OCR3A = 0 × F A0 = 64000 que
equivale a 250Hz, éste es un valor no muy chico y en principio adecuado. Si
fuese mucho menor, del orden de 1Hz, se demorarı́a demasiado en comenzar los
movimientos. Ambos lı́mites se pueden llegar a ajustar en el código si se encontrase
una combinación más óptima.
Otro paso importante a realizar es evaluar cuanto tiempo es razonable que
se demore en llegar al régimen, un segundo es un valor adecuado para comenzar
a probar ya que no hay movimiento mucho más cortos en promedio. Se debe
determinar en cuanto se reduce la cuenta del Timer 3 en cada iteración hasta
alcanzar la frecuencia nominal. Para ello se tiene como dato, la frecuencia del reloj
del sistema, la cuenta inicial y el tiempo que se estima adecuado para invertir en
acelerar o desacelerar. El método empleado es restar por cada interrupción una

102
6.4. Software para microcontrolador Arduino

cantidad constante en proporción al último valor de la cuenta llevada en el registro


OCR3A.
Para determinar dicha proporción, se planteó en la ecuación (6.2) una sucesión
donde ti es el tiempo en instante i = 0..n; tn es entonces el tiempo total de cada
transitorio y Ci las cuentas que determinan cada instante de interrupción.

C0 C1 C2 Cn
tn = + + + ... + (6.2)
f f f f
Cada cuenta se determina a partir de la anterior restando una cantidad pro-
porcional a la última cuenta como se muestra en la ecuación (6.3).

1
tn = [C0 + (C0 − C0 K) + ((C0 − C0 K) − (C0 − C0 K)K) + ...] (6.3)
f

Sacando factor común el termino C0 y agrupando 1 − K como α se puede


observar en la ecuación (6.4), que el tiempo tn se puede calcular a partir de una
sucesión geométrica.
n
C0 C0 X k C0 1 − αn+1
tn = [1 + α + α2 + ... + αn ] = α = (6.4)
f f f 1−α
i=0

Una primer aproximación para n muy grande se puede apreciar en (6.5), de


donde se obtiene que K = 4 × 10−3 s, en otras palabras, el factor por el cual debe
dividirse a la cantidad de cuentas es K1 = 250. Dicho valor es muy cercano a 256,
por lo que en una primer prueba se tomo éste último que significa quedarse con la
parte alta del registro OCR3A de 16 bits para luego sustraerla. Sin embargo, más
adelante el mismo se cambio por 128 para perder menos tiempo en el transitorio
a costa de aumentar la no linealidad del control de velocidad.

C0 1
tn = (6.5)
f 1−α
Si se mantiene fija la cantidad de cuentas inicial y frecuencia del reloj del sis-
tema, se puede variar el tiempo que llega al régimen cambiando el inverso de K.
Por ejemplo dividir entre 128(correr hacia derecha 7 bits de OCR3A) es aproxi-
madamente 0,507s de tiempo de subida en lugar de 1,0s.
Una simulación temprana de los datos, reveló que el perfil de velocidad conse-
guido, no era trapezoidal. Presenta una curvatura para aceleración y desacelera-
ción, lo que significa que no se mantiene constante la aceleración. Lo anterior es
razonable ya que en un principio la proporción descontada al contador es pequeña
en comparación (se inicia en 0 × F A0 = 64000) y en cambio, cuando la cuenta del
Timer 3 se aproxima a 0 × 378 = 889 descontar la proporción determinada por
K puede significar un cambio muy marcado en la frecuencia lo que implica que la
aceleración no se mantiene constante. En la Figura 6.14 se muestra una gráfico de
los datos determinados por la metodologı́a aplicada.
Implementación

103
Capı́tulo 6. Software

1
Figura 6.14: Perfil de velocidad que se obtendrı́a según datos para K = 128.

El algoritmo a implementar debe ser capaz de recalcular la cuenta para el


registro OCR3A en cada interrupción del Master Clock siendo capaz de detectar
cuando se debe acelerar y cuando frenar. La lógica que se implemento se puede
apreciar en la Figura 6.15.

Figura 6.15: Lógica del algoritmo de control de velocidad.

El flujo anterior se integra a la rutina de interrupción del MCLK. Para contestar

104
6.4. Software para microcontrolador Arduino

la pregunta, de si se debe frenar, hay algunas consideraciones que están ocultas en


el diagrama anterior. La primera, es que en un movimiento concurrente de más de
un motor, el que deba realizar la mayor cantidad de pasos será que deba ir más
rápido. La ecuación (6.6) refleja éste hecho.

Nx P ulsosM CLKy Vx
= = (6.6)
Ny P ulsosM CLKx Vy

La idea es determinar un criterio para comenzar a frenar. El utilizado es que


se debe frenar si Nmax .P ulsosM CLK < N inst, donde Nmax representa la cantidad
de pasos restantes del motor que se debe desplazar más pasos. P ulsosM CLK es
la cantidad de pulsos de MCLK para realizar un paso y Ninst es un contador de
instantes, equivalente a contar las interrupciones.
Por lo tanto, actualizando Nmax y contando Ninst se determina la cantidad de
interrupciones que se demoró en llegar al régimen y se puede determinar cuando
se debe frenar, ya que si queda menos tiempo para desacelerar del que le llevó
acelerar entonces debe comenzar a frenar. Con lo cual, el perfil de velocidad es
simétrico. Es posible también, que el tiempo que disponga el motor más exigido
para realizar el movimiento no sea suficiente para alcanzar el régimen en velocidad.
En éste caso, el algoritmo acelera la mitad del tiempo y el resto desacelera.
Es de resaltar que el algoritmo no es posible implementarlo enteramente en la
rutina de atención del Master Clock por una razón, no se puede modificar OCR3A
durante las interrupciones y en la rutina de interrupción. Esto obligó a operar con
una variable de por medio y utilizar una bandera que indique si debe actualizarse
la cuenta en OCR3A. Se aprovechó la arquitectura de Round-Robin para atender
a la nueva bandera y modificar la cuenta. Lo anterior es posible ya que en el peor
caso que es cuando el MCLK funciona a frecuencia nominal, se debe asegurar que
el ciclo de atención a las banderas del bucle sea menor que el perı́odo del MCLK.
Si se asegura ésto, antes de una nueva interrupción siempre se habrá realizado el
cambio previo a la cuenta del registro OCR3A.
Otro detalle importante es sobre la correcta escritura del registro mencionado,
lo adecuado es escribir primero la parte alta OCR3AH) y luego la baja (OCR3AL)
con interrupciones desactivadas. Para concluir se presenta en la Figura 6.16 una
captura de datos realizada con un osciloscopio digital GW instek modelo GDS-
2062.
La prueba realizada consistió en generar un reloj de frecuencia objetivo 2kHz
a partir de un Master clock inicial de 250Hz.
Como conclusión de la sección, se resalta la implementación de un algoritmo
capaz de realizar un control sincronizado de velocidad en cuatro motores a partir
de un solo Timer. Como desventajas tiene la no linealidad que puede implicar
grandes aceleraciones a medida que el MCLK alcanza su valor nominal, pero aún
ası́ contribuye a suavizar los movimientos.

105
Capı́tulo 6. Software

Figura 6.16: Medida relevada de la variación de velocidad.

6.4.2. Control de temperatura


El control de la temperatura se realiza a través del módulo contTemp.cpp
con la interfaz contTemp.h, donde se implementa la clase 3 contTemp. La razón
por la que se realizó el control mediante una clase es que son dos los objetos a los
cuales se debe controlar la temperatura: el extrusor y la heated bed ; y las funciones
necesarias son análogas. Además si en un futuro se deseara agregar un segundo
extrusor solo serı́a necesario crear otro objeto de esta clase.
Al constructor de la clase contTemp solo se necesita pasarle los pines por los
que se comunicará con el hardware, estos son un pin para sensar la temperatura,
otro para controlar la corriente, y el tercer parámetro del constructor es el factor
que se utiliza para la conversión tensión-temperatura.
La razón por la que hay que pasarle este dato es que a pesar de que teóricamente
el LM35 de la heated bed y la termocupla del extrusor poseen la misma ganancia,
se debió efectuar la calibración de esta última, y como se concluyó que la relación
era lineal se decidió corregir variando el factor.
Además se puede construir la clase con el dato de otro pin opcional para el
control del ventilador.
Las funciones que brinda la clase sirven para:

Setear y consultar el setpoint.

Consultar la temperatura.

Realizar el control de la temperatura.

Encender y apagar el ventilador.

En una primera etapa se implementó el control de temperatura mediante un


controlador “ON/OFF”, el cual encendı́a la fuente de corriente si la temperatura
era menor al setpoint y la apagaba si era mayor. Este controlador presentaba
oscilaciones que rondaban los 5◦ C, esto realizando las pruebas con el extrusor
quieto, sin extruir y sin ventilador.
3
Una clase es una plantilla para la creación de objetos de datos según un modelo
predefinido.

106
6.4. Software para microcontrolador Arduino

Para mejorar estas medidas se cambió el sistema de control, se continuó con


un sistema que solamente prende y apaga la fuente de corriente, pero ahora se
calcula cuánto tiempo tiene que estar prendida o apagada según la diferencia entre
el setpoint y la temperatura medida. El control de la temperatura se realizó cada
un segundo y se implementó a través de una interrupción periódica cada 50ms.
Para este nuevo control, se manejan dos tipos de contadores: uno general que
siempre se setea con un valor de 20 (con el que se cuenta un segundo) y otro
propio de cada objeto de la clase contTemp, al cual se le asigna un valor entre 0 y
20 dependiendo de cuanto se aleja la temperatura del setpoint dentro de un rango
que se define como un porcentaje del setpoint (por fuera de ese rango la fuente
siempre esta prendida o apagada).
En cada interrupción se decrementa en uno, el contador que determina que
proporción de 1s se mantiene encendida la fuente implementada con un mosfet.
Cuando llega a cero se apaga la fuente y transcurrido el segundo se repite el proceso
luego de realizar una lectura analógica para determinar el nuevo valor del contador.
En la Figura 6.17 se puede apreciar lo explicado recientemente, donde se ven
2 ejemplos: uno con el contador propio del objeto seteado en 10 y el otro en 5.
Además se puede ver como se encuentra la llave de la fuente de corriente en cada
instante.

Figura 6.17: Ejemplo de los contadores del control de temperatura. Donde se muestran 2
contadores propios de las clase contTemp uno seteado en 10 (50 % del tiempo) y otro en 5
(25 % del tiempo).

El controlador implementado se asemeja a un controlador proporcional, esto se


puede ver en que el valor medio de la energı́a entregada al hot end en un segundo
depende proporcionalmente al error, siendo éste la diferencia entre la temperatura
y el setpoint.
Para setear los contadores propios de los objetos contTemp, se calcula el error
relativo como:

Setpoint−T emperatura
Setpoint

107
Capı́tulo 6. Software

Dependiendo de si el error queda por fuera de una banda definida entre [−P OR ERROR,
+P OR ERROR], se enciende o se apaga la fuente de corriente por todo el segundo.
Y cuando el error queda dentro de esta banda, el contador se calcula como:
  
Setpoint−T emperatura 10
Setpoint + P OR ERROR × P OR ERROR

Con lo que se establece una correspondencia lineal entre [−P OR ERROR,


+P OR ERROR] y [0, 20]. Y se puede apreciar en la Figura 6.18.

Figura 6.18: Cuerva controlador.

6.4.3. Intérprete de comandos


El objetivo de este módulo consiste en interpretar los comandos G-code y M-
code, resultados de aplicar un slicer a un archivo .stl o cad que describe una figura
3D.

Figura 6.19: Diagrama entrada-salida del módulo interprete.cpp.

108
6.4. Software para microcontrolador Arduino

La Figura 6.19 muestra la entrada y salida del bloque. La entrada al módulo


es una lı́nea de un archivo .gcode. Los comandos G-code que se interpretan se
pueden consultar en las Tablas 6.6 y 6.7 . La salida del módulo es la información
necesaria para que el módulo ejecutador.cpp realice el adecuado manejo de las
capas bajas de software. Dicha información se ordena en una estructura de datos,
definida como de tipo comando. En la Tabla 6.5 se resume los campos de dicha
estructura.

Tipo dato nombre Descripción


acciones t acción Enumeración de acciones para G o M code
float datos ejes[4] Arreglo de cuatro valores para los ejes
float datos nuevos[7] Arreglo bandera de datos nuevos
float param F Valor flotante de avance mm/min
float center IJ[2] Arreglo para centro de movimiento circular
float param S Configuración temperatura y otros parámetros
char message[30] Arreglo de carácteres de un mensaje
int system coordinates Bandera datos en absoluto o relativo
int extruder mode Ídem anterior pero para extrusor
int sentido CW Sentido trazado curvo
int fan Encendido/apagado del ventilador extrusor
int extrudeON Bandera indica extrusión
int retract Indica retracción filamento

Tabla 6.5: Campos en la estructura de datos “comando”

Para entender el funcionamiento básico del módulo interprete.cpp y cómo se


relaciona con el ejecutador.cpp, es necesario comentar un poco sobre el campo
“acción” de la estructura de datos. Es básicamente un código con el que se etiqueta
un comando recibido, para que el resto del software sepa qué camino tomar. Para
su asignación se agrupó los comandos G-code y M-code en acciones del mismo
tipo. Por ejemplo, realizar un movimiento lineal(move linear en el código) se co-
rresponde con un comando G0 o G1. Lo que varı́a es la bandera “extrudeON” que
indicará si se debe extruir (G1) o no (G0). De esta forma, se brinda la información
necesaria al ejecutador.cpp cuya entrada es la salida de este módulo.
Para resumir, el objetivo de este bloque es obtener de un string la información
necesaria para el correcto funcionamiento del prototipo.

Descripción del flujo principal


En el módulo interprete.cpp se implementan una serie de funciones para
el análisis y obtención de datos de un comando G-code o M-code. La función
principal, que devuelve una variable de tipo “comando” es la función “comando
interpretar(char gcode[ ])”. Para completar una descripción del bloque, se presenta
en la Figura 6.20 dicha función donde se omiten algunos G-codes no tan relevantes.

109
Capı́tulo 6. Software

Se puede apreciar que el camino que toma la información se separa en dos


principales caminos, si es un M-code o un G-code. En cada camino se trata de
agrupar aquellos que pueden desembocar en una acción similar, como puede ser
obtener los valores para realizar un movimiento lineal, u obtener los parámetros
para luego configurar un setpoint en la temperatura del extrusor o cama caliente.
En un segundo paso se hace una segunda clasificación dentro del grupo, fijando
los valores correspondientes a ciertas banderas de software pertenecientes a la
estructura de datos que se retorna. En el diagrama de la Figura 6.20 se resaltan
los principales G-code 4 .

4
Se recuerda que G-code engloba G-codes y M-codes

110
6.4. Software para microcontrolador Arduino

111
Figura 6.20: Diagrama de Flujo de la función “comando interpretar(char gcode[ ])”.
Capı́tulo 6. Software

Figura 6.21: Diagrama lógico donde se enmarca el razonamiento desarrollado en el módulo


Ejecutador (no representa verdadero flujo de información).

6.4.4. Ejecutador
En la presente sección se pretende describir el módulo Ejecutador (Ejecutador.cpp
y Ejecutador.h) el cual forma parte del firmware.
Este módulo compone el alto nivel del sistema programado. Conjuntamente
con el módulo interprete.cpp, el objetivo es adecuar los datos provenientes del
código de máquina al universo de los módulos que componen el bajo nivel. Para
llevar a cabo esta tarea el módulo debe conocer la acción que se debe realizar y
en base a ésta, teniendo como entrada registros de los datos del código de máqui-
na ya interpretados, razonar cómo debe utilizar dichos datos para obtener en la
realidad exactamente lo que la acción representa. Además, debe recibir el retorno
de los módulos de bajo nivel para poder devolverle a los módulos principales el
estado en que se encuentra el sistema para que éstos decidan como continuar el
funcionamiento. Para comprender más claramente la anterior descripción se puede
consultar el esquema presentado en la Figura 6.1 y para entender los razonamien-
tos se presenta un diagrama lógico (no es un diagrama que represente el verdadero
flujo de información) que presenta la relación entre los módulos de Intérprete,
Ejecutador y Bajo Nivel en la Figura 6.21.
El presente módulo se destaca sobre el resto, debido a que las decisiones lógicas
que se tomen en la programación se traducen casi directamente en especificaciones
de la máquina, es decir, el cómo se ejecuta cada acción da caracterı́sticas esenciales
a éste tipo de máquinas de control numérico. Obviamente, como ya se ha mencio-
nado, el código de máquina, en particular cada G-code fue interpretado tomando
como referencia la interpretación del firmware Marlin, pero a la hora de tomar
decisiones sobre lo que debe realizar la máquina al ejecutar determinadas acciones
desembocó en elecciones propias.
El módulo tiene dos tipos de acciones para ejecutar: las acciones que solo

112
6.4. Software para microcontrolador Arduino

Figura 6.22: Comparación entre el sistema de coordenadas en lo que basan sus razonamientos
los módulos de bajo (control de motores) y alto nivel (ejecutador).

derivan en setear banderas, cargar datos en algunos registros y las que representan
uso de los módulos de bajo nivel (control de temperatura y control de motores).
Este módulo posee dos estructuras estáticas de datos, una cuyos elementos son
datos estáticos y la otra guarda elementos utilizados como banderas estáticas.
Estas estructuras son la fuente de información para cada razonamiento a realizar
con el objetivo de ejecutar la acción solicitada de forma correcta. Las mismas se
mantienen coherentes durante toda la realización de un proyecto, dando la ventaja
de que a pesar de que durante éste se realicen cambios de sistema de referencias,
“offset” de posición, etc, el bajo nivel no será el encargado de reflejar estos cambios.
De esta forma siempre es el control de bajo nivel el que lleva la verdadera cuenta
de pasos con respecto al cero mecánico.
El alto nivel, basa su sistema de referencia considerando que existe tal cero
mecánico (origen de coordenadas del bajo nivel) determinado por el accionar de los
tres fines de carrera. Luego, se puede llevar el puntero 5 a una posición determinada
en la cual mediante una función el ejecutador guarda en unos registros esta posición
que equivale al origen del alto nivel. Entonces siempre que se quiera ir al origen
de coordenadas de software se va a esta posición. Observando la Figura 6.22, se
aprecia lo mencionado anteriormente. En particular, entre los módulos los ejes X
e Y tiene el mismo sentido pero el Z no. Esta diferencia se contempla para cada
función del seteo de registros 6 .
Por el mismo camino, es de destacar que el presente módulo implementa una
barrera de software, que tiene por objetivo controlar los datos que se guardan en las
estructuras del ejecutador antes de llegar a la ejecución propiamente dicha. Dicha
5
mediante la utilización del Joystick, cuyo manejo se implementa en el Movimiento-
Manual.cpp
6
Debido al criterio utilizado, básicamente siempre se va a definir un origen de alto nivel
distinto de cero para el eje vertical. De todas formas para impresiones y fresados, es bueno
obligar esta acción para el correcto nivelado de la mesa evitando ası́ estropear tanto a la
misma como al puntero (fresa o extrusor).

113
Capı́tulo 6. Software

barrera no es exclusivamente de bloqueo, sino que también toma decisiones para


poder seguir adelante y poder ejecutar la acción. Un ejemplo de esto último, se da
al ejecutar la acción de movimiento: si la velocidad absoluta que fue interpretada es
mayor a la especificada como máxima en la máquina, la barrera decide tomar como
velocidad absoluta del movimiento a ejecutar la velocidad máxima especificada, de
ésta forma se puede seguir adelante con la ejecución.

Programación
El módulo está compuesto por varias funciones que pueden verse en la interfaz
del módulo Ejecutador.h. Hay tres funciones pensadas para ser llamadas desde
los módulos principales:
void inicializarEjecutador(): se encarga de inicializar las estructuras men-
cionadas en la presente sección.

void setHomeOffset(): guarda en registros la posición actual en milı́metros y


pulgadas equivalente a la ubicación en número de pasos del bajo nivel en ese
momento. Está pensada para ser usada al inicio de determinado proyecto,
para guardar dicha posición como el origen de coordenadas del alto nivel.

error *ejecutar(comando cmd): esta es la función principal del módulo. Se le


pasa como parámetro una estructura que contiene los datos y banderas que
se interpretaron en el módulo interprete.cpp a raı́z de un G-code (recordar
diagrama lógico de la Figura 6.21).
El primer paso está en detectar cuál es la acción a ejecutar consultando el
dato correspondiente de la entrada. Luego de ésto, se accede a una parte
del código que sólo se encarga de esa acción en particular, pero sı́ usando
otras funciones internas al módulo para llevar a cabo la correcta ejecución
de dicha acción.
Dependiendo de la acción se almacenan los datos en la estructura del Ejecu-
tador y se revisan las banderas del mismo para ir tomando decisiones. Luego,
según estas banderas los datos guardados son asimilados de forma coherente
para que la acción se ejecute de manera correcta. Esto quedará más claro al
momento de presentar el diagrama de flujo de una acción en particular.
Con el objetivo de realizar una programación ordenada y sabiendo que se
tienen banderas para conocer el sistema de coordenadas (absoluto o relativo)
y el sistema métrico (milı́metros o pulgadas), la gran mayorı́a de las funciones
internas del módulo representan versiones para cada combinación de éstas.
Además, se tratan por un lado los cálculos correspondientes a los ejes X, Y,
Z y por otro los referidos a la extrusión (eje E).
Recordar que cada dato proveniente de la estructura de entrada debe pasar
por el código que compone las barreras de software, para recién ser alma-
cenados en las estructuras del Ejecutador. En caso de que algunos de los
datos (posición de cada uno de los ejes, velocidad absoluta, temperatura de
la cama caliente, temperatura del extrusor) haga que no se pueda sortear

114
6.4. Software para microcontrolador Arduino

una de las barreras, dicha acción no se ejecutará y la función dará un retorno


de error coherente hacia los módulos principales. En cambio, si la ejecución
es terminada la función ejecutar retorna un “ok” (dato tipo error). Se parte
de la base que esta función debe siempre dar respuesta, con lo cual, se con-
figuran los módulos de bajo nivel que son llamados dentro de esta función
para cumplir con el mencionado criterio, como se sabe de la Sección 6.4.1.

Razonamientos internos esenciales


Podrı́a decirse que existen G-codes cuyas acciones asociadas son esenciales
para el funcionamiento básico del posicionador y del extrusor. Es por ésto que a
continuación se va a describir el funcionamiento de la acción mover linear, cuyo
objetivo es desplazar el puntero a determinado punto extruyendo o no. Esta acción
es provocada por la llegada de los G-codes G1 (con extrusión) o G0 (sin extrusión).
En el diagrama de flujo de la Figura 6.23 se observa la estructura general del
razonamiento con que se logra ejecutar dicha acción.
De lo que se observa en el diagrama, son de destacar las funciones que se
encargan de setear los registros, los cuales serán entradas del bajo nivel.
Se tienen cuatro de estas funciones para los ejes X, Y y Z, y cuatro para el eje
E. En ambos casos la cantidad proviene de las cuatro posible combinaciones entre
sistema de coordenadas y sistema de medidas.
El objetivo de cada una de estas funciones es que tomando como entrada los
datos de cada eje y la velocidad absoluta poder guardar en los registros que usará
el bajo nivel los pasos a dar en cada eje y cuantos pulsos de Master Clock por paso
(incremento).
Los registros de pasos a setear dependen de las caracterı́sticas mecánicas de
los ejes, de los motores, del sistema de coordenadas, de las unidades y del origen
de coordenadas del alto nivel o algún otro offset (por ejemplo G92 → acción
set posicion 7 ) definido anteriormente.
Si se trabaja en absoluto, se utiliza una función para pasar el dato de la estruc-
tura que se encuentra en milı́metros o en pulgadas a cantidad de pasos y luego se
escribe en el registro de salida la suma en pasos de: origen del alto nivel + offset
por seteo de posición + el dato de entrada pasado a pasos (resultando la posición
objetivo real del bajo nivel respecto a su origen -cero mecánico-).
Para el caso en que se esté trabajando en relativo, el razonamiento es análogo,
pero como ahora el dato de entrada es un incremento y no puntos destino (como es
en caso absoluto) para el seteo de los registros de salida se debe sumar: los pasos
actuales del bajo nivel + el dato de entrada expresado en pasos.
Como se observa en este modo de operación los registros de origen del alto
nivel y de offsets de posición no son utilizados en las cuentas para el seteo de
registros, de todas formas se encuentran respaldados dado que si en el proyecto
que se está ejecutando, llegara un G-code (G90-a absoluto- o G91-a relativo- →

7
Éste G-code, es de seteo y su objetivo es afirmar que la posición donde se encuentra
el puntero pasa a ser la que es ingresada como parámetro con respecto al origen del alto
nivel.

115
Capı́tulo 6. Software

Figura 6.23: Diagrama de flujo para ejecutar la acción de movimiento lineal, extruyendo o no.
116
6.4. Software para microcontrolador Arduino

acción: set systemMode 8 ) para cambiar el sistema de coordenadas, el programa


debe poder soportar dicho cambio y seguir ubicando el puntero coherentemente.
En las ecuaciones (6.7) y (6.8) se observa el razonamiento principal para pasar
las distancia lineales de avance de cada eje a un universo de número de pasos
equivalente.

distanciaEJExyz
pasosEJExyz = (6.7)
distanciaP ASOxyz
P U LGADA
distanciaP ASOxyz = (6.8)
V U ELT ASxP U LGADA × P ASOSxV U ELT A
La ecuación (6.8) se usa para todos los modos de operación del posicionador
(ejes X, Y y Z). La constante VUELTASxPULGADA depende del tornillos utiliza-
do en cada eje. En particular para el presente proyecto se utiliza el mismo tornillo
para los 3 ejes, el cual posee 12 vueltas por pulgada. La contante PASOSxVUELTA
depende de los motores a utilizar y del modo de operación de éstos (paso completo
o medio paso). En particular, los motores utilizados en este proyecto son de 200
pasos por vuelta, pero el modo de operación elegido para comandar dichos motores
es modo medio paso. Es por esto que dicha constante toma el valor de 400.9
En caso de estar trabajando en milı́metros se debe multiplicar PULGADA
(= 1) por la constante PULGADASaMILIMETROS (100 - 25, 4mm), ya que siem-
pre deben quedar acordes las dimensiones entre distanciaEJE y distanciaPASO,
confirmando que el número de pasos debe ser adimensionado.
Para el caso del extrusor, la relación es distinta, debido a que por su diseño lo
que gira el engranaje es igual a lo que avanza el filamento, como se describe en la
Sección 4.4.
En las ecuaciones (6.9) y (6.10), se presenta el cálculo para hallar los pasos
a dar en el motor correspondiente al extrusor dada una longitud de filamento a
extruir.
distanciaEJEe
pasosEJEe = (6.9)
distanciaP ASOe
π.DIAM ET RO
distanciaP ASOe = (6.10)
P ASOSxV U ELT A
Donde la constante PASOSxVUELTA presente en la ecuación (6.10) del extru-
sor coincide con la del posicionador (6.8), ya que la caracterı́stica de los motores
es la misma. Luego, la constante DIAMETRO es el diámetro del engranaje que
posee el extrusor, especificado en la hoja de datos del mismo [52], teniendo el valor
de 11mm. En caso de trabajar en pulgadas, se debe dividir sobre la constante
PULGADASaMILIMETROS.
8
Se cambia el sistema de coordenadas, se decide consultando la bandera correspondien-
te.
9
Nota: En lugar de pasos, estrictamente habrı́a que hablar de incremento para no
confundir el razonamiento al pasar de un modo a otro de comando. Para todo razonamiento
de éste proyecto un paso es el mı́nimo incremento en el giro del motor independiente del
modo.

117
Capı́tulo 6. Software

Figura 6.24: Esquema de movimiento en dos direcciones que muestra la diferencia entre forzar
la concurrencia (lı́nea punteada) o no forzarla (lı́nea continua).

Entonces, para completar los registros de salida, para luego poder llamar a
la función principal del bajo nivel (error *stepper()) y que el movimiento sea
ejecutado está faltando la explicación de cómo se llega a tener las velocidades
de cada eje. La velocidad en el bajo nivel se entiende en “cantidad de perı́odos
del Master Clock ”, siendo el tiempo que demora en dar un incremento angular el
motor.
Es importante mencionar como hipótesis que los movimientos de cada eje deben
ser concurrentes. Cuando se debe ir a un punto para el cual hay que moverse en
más de un eje, el puntero debe ir por el camino más corto. Si no se hiciera de
esta manera y se necesitara imprimir o fresar desde un punto a otro en lugar de
realizarse una recta, el movimiento se descompondrı́a en más de una, debido a que
los ejes no terminan los movimientos al mismo tiempo.
Para tener claro lo anterior, se puede observar la Figura 6.24, en donde se
toma un movimiento en dos direcciones (análogo para 3 direcciones) presentando
la diferencia que provocarı́a solo exigir llegar a un punto, frente a exigir que se
llegue en cada dirección en el mismo instante.
Para explicar la manera en que se define la cantidad de perı́odos de Master
Clocks para cada eje se presenta el diagrama de la Figura 6.25.
El primer paso es obtener el tiempo que llevará realizar el movimiento. Para
esto se usa la ecuación (6.11), donde deltaEJE depende del sistema de coordenadas,
en modo relativo es directamente el dato guardado en la estructura principal del
ejecutador, pero en el caso de absoluto, se le debe restar la posición actual para
ası́ tener realmente el avance o retroceso.
p
(∆x)2 + (∆y)2 + (∆z)2
tiempo = (6.11)
velocidadAbsoluta
Luego, teniendo el tiempo y cada delta de posición, se halla la velocidad de
cada eje. En el caso que sea movimiento con extrusión se halla también la velocidad
del eje E. La relación entre la cantidad de filamento a extruir y el tiempo del

118
6.4. Software para microcontrolador Arduino

Figura 6.25: Diagrama de flujo que representa la obtención de la velocidad en el equivalente


de cantidad de perı́odos de Master Clocks.

movimiento determinado por los datos en los demás ejes restringe las lı́neas de
deposición quedando éstas más finas o más gruesas.
Observando el diagrama de la Figura 6.25, teniendo la velocidades se pasa a
calcular efectivamente la cantidad de perı́odos de Master Clock que representarán
dichas velocidades en el universo del bajo nivel.
En las ecuaciones (6.12) y (6.13) puede observarse el razonamiento para averi-
guar este dato a partir de la velocidad.

tiempoP aso
cantidadM CLKEJExyz = (6.12)
T M CLK
P U LGADA
V U ELT ASxP U LGADA.P ASOSxV U ELT A
tiempoP aso = (6.13)
velocidadEJExyz

Para el caso del extrusor se tienen las ecuaciones 6.14 y 6.15.

tiempoP aso
cantidadM CLKEJEe = (6.14)
T M CLK
π.DIAM ET RO
P ASOSxV U ELT A
tiempoP aso = (6.15)
velocidadEJEe
Las constantes son las mismas presentadas en el cálculo de las cantidades de
pasos. Tener presente la equivalencia de pulgadas a milı́metros según corresponda.
La idea es, teniendo la velocidad del eje, obtener el tiempo que demora en dar
un paso (incremento más precisamente), para luego normalizarlo por el perı́odo de
Master Clock, logrando ası́ el objetivo.
Cabe aclarar que como la velocidad absoluta viene siempre expresada en unidad
métrica sobre minutos, el tiempo que se calcula es en minutos y las velocidades por

119
Capı́tulo 6. Software

eje tiene las unidades de la velocidad absoluta, recién en el cálculo de la cantidad


de Master Clock se hace la equivalencia a segundos ya que debe ser coherente con
el valor que lo normaliza, T MCLK (éste está en segundos por provenir del inverso
de la frecuencia con cual se setea el reloj del timer en el bajo nivel, la cual está en
Hz).

Finalmente, observando nuevamente el diagrama de la Figura 6.23 llega el


momento de llamar al bajo nivel, para ésto se arman dos arreglos: uno con los
registros de pasos y otros con los de cantidades de perı́odos de MCLK.

Pero, si se observa la Figura 6.23 para el caso en que deba existir extrusión, hay
un momento en que se revisa la temperatura del extrusor y de la cama caliente. Si
estas temperaturas no son las adecuadas para la extrusión, el programa se queda
esperando hasta que las temperaturas estén en un rango correcto para sı́ luego dar
paso al control de bajo nivel de los motores. Se puede dar una salida por timeout,
debido a que si por alguna causa externa nunca se llega a la temperatura adecuada,
el modulo no podrı́a retornar una respuesta hacia los módulos principales debido a
que se quedarı́a esperando a que dicha temperatura sea adecuada para la extrusión.

Flexibilidad operacional soportada

En las tablas 6.6 y 6.7 se presentan las distintas series de instrucciones del
lenguaje de máquina (G-codes y M-codes) que son soportadas por el prototipo
fabricado.

Existen más instrucciones cuya atención no ha sido implementada, por no ser


crı́ticas para el correcto funcionamiento (se pueden observar visitando el código
que se adjunta del módulo interprete.cpp).

G-code Significado
G0 Movimiento lineal en al menos un eje al punto destino
G1 Movimiento lineal en al menos un eje al punto destino, extruyendo
G10 Retraer filamento según ajustes de M207
G11 Extruir filamento según ajustes de M208
G28 Ir al origen de coordenadas de alto nivel
G90 Trabajar en sistema absoluto
G91 Trabajar en sistema relativo
G92 Setear posición actual a las coordenadas pasadas como parámetro

Tabla 6.6: Instrucciones de tipo G-code que son interpretadas y cuyas correspondientes acciones
han sido implementadas para su correcta ejecución.

120
6.4. Software para microcontrolador Arduino

M-code Significado
M104 Fijar temperatura objetivo del extrusor
M82 Ajustar extrusor a coordenadas absolutas (por defecto)
M83 Ajustar extrusor a coordenadas relativas
M84 Deshabilitar motores
M92 Ajustar pasos por unidad de los ejes
M117 Desplegar mensaje
M140 Fijar temperatura de heated bed
M190 Fijar temperatura de heated bed
M206 Ajustar offset de alto nivel para homeing
M207 Ajustar largo del filamento a retraer
M208 Ajustar largo del filamento a extruir
M400 Terminar todos los movimientos

Tabla 6.7: Instrucciones de configuración (tipo M-code).

Es de destacar la existencia de un módulo de configuración, denominado se-


tup.cpp. Este módulo tiene como objetivo reunir todo tipo de constantes que son
usadas en el resto del software implementado. Es decir, todas las constantes referi-
das: a la mecánica (caracterı́sticas de los tornillos de avance lineal), a los motores
(incrementos por vuelta), a la barrera de software (velocidades máximas, volumen
de trabajo, delimitados por las excursiones máximas de cada eje, temperaturas
máximas y mı́nimas de extrusor y heated bed ).
La implementación de dicho módulo se pensó no solo por tener un orden en la
programación, sino para dar facilidad al momento de reutilizar el software de este
prototipo en otros posicionadores con sus nuevas caracterı́sticas.

6.4.5. Interfaz con el usuario


En esta sección se describirán a los distintos módulos que componen la interfaz
con el usuario. Se implementa como un menú inicial desde el cual se accede a otros
submenús. Y desde los submenús se puede entrar a las opciones que se consideraron
más ventajosas de incluir para que el usuario pueda ejecutar directamente.

Main principal
Como se dijo antes el firmware inicia en un menú padre este es el Main prin-
cipal. El main principal se compone de 2 funciones el setup() y el loop(), ambas
son caracterı́sticas de los archivos .ino del Arduino. Por fuera de estas funciones
se incluyen las librerı́as necesarias, como las que incluyen las funciones de los sub-
menú y otras librerı́as externas como la que habilita el manejo del pantalla LCD.
También se declara la variable lcd, mediante la función pertinente de la librerı́a Li-
quidCrystal.h, asignándole los pines mediante a los cuales se controlará la pantalla
lcd.

121
Capı́tulo 6. Software

En el setup() se inicializan variables de uso general como el lcd, además se


entabla la comunicación serial, y se ejecuta la función del módulo display.cpp que
crea los carácteres que se necesitan mostrar en pantalla no incluidos en la librerı́a.

Figura 6.26: Esquema de funcionamiento del Main Principal.

En el loop() se implementan las 4 opciones del menú que serán accedidas desde
aquı́, estas se pueden apreciar en la Figura 6.26. Cada una de las opciones se sim-
boliza por un “estado”, éstos se implementaron como un bucle donde se actualiza
la información en pantalla y se lee la entrada del Joystick. De los “estados” solo
se sale hacia otros mediante las movimientos laterales del joystick, y se accede a
las opciones con el botón de enter.

Calibración
Cuando se ingresa al submenú de calibración desde el Main principal se eje-
cuta la función calibración la cual implementa un menú circular análogo al de su
predecesor, las opciones que se pueden calibrar desde este menú son:

Homing
Calibrar milı́metros por paso para el extrusor
Origen de coordenadas del alto nivel
Ajuste de altura de la mesa de trabajo

Homing
Realizar el homing es básico para un posicionador, dado que esto significa
encontrar los lı́mites fı́sicos (origen mecánico) del prototipo. Esto se hace mediante
los finales de carrera, los cuales son switches ubicados estratégicamente para que
se accionen cuando el posicionador se halle tanto en su posición mı́nima como
máxima. Para esto se ejecuta la función del bajo nivel “void home all axis()”,que
realiza el homing en los 3 ejes simultaneámente.
Calibrar milı́metros por paso del extrusor
Cuando se quiere extruir una distancia determinada en realidad la cantidad
extruida realmente difiere por una constante, ésta es la que se calibra en este
punto [85].

122
6.4. Software para microcontrolador Arduino

Para esto se manda a extruir una distancia prefijada y se mide cuánto fue la
extrusión real. A partir del cociente de estos dos valores se reajusta la constante
de calibración. Con el objetivo que el usuario no tenga que manipular el firmware,
se programó para que pudiera ingresar los datos desde la interfaz. Para ésto se
implementa un menú en el cual mediante el joystick se selecciona la distancia que
se quiere mover. Luego con el enter se efectúa el movimiento y se mide distancia
real, y se ingresa en el menú. A partir de estos se calcula el factor de ajuste.
Origen de coordenadas del alto nivel
Para que el prototipo no llegue a los lı́mites fı́sicos (salvo en el inicio del pro-
yecto), lo cual puede significar un riesgo desde el punto de vista mecánico, es que
define un origen de coordenadas para el alto nivel del software, Ésto se puede ver
en el Capı́tulo 6. Éste origen de coordenadas por software se fija mediante el uso de
la función “void MovimientoManual(int opcion)”, la cual permite ubicar el puntero
del posicionador en una ubicación especifica del volumen de trabajo. Una vez que
se ubica el puntero en la ubicación donde se desea tener el origen de coordenadas
del software con el enter se confirma como tal. Esto se hace mediante la función
del ejecutador.
Ajuste de la altura de la mesa
Este paso del proceso de calibración se realiza para que cuando se ejecuta
un movimiento en el plano X-Y la distancia del puntero a la mesa se mantenga
constante. Esto depende de 2 elementos: un correcto armado de la estructura y
el ajuste de la mesa. Para realizar este último se ubica el puntero en 4 puntos
cercanos a las esquinas de la mesa de trabajo y se van regulando las mariposas de
las mesas hasta que las distancias al puntero queden todas iguales.
Primero se sitúa el origen de coordenadas del alto nivel tal que la altura en el
primero de los puntos sea correcta, y luego se va a los 3 puntos restantes.
Los parámetros que se deben calibrar [86] son más pero el equipo entendió que
estos son los que presentan una ventaja a la hora de hacerlo en el formato Stand
Alone.

Movimiento Manual
El movimiento manual es una función que se puede invocar desde 2 lugares
distintos en el firmware, en el Main Principal para que el usuario pueda desplazar
el puntero con fines recreativos, y desde la calibración para setear el origen de
coordenadas de alto nivel del posicionador.
En la función se implementa un menú circular donde las opciones son los
distintos ejes, una vez que se selecciona el eje se ingresa en un submenú en los
cuales recorriendo con movimientos laterales del Joystick se eligen las distancias
para avanzar, y con movimientos verticales se efectúan los movimientos en una u
otra dirección.

Main de impresion
El “void MainImprimiendo()” es la función que se invoca cuando se ordena
imprimir. La primer tarea es avisar al Raspberry Pi sobre la realización de una

123
Capı́tulo 6. Software

impresión para que ésta ejecute el algoritmo que implementa la cola de archivos. El
Arduino espera el envió de los “G-code” en éste main. El algoritmo que implementa
el Main de impresión se muestra en la Figura 6.27.

Figura 6.27: Esquema de funcionamiento del Main de impresión.

En primer lugar se declaran los controladores de temperatura pertinentes, se


les setea un setpoint menor al usual (el verdadero setpoint llegará como “G-code”
y el ejecutador se encargará de sobrescribirlo), esto se hace dado que el proceso
de calentamiento es lento. Y por último se llama la función para establecer a que
elementos se le realizará un control de temperatura.
La comunicación serial para transferencia de datos se diseñó para que la Rasp-
berry Pi envı́e los “G-code” luego de que el Arduino se los pida, esto se hace
enviando un carácter de control, el elegido fue el “&”. Para leer los “G-code” se
creó una función, llamada LeoGcode() en la cual se leen string del puerto serial.
Pero a los string se le impone algunas restricciones, estás son coherentes al hecho
de que solo llegaran “G-code” que nuestro firmware puede interpretar, entonces se
ignoran todos los string que no comiencen con “G” o “M”. Y se dan por concluidos
cuando llegue un salto de lı́nea o un “;”, significando que lo siguiente en esa lı́nea
es un comentario.

124
6.5. Simulador

Para no depender de la comunicación en el procesamiento de cada uno de


los “G-code”se decidió almacenarlos en un buffer. En el módulo buffer.cpp se
implementa la clase buffer, que consta de un arreglo de string de un tamaño
determinado, y posee accesibles funciones para el manejo de la cola. Estas funciones
permiten encolar y extraer elementos, consultar si el buffer se encuentra lleno o
vacı́o. Cuando el “buffer” se sature se da lugar al procesamiento, y cuando este se
vacı́e se repite el proceso hasta que se haya completado el envı́o de todo el archivo.
El procesamiento de los “G-code” consta de la invocación de la función “co-
mando interpretar()”, el resultado de esta se pasa como parámetro de la función
“error ejecutar(comando cmd)” y se actualiza la información desplegada en pan-
talla.

Main Fresado
El Main de fresado es análogo al de impresión con la salvedad que cuando se
invoca se debe avisar a la Raspberry Pi que se va a fresar en lugar de imprimir.

6.5. Simulador
6.5.1. Descripción
Al terminar la esencia de la programación, se decidió realizar un simulador
con el objetivo de asegurarse que las salidas hacia los motores reproducen de
manera fidedigna el objeto a extruir. De esta forma, se puede asegurar el correcto
funcionamiento o no de etapas. Si hay diferencia entre un objeto terminado y lo
que se esperaba, el simulador permitirá saber si el problema es mecánico o de
programación.
En el momento de diseñar el simulador, se quiso incluir en el mismo todos los
módulos programados. Tanto los del microcontrolador como los de la Raspberry
Pi. Para que la simulación sea un reflejo fiel de la realidad se deben correr los
programas de igual forma a si estuvieran conectados los motores. Por ésto, tempo-
ralmente, la simulación demora lo mismo que si se estuviera imprimiendo el objeto.
Se optó por hacerlo de esta manera para registrar los datos en pasos del bajo nivel
finales de cada movimiento para los 4 ejes: xyz + e.
La gran dificultad que se presentó es que al Arduino no tener manejo de archivo
(como ya se menciono en la sección 6.2.1), no hace sencilla la recolección de datos.
La solución encontrada fue utilizar en conjunto el software de cálculo numérico
Matlab y el Arduino.
En un primer momento, se pensaba poder mantener el criterio de utilizar todos
los módulos desde los del computador hasta los del microcontrolador. Pero se tuvo
que dejar por fuera los del computador, ya que como se sabe éste envı́a G-code a
G-code al Arduino por medio de comunicación serial surgiendo el problema de que
no se puede establecer comunicación Raspberry Pi-Arduino-Matlab en un mismo
canal de comunicación. Es por eso que se decidió solo simular los módulos del
microcontrolador y en lugar de que los datos de entrada (G-code) vengan desde

125
Capı́tulo 6. Software

un archivo presente en la Raspberry Pi, estarán en la misma PC donde se corre el


simulador.

6.5.2. Funcionamiento lógico


Se preparó un script en Matlab que establece una comunicación Serial con
el Arduino en el cual se ejecuta el código de la máquina a simular. Luego de
establecida la comunicación, Matlab se queda escuchando el puerto donde debe
escribir el Arduino. Cuando Matlab recibe determinado carácter, significa el pedido
de G-codes desde el main de impresión. Ante ésto, Matlab levanta desde el archivo
que contiene los mismos una lı́nea y la envı́a por el puerto Serial al Arduino. Éste
G-code es guardado en un buffer que dependiendo del tamaño de éste, el Arduino
pedirá más lı́neas del archivo para llenarlo y luego comenzar a ejecutar.
Siguiendo el razonamiento como si el buffer fuera de tamaño 1, en el programa
que está corriendo en el micrcontrolador se ejecuta el G-code que llegó por el
envı́o desde Matlab. Éste se queda escuchando el puerto en todo momento luego de
escribir en el mismo. Si recibe un dato que no es el carácter de pedido de G-codes,
entiende que es la posición en pasos del eje X que se escribió en el canal serial
luego de culminado el movimiento correspondiente al G-code ejecutado. Si llegó
la posición en X, a continuación Matlab recibe la cantidad de pasos de los ejes
Y, Z y del extrusor. Matlab se encarga de ir guardando estos datos en un archivo
ubicados en 4 columnas, donde cada fila es el final de un movimiento tanto de
extrusión como solo de desplazamiento (notar que siempre luego de ejecutar una
acción se mandan los datos de los ejes a Matlab, es ası́ que ante acciones que no
representaban movimiento se repite la fila en el archivo que se va armando).
Luego de finalizado el envı́o de G-codes, se termina la ejecución y se procede
a tratar los datos obtenidos que fueron guardados en el PC donde se corrió el
simulador.
Como se sabe, los datos obtenidos son cantidades de pasos de cada eje luego de
cada acción ejecutada respecto al origen del bajo nivel (cero mecánico). El objetivo
del simulador es poder realizar un “ploteo” de lo que serı́a el material extruido en
la máquina. Con lo cual, el resultado esperado es que el plot 3D sea similar al
objeto equivalente al código de máquina tomado como entrada.
Para procesar los datos y lograr el objetivo recién mencionado, se usa como
función principal plot3(X,Y,Z), donde las entradas son matrices. Básicamente, di-
cha función grafica lı́neas rectas en el espacio. Los puntos que definen estas rectas
están determinados por los valores de cada una de las matrices para una misma
entrada de éstas (igual columna, igual fila). Si dichos datos están en la misma co-
lumna entonces recorriendo las columnas desde la primer fila en adelante, cada dos
puntos tengo un segmento de recta (Segmento 1: fila 1, columna 1-fila 2 columna
1; Segmento 2: fila 2, columna 1-fila 3,columna 1; Segmento 3: fila 3,columna 1-fila
4,columna 1; ...), con lo cual, en el gráfico estos son puntos unidos en el espacio.
Luego, cuando aparece una discontinuidad a graficar, es decir, cuando se grafica
otra secuencia de segmentos de recta desde otro punto del espacio, se debe a que
se cambió de columna en las matrices de coordenadas de entrada.

126
6.5. Simulador

Utilizando lo explicado en el párrafo anterior, para llevar a cabo el simulador se


deben armar las matrices de entrada utilizando los datos guardados en el archivo ya
generado con la recepción de datos en Matlab que contiene los datos en cantidades
de pasos. El primer paso es llevar estos datos al sistema de unidades utilizado
(milı́metros o pulgadas) coincidente con el sistema de unidades que utilizó el código
de máquina de entrada (al código que corresponden estas cantidades de pasos).
Luego se debe ir recorriendo los datos del archivo para detectar los movimientos
de no extrusión, los cuales representarán un cambio de columna en las matrices de
entrada que se van armando. Ésto se realiza observando los datos correspondientes
a la columna del extrusor, si la cantidad varió es que hubo extrusión, de lo contrario
fue solo desplazamiento del posicionador.
Finalmente, luego de haber recorrido todos los datos, se tiene las matrices X,
Y y Z de iguales dimensiones. Cada terna de valores formada por una entrada de
iguales ı́ndices de cada una de estas matrices representa un punto en el espacio.
Además se sabe que por fila dichos puntos se van uniendo mediante rectas (con
segmentos de recta más precisamente). Entonces para cada columna se tienen
“caminos” de extrusión continua que simulan la verdadera extrusión de un objeto.
En el Capı́tulo 7 se presentan los resultados obtenidos al aplicar el simulador
a diferentes archivos .gcode.

127
Esta página ha sido intencionalmente dejada en blanco.
Capı́tulo 7

Testeos y medidas

7.1. Introducción
Las pruebas y medidas se organizaron por temática. Se realizaron pruebas sobre
el funcionamiento general del posicionador XYZ. Por otro lado se hicieron testeos
sobre el control de temperatura para el extrusor y la heated bed. Para obtener
resultados del software en general se empleó la simulación comentada en 6.5.
Como siguiente paso, se hicieron pruebas básicas de impresión para corroborar
prácticamente el funcionamiento del software desarrollado por el grupo.

7.2. Posicionador XYZ


En la presente sección se describen las distintas pruebas realizadas con el fin
de determinar el correcto funcionamiento del posicionador. Lo anterior es particu-
larmente importante, los resultados obtenidos en la realización de un proyecto de
impresión 3D o fresado se ven directamente afectados por esto.
Por otro lado, en un sistema controlado en lazo abierto como lo permite el
uso de motores PAP, las cuentas de pasos no se ven compensadas si fenómenos de
la mecánica u operación, hace que se realicen diferente cantidad de pasos que los
contabilizados. Se pierde literalmente el control de la posición real de la máquina.

7.2.1. Experimento de detección de pérdida de Pasos 1


Descripción
En la Figura 7.1 se aprecia un esquema del experimento realizado. La idea es
realizar en un sentido cuatro tramos hasta el punto destino y retornar en un solo
tramo hasta el punto de partida. Claramente en el primer recorrido se agregan un
total de 3 detenciones y 3 arranques sin contar los iniciales y el final donde además
se conmuta el sentido. El mismo debe realizarse para cada eje.
Capı́tulo 7. Testeos y medidas

Figura 7.1: Descripción gráfica del experimento 1.

Se busca obtener un resultado cualitativo, producto de acumular posibles erro-


res sistemáticos, motivo por el cual se realiza un tramo en varios.
Para esto se determina a ojo humano si es considerable la dispersión en el
estado inicial de la posición para cada eje. Es esperable, si se acumula error, que
la variación sea como se indica en la Figura 7.2. El experimento es exitoso si en
un número “N” de iteraciones es despreciable el corrimiento de la posición de cada
eje al retorno frente a la posición inicial. Si falla, puede intentarse una prueba
similar como la indicada en la Figura 7.3 para descartar o no que el problema
pueda deberse a un efecto de arranque-detención. O se puede intentar el mismo
con una rampa de velocidad.

Figura 7.2: Descripción gráfica del error sistemático acumulado en el experimento 1.

Resultado e interpretación
Las condiciones de prueba se pueden resumir en tres parámetros: la cantidad de
pasos a realizar, la velocidad y la cantidad de iteraciones. La Tabla 7.1 resume los
anteriores para las pruebas realizadas en los grados de libertad del posicionador,
donde se utilizó rampa de velocidad para suavizar los arranques y detenciones.
Para realizar las observaciones, se ajustaron marcas en papel que indicaran la
posición inicial.
Un detalle importante a tener en cuenta, es que no se realizaron pruebas de
movimiento en el eje Z, que en la fecha de realización de éstas pruebas, presentaba
problemas mecánicos que comprometı́an el movimiento.
En los ejes X e Y la dispersión resultante no fue apreciable. No se puede
asegurar que no se pierden pasos, pero en principio el resultado es alentador.

130
7.2. Posicionador XYZ

Eje Cantidad de pasos Velocidad (pasos/seg) Iteraciones


Eje X 18896 2250 1000
Eje Y 18896 2250 1000

Tabla 7.1: Parámetros caracterı́sticos del experimento número 1.

7.2.2. Experimento de detección de pérdida de pasos 2


Descripción
Consiste en realizar una trayectoria más compleja como se muestra en la Figura
7.3. La idea es realizar un movimiento en X, luego uno en Z y llegar al punto destino
con un movimiento en el eje Y. Se realiza un retorno al punto inicial simultáneo
en los tres ejes. El recorrido completo se realiza una cantidad “N” de veces al igual
que los anteriores para detectar errores sistemáticos que se hayan acumulado.

Figura 7.3: Descripción gráfica del experimento 2.

El experimento descrito no se pudo realizar dado que en la fecha se presentó


un desperfecto mecánico con el eje Z que impidió la realización de la prueba en
tiempo y forma.

7.2.3. Cuantificación de la repetibilidad:


Descripción
El objetivo del ensayo es obtener un resultado cuantificable de la repetibilidad
de la máquina. Para realizar esto, se analizan e interpretan las medidas obtenidas
y realizan pruebas complementarias que se discutirán. La prueba tiene dos grandes
criterios de éxito. El primero es verificar que la dispersión en la medida de dife-
rentes puntos es aleatoria y no sigue una tendencia. La segunda, es verificar que
la repetibilidad de la máquina en cada eje es menor a 0,15mm

131
Capı́tulo 7. Testeos y medidas

El experimento en esta instancia es similar al presentado para detectar la pérdi-


da de pasos. La Figura 7.4 explica de forma gráfica como se realiza el experimento.
Como puede observarse se realiza un primer recorrido en tres tramos donde que-
dan definidos los extremos de cada tramo, P0 , P1 , P2 , P3 . El segundo recorrido
es un solo tramo desde P3 a P0 o al revés, según el sentido. En ésta ocasión el
experimento se realizó en cada eje sin rampa de velocidad, pero a una velocidad
razonablemente más lenta que en la prueba cualitativa (1125pasos/seg) para que
los arranques y detenciones no produzcan un error notorio y un total de quince
iteraciones.

Figura 7.4: Descripción gráfica del experimento para realizar la cuantificación de la repetibili-
dad.

El procedimiento consiste en registrar la posición en milı́metros de cada Pk


junto a su equivalencia en pasos teóricamente realizados. Las medidas relevadas
se obtienen con un extensiómetro de resolución de una centésima de milı́metro.
Con los datos obtenidos, se obtiene un valor medio de las posiciones y la desvia-
ción estándar de dichos valores cuyo resultado es importante para obtener una
interpretación.
La repetibilidad en cada grado de libertad se define como la mitad del rango.
A su vez, el rango se expresa como se indica en la ecuación (7.1). En cada punto
Pk se obtiene un valor de repetibilidad, por lo que se reportará como precisión el
peor caso.

rango = Pkmax − Pkmin (7.1)


Otro parámetro muy importante a verificar, es la ganancia mecánica de cada
grado de libertad comparándola contra el valor teórico que se observa en 7.2. La
homogeneidad de las varillas roscadas que traccionan en cada eje se verá reflejada
en éste parámetro. Por un lado, puede existir un error frente al valor teórico, pero
si es constante no habrá diferencias en el avance del mecanismo según la zona del

132
7.2. Posicionador XYZ

tornillo. Por otro lado, si además de error frente al valor teórico es variable puede
resultar en un problema grave para la precisión de la máquina.

mm
Gmec = 0, 005291667 (7.2)
paso

En los siguientes párrafos se brindarán los resultados para cada eje y se anali-
zarán los mismos.

Eje X
En la Figura 7.5(a) se observa el montaje de un extensiómetro Mitutoyo de
una centésima de milı́metro de resolución para la realización del experimento en
el eje X de la máquina. Como se puede apreciar el vástago se ubica paralelo a
la dirección del movimiento, apoyándose el mismo perpendicular al borde de la
mesa como indica la Figura 7.5(b). Lo anterior es muy importante, para tener
que evitar realizar una corrección por la tangente del ángulo en que se realiza
el contacto. Aunque si el ángulo es despreciable, también lo es el error que se
comete. La posición del artefacto se fijó a la estructura como muestra la Figura
7.5(a) con ayuda de una morsa. Es imprescindible, que el instrumento de medida
no sea desplazado por acción de la fuerza que arrastra el mecanismo ni cambie su
orientación. Cualquiera de estos errores se traduce en un error de medida.

(a) Montaje del extensiómetro a la es- (b) Vástago del extensiómetro paralelo a
tructura, se aprecia una morsa para fijar la dirección del movimiento.
la posición al aluminio.

Figura 7.5: Montaje del extensiómetro en el eje X.

La Tabla 7.2 resume las medidas obtenidas en el experimento para el eje X.


La Tabla 7.3 resume la posición en pasos que registra el software de bajo nivel de
control de los motores. En una primera inspección de los mismos observamos una
ligera variación respecto de la posición de los diferentes puntos relevados.

133
Capı́tulo 7. Testeos y medidas

X0 (mm) X1 (mm) X2 (mm) X3 (mm)


5.000 10.080 20.640 41.770
5.005 10.080 20.640 41.770
5.005 10.070 20.625 41.760
5.005 10.060 20.630 41.780
5.000 10.077 20.635 41.760
5.005 10.070 20.640 41.765
4.995 10.065 20.625 41.765
5.000 10.070 20.630 41.765
5.010 10.090 20.640 41.770
5.005 10.075 20.630 41.760
5.005 10.080 60.635 41.760
5.000 10.080 20.655 41.770
5.020 10.090 20.640 41.760
5.010 10.080 20.635 41.760
5.000 10.080 20.655 41.755

Tabla 7.2: Medida de distancias realizadas con el extensiómetro para cada punto intermedio
del recorrido.

X0 (pasos) X1 (pasos) X2 (pasos) X3 (pasos)


7000 6000 4000 0

Tabla 7.3: Posición absoluta en pasos para cada punto del recorrido de prueba.

La Tabla 7.4 agrupa los valores medios de cada Pk , k = 0..,3, la desviación


estándar de éstos valores, el rango y la repetibilidad.

X0 X1 X2 X3
Promedio(mm) 5.0040 10.0764 20.6370 41.7646
Desviación estándar(mm) 0.0058 0.0083 0.0090 0.0064
Rango(mm) 0.025 0.030 0.030 0.025
Repetibilidad(mm) 0.0125 0.0150 0.0150 0.0125

Tabla 7.4: Valores medios, desviación estándar, rango y repetibilidad para cada punto Xk .

En principio se puede decir que se cumple con el objetivo de tener una preci-
sión menor a 0,15mm. Pero falta verificar la aleatoriedad, lo cual es esencial para
asegurar que no existe una tendencia de las posiciones relevadas a desplazarse de

134
7.2. Posicionador XYZ

su posición original. En la Figura 7.6(a) podemos observar como no existe una


tendencia al desplazamiento de los puntos del recorrido, manteniéndose cada uno
prácticamente constante. En la Figura 7.6(b) se observa la variación de la posi-
ción para el punto inicial X0 , destacándose el comportamiento aleatorio, lo cual
significa que no se ha detectado un error sistemático que se acumule notoriamente
para un cierto número de iteraciones. En conclusión para el eje X se declara una
repetibilidad de 15 milésimas de milı́metro, tomando como criterio el peor caso.
Se resalta que las medidas fueron realizadas sin lubricación, por lo que es posible
que sean mejores con un correcto mantenimiento.

(a) Variación de la posición de los puntos extremos de cada


tramo.

(b) Variación de la posición del punto inicial X0 .

Figura 7.6: Mediciones de repetibilidad realizadas en el eje X.

135
Capı́tulo 7. Testeos y medidas

Eje Y
El siguiente paso fue repetir el experimento anterior para el eje Y. Para lograr
este objetivo se montó un extensiómetro Mitutoyo idéntico al utilizado en el eje X.

(a) Montaje del extensiómetro (b) Vástago del extensiómetro


para medida de repetibilidad paralelo a la dirección del mo-
en eje Y. vimiento.

Figura 7.7: Montaje del extensiómetro en el eje Y.

Se realizaron quince repeticiones del experimento y se relevaron los mismos


datos que para el eje X. Los resultados obtenidos para este experimento no estu-
vieron a la altura de los obtenidos para el eje X. En la Figura 7.8(a) se aprecia
una leve tendencia a desplazarse de los puntos Y0 Y1 Y2 Y3 hacia una posición menor
a su posición inicial. En la Figura 7.8(b) se observa claramente como la evolución
del punto Y0 es monótona decreciente.
Sin embargo, si observamos en la Figura 7.9 el gráfico de las distancias entre
|Y0 − Y1 |, |Y1 − Y2 | y |Y2 − Y3 |, podemos observar que se mantienen relativamente
constantes, lo que quiere decir que en cada iteración del experimento se recorre la
misma distancia en cada tramo.
El problema detectado, puede tener diferentes orı́genes. Por ejemplo, puede
ser el mecanismo del eje Y que pierda cuentas o que el instrumento se desplace
dado que está mal ajustado. La segunda posibilidad, se constata que no es la causa
del problema. Por lo tanto, se pierden cuentas y es este punto hay dos caminos
a seguir para hallar la razón. Por un lado, puede deberse a esfuerzos mecánicos
que hagan perder pasos al motor que transmite el movimiento al eje Y. O podrı́a
deberse a un problema con la lógica del software. En esta instancia, se optó por
descartar un problema en la lógica ya que ha pasado por diferentes etapas de testeo
donde los errores que podrı́an llevar a dicho efecto sobre el desplazamiento han sido
corregidos. De ésta forma, se concluye que el problema es de origen mecánico y se
decide lubricar el eje con un aceite fino (WD-40) para lograr un mejor movimiento.

136
7.2. Posicionador XYZ

(a) Evolución de los puntos extremos de cada tramo del recorrido


en el eje Y.

(b) Evolución de la posición del punto inicial del recorrido Y0 .

Figura 7.8: Mediciones de repetibilidad en el eje Y.

Se repitió el experimento con el mismo montaje del extensiómetro y obtuvieron


las medidas que se presentan en la Tabla 7.5.

137
Capı́tulo 7. Testeos y medidas

Figura 7.9: Distancia de tramos para el experimento realizado en eje Y.

Y0 (mm) Y1 (mm) Y2 (mm) Y3 (mm)


9.000 14.250 24.775 45.895
9.040 14.250 24.780 45.900
9.030 14.240 24.780 45.900
9.040 14.240 24.780 45.950
9.025 14.240 24.785 45.865
9.030 14.240 24.780 45.880
9.020 14.240 24.765 45.875
9.040 14.230 24.770 45.900
9.035 14.235 24.760 45.895
9.030 14.230 24.760 45.890
9.030 14.235 24.770 45.885
9.030 14.245 24.770 45.895
9.035 14.220 24.760 45.890
9.020 14.240 24.770 45.890
9.040 14.230 24.775 45.875

Tabla 7.5: Medida de distancias realizadas con el extensiómetro para cada punto intermedio
del recorrido en el eje Y.

Como puede observarse en la tabla anterior, ocurrieron mejoras en los resulta-


dos del eje Y. En la Figura 7.10(a) se presenta la evolución de la posición de los
puntos relevados la cual es apreciablemente más constante que antes de lubricar.
Por otro lado, en la Figura 7.10(b) se aprecia la evolución de la posición para el

138
7.2. Posicionador XYZ

punto inicial del recorrido en experimento realizado. Se observa, que presenta un


carácter aleatorio, que hace que el error en el posicionamiento sea en promedio
constante, sin acumularse.

(a) Evolución de la posición de los puntos Yk , luego de lubri-


car el tornillo del eje Y.

(b) Evolución de la posición del punto inicial del recorrido Y0 ,


luego de aplicada la lubricación.

Figura 7.10: Medidas en el eje Y luego de realizar un lubricado en tornillo y rulemanes.

En la Tabla 7.6 se pueden observar los resultados para el valor medio de cada
punto, la desviación estándar, el rango y la repetibilidad. En base a los resultados

139
Capı́tulo 7. Testeos y medidas

presentados, se declara una repetibilidad de 42,5 milésimas de milı́metro con el eje


correctamente lubricado (rulemanes y tornillo).

Y0 Y1 Y2 Y3
Promedio(mm) 9.0291 14.238 24.772 45.829
Desviación estándar(mm) 0.0105 0.0080 0.0082 0.0191
Rango(mm) 0.040 0.030 0.025 0.085
Repetibilidad(mm) 0.020 0.0150 0.0125 0.0425

Tabla 7.6: Valores medios, desviación estándar, rango y repetibilidad para cada punto Yk .

Eje Z
Nuevamente se repitió quince veces el experimento, pero esta vez con el eje Z.
En la Figura 7.11(a) se puede apreciar el montaje de un extensiómetro Mitutoyo
de resolución una centésima de milı́metro y número de serie 3058S-19.

(a) Montaje extensiómetro en la es- (b) Vástago del extensiómetro paralelo


tructura del posicionador para eje Z. a la dirección del movimiento.

Figura 7.11: Montaje del extensiómetro en el eje Z.

En esta etapa tampoco fueron satisfactorios los resultados, siendo incluso mu-
cho peores que los primeros obtenidos para el eje Y ya que a priori no se cumplirı́a
con el criterio de éxito para la repetibilidad en tan solo quince iteraciones. En la Fi-
gura 7.12(a) se observa los resultados de las medidas para los puntos Zk , k = 0..,3.
Se aprecia como decrece la posición de dichos puntos frente a su valor inicial. En la
Figura 7.12(b) se aprecia la misma evolución monótona decreciente para el punto
Z0 .
Claramente, existe un error que se acumula provocando el desplazamiento ob-
servado en las figuras anteriores. Sin embargo, al igual que en el eje Y las distancias
recorridas en cada tramo se mantienen con una variación mı́nima, lo cual habla
muy bien de la homogeneidad del tornillo. En la Figura 7.13 apreciamos estos
resultados.

140
7.2. Posicionador XYZ

(a) Evolución de la posición de los puntos Zk .

(b) Evolución de la posición del punto inicial del recorrido Z0 .

Figura 7.12: Mediciones de repetibiliad en el eje Z.

Las hipótesis para explicar ese error son las mismas que para el eje Y. Nue-
vamente se descarta la posibilidad de desplazamiento del instrumento de medida,
por lo que el origen se debe a una pérdida sistemática de pasos, que tampoco se
debe a la lógica como en el caso anterior, sino a esfuerzos mecánicos. Ası́ mismo,
la solución aplicada consistió en lubricar ambos tornillos de tracción del eje Z y
la polea del tensor de la correa dentada que vincula a ambos. En la Tabla 7.7 se
puede consultar las medidas realizadas de los puntos extremos de cada tramo.
En la Figura 7.14(a) podemos apreciar los resultados gráficamente para los

141
Capı́tulo 7. Testeos y medidas

Figura 7.13: Distancia de tramos para el experimento realizado en eje Z.

Z0 (mm) Z1 (mm) Z2 (mm) Z3 (mm)


6.000 11.320 21.840 42.960
5.880 11.185 21.710 42.860
5.835 11.140 21.710 42.860
5.835 11.135 21.700 42.860
5.835 11.130 21.700 42.860
5.835 11.130 21.700 42.860
5.835 11.130 21.700 42.860
5.830 11.130 21.700 42.855
5.830 11.130 21.695 42.860
5.830 11.130 21.700 42.855
5.830 11.130 21.695 42.850
5.830 11.125 21.695 42.850
5.830 11.120 21.690 42.850
5.835 11.125 21.690 42.850
5.830 11.120 21.690 42.850

Tabla 7.7: Medida de distancias realizadas con el extensiómetro para cada punto intermedio
del recorrido en el eje Z.

142
7.2. Posicionador XYZ

(a) Evolución de la posición de los puntos Zk , luego de aplicar


lubricación.

(b) Evolución de la posición del punto inicial del recorrido Z0 ,


luego de aplicar lubricación.

Figura 7.14: Medidas del eje Z luego de aplicar la lubricación.

cuatro puntos intermedios y en la Figura 7.14(b) se observa el resultado de la


evolución de la posición para el punto inicial del recorrido. Salvo por las dos pri-
meras medidas, el resto de las mismas se repiten bastante con algunas oscilaciones,
producto de la aleatoriedad.
De la tabla anterior podemos observar, una gran mejora general. No obstante,

143
Capı́tulo 7. Testeos y medidas

Z0 Z1 Z2 Z3
Promedio(mm) 5.8459 11.1453 21.7077 42.8627
Desviación estándar(mm) 0.0428 0.0507 0.0371 0.0273
Rango(mm) 0.170 0.200 0.150 0.110
Repetibilidad(mm) 0.085 0.100 0.075 0.055

Tabla 7.8: Valores medios, desviación estándar, rango y repetibilidad para cada punto Yk .

no se alcanza resultados tan buenos como en el eje X o eje Y. Como conclusión


podemos reportar una repetibilidad en el eje Z de 100 milésimas de milı́metro
tomando el peor caso y resaltando que cumple con el criterio de éxito antes men-
cionado.

Verificación de la Ganancia Mecánica


Durante la realización de las pruebas de repetibilidad se obtuvieron diferentes
medidas de cuatro puntos en un recorrido para cada eje del sistema de coordenadas.
En 7.9 y 7.13 se presentó un primer resultado de la variación de la distancia
por cada tramo que une a cada punto intermedio del recorrido y se concluyó
que la variación era mı́nima dado que se mantenı́an relativamente constantes. En
esta sección se presenta para los experimentos exitosos de cuantificación de la
repetibilidad los resultados referentes a la ganancia mecánica. En la Figura 7.15(a)
se muestran los resultados finales para el eje X, en la Figura 7.15(b) se muestra el
comportamiento en el eje Y y en la Figura 7.15(c) se observa para el eje Z.
Como se puede observar la variación no es notoria. En la Tabla 7.9 se compila
todos los resultados obtenidos para cada eje. Donde la ganancia de cada tramo
se calculó como se indica en la ecuación 7.3, donde Pk+1 − Pk es la distancia en
milı́metros entre puntos consecutivos y ∆Nk,k+1 son los pasos realizados en dicho
tramo.

Pk+1 − Pk
G= (7.3)
∆Nk,k+1

Ganancia por Tramo Eje X Eje Y EjeZ


P1 − P 0 0.0050724 0.0052086 0.005299
P2 − P 1 0.0052803 0.0052671 0.0052812
P2 − P 3 0.0052819 0.0052801 0.0052889
P3 − P 0 0.0052515 0.0052662 0.0052881
Promedio 0.0052215 0.0052555 0.0052894
Error Relativo( %) 1.33 0.68 0.04

Tabla 7.9: Ganancias mecánicas relevadas para cada eje y error relativo frente al valor teórico.

144
7.2. Posicionador XYZ

(a) Variación de la distancia por tramo en el eje X.

(b) Variación de la distancia por tramo en el eje Y.

(c) Variación de la distancia por tramo en el eje Z.

Figura 7.15: Comparación de las ganancias mecánicas para los tres grados de libertad luego
de lubricar tornillos y rulemanes.
145
Capı́tulo 7. Testeos y medidas

Como conclusión de este último resultado, se menciona que los tornillos re-
sultan bastante homogéneos ya que la ganancia mecánica medida posee un error
despreciable frente al valor teórico. Y como conclusión general se destaca la ob-
tención de un prototipo basado en materiales que no son de precisión, pero que
sirven para lograr los requerimientos propuestos.

7.3. Control de la temperatura


Se realizaron mediciones de temperatura para los elementos que necesitaban un
sistema de control para dicha magnitud. Estos elementos son el extrusor y la heated
bed. Se comenzó como se recuerda del Capı́tulo 6 con controladores análogos y del
tipo “ON/OFF”, se optó por esta clase de controlador dado que no es necesario
un control más preciso de la temperatura, como lo efectuarı́a un controlador PID.

7.3.1. Heated Bed Platform


Las medidas que se tienen de la temperatura de la heated bed corresponden al
primer prototipo explicado en el Capı́tulo 5, cuando se utilizó un setpoint de 60◦ C.

Figura 7.16: Temperatura de la heated bed platform con un setpoint de 60◦ C, donde cada
iteración es cada 1 segundo.

Cabe destacar que en la Figura 7.16 no se contrasta la medida por software


con la medida real de un termómetro patrón, mas sı́ se compara la temperatura
de estabilización con la medida de un termómetro de mercurio, el cual arrojaba
valores comprendidos entre los lı́mites de las oscilaciones.
Cuando se repitió la prueba con un mayor setpoint, de 110◦ C, la heated bed
llegaba como máximo a 85◦ C. Ésto se observa en la Figura 7.17.

146
7.3. Control de la temperatura

Figura 7.17: Temperatura de la heated bed platform con un setpoint de 110◦ C.

Las medidas de la versión final de la heated bed platform no se pudieron realizar


dado que ésta se diseñó, se fabricaron las partes pero nunca se llegó a armar.

7.3.2. Extrusor
Para sensar la temperatura del extrusor se tiene una termocupla tipo K, la cual
forma parte del extrusor adquirido. Para acondicionar la salida de la termocupla
se utilizó un amplificador AD595 [87], el cual esta calibrado especı́ficamente para
este tipo de termocuplas. Presentando una ganancia igual a la del LM35 de 10mV ◦C .

Cuando se realizaron las primeras pruebas se notó que el extrusor alcanzaba


una temperatura notoriamente superior a la esperada. Por ejemplo cuando se regis-
traba que la temperatura (sensada a través de termocupla) era 220◦ C, en realidad
medida con un termómetro patrón se encontraba a 380◦ C. Para solucionar este
problema se optó por calibrar por software la curva, también se decidió realizar
esta corrección en el tramo de trabajo, o sea entre 200◦ C y 280◦ C.
Para calibrar la curva se empezó por ver gráficamente cómo se relaciona la
temperatura sensada con la del patrón. Para coordinar estas medidas se realizó el
siguiente experimento.
Se programó un módulo de prueba en el cual se inicia con una temperatura,
cuando ésta se registra en el termómetro patrón el usuario toca una tecla del
teclado y se registra la temperatura predeterminada y la que está leyendo en ese
preciso momento. Luego se pasa a otra temperatura de comienzo y repitiendo ası́
el algoritmo.
Como el proceso de calentamiento es más rápido que el de enfriamiento, se
ajustaron pasos distintos para cada caso. Los resultados obtenidos se pueden ver
en la Figura 7.18, donde se efectuaron pasos de 10◦ C para calentar y de 2◦ C para

147
Capı́tulo 7. Testeos y medidas

Temperatura del extrusor calentando Temperatura del extrusor enfriando


180 180

160 160
Temperatura medida por el Arduino (ºC)

Temperatura medida por el Arduino (ºC)


140
140

120
120
100
100
80

80
60

40 60

20 40
0 50 100 150 200 250 300 50 100 150 200 250 300
Temperatura medida con el termometro patron (°C) Temperatura medida con el termometro patron (°C)

(a) Medidas con el extrusor calentando. (b) Medidas con el extrusor enfriando.

Figura 7.18: Medidas de la temperatura vs termómetro patrón.

enfriar.
Como primera conclusión a partir de la Figura 7.18 se observa que existe una
relación lineal entre la medida que se realiza mediante la termocupla y la del
patrón. Por esta razón se proyecta solucionar la diferencia cambiando el factor
que relaciona la tensión de salida del amplificador y la temperatura. Repitiendo
el experimento con el factor corregido se obtienen los resultados que se ven en la
Figura 7.19, en la cual se presenta una recta con pendiente casi igual a 1. Y las
medidas para un setpoint igual a 220◦ C se muestran en la Figura 7.20.
Además con ayuda de Matlab se obtuvo el modelo de primer orden de la gráfica
mostrada en la Figura 7.19, y se agregó en el código del controlador para corregir
la temperatura leı́da para el caso del extrusor.

Nuevo controlador
Cuando se realizaron las primeras pruebas de impresión se notó que la tem-
peratura del extrusor era inferior al valor mı́nimo exigido para la extrusión. Ésto
difiere de los resultados que se muestran en la Figura 7.20, lo que se explica con
que dichas medidas se realizaron con el extrusor quieto y sin extruir, factores que
provocan una mayor pérdida de energı́a .
Para mejorar el control de la temperatura sin modificar esencialmente el funcio-
namiento del mismo, se implementó un controlador que sigue teniendo por salida
valores lógicos, fuente encendida o apagada. Cada un segundo se mide la tem-
peratura y se compara con setpoint, dependiendo de cuanto difieran se establece
cuanto es el transcurso del segundo en que la fuente estará encendida o apagada.
La implementación del controlador se explica más en detalle en la Sección 6.4.2.
Considerando el valor medio de la salida en un segundo, se puede interpretar
el sistema de control como una especie de controlador proporcional, esto es cierto
dentro del rango de control. Dado que por fuera de éste la salida se encuentra total-
mente encendida o apagada, pero cuando el error relativo se encuentra contenido en

148
7.3. Control de la temperatura

Temperatura del extrusor


300

250

Temperatura medida por el Arduino (ºC)


200

150

100

50

0
0 50 100 150 200 250 300
Temperatura medida con el termometro patron (°C)

Figura 7.19: Medidas del extrusor con el factor corregido.

Figura 7.20: Temperatura del extrusor con un setpoint de 220◦ C. Iteraciones cada un segundo.

dicho rango el valor medio de la salida en un segundo depende proporcionalmente


de dicho error, con la salvedad de que la salida se controla de forma discreta.
Cuando se comparó el nuevo sistema de control con el anterior (“ON/OFF”)
en las mismas condiciones se encontró que los resultados mejoraban, o sea que las
oscilaciones eran menores, como se puede ver en la Figura 7.21. En dicha figura se

149
Capı́tulo 7. Testeos y medidas

(a) Controlador “ON/OFF”.

Temperatura del Extrusor


220

200

180

160
Temperatura (ºC)

140

120

100

80

60

40

20
0 200 400 600 800 1000 1200 1400 1600
Iteracion

(b) Controlador nuevo con un rango de control de


7 %.

Figura 7.21: Temperatura medida con un setpoint igual a 220◦ C para los dos sistemas de
control. Iteraciones cada un segundo.

puede ver que la temperatura a la que se estabiliza es inferior, más las oscilaciones
son mucho menores.
Una de las primeras observaciones que se apreciaron en el sistema de control,
es que al ser fija la cantidad de valores en que se puede setear el contador y al
variar el rango en el que se implementa el control, lo que se modifica es la ganancia
del controlador. Un ejemplo de ésto se puede apreciar en la Figura 7.22, donde el
ejemplo con un porcentaje menor presenta mayores oscilaciones. Este fenómeno
es de esperar ya que bajar el rango de control implica aumentar la pendiente del
rango lineal del controlador y al igual que en un control proporcional, aumentar

150
7.3. Control de la temperatura

Temperatura del Extrusor Temperatura del Extrusor


220 220

200
200

180
180
Temperatura (ºC)

Temperatura (ºC)
160
160
140

140
120

120
100

100 80
0 100 200 300 400 500 600 700 800 900 1000 0 100 200 300 400 500 600
Iteracion Iteracion

(a) Controlador nuevo con un rango de con- (b) Controlador nuevo con un rango de con-
trol de 4, 5 %. trol de 6 %.

Figura 7.22: Temperatura medida con un setpoint igual a 220◦ C con distintos rangos de
control. Iteraciones cada un segundo.

Setpoint (◦ C) Temperatura de estabilización (◦ C)


210 202
220 216.5
230 218
240 226.5

Tabla 7.10: Setpoint vs temperatura de estabilización.

demasiado la ganancia puede volver inestable al sistema.


Por último como se mostró en todas las figuras, la temperatura a la que se
estabiliza difiere del setpoint, por más que el error oscila muy poco la naturaleza
del controlador no permite anular éste. Lo que se observa en la Figura 7.23 son
las medidas de la temperatura para distintos setpoints, éstos fueron 210◦ C, 220◦ C,
230◦ C y 240◦ C.
La diferencia entre la temperatura alcanzada y el setpoint se puede explicar en
que el controlador busca lograr un equilibrio entre la energı́a recibida y la disipada
por el hot end, y este equilibrio se logra en nuestro caso a una temperatura inferior
al setpoint. Las temperaturas a las que se estabiliza se pueden ver en la Tabla 7.10.
Las medidas oscilan en un rango inferior a ±2,5◦ C.
Como conclusión es de remarcar que aunque se comenzó con la idea de im-
plementar un control de temperatura más simple, por causas reales se encontró la
necesidad de mejorar dicho control. Lo cual se pudo realizar en un determinado
plazo y sin agregarle al mismo una gran complejidad, como puede ser que el siste-
ma tenga memoria, lo que permitirı́a anular el error, dejando ésto como trabajo a

151
Capı́tulo 7. Testeos y medidas

Temperatura del Extrusor Temperatura del Extrusor


220 220

200 200

180 180
Temperatura (ºC)

Temperatura (ºC)
160 160

140 140

120 120

100 100
0 500 1000 1500 2000 2500 3000 3500 4000 0 200 400 600 800 1000 1200
Iteracion Iteracion

(a) Setpoint= 210◦ C. (b) Setpoint= 220◦ C.

Temperatura del Extrusor Temperatura del Extrusor


240 240

220
220
200
200
180
Temperatura (ºC)

Temperatura (ºC)

180
160

160 140

120
140
100
120
80
100
60

80 40
0 500 1000 1500 0 500 1000 1500
Iteracion Iteracion

(c) Setpoint= 230◦ C. (d) Setpoint= 240◦ C.

Figura 7.23: Temperatura medida con un setpoint igual a 220◦ C con distintos rangos de
control. Iteraciones cada un segundo.

futuro.

7.4. Simulación Software e Impresión


7.4.1. Descripción
En una primera instancia, para el testeo del software se realizaron dos tareas
que se explican en la Sección 6.5, que recordando, consistieron en la escritura al
puerto serial de los datos en cantidad de pasos del control de bajo nivel luego
de cada movimiento y la captura de los mismos mediante Matlab para su proce-
samiento y posterior ploteo de la trayectoria que describe el cabezal durante la
extrusión. En otras palabras se realizó un simulador para verificar si la salida se

152
7.4. Simulación Software e Impresión

corresponderı́a con la entrada del archivo .gcode que se intentará imprimir.


Las pruebas a realizar consistieron en la simulación de la extrusión de:

Un cubo de 2 × 2 × 2cm3

Una cuchara

El contorno del territorio Uruguayo

En una segunda instancia se procede a imprimir aquellos modelos ya simulados.


Se presta especial atención al patrón descrito durante la impresión y se compara
con la trayectoria resultante de la simulación. Se detectan además problemas que
puedan existir de temperatura, de posicionamiento por mecánica o lógica.

7.4.2. Resultados e interpretación


En el caso del cubo la simulación obtenida se puede apreciar en la Figura
7.24(a). Lo primero a destacar es que se respeta la forma geométrica caracterı́stica
del mismo y también las dimensiones. Por otro lado, en la Figura 7.24(b) se puede
apreciar mejor el patrón que deberı́a seguir la trayectoria del puntero cuando
extruye.
En un primer intento de impresión de algunas capas de dicho cubo se obtuvo
el resultado que se aprecia en la Figura 7.25(a). Como puede observarse, dichas
capaz resultaron muy sólidas y no describen el patrón de la simulación. La razón
se debe a un error de calibración de la cantidad de milı́metros de filamento que se
extruye por paso del motor.
Realizando un experimento para la calibración como se indica en [85] se logra
mejorar el resultado y obtener un patrón adecuado, el cual se puede observar en la
Figura 7.25(b). Al momento de imprimir el modelo completo, se detectaron ciertos
problemas, algunos de los cuales fueron resueltos en secciones anteriores. En la
Figura 7.25(c) se puede apreciar el resultado.
Los problemas detectados son tres: primero, con el aumento de temperatura el
dispositivo que tracciona el filamento pasado un tiempo de encontrarse intentando
llegar al equilibrio térmico con la boquilla caliente, alcanza una temperatura tal
que el filamento se ablanda. Por tal motivo, se descarrila y la maquina puede dejar
de extruir. El problema surge que durante la prueba, no se utilizó el ventilador
para mantener a una temperatura adecuada la zona de tracción.
Por otro lado, las oscilaciones de la temperatura en sı́, superan el margen
impuesto por software para permitir extrusión. Sucede generalmente, que se debe
calentar y por lo tanto se espera a que la temperatura alcance el rango centrado en
el valor deseado. Por último se detectó en el eje Y un desplazamiento de la posición,
como éste experimento se realizó con anterioridad a la medida de repetibilidad, se
considera ya resuelto.
Se intentó simular una cuchara, pero durante el proceso una desconexión pro-
vocó la detención de la transmición de comandos G-codes desde el PC corriendo
Matlab para que procese el Arduino y no pudiendo retomar el trabajo posterior-
mente. No se reinició la prueba debido al tiempo que consumı́a de alrededor de 5

153
Capı́tulo 7. Testeos y medidas

(a) Resultado de simulación de un cubo de 8cm3 con sistema de coordenadas ab-


soluto y unidades en milı́metros.

(b) Patrón descripto en la simulación pa-


ra el relleno del cubo al 20 %.

Figura 7.24: Resultados de simulación.

horas. En la Figura 7.26 se aprecia el resultado y se destaca la forma curva, propia


de la geometrı́a de la misma.
También se generó una simulación del espacio terrestre del Uruguay, que posee
unas dimensiones pequeñas en el modelo simulado. En la Figura 7.27 podemos
apreciar el resultado.

154
7.4. Simulación Software e Impresión

(a) Primer intento de (b) Segundo intento (c) Tercer intento de


impresión, con un mal de impresión donde se impresión, modelo com-
ajuste de la cantidad de ajusto la constate de pleto de cubo de 8cm3 .
milı́metros por paso ex- calibración en 1.5.
truidos de filamento.

Figura 7.25: Pruebas de impresión realizadas a la fecha.

Figura 7.26: Simulación de una cuchara sin terminar, con sistema de coordenadas absoluto y
unidades en milı́metros.

155
Capı́tulo 7. Testeos y medidas

Figura 7.27: Simulación del territorio Uruguayo, con sistema de coordenadas absoluto y uni-
dades en milı́metros.

156
Capı́tulo 8

Conclusiones y trabajo a futuro

8.1. Conclusiones
El presente capı́tulo busca resumir los logros alcanzados en el desarrollo del
proyecto.
Se alcanzó la realización de un principio-fin en el diseño y construcción del po-
sicionador XYZ, con un desarrollo ı́ntegro de software, electrónica y mecánica que
cumple con las necesidades del prototipo, obteniéndose una máquina que prueba el
concepto general de funcionamiento (ver Figuras 8.1 y 8.2). La misma está abierta
a distintos usos para aplicaciones tridimensionales, dando lugar a un uso eficiente
del espacio.

Figura 8.1: Fotografı́a del prototipo fabricado, vista frontal.


Capı́tulo 8. Conclusiones y trabajo a futuro

Figura 8.2: Fotografı́a del prototipo fabricado, vista posterior.

Comenzando por la mecánica del prototipo, se logró el diseño y armado de


una estructura modular capaz de ser accionada mediante motores paso a paso. La
implementación de la misma involucró la necesidad de surtir diferentes dificultades
a las cuales ningún miembro del equipo de trabajo se encontraba familiarizado. Fue
en las tareas referidas a este tema donde se tuvieron las principales dificultades
que consumieron una importante carga horaria de la total dedicada al proyecto.
Los problemas resueltos se resumen a continuación:

Backlash en los ejes X e Y: Se utilizaron resortes y una segunda tuerca por


eje para lograr una tracción contra la misma cara de los tornillos sin fin.

Excentricidad tornillos: Se diseño un collar de empuje para absorber el efecto


producido por la excentricidad y se implemetó en cada eje.

Segundo tornillo de tracción para eje Z: Se agrego un segundo eje de tracción


para eliminar vibraciones en la dirección vertical y se vinculó al primer
tornillo del eje Z mediante un correa dentada y un tensor.

Por otro lado se realizó un sistema basado en finales de carrera mecánicos que
además de utilizarse para obtener una posición inicial de referencia sirven para
protección mecánica. Se cumplieron las metas en cuanto a volumen de trabajo,
obteniéndose un volumen de 35,8cm × 31,4cm × 32,1cm. En cuanto a precisión se
obtuvo en el peor caso 0,1mm de repetibilidad.
Continuando con la electrónica, se destaca la elección del hardware que cumple
con los requerimientos. En particular, la placa Raspberry Pi la cual no se explotó
en deması́a abre la posibilidad a futuras mejoras que requieran más capacidad

158
8.1. Conclusiones

de procesamiento o un cambio en el esquema de software. Es de destacar que la


integración de toda la electrónica no resultó tarea sencilla, pero se logró en forma
satisfactoria.
Otro punto importante a mencionar y que es vital para el funcionamiento del
dispositivo es el desarrollo de los drivers de los motores PAP. Su implementación
basada en los integrados L297 y L298 involucró un tiempo importante dedicado a la
lectura y compresión tanto de hojas de datos como hojas de aplicación. Ésto llevó
a un diseño que evoluciono hasta que se obtuvo una versión capaz de comandar
los motores incluso en un caso tan exigente como el eje vertical (consume más
corriente para aplicar el torque necesario y comenzar el movimiento). Algunas
caracterı́sticas relevantes que se implementaron se resumen a continuación:
Half-Step: Reduce efectos de resonancia.
Control de Torque: Cuando el estado de las fases es tal que una bobina se
encuentra desenergizada, aumenta la corriente por la bobina restante. Se
denomina también Half-Step with shaping y logra reponer el torque efectivo
prácticamente al del nivel en modo de operación Full-Step.
Además, se implementó una interfaz para el usuario a partir de la cual se
puede controlar manualmente la máquina, calibrar o indicar que comience un nuevo
trabajo.
En cuanto al software, es destacable el desarrollo realizado por el equipo. El
mismo involucra desde rutinas para la lectura de un archivo G-code, su transmisión,
su procesamiento hasta el control general de la máquina.
Si bien todos los módulos involucraron un trabajo arduo con varias horas de
dedicación y testeo, se elije mencionar particularmente los relacionados al control
de posición, velocidad y temperatura por ser los bloques de más bajo nivel y que
se relacionan más directamente con la electrónica del prototipo.
El control de posición, se desarrolló en base a un solo timer de 16 bits de los
disponibles en la placa Arduino para controlar el movimiento de cuatro motores
paso a paso. Dicha tarea no resultó sencilla, debiéndose dedicar muchas horas a
la optimización del código y aceptar limitaciones de procesamiento en la placa
Arduino para lograr avanzar. Por otro lado, el control de velocidad surgió como
una necesidad para suavizar los movimientos, y ası́ reducir posibles pérdidas de
pasos por arranques y detenciones bruscas. Su realización basada en modulación
de la frecuencia del timer (Master Clock )fue un desafı́o, ya que debı́a lograrse sin
comprometer el funcionamiento de la rutina de movimiento.
En la práctica se determinó mediante experimentos con un dispositivo de-
nominado extensiómetro la repetibilidad de cada eje, sin considerar el efecto de
operación de otros ejes. Los resultados que ya fueron presentados en el Capı́tulo 7
y en el corriente fueron ampliamente satisfactorios. El funcionamiento del control
de velocidad se comprobó mediante osciloscópio, como mostró en el Capı́tulo 6.
El control de temperatura involucró la transición de un control ON/OFF a un
control proporcional, donde el ciclo de trabajo de un mosfet de potencia en un
periódo de un segundo es proporcional al error relativo de la medida de tempera-
tura contra el Setpoint. Se compararon los resultados para diferentes respuestas al

159
Capı́tulo 8. Conclusiones y trabajo a futuro

escalón con las obtenidas para el controlador ON/OFF y se verificó una drástica
disminución de las oscilaciones. En la práctica, se observó una mayor fluidez entre
movimientos consecutivos del prototipo durante una impresión, en otras palabras
menos cortes por salirse del rango deseado de temperatura.
Otros puntos no mencionados pero que merecen un lugar en este capı́tulo son
la configuración de la placa Raspberry Pi para que establezca una red inalámbri-
ca para la transferencia del archivo G-code. Se logró aplicar un procedimiento de
calibración para encontrar la ortogonalidad de la mesa de trabajo, aunque no se
llegó a acabar el diseño previsto. Y un procedimiento para calibrar el espesor de
filamento extrudido, necesario para obtener mejor calidad en la pieza. Se realizaron
simulaciones varias de prototipos a imprimir, cubos, cucharas, territorio uruguayo,
engranajes, además se efectuaron impresiones de cubos para comparar el resulta-
do final con lo obtenido en las simulaciones. Los resultados fueron satisfactorios,
aunque se encontraron detalles a mejorar tras obtener las impresiones.
Como reflexión grupal, la ejecución del presente proyecto derivó en un estudio
e investigación en distintas áreas por todos los puntos que se debieron atacar. Esto
permitió acrecentar tanto el conocimiento como la práctica de distintos temas
aprendidos durante la carrera.

8.2. Trabajo a futuro


Al haber sido el objetivo del proyecto crear el prototipo y dejarlo funcional,
provocó que haya determinados puntos para los cuales no se pensó una solución,
otros para los cuales se podrı́a encontrar otra alternativa de solución, o simplemente
mejorar alguna solución implementada.
Pero principalmente con la presente construcción y desarrollo funcional, se
espera que puedan surgir ideas para las distintas aplicaciones que pueden hacer
uso del posicionador, por ejemplo pensando en futuros proyectos de fin de grado.
A continuación se detalla una selección de puntos divididos por las áreas de
mecánica, electrónica y software, que el equipo considera que se deben atacar para
cubrir faltantes o mejorar soluciones presentadas.

Mecánica:
Los siguientes puntos están pensados para mejorar. Es decir, para tener
en cuenta en una nueva construcción o si en algún momento se decidiera
desarmar el prototipo.

• Cambio de guı́as: las colocadas son de 8mm, por unas de mayor diáme-
tro, lo que brindará una mayor firmeza en la estructura y que soporten
los esfuerzos a las que están sometidas.
• Evaluar cambio de motor en el eje Z (vertical) por uno de mayor tor-
que: no se logró una velocidad máxima comparable a la conseguida en
los demás ejes. Esto se debe a que dicho eje debe realizar movimientos
hacia arriba que tienen en contra el peso de toda la parte móvil (es-
tructura de eje Y) y como ya se ha mencionado a altas velocidades los

160
8.2. Trabajo a futuro

motores paso a paso bajan su torque lo que provoca que la fuerza de


tracción en el eje vertical a alta velocidad no sea suficiente.
• Mejorar las piezas de tracción de cada eje con el objetivo de corregir
todavı́a más la excentricidad del tornillo, o plantearse un cambio de
tornillo, colocando uno de calidad adecuado para este tipo de máquinas.

Ahora se presentan tareas que se deben realizar para ultimar el prototipo.

• Colocar una cubierta de policarbonato transparente que aı́sle a la


máquina del exterior. Cubierta obligatoria para la aplicación de fre-
sado.
• Realizar adaptación para poder colocar de forma práctica el cabezal
de fresado.
• Colocar mesa nivelable, cuyo sistema ya esta implementado.

Electrónica:

• Comprar una fuente igual a la que tiene colocada el prototipo actual-


mente para duplicar la alimentación. Trabajando a 24V de tensión, si
se calcula un peor caso de consumo se estarı́an consumiendo 24, 6A
(3, 4 × 4A motores, 5A heated bed, 2A extrusor, 1A (consumo estático
de cada uno de los circuitos y consumo de placas inteligentes)). De to-
das formas, por un tema de combinación de movimientos y velocidades
de éstos, estarı́a bien poder dar de alimentación 17, 6A.
• Realizar el circuito impreso del controlador de motores de corriente
continua (PCB ya esta diseñado), que permite control de velocidad
desde el microcontrolador utilizado, pudiendo manejar dos canales de
motores diferentes. Se debe utilizar para el motor del cabezal fresador
y serı́a buena práctica usarlo para controlar el ventilador del cabezal
de impresión.
• Colocar la heated bed ya fabricada.

Software:

• Realizar una interfaz de usuario más amigable para la transmisión del


archivo .gcode a la máquina.
• Replantear el razonamiento del módulo de más bajo nivel que controla
los motores paso a paso con el objetivo de basarlo en un modelo fı́sico.
Esto permitirá poder generar las frecuencias correspondientes a cada
movimiento de cada uno de los ejes de forma independiente, brindando
la posibilidad de realizar de forma óptima las rampas de aceleración y
frenado.
• Hacer el control de temperatura más eficiente, para anular el error. Por
ejemplo implementado un control PID.

161
Capı́tulo 8. Conclusiones y trabajo a futuro

• Realizar el módulo para interpretar las lı́neas de código de máquina


referidas a la aplicación de fresado. Básicamente es replicar el módulo
interprete.cpp de impresión y realizar las modificaciones pertinentes
(cantidad de números que describen la acción, entre otras) para el
código de fresado.

Con este prototipo se quiso dejar las puertas abiertas para desarrollar distintas
funciones que se asocien al uso del posicionador, con lo cual desde el comienzo del
proyecto se vio como tarea a futuro el poder buscar estas funciones, que se sumen
a la de impresión 3D y fresado, como puede ser la función de escaneo 3D, buscando
una alternativa que usufructúe la capacidad de que el puntero se puede ubicar en
cualquier punto del volumen de trabajo.

162
Apéndice A

Doxygen de las interfaces del Código


My Project

Generated by Doxygen 1.8.8

Thu Apr 23 2015 20:16:58


Contents

1 Data Structure Index 1


1.1 Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 File Index 3
2.1 File List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3 Data Structure Documentation 5


3.1 banderas Struct Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2 Field Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2.1 extrudeON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2.2 extruder_mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2.3 fan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2.4 inches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2.5 retract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.2.6 sentido_CW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.2.7 system_coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 buffer Class Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.2 Constructor & Destructor Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.2.1 buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.3 Member Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.3.1 add . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.3.2 get . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.3.3 getEnvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.3.4 getGuardo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.3.5 isEmpty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.3.6 isFull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2.3.7 len . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 comando Struct Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3.2 Field Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
iv CONTENTS

3.3.2.1 accion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.2 center_IJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.3 datos_ejes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.4 extrudeON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.5 extruder_mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.6 fan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.7 flag_datosNuevos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.8 message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.9 param_B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.10 param_F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.11 param_L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.12 param_P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2.13 param_R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2.14 param_S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2.15 param_T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2.16 power . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2.17 retract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2.18 sentido_CW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2.19 system_coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4 contTemp Class Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.2 Constructor & Destructor Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.2.1 contTemp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.2.2 contTemp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3 Member Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3.1 controlTemp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3.2 fanOFF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3.3 fanON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3.4 getCont_por . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.3.5 getFlag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4.3.6 getOutput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4.3.7 getSetpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4.3.8 getTemp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4.3.9 off . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4.3.10 on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4.3.11 reduce_cont_por . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4.3.12 setSetpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5 datos Struct Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.5.2 Field Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


CONTENTS v

3.5.2.1 center_IJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.5.2.2 datos_aceleracion_extruyendo . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.5.2.3 datos_ejes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.5.2.4 datos_ejes_retract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.5.2.5 datos_origenHighLevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.6 datos_origenHighLevelINCHES . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.7 datos_origenHighLevelMM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.8 delta_nueva_posicionINCHESabs . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.9 delta_nueva_posicionINCHESrel . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.10 delta_nueva_posicionMMabs . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.11 delta_nueva_posicionMMrel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.12 max_jerk_xy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.13 max_jerk_z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.14 message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.15 MinSegmentTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.16 offset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5.2.17 param_B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.18 param_F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.19 param_L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.20 param_P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.21 param_R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.22 param_S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.23 param_T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.24 step_per_unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.25 velocidad_retract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.26 VelocidadTravelMin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.5.2.27 VelocidadTravelMinImpresion . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.6 registroErrores Struct Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.6.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.6.2 Field Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.6.2.1 err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.6.2.2 indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.7 vel Struct Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.7.1 Detailed Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.7.2 Field Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.7.2.1 ve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.7.2.2 vx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.7.2.3 vy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.7.2.4 vz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


vi CONTENTS

4 File Documentation 23
4.1 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/buffer.h File Reference . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.1.1 LARGO_BUFFER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.1.2 LARGO_STRING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/Calibracion.h File Reference . . . . . . . . . . . . . . . . . . . . . 24
4.2.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2.1.1 calibracion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/controlXYZ_E.h File Reference . . . . . . . . . . . . . . . . . . . 25
4.3.1 Typedef Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.1.1 eje_k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.1.2 propiedad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.2 Enumeration Type Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.2.1 ejes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.2.2 propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.3 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.1 consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.2 consultaPos_objE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.3 consultaPos_objX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.4 consultaPos_objY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.5 consultaPos_objZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.6 consultaPosE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.7 consultaPosX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.8 consultaPosY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.9 consultaPosZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.10 consultaVelE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.11 consultaVelX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3.12 consultaVelY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.13 consultaVelZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.14 deltaE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.15 deltaX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.16 deltaY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.17 deltaZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.18 getMovimientoE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.19 getMovimientoX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.3.20 getMovimientoY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.3.21 getMovimientoZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.3.22 getSentidoE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


CONTENTS vii

4.3.3.23 getSentidoX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.3.3.24 getSentidoY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.3.3.25 getSentidoZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.3.3.26 restart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.3.3.27 setObjetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

4.3.3.28 setPosicion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

4.3.3.29 setVelocidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

4.4 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-


Software/Anexo codigo/Codigo/contTemp.h File Reference . . . . . . . . . . . . . . . . . . . . . 30

4.4.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4.1.1 POR_FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4.1.2 PROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4.2 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4.2.1 controlarTemperatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4.2.2 iniTempClock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4.2.3 SetearCont_por . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4.5 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-


Software/Anexo codigo/Codigo/Display.h File Reference . . . . . . . . . . . . . . . . . . . . . . . 32

4.5.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.1 PIN_ABAJO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.2 PIN_ARRIBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.3 PIN_DERECHO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.4 PIN_ENTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.5 PIN_EXIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.6 PIN_IZQUIERDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5.1.7 TIEMPO_ANTIREBOTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.1 antirebote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.2 DisplayAltMesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.3 DisplayCalibrar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.4 DisplayClear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.5 DisplayFresado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.6 DisplayHoming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.5.2.7 DisplayImprimiendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.5.2.8 DisplayImprimir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.5.2.9 DisplayManual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.5.2.10 DisplayMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.5.2.11 DisplaymmXpaso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.5.2.12 DisplaymmXpasoMed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.5.2.13 DisplaymmXpasoObj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


viii CONTENTS

4.5.2.14 DisplayMovX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5.2.15 DisplayMovY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5.2.16 DisplayMovZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5.2.17 DisplayOffset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5.2.18 DisplaySalir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5.2.19 InicializarDisplay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.5.2.20 recibir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.5.2.21 RefreshDisplay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/ejecutador.h File Reference . . . . . . . . . . . . . . . . . . . . . 38
4.6.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.6.1.1 cantidadPeriodosMCLKinches . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.6.1.2 cantidadPeriodosMCLKinchesE . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.6.1.3 cantidadPeriodosMCLKmm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.6.1.4 cantidadPeriodosMCLKmmE . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.6.1.5 controlEntradaE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.6.1.6 controlEntradaEJE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.6.1.7 controlEntradaVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.6.1.8 controlEntradaXYZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.6.1.9 controlEntradaZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.6.1.10 distanciaEinchesAPasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.6.1.11 distanciaEmmAPasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.6.1.12 distanciainchesAPasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.6.1.13 distanciammAPasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.6.1.14 ejecutar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6.1.15 inicializarEjecutador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6.1.16 moverLinealConExtruir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6.1.17 moverLinealSinExtruir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6.1.18 pasosAdistanciaINCHES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.6.1.19 pasosAdistanciaINCHESE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.6.1.20 pasosAdistanciaMM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.6.1.21 pasosAdistanciaMME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.6.1.22 printEntrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.23 printSalida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.24 printSalidaPosta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.25 setHomeOffset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.26 setRegistroEinchesAbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.27 setRegistroEinchesRel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.28 setRegistroEmmAbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.6.1.29 setRegistroEmmRel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


CONTENTS ix

4.6.1.30 setRegistroXYZinchesAbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.6.1.31 setRegistroXYZinchesRel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.6.1.32 setRegistroXYZmmAbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.6.1.33 setRegistroXYZmmRel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6.1.34 tiempoABSinches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6.1.35 tiempoABSmm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6.1.36 tiempoREL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6.1.37 velejeEABSinches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6.1.38 velejeEABSmm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6.1.39 velejeErelINCHES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6.1.40 velejeErelMM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6.1.41 velXejeABSinches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.6.1.42 velXejeABSmm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.6.1.43 velXejeREL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.7 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/errores.h File Reference . . . . . . . . . . . . . . . . . . . . . . . 49
4.7.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.1.1 TAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.2 Typedef Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.2.1 error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.3 Enumeration Type Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.3.1 eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.8 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/interprete.h File Reference . . . . . . . . . . . . . . . . . . . . . . 51
4.8.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8.1.1 MAX_speed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8.2 Typedef Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8.2.1 acciones_t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8.3 Enumeration Type Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8.3.1 acciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8.4 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.8.4.1 ini_comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.8.4.2 interpretar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/layerHW.h File Reference . . . . . . . . . . . . . . . . . . . . . . 52
4.9.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.1 BOTON_EMERGENCIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.2 CLK_E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.3 CLK_X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.4 CLK_Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.5 CLK_Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


x CONTENTS

4.9.1.6 Contador_max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.7 Contador_min . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.8 deshabMotorE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.9 deshabMotorX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.10 deshabMotorY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.11 deshabMotorZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.12 ENABLE_E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.9.1.13 ENABLE_X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.14 ENABLE_Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.15 ENABLE_Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.16 F_CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.17 FrecCont_divider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.18 ini_systemClock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.19 min_t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.20 MotorE_reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.9.1.21 MotorX_reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.22 MotorY_reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.23 MotorZ_reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.24 moveE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.25 moveX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.26 moveY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.27 moveZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.28 RESET_E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.9.1.29 RESET_X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.30 RESET_Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.31 RESET_Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.32 SENTIDO_E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.33 SENTIDO_X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.34 SENTIDO_Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.35 SENTIDO_Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.36 SW_X0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.37 SW_X1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.38 SW_Y0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.39 SW_Y1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.40 SW_Z0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.9.1.41 SW_Z1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.2 Typedef Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.2.1 motores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.3 Enumeration Type Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.3.1 motor_i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


CONTENTS xi

4.9.4 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59


4.9.4.1 configDriver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.4.2 configPorts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.4.3 configTimerE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.9.4.4 configTimerX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.5 configTimerY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.6 configTimerZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.7 deshabTimerE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.8 deshabTimerX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.9 deshabTimerY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.10 deshabTimerZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.4.11 iniMasterClock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.5 Variable Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.9.5.1 Cmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.2 data_OCR3A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.3 flagE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.4 flagEmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.5 flagReconfTimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.6 flagTimeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.7 flagX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.8 flagY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.9 flagZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.9.5.10 Ninst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.9.5.11 Pmax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.10 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/Main_imprimiendo.h File Reference . . . . . . . . . . . . . . . . . 62
4.10.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.10.1.1 LeoGcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.10.1.2 MainImprimiendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.11 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/MovimientoManual.h File Reference . . . . . . . . . . . . . . . . . 63
4.11.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.11.1.1 MovimientoManual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.12 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/setup.h File Reference . . . . . . . . . . . . . . . . . . . . . . . . 63
4.12.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.1 DiamTornilloEmm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.2 E_MAX_INCHES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.3 E_MAX_MM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.4 frecMCLK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.5 HILOSxPULGADA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


xii CONTENTS

4.12.1.6 K_EXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.7 MAX_TEMP_EXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.12.1.8 MAX_TEMP_HEATEDBED . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.9 PASOSxVUELTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.10 PULGADASaMILIMETROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.11 T_MCLK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.12 VELOCIDAD_MAXIMA_ABSOLUTA_INCHES . . . . . . . . . . . . . . . . . . 65
4.12.1.13 VELOCIDAD_MAXIMA_ABSOLUTA_INCHES_EXTRUYENDO_SIN_MOV . . . 65
4.12.1.14 VELOCIDAD_MAXIMA_ABSOLUTA_MM . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.15 VELOCIDAD_MAXIMA_ABSOLUTA_MM_EXTRUYENDO_SIN_MOV . . . . . . 65
4.12.1.16 X_MAX_INCHES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.17 X_MAX_MM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.18 Y_MAX_INCHES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.19 Y_MAX_MM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.12.1.20 Z_MAX_INCHES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.12.1.21 Z_MAX_MM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.13 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/←-
Software/Anexo codigo/Codigo/stepper.h File Reference . . . . . . . . . . . . . . . . . . . . . . . 66
4.13.1 Macro Definition Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.13.1.1 LIMITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.13.2 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.13.2.1 home_all_axis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.13.2.2 stepper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


Chapter 1

Data Structure Index

1.1 Data Structures

Here are the data structures with brief descriptions:


banderas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
contTemp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
registroErrores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
vel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 Data Structure Index

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


Chapter 2

File Index

2.1 File List

Here is a list of all files with brief descriptions:


C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/buffer.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/Calibracion.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/controlXYZ_E.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/contTemp.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/Display.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/ejecutador.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/errores.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/interprete.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/layerHW.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/Main_imprimiendo.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/MovimientoManual.h . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/setup.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/←-
Anexo codigo/Codigo/stepper.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4 File Index

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


Chapter 3

Data Structure Documentation

3.1 banderas Struct Reference

#include <ejecutador.h>

Data Fields

• int system_coordinates
• int extruder_mode
• int inches
• int sentido_CW
• int fan
• int extrudeON
• int retract

3.1.1 Detailed Description

Definition at line 78 of file ejecutador.h.

3.1.2 Field Documentation

3.1.2.1 int extrudeON

Definition at line 85 of file ejecutador.h.

3.1.2.2 int extruder_mode

Definition at line 81 of file ejecutador.h.

3.1.2.3 int fan

Definition at line 84 of file ejecutador.h.

3.1.2.4 int inches

Definition at line 82 of file ejecutador.h.


6 Data Structure Documentation

3.1.2.5 int retract

Definition at line 86 of file ejecutador.h.

3.1.2.6 int sentido_CW

Definition at line 83 of file ejecutador.h.

3.1.2.7 int system_coordinates

Definition at line 80 of file ejecutador.h.


The documentation for this struct was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/ejecutador.h

3.2 buffer Class Reference

#include <buffer.h>

Public Member Functions

• buffer ()
• void add (char ∗gcode)
• int getEnvio ()
• int getGuardo ()
• char ∗ get (void)
• int len ()
• bool isFull ()
• bool isEmpty ()

3.2.1 Detailed Description

Definition at line 31 of file buffer.h.

3.2.2 Constructor & Destructor Documentation

3.2.2.1 buffer ( )

buffer(): Constructor de la clase buffer. Se construye un buffer en el cual se que apunta al primer lugar tanto para
enviar como para guardar, el cual no esta lleno.
Parameters

Returns

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.2 buffer Class Reference 7

3.2.3 Member Function Documentation

3.2.3.1 void add ( char ∗ gcode )

add(char∗ gcode): funcion para encolar un string.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


8 Data Structure Documentation

Parameters
char∗ gcode: puntero al string

Returns

3.2.3.2 char∗ get ( void )

get(): funcion para obtener un string de la cola.


Parameters

Returns

char∗ gcode: puntero al string que se obtiene.

3.2.3.3 int getEnvio ( )

getEnvio(): funcion para obtener el entero que dice en que lugar del arreglo se encuentra el proximo string a enviar.
Parameters

Returns

int: entero que marca el lugar del arreglo donde se encuentra el proximo string a ser enviado.

3.2.3.4 int getGuardo ( )

getGuardo(): funcion para obtener el entero que dice en que lugar del arreglo se debe guardar el proximo string
que se desee encolar
Parameters

Returns

int: entero que marca el lugar del arreglo donde se debe guardar el proximo string a se desee encolar.

3.2.3.5 bool isEmpty ( )

isEmpty(): funcion para consultar si la cola se encuentra vacia.


Parameters

Returns

bool: 1 si esta vacia y 0 si no.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.2 buffer Class Reference 9

3.2.3.6 bool isFull ( )

isFull(): funcion para consultar si la cola se encuentra llena.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


10 Data Structure Documentation

Parameters

Returns

bool: 1 si esta llena y 0 si no.

3.2.3.7 int len ( )

len(): funcion para consultar la cantidad de string que se encuentran en la cola.


Parameters

Returns

int: cantidad de string que se encuentran en la cola.

The documentation for this class was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/buffer.h

3.3 comando Struct Reference

#include <interprete.h>

Data Fields

• acciones_t accion
• float datos_ejes [4]
• float flag_datosNuevos [7]
• float param_F
• float center_IJ [2]
• float param_L
• float param_S
• float param_P
• float param_R
• float param_B
• float param_T
• char message [30]
• int system_coordinates
• int extruder_mode
• int sentido_CW
• int fan
• int power
• int extrudeON
• int retract

3.3.1 Detailed Description

Definition at line 58 of file interprete.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.3 comando Struct Reference 11

3.3.2 Field Documentation

3.3.2.1 acciones_t accion

Definition at line 61 of file interprete.h.

3.3.2.2 float center_IJ[2]

Definition at line 65 of file interprete.h.

3.3.2.3 float datos_ejes[4]

Definition at line 62 of file interprete.h.

3.3.2.4 int extrudeON

Definition at line 80 of file interprete.h.

3.3.2.5 int extruder_mode

Definition at line 76 of file interprete.h.

3.3.2.6 int fan

Definition at line 78 of file interprete.h.

3.3.2.7 float flag_datosNuevos[7]

Definition at line 63 of file interprete.h.

3.3.2.8 char message[30]

Definition at line 72 of file interprete.h.

3.3.2.9 float param_B

Definition at line 70 of file interprete.h.

3.3.2.10 float param_F

Definition at line 64 of file interprete.h.

3.3.2.11 float param_L

Definition at line 66 of file interprete.h.

3.3.2.12 float param_P

Definition at line 68 of file interprete.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


12 Data Structure Documentation

3.3.2.13 float param_R

Definition at line 69 of file interprete.h.

3.3.2.14 float param_S

Definition at line 67 of file interprete.h.

3.3.2.15 float param_T

Definition at line 71 of file interprete.h.

3.3.2.16 int power

Definition at line 79 of file interprete.h.

3.3.2.17 int retract

Definition at line 81 of file interprete.h.

3.3.2.18 int sentido_CW

Definition at line 77 of file interprete.h.

3.3.2.19 int system_coordinates

Definition at line 75 of file interprete.h.


The documentation for this struct was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/interprete.h

3.4 contTemp Class Reference

#include <contTemp.h>

Public Member Functions

• contTemp (int thermPin1, int controlPin1, float factor1)


• contTemp (int thermPin1, int controlPin1, int fanPin1, float factor1)
• void setSetpoint (double Setpoint1)
• double getTemp ()
• double getSetpoint ()
• double getOutput ()
• int getFlag ()
• int getCont_por ()
• void controlTemp ()
• void fanON ()
• void fanOFF ()
• void reduce_cont_por ()

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.4 contTemp Class Reference 13

• void on ()
• void off ()

3.4.1 Detailed Description

Definition at line 36 of file contTemp.h.

3.4.2 Constructor & Destructor Documentation

3.4.2.1 contTemp ( int thermPin1, int controlPin1, float factor1 )

3.4.2.2 contTemp ( int thermPin1, int controlPin1, int fanPin1, float factor1 )

3.4.3 Member Function Documentation

3.4.3.1 void controlTemp ( )

controlTemp(): Funcion que establece el valor del contador propio.


Parameters

Returns

3.4.3.2 void fanOFF ( )

fanOFF(): Funcion que apaga el ventilador.


Parameters

Returns

3.4.3.3 void fanON ( )

fanON(): Funcion que enciende el ventilador.


Parameters

Returns

3.4.3.4 int getCont_por ( )

getCont_por(): Funcion que retorna el contador propio del controlador.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


14 Data Structure Documentation

Parameters

Returns

3.4.3.5 int getFlag ( )

getFlag(): Funcion que retorna la bandera que avisa si la temperatura difiere del setpoint menos un determinado
valor relativo.
Parameters

Returns

3.4.3.6 double getOutput ( )

getOutput(): Funcion que retorna la salida entre 0 (apagado) y 255 (encendido).


Parameters

Returns

3.4.3.7 double getSetpoint ( )

getSetpoint(): Funcion que retorna el Setpoint.


Parameters

Returns

3.4.3.8 double getTemp ( )

getTemp(): Funcion que retorna la temperatura actual.


Parameters

Returns

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.4 contTemp Class Reference 15

3.4.3.9 void off ( )

off(): Funcion apaga la fuente de corriente.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


16 Data Structure Documentation

Parameters

Returns

3.4.3.10 void on ( )

on() : Funcion enciende la fuente de corriente.


Parameters

Returns

3.4.3.11 void reduce_cont_por ( )

reduce_cont_por(): Funcion que reduce en uno el contador propio del controlador.


Parameters

Returns

3.4.3.12 void setSetpoint ( double Setpoint1 )

setSetpoint(double Setpoint1): Funcion que setea el Setpoint.


Parameters
double Setpoint1 : Valor del setpoint a setear.

Returns

The documentation for this class was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/contTemp.h

3.5 datos Struct Reference

#include <ejecutador.h>

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.5 datos Struct Reference 17

Data Fields

• float datos_origenHighLevel [3]


• float datos_origenHighLevelMM [3]
• float datos_origenHighLevelINCHES [3]
• float datos_ejes [4]
• float datos_ejes_retract [2]
• float velocidad_retract
• float datos_aceleracion_extruyendo [4]
• float offset [4]
• float delta_nueva_posicionMMabs [4]
• float delta_nueva_posicionINCHESabs [4]
• float delta_nueva_posicionMMrel [4]
• float delta_nueva_posicionINCHESrel [4]
• float param_F
• float center_IJ [2]
• float step_per_unit
• float max_jerk_xy
• float max_jerk_z
• float VelocidadTravelMinImpresion
• float VelocidadTravelMin
• float MinSegmentTime
• float param_L
• float param_S
• float param_P
• float param_R
• float param_T
• float param_B
• char message [30]

3.5.1 Detailed Description

Definition at line 46 of file ejecutador.h.

3.5.2 Field Documentation

3.5.2.1 float center_IJ[2]

Definition at line 62 of file ejecutador.h.

3.5.2.2 float datos_aceleracion_extruyendo[4]

Definition at line 55 of file ejecutador.h.

3.5.2.3 float datos_ejes[4]

Definition at line 52 of file ejecutador.h.

3.5.2.4 float datos_ejes_retract[2]

Definition at line 53 of file ejecutador.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


18 Data Structure Documentation

3.5.2.5 float datos_origenHighLevel[3]

Definition at line 49 of file ejecutador.h.

3.5.2.6 float datos_origenHighLevelINCHES[3]

Definition at line 51 of file ejecutador.h.

3.5.2.7 float datos_origenHighLevelMM[3]

Definition at line 50 of file ejecutador.h.

3.5.2.8 float delta_nueva_posicionINCHESabs[4]

Definition at line 58 of file ejecutador.h.

3.5.2.9 float delta_nueva_posicionINCHESrel[4]

Definition at line 60 of file ejecutador.h.

3.5.2.10 float delta_nueva_posicionMMabs[4]

Definition at line 57 of file ejecutador.h.

3.5.2.11 float delta_nueva_posicionMMrel[4]

Definition at line 59 of file ejecutador.h.

3.5.2.12 float max_jerk_xy

Definition at line 64 of file ejecutador.h.

3.5.2.13 float max_jerk_z

Definition at line 65 of file ejecutador.h.

3.5.2.14 char message[30]

Definition at line 75 of file ejecutador.h.

3.5.2.15 float MinSegmentTime

Definition at line 68 of file ejecutador.h.

3.5.2.16 float offset[4]

Definition at line 56 of file ejecutador.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.5 datos Struct Reference 19

3.5.2.17 float param_B

Definition at line 74 of file ejecutador.h.

3.5.2.18 float param_F

Definition at line 61 of file ejecutador.h.

3.5.2.19 float param_L

Definition at line 69 of file ejecutador.h.

3.5.2.20 float param_P

Definition at line 71 of file ejecutador.h.

3.5.2.21 float param_R

Definition at line 72 of file ejecutador.h.

3.5.2.22 float param_S

Definition at line 70 of file ejecutador.h.

3.5.2.23 float param_T

Definition at line 73 of file ejecutador.h.

3.5.2.24 float step_per_unit

Definition at line 63 of file ejecutador.h.

3.5.2.25 float velocidad_retract

Definition at line 54 of file ejecutador.h.

3.5.2.26 float VelocidadTravelMin

Definition at line 67 of file ejecutador.h.

3.5.2.27 float VelocidadTravelMinImpresion

Definition at line 66 of file ejecutador.h.


The documentation for this struct was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/ejecutador.h

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


20 Data Structure Documentation

3.6 registroErrores Struct Reference

#include <errores.h>

Data Fields

• int indice
• error err [TAM]

3.6.1 Detailed Description

Registro de errores ocurridos


Definition at line 62 of file errores.h.

3.6.2 Field Documentation

3.6.2.1 error err[TAM]

Arreglo del tipo error


Definition at line 65 of file errores.h.

3.6.2.2 int indice

Indice del arreglo


Definition at line 64 of file errores.h.
The documentation for this struct was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/errores.h

3.7 vel Struct Reference

#include <controlXYZ_E.h>

Data Fields

• unsigned int vx
• unsigned int vy
• unsigned int vz
• unsigned int ve

3.7.1 Detailed Description

Estructura para registro de velocidad de cada Eje


Definition at line 60 of file controlXYZ_E.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


3.7 vel Struct Reference 21

3.7.2 Field Documentation

3.7.2.1 unsigned int ve

velocidad de e
Definition at line 65 of file controlXYZ_E.h.

3.7.2.2 unsigned int vx

velocidad en coordenada x
Definition at line 62 of file controlXYZ_E.h.

3.7.2.3 unsigned int vy

velocidad en coordenada y
Definition at line 63 of file controlXYZ_E.h.

3.7.2.4 unsigned int vz

velocidad en coordenada z
Definition at line 64 of file controlXYZ_E.h.
The documentation for this struct was generated from the following file:

• C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto modular3D/Software/Anexo


codigo/Codigo/controlXYZ_E.h

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


22 Data Structure Documentation

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


Chapter 4

File Documentation

4.1 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/buffer.h File Reference

#include "Arduino.h"

Data Structures

• class buffer

Macros

• #define LARGO_BUFFER 1
• #define LARGO_STRING 50

4.1.1 Macro Definition Documentation

4.1.1.1 #define LARGO_BUFFER 1

Proyecto Modular 3D Modulo Buffer


El objetivo de este modulo es crear el objeto buffer. El cual es una cola de string, los cuales constan de LARGO←-
_STRING de char y en la misma caben LARGO_BUFFER string. La cola responde a la logica FIFO First In First
Out y circular. Y tambien se deben contener todas las funciones que el objeto buffer necesita para intereactuar con
los demas modulos.
buffer.h

Version

1.0

Author

Guillermo Airaldiguillermo.airaldi@gmail.com
Guillermo Antunez antunezguillermo7@gmail.com
Nicolas Lamath ellama.ing@gmail.com
24 File Documentation

Date

03 de Setiembre 2014

Definition at line 26 of file buffer.h.

4.1.1.2 #define LARGO_STRING 50

Definition at line 27 of file buffer.h.

4.2 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/Calibracion.h File Reference

#include "Display.h"
#include "Main_imprimiendo.h"
#include <LiquidCrystal.h>

Functions

• void calibracion ()

4.2.1 Function Documentation

4.2.1.1 void calibracion ( )

Proyecto Modular 3D Modulo Calibracion


El objetivo de este modulo es el de definir y agrupar todas las funciones que sean necesarias para la ejecucion de
una etapa de calibracion mecanica, la cual constara de distintas fases que se puedan realizar parcial o totalmente
de forma previa a la impresion de un modelo
Calibracion.h

Version

1.0

Author

Guillermo Airaldiguillermo.airaldi@gmail.com
Guillermo Antunez antunezguillermo7@gmail.com
Nicolas Lamath ellama.ing@gmail.com

Date

03 de Setiembre 2014 calibracion(): Funcion que ejecuta el menu de calibracion

Parameters

Returns

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.3 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/controlXYZ_E.h File Reference 25

4.3 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/controlXYZ_E.h File Reference

#include <stdbool.h>

Data Structures

• struct vel

Typedefs

• typedef enum ejes eje_k


Se define el tipo para poder definir variables con la enumeracion creada.
• typedef enum propiedades propiedad
Se define el tipo para poder declarar variables con esta enumeracion.

Enumerations

• enum ejes { ejeX =1, ejeY, ejeZ, ejeE }


• enum propiedades { posicion, objetivo, velocidad }
Enumeracion que describe la posicion y la velocidad.

Functions

• bool getSentidoX ()
• bool getMovimientoX ()
• bool getSentidoY ()
• bool getMovimientoY ()
• bool getSentidoZ ()
• bool getMovimientoZ ()
• bool getSentidoE ()
• bool getMovimientoE ()
• void deltaX (bool sentido)
• void deltaY (bool sentido)
• void deltaZ (bool sentido)
• void deltaE (bool sentido)
• void restart (eje_k eje)
• void setObjetivo (eje_k eje, unsigned long int pos_final)
• void setPosicion (eje_k eje, unsigned long int nueva_pos)
• void setVelocidad (eje_k eje, unsigned int v)
• unsigned long int consulta (eje_k eje, propiedad selector)
• unsigned long int consultaPosX ()
• unsigned long int consultaPosY ()
• unsigned long int consultaPosZ ()
• unsigned long int consultaPosE ()
• unsigned long int consultaPos_objX ()
• unsigned long int consultaPos_objY ()
• unsigned long int consultaPos_objZ ()
• unsigned long int consultaPos_objE ()
• unsigned long int consultaVelX ()
• unsigned long int consultaVelY ()
• unsigned long int consultaVelZ ()
• unsigned long int consultaVelE ()

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


26 File Documentation

4.3.1 Typedef Documentation

4.3.1.1 typedef enum ejes eje_k

Se define el tipo para poder definir variables con la enumeracion creada.


Definition at line 41 of file controlXYZ_E.h.

4.3.1.2 typedef enum propiedades propiedad

Se define el tipo para poder declarar variables con esta enumeracion.


Definition at line 55 of file controlXYZ_E.h.

4.3.2 Enumeration Type Documentation

4.3.2.1 enum ejes

Proyecto CtrlMotors3D Modulo controlXYZ_E


Este modulo se encarga del registro de la posicion absoluta del posicionador XYZ y el extrusor E en numero de
pasos y las respectivas velocidades en unidades de Master Clock. Implementa funciones para menejo de los
registros y consulta de los mismos.
controlXYZ_E.h

Author

Guillermo Airaldi guillermo.airaldi@gmail.com


Guillermo Antunez antunezguillermo7@gmail.com
Jose Basualdo josebasualdo@gmail.com

Version

2.0

Date

20 de noviembre 2014 ... Librerias ... Definicion de Variables Enumeracion que representa los ejes XYZ y el
extrusor

Enumerator

ejeX Eje X
ejeY Eje Y
ejeZ Eje Z
ejeE Extrusor

Definition at line 31 of file controlXYZ_E.h.

4.3.2.2 enum propiedades

Enumeracion que describe la posicion y la velocidad.

Enumerator

posicion posicion actual


objetivo posicion objetivo
velocidad velocidad con la que se realizara el movimiento

Definition at line 46 of file controlXYZ_E.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.3 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/controlXYZ_E.h File Reference 27

4.3.3 Function Documentation

4.3.3.1 unsigned long int consulta ( eje_k eje, propiedad selector )

Funcion de consulta de posicion, objetivo o velocidad de un eje pensada para uso por el Alto Nivel
Parameters
eje_k eje: Parametro que indica que eje se desea consultar
propiedad selector: Parametro que indica la propiedad a consultar, estas pueden ser, posicion , objetivo
o velocidad

4.3.3.2 unsigned long int consultaPos_objE ( )

Funcion de consulta de posicion objetivo en eje E

4.3.3.3 unsigned long int consultaPos_objX ( )

Funcion de consulta de posicion objetivo en eje X

4.3.3.4 unsigned long int consultaPos_objY ( )

Funcion de consulta de posicion objetivo en eje Y

4.3.3.5 unsigned long int consultaPos_objZ ( )

Funcion de consulta de posicion objetivo en eje Z

4.3.3.6 unsigned long int consultaPosE ( )

Funcion de consulta de posicion actual en eje E

4.3.3.7 unsigned long int consultaPosX ( )

Funcion de consulta de posicion actual en eje X

4.3.3.8 unsigned long int consultaPosY ( )

Funcion de consulta de posicion actual en eje Y

4.3.3.9 unsigned long int consultaPosZ ( )

Funcion de consulta de posicion actual en eje Z

4.3.3.10 unsigned long int consultaVelE ( )

Funcion de consulta por registro velocidad en eje E

4.3.3.11 unsigned long int consultaVelX ( )

Funcion de consulta por registro velocidad en eje X

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


28 File Documentation

4.3.3.12 unsigned long int consultaVelY ( )

Funcion de consulta por registro velocidad en eje Y

4.3.3.13 unsigned long int consultaVelZ ( )

Funcion de consulta por registro velocidad en eje Z

4.3.3.14 void deltaE ( bool sentido )

Funcion que actualiza el registro de posicion absoulta de E en 1 paso segun sentido


Parameters
bool sentido: Vale 1 si se desea sumar un paso y -1 si desea restar

4.3.3.15 void deltaX ( bool sentido )

Funcion que actualiza el registro de posicion absoulta de X en 1 paso segun sentido


Parameters
bool sentido: Vale 1 si se desea sumar un paso y -1 si desea restar

4.3.3.16 void deltaY ( bool sentido )

Funcion que actualiza el registro de posicion absoulta de Y en 1 paso segun sentido


Parameters
bool sentido: Vale 1 si se desea sumar un paso y -1 si desea restar

4.3.3.17 void deltaZ ( bool sentido )

Funcion que actualiza el registro de posicion absoulta de Z en 1 paso segun sentido


Parameters
bool sentido: Vale 1 si se desea sumar un paso y -1 si desea restar

4.3.3.18 bool getMovimientoE ( )

Funcion encargada de retornar un bool que indica si el motor E se esta moviendo.

Returns

bool True indica que el motor se esta moviendo, false que no lo esta.

4.3.3.19 bool getMovimientoX ( )

Funcion encargada de retornar un bool que indica si el motor X se esta moviendo.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.3 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/controlXYZ_E.h File Reference 29
Returns

bool True indica que el motor se esta moviendo, false que no lo esta.

4.3.3.20 bool getMovimientoY ( )

Funcion encargada de retornar un bool que indica si el motor Y se esta moviendo.

Returns

bool True indica que el motor se esta moviendo, false que no lo esta.

4.3.3.21 bool getMovimientoZ ( )

Funcion encargada de retornar un bool que indica si el motor Z se esta moviendo.

Returns

bool True indica que el motor se esta moviendo, false que no lo esta.

4.3.3.22 bool getSentidoE ( )

Funcion que devuelve un valor booleano que indica el sentido de giro del motor E.

Returns

bool True corresponde a horario, y false a antihorario.

4.3.3.23 bool getSentidoX ( )

...Funciones del modulo Funcion que devuelve un valor booleano que indica el sentido de giro del motor X.

Returns

bool True corresponde a horario, y false a antihorario.

4.3.3.24 bool getSentidoY ( )

Funcion que devuelve un valor booleano que indica el sentido de giro del motor Y.

Returns

bool True corresponde a horario, y false a antihorario.

4.3.3.25 bool getSentidoZ ( )

Funcion que devuelve un valor booleano que indica el sentido de giro del motor Z.

Returns

bool True corresponde a horario, y false a antihorario.

4.3.3.26 void restart ( eje_k eje )

Funcion que resetea el registro de un eje a cero, permite establecer el cero de ccoordenada por software del eje.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


30 File Documentation

Parameters
eje_k eje: Parametro que indica que eje se debe resetear

4.3.3.27 void setObjetivo ( eje_k eje, unsigned long int pos_final )

Funcion que actualiza el registro del setpoint por eje


Parameters
eje_k eje: Parametro que indica en que eje se debe efectuar la modificacion del setpoint
int pos_final: posicion absoluta que se desea alcanzar en pasos

4.3.3.28 void setPosicion ( eje_k eje, unsigned long int nueva_pos )

Funcion que actualiza el registro de la posicion actual por eje


Parameters
eje_k eje: Parametro que indica en que eje se debe efectuar la modificacion del setpoint
int nueva_pos: posicion absoluta que se desea setear a la posicion real actual

4.3.3.29 void setVelocidad ( eje_k eje, unsigned int v )

Funcion que actualiza el registro de la velocidad por eje


Parameters
eje_k eje: Parametro que indica en que eje se debe efectuar la modificacion de velocidad
int vel: velocidad en unidades de periodo de Master Clock

4.4 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/contTemp.h File Reference

#include "Arduino.h"

Data Structures

• class contTemp

Macros

• #define POR_FLAG 0.07


• #define PROM 5

Functions

• void iniTempClock ()
• void controlarTemperatura (contTemp ∗ct)
• void SetearCont_por ()

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.4 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/contTemp.h File Reference 31

4.4.1 Macro Definition Documentation

4.4.1.1 #define POR_FLAG 0.07

Proyecto Modular 3D Modulo contTemp


El objetivo de este modulo es crear el objeto contTemp. El cual es el encargado de controlar la temperatura del
extrusor o de la "Heated Bed", cabe destacar que esto es posible dado que ambas poseen caracteristicas similares.
Y tambien se deben contener todas las funciones de consulta en lo que refieren a la temperatura
contTemp.h

Version

2.0

Author

Guillermo Airaldiguillermo.airaldi@gmail.com
Guillermo Antunez antunezguillermo7@gmail.com
Nicolas Lamath ellama.ing@gmail.com

Date

28 de Noviembre 2014

Definition at line 26 of file contTemp.h.

4.4.1.2 #define PROM 5

Definition at line 27 of file contTemp.h.

4.4.2 Function Documentation

4.4.2.1 void controlarTemperatura ( contTemp ∗ ct )

controlarTemperatura(contTemp∗ ct): Funcion que agrega en un arreglo de controladores de temperatura el con-


trolador ct.
Parameters
contTemp∗ ct : Puntero a contTemp que se desea controlar en las interrupciones.

Returns

4.4.2.2 void iniTempClock ( )

iniTempClock(): Funcion que inicializa el timer que impone la interrupcion cada 50 milisegundos.
Parameters

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


32 File Documentation

Returns

4.4.2.3 void SetearCont_por ( )

SetearCont_por(): Funcion invocada cada 1 segundo, esteblece el contador cont_tot en 20 y los contadores cont←-
_por en el valor necesario.
Parameters

Returns

4.5 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/Display.h File Reference

#include "Arduino.h"
#include <LiquidCrystal.h>

Macros

• #define PIN_DERECHO 38
• #define PIN_ARRIBA 40
• #define PIN_IZQUIERDO 41
• #define PIN_ABAJO 39
• #define PIN_ENTER 43
• #define PIN_EXIT 42
• #define TIEMPO_ANTIREBOTE 30

Functions

• void InicializarDisplay ()
• void DisplayClear ()
• void DisplayCalibrar ()
• void DisplayManual ()
• void DisplayImprimir ()
• void DisplayFresado ()
• void DisplayMovX (char ∗avance)
• void DisplayMovY (char ∗avance)
• void DisplayMovZ (char ∗avance)
• void DisplaySalir ()
• void RefreshDisplay (float temp, float PosX, float PosY, float PosZ)
• void DisplayMessage (char ∗message)
• void DisplayHoming ()
• void DisplaymmXpaso ()

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.5 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/Display.h File Reference 33

• void DisplaymmXpasoObj (int eje, float dist)


• void DisplaymmXpasoMed (int eje, float med)
• void DisplayAltMesa (int punto)
• void DisplayOffset ()
• void DisplayImprimiendo ()
• int recibir ()
• boolean antirebote (int pin)

4.5.1 Macro Definition Documentation

4.5.1.1 #define PIN_ABAJO 39

Definition at line 27 of file Display.h.

4.5.1.2 #define PIN_ARRIBA 40

Definition at line 25 of file Display.h.

4.5.1.3 #define PIN_DERECHO 38

Proyecto Modular 3D Modulo Display


El objetivo de este modulo es el de definir y agrupar todas las funciones que sean necesarias para la implementa-
cion de la pantalla lcd, y para su uso desde cualquier otro modulo
Display.h

Version

1.0

Author

Guillermo Airaldiguillermo.airaldi@gmail.com
Guillermo Antunez antunezguillermo7@gmail.com
Nicolas Lamath ellama.ing@gmail.com

Date

04 de Setiembre 2014

Definition at line 24 of file Display.h.

4.5.1.4 #define PIN_ENTER 43

Definition at line 28 of file Display.h.

4.5.1.5 #define PIN_EXIT 42

Definition at line 29 of file Display.h.

4.5.1.6 #define PIN_IZQUIERDO 41

Definition at line 26 of file Display.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


34 File Documentation

4.5.1.7 #define TIEMPO_ANTIREBOTE 30

Definition at line 30 of file Display.h.

4.5.2 Function Documentation

4.5.2.1 boolean antirebote ( int pin )

Funcion para anular el efecto de rebote de los botones por software


Parameters
numero del pin que se desea medir sin rebote

4.5.2.2 void DisplayAltMesa ( int punto )

Funcion que despliega el sub-menu Altura de la mesa


Parameters

4.5.2.3 void DisplayCalibrar ( )

Funcion que despliega el menu Calibrar


Parameters

4.5.2.4 void DisplayClear ( )

Funcion borra todos los caracteres en el display


Parameters

4.5.2.5 void DisplayFresado ( )

Funcion que despliega el menu Fresar


Parameters

4.5.2.6 void DisplayHoming ( )

Funcion que despliega el menu Homing

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.5 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/Display.h File Reference 35

Parameters

4.5.2.7 void DisplayImprimiendo ( )

Funcion que despliega el mensaje imprimiendo..


Parameters

4.5.2.8 void DisplayImprimir ( )

Funcion que despliega el menu Imprimir


Parameters

4.5.2.9 void DisplayManual ( )

Funcion que despliega el menu Movimiento manual


Parameters

4.5.2.10 void DisplayMessage ( char ∗ message )

Funcion despliega un mensaje


Parameters

4.5.2.11 void DisplaymmXpaso ( )

Funcion que despliega el sub-menu mm por paso


Parameters

4.5.2.12 void DisplaymmXpasoMed ( int eje, float med )

Funcion que despliega parte del sub-menu mm por paso


Parameters
eje que eje se esta calibrando

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


36 File Documentation

med distancia que midio

4.5.2.13 void DisplaymmXpasoObj ( int eje, float dist )

Funcion que despliega parte del sub-menu mm por paso


Parameters
eje que eje se esta calibrando
dist distancia que se debe avanzar

4.5.2.14 void DisplayMovX ( char ∗ avance )

Funcion que despliega el sub-menu Movimiento manual en el Eje X


Parameters

4.5.2.15 void DisplayMovY ( char ∗ avance )

Funcion que despliega el sub-menu Movimiento manual en el Eje Y


Parameters

4.5.2.16 void DisplayMovZ ( char ∗ avance )

Funcion que despliega el sub-menu Movimiento manual en el Eje Z


Parameters

4.5.2.17 void DisplayOffset ( )

Funcion que despliega el sub-menu Offset


Parameters

4.5.2.18 void DisplaySalir ( )

Funcion que despliega el sub-menu para salir


Parameters

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.5 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/Display.h File Reference 37

4.5.2.19 void InicializarDisplay ( )

...Funciones del modulo Funcion inicializa el display

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


38 File Documentation

Parameters

4.5.2.20 int recibir ( )

Funcion para sensar los botones


Parameters

4.5.2.21 void RefreshDisplay ( float temp, float PosX, float PosY, float PosZ )

Funcion que despliega informacion del estado de la maquina


Parameters

4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/ejecutador.h File Reference

#include <stdio.h>
#include <stdlib.h>
#include "setup.h"
#include "stepper.h"
#include "math.h"
#include "interprete.h"
#include "contTemp.h"

Data Structures

• struct datos
• struct banderas

Functions

• void inicializarEjecutador ()
• error ∗ ejecutar (comando cmd)
• void moverLinealConExtruir ()
• void moverLinealSinExtruir ()
• void setHomeOffset ()
• void setRegistroEmmAbs ()
• void controlEntradaVEL (float velAbsoluta, int flagF)
• error controlEntradaXYZ (float posX, int flagX, float posY, int flagY, float posZ, int flagZ)
• error controlEntradaZ (float posEJE, int flagEJE)
• error controlEntradaE (float posE, int flagE)
• error controlEntradaEJE (int ejeEJE, eje_k ejeEJE_K, const float EJE_MAX_INCHES, const float EJE_MA←-
X_MM, float posEJE, int flagEJE)
• void setRegistroEinchesAbs ()

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/ejecutador.h File Reference 39

• void setRegistroEmmRel ()
• void setRegistroEinchesRel ()
• void setRegistroXYZmmAbs ()
• void setRegistroXYZinchesAbs ()
• void setRegistroXYZmmRel ()
• void setRegistroXYZinchesRel ()
• float velXejeABSinches (int eje)
• float velejeEABSinches ()
• float velXejeABSmm (int eje)
• float velejeEABSmm ()
• float velXejeREL (int eje)
• float velejeErelINCHES ()
• float velejeErelMM ()
• float tiempoREL ()
• float tiempoABSinches ()
• float tiempoABSmm ()
• float pasosAdistanciaINCHES (long int cantidadPasos)
• float pasosAdistanciaINCHESE (long int cantidadPasos)
• float pasosAdistanciaMM (long int cantidadPasos)
• float pasosAdistanciaMME (long int cantidadPasos)
• unsigned int cantidadPeriodosMCLKinches (float velocidadINCHESxMIN)
• unsigned int cantidadPeriodosMCLKinchesE (float velocidadINCHESxMIN)
• unsigned int cantidadPeriodosMCLKmm (float velocidadMMxMIN)
• unsigned int cantidadPeriodosMCLKmmE (float velocidadMMxMIN)
• long int distanciainchesAPasos (float distanciaINCHES)
• long int distanciammAPasos (float distanciaMM)
• unsigned long int distanciaEinchesAPasos (float distanciaINCHES)
• unsigned long int distanciaEmmAPasos (float distanciaMM)
• void printEntrada ()
• void printSalida ()
• void printSalidaPosta ()

4.6.1 Function Documentation

4.6.1.1 unsigned int cantidadPeriodosMCLKinches ( float velocidadINCHESxMIN )

cantidadPeriodosMCLKinches(float velocidadINCHESxMIN): para el caso en el que se trabaje en inches, pasa las


velocidades a su equivalente en cantidad de periodos de MCLK.
Parameters
float velocidadINCHESxMIN: velocidad en inches x minuto.

Returns

int : cantidad de periodos de master clock que equivalen a la velocidad.

4.6.1.2 unsigned int cantidadPeriodosMCLKinchesE ( float velocidadINCHESxMIN )

cantidadPeriodosMCLKinchesE(float velocidadINCHESxMIN): para el caso en el que se trabaje en inches en E,


pasa las velocidades a su equivalente en cantidad de periodos de MCLK.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


40 File Documentation

Parameters
float velocidadINCHESxMIN: velocidad en inches x minuto.

Returns

int : cantidad de periodos de master clock que equivalen a la velocidad.

4.6.1.3 unsigned int cantidadPeriodosMCLKmm ( float velocidadMMxMIN )

cantidadPeriodosMCLKmm(float velocidadMMxMIN): para el caso en el que se trabaje en mm, pasa las velocidades
a su equivalente en cantidad de periodos de MCLK.
Parameters
float velocidadMMxMIN: velocidad en mm x minuto.

Returns

int : cantidad de periodos de master clock que equivalen a la velocidad.

4.6.1.4 unsigned int cantidadPeriodosMCLKmmE ( float velocidadMMxMIN )

cantidadPeriodosMCLKEmm(float velocidadMMxMIN): para el caso en el que se trabaje en mm en E, pasa las


velocidades a su equivalente en cantidad de periodos de MCLK.
Parameters
float velocidadMMxMIN: velocidad en mm x minuto.

Returns

int : cantidad de periodos de master clock que equivalen a la velocidad.

4.6.1.5 error controlEntradaE ( float posE, int flagE )

controlEntradaE(): Se encargar de ver que la entradas de posicion (E) sea adecuada, para luego si procesarla.
Parameters
float posE: posicion E, puede ser relativa (con signo) o absoluta.
int flagE: bandera de posicion E nueva.

Returns

error: usado para abandonar la ejecucion de la accion y no llegar albajo nivel

4.6.1.6 error controlEntradaEJE ( int ejeEJE, eje_k ejeEJE_K, const float EJE_MAX_INCHES, const float EJE_MAX_MM,
float posEJE, int flagEJE )

controlEntradaEJE(): Se encargar de ver que la entrada de posicion sea adecuada, para luego si procesarla.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/ejecutador.h File Reference 41

Parameters
float posEJE: posicion EJE, puede ser relativa (con signo) o absoluta.
int flagEJE: bandera de posicion EJE nueva.
int ejeEJE: indica cual eje (X 0, Y 1, Z 2, E 3).
eje_k ejeEJE_K: indica cual eje es (para uso de funiones de bajo nivel
const float EJE_MAX_INCHES: limite de posicion de ese eje particular INCHES.
const float EJE_MAX_MM: limite de posicion de ese eje particular MM.

Returns

error: usado para abandonar la ejecucion de la accion y no llegar albajo nivel

4.6.1.7 void controlEntradaVEL ( float velAbsoluta, int flagF )

controlEntradaVEL(): Se encargar de ver que la entrada de velocidad absoluta sea adecuada, para luego si proce-
sarla.
Parameters
float velAbsoluta: velocidad absoluta
int flagF: bandera de velocidad nueva.

Returns

4.6.1.8 error controlEntradaXYZ ( float posX, int flagX, float posY, int flagY, float posZ, int flagZ )

controlEntradaXYZ(): Se encargar de ver que las entradas de posicion (XYZ) sean adecuadas, para luego si
procesarlas.
Parameters
float posX: posicion X, puede ser relativa (con signo) o absoluta.
int flagX: bandera de posicion X nueva.
float posY: posicion Y, puede ser relativa (con signo) o absoluta.
int flagY: bandera de posicion Y nueva.
float posZ: posicion Z, puede ser relativa (con signo) o absoluta.
int flagZ: bandera de posicion Z nueva.

Returns

4.6.1.9 error controlEntradaZ ( float posEJE, int flagEJE )

controlEntradaZ(): Se encargar de ver que la entradas de posicion (Z) sea adecuada, para luego si procesarla.
Parameters
float posZ: posicion Z, puede ser relativa (con signo) o absoluta.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


42 File Documentation

int flagZ: bandera de posicion Z nueva.

Returns

error: usado para abandonar

4.6.1.10 unsigned long int distanciaEinchesAPasos ( float distanciaINCHES )

distanciaEinchesAPasos(float distanciaINCHES): para el caso en el que se trabaje en pulgadas en E, pasa las


distancias a su equivalente en numero de pasos
Parameters
float distanciaINCHES: distancias en pulgadas.

Returns

int : numero de pasos que equivalen a dicha distancia.

4.6.1.11 unsigned long int distanciaEmmAPasos ( float distanciaMM )

distanciaEmmAPasos(float distanciaMM): para el caso en el que se trabaje en mm en E, pasa las distancias a su


equivalente en numero de pasos
Parameters
float distanciaMM: distancias en mm.

Returns

int : numero de pasos que equivalen a dicha distancia.

4.6.1.12 long int distanciainchesAPasos ( float distanciaINCHES )

distanciainchesAPasos(float distanciaINCHES): para el caso en el que se trabaje en pulgadas, pasa las distancias
a su equivalente en numero de pasos
Parameters
float distanciaINCHES: distancias en pulgadas.

Returns

int : numero de pasos que equivalen a dicha distancia.

4.6.1.13 long int distanciammAPasos ( float distanciaMM )

distanciammAPasos(float distanciaMM): para el caso en el que se trabaje en mm, pasa las distancias a su equiva-
lente en numero de pasos

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/ejecutador.h File Reference 43

Parameters
float distanciaMM: distancias en mm.

Returns

int : numero de pasos que equivalen a dicha distancia.

4.6.1.14 error∗ ejecutar ( comando cmd )

ejecutar: funcion para inicilizar las estructuras en cada trabajo.


Parameters
comando cmd: estructura con los datos brindados desde el interprete.

Returns

error: para decirle al main como va

4.6.1.15 void inicializarEjecutador ( )

inicializarEjecutador(): funcion para inicilizar las estructuras en cada trabajo.


Parameters

Returns

4.6.1.16 void moverLinealConExtruir ( )

moverLinealConExtruir(): Funcion que utiliza casi la totalidad de las demas funciones para ejecutar la accion de
mover lineal extruyendo.
Parameters

Returns

error: tipo de error para que el main sepa como seguir (ok, o lo que haya pasado)

4.6.1.17 void moverLinealSinExtruir ( )

moverLinealSinExtruir(): Funcion que utiliza casi la totalidad de las demas funciones para ejecutar la accion de
mover lineal no extruyendo.
Parameters

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


44 File Documentation

Returns

4.6.1.18 float pasosAdistanciaINCHES ( long int cantidadPasos )

pasosAdistanciaINCHES(int cantidadPasos): para el caso en el que se trabaje en pulgadas, pasa el numero de


pasos a su equivalente en distancia.
Parameters
int cantidadPasos: numero de pasos.

Returns

float: distancia en inches que equivale a dicho numero de pasos .

4.6.1.19 float pasosAdistanciaINCHESE ( long int cantidadPasos )

pasosAdistanciaINCHESE(int cantidadPasos): para el caso en el que se trabaje en pulgadas en E, pasa el numero


de pasos a su equivalente en distancia.
Parameters
int cantidadPasos: numero de pasos.

Returns

float: distancia en inches que equivale a dicho numero de pasos .

4.6.1.20 float pasosAdistanciaMM ( long int cantidadPasos )

pasosAdistanciaMM(int cantidadPasos): para el caso en el que se trabaje en mm, pasa el numero de pasos a su
equivalente en distancia.
Parameters
int cantidadPasos: numero de pasos.

Returns

float: distancia en mm que equivale a dicho numero de pasos .

4.6.1.21 float pasosAdistanciaMME ( long int cantidadPasos )

pasosAdistanciaMME(int cantidadPasos): para el caso en el que se trabaje en mm en E, pasa el numero de pasos


a su equivalente en distancia.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/ejecutador.h File Reference 45

Parameters
int cantidadPasos: numero de pasos.

Returns

float: distancia en mm que equivale a dicho numero de pasos .

4.6.1.22 void printEntrada ( )

4.6.1.23 void printSalida ( )

4.6.1.24 void printSalidaPosta ( )

4.6.1.25 void setHomeOffset ( )

setHomeOffset(): Funcion que se fija donde esta el bajo nivel y toma dicha posicion como el oofset de alto nivel.
Parameters

Returns

4.6.1.26 void setRegistroEinchesAbs ( )

setRegistroEinchesAbs(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema absoluto
y inches.
Parameters

Returns

4.6.1.27 void setRegistroEinchesRel ( )

setRegistroEinchesRel(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema relativo e
inches.
Parameters

Returns

4.6.1.28 void setRegistroEmmAbs ( )

setRegistroEmmAbs(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema absoluto y
mm.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


46 File Documentation

Parameters

Returns

4.6.1.29 void setRegistroEmmRel ( )

setRegistroEmmRel(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema relativo y
mm.
Parameters

Returns

4.6.1.30 void setRegistroXYZinchesAbs ( )

setRegistroXYZinchesAbs(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ.
Sistema absoluto e inches.
Parameters

Returns

4.6.1.31 void setRegistroXYZinchesRel ( )

setRegistroXYZinchesRel(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ.
Sistema relativo e inches.
Parameters

Returns

4.6.1.32 void setRegistroXYZmmAbs ( )

setRegistroXYZmmAbs(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ. Sistema
absoluto e mm.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.6 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/ejecutador.h File Reference 47

Parameters

Returns

4.6.1.33 void setRegistroXYZmmRel ( )

setRegistroXYZmmRel(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ. Sistema
relativo e mm.
Parameters

Returns

4.6.1.34 float tiempoABSinches ( )

tiempoABSinches(): para el caso en el que se trabaje en inches y en sistema absoluto, calcula el tiempo de
movimiento de los motores para que concurran en el punto objetivo.
Parameters
.

Returns

float: tiempo minutos(sistema absoluto y inches).

4.6.1.35 float tiempoABSmm ( )

tiempoABSmm(): para el caso en el que se trabaje en mm y en sistema ansoluto, calcula el tiempo de movimiento
de los motores para que concurran en el punto objetivo.
Parameters
.

Returns

float : tiempo minutos(sistema absoluto y mm).

4.6.1.36 float tiempoREL ( )

tiempoREL(): para el caso en el que se trabaje sistema relativo, calcula el tiempo de movimiento de los motores
para que concurran en el punto objetivo.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


48 File Documentation

Parameters
.

Returns

float: tiempo minutos(sistema relativo). Se despreocupa del sistema de unidades, xq no ha que consultar
numero de pasos).

4.6.1.37 float velejeEABSinches ( )

velejeEABSinches(): para el caso en el que se trabaje sistema absoluto y inches, calcula la velocidad del eje E.
Parameters
int eje: para seleccionar el eje.

Returns

float: velocidad (sistema absoluto e inches).

4.6.1.38 float velejeEABSmm ( )

velejeEABSmm(): para el caso en el que se trabaje sistema absoluto y mm, calcula la velocidad del eje E.
Parameters

Returns

float: velocidad (sistema absoluto y mm).

4.6.1.39 float velejeErelINCHES ( )

velejeErelINCHES(): para el caso en el que se trabaje sistema relativo e inches en E, calcula la velocidad del eje
E.
Parameters

Returns

float: velocidad eje E(sistema relativo e inches).

4.6.1.40 float velejeErelMM ( )

velejeErelMM(): para el caso en el que se trabaje sistema relativo e mm en E, calcula la velocidad del eje E.
Parameters

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.7 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/errores.h File Reference 49

Returns

float: velocidad eje E(sistema relativo e mm).

4.6.1.41 float velXejeABSinches ( int eje )

velXejeABSinches(int eje): para el caso en el que se trabaje sistema absoluto y inches, calcula la velocidad pasan-
dole el eje correspondiente.
Parameters
int eje: para seleccionar el eje.

Returns

float: velocidad (sistema absoluto e inches).

4.6.1.42 float velXejeABSmm ( int eje )

velXejeABSmm(int eje): para el caso en el que se trabaje sistema absoluto y mm, calcula la velocidad pasandole
el eje correspondiente.
Parameters
int eje: para seleccionar el eje.

Returns

float: velocidad (sistema absoluto y mm).

4.6.1.43 float velXejeREL ( int eje )

velXejeREL(int eje): para el caso en el que se trabaje sistema relativo, calcula la velocidad pasandole el eje
correspondiente.
Parameters
int eje: para seleccionar el eje.

Returns

float: velocidad (sistema relativo). Se despreocupa del sistema de unidades, xq se tachan.

4.7 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/errores.h File Reference

Data Structures

• struct registroErrores

Macros

• #define TAM 8

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


50 File Documentation

Typedefs

• typedef enum eventos error

Enumerations

• enum eventos {
ok =0, finCarreaX0, finCarreaX1, finCarreaY0,
finCarreaY1, finCarreaZ0, finCarreaZ1, salida_por_timeout_resetear,
salidaxFueraRango, setPointTempExtInvalid, setPointHeatedBedTempInvalid, velInvalida,
emergencia }

4.7.1 Macro Definition Documentation

4.7.1.1 #define TAM 8

Definition at line 25 of file errores.h.

4.7.2 Typedef Documentation

4.7.2.1 typedef enum eventos error

Definition at line 57 of file errores.h.

4.7.3 Enumeration Type Documentation

4.7.3.1 enum eventos

...Definicion de Variables Definicion de eventos posibles.

Enumerator

ok El movimiento es realizable
finCarreaX0 El fin de carrera 1 del eje X, esta presionado
finCarreaX1 El fin de carrera 2 del eje X, esta presionado
finCarreaY0 El fin de carrera 1 del eje Y, esta presionado
finCarreaY1 El fin de carrera 2 del eje Y, esta presionado
finCarreaZ0 El fin de carrera 1 del eje Z, esta presionado
finCarreaZ1 El fin de carrera 2 del eje Z, esta presionado
salida_por_timeout_resetear Timeout del sistema, indica que se debe resetear
salidaxFueraRango Movimiento requerido, sale del rango excursion en alguno de los ejes
setPointTempExtInvalid Temperatura seteada en extrusor es invalida
setPointHeatedBedTempInvalid Temperatura seteada en heated-bed es invalida
velInvalida
emergencia Problema no previsto, que detecta el usuario y requiere un cese de todas las operaciones

Definition at line 34 of file errores.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.8 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/interprete.h File Reference 51

4.8 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/interprete.h File Reference

Data Structures

• struct comando

Macros

• #define MAX_speed 9600

Typedefs

• typedef enum acciones acciones_t

Enumerations

• enum acciones {
move_linear =1, mover_circular, go_home, set_milimeters,
set_fan, set_ExtruderTemp, set_BedTemp, set_MaxAcel,
set_Maxfeedrate, set_systemMode, set_extruderMode, set_position,
set_homingOffset, set_hotEndOffset, set_retract, set_motorOFF,
set_coldExtrude, display_message, go_pausa, do_retract,
steps_unit, finishAllmoves_clearBuff, set_advancedSettings }

Functions

• comando interpretar (char code[ ])


• void ini_comando ()

4.8.1 Macro Definition Documentation

4.8.1.1 #define MAX_speed 9600

Definition at line 23 of file interprete.h.

4.8.2 Typedef Documentation

4.8.2.1 typedef enum acciones acciones_t

Definition at line 54 of file interprete.h.

4.8.3 Enumeration Type Documentation

4.8.3.1 enum acciones

Enumerator

move_linear
mover_circular
go_home

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


52 File Documentation

set_milimeters
set_fan
set_ExtruderTemp
set_BedTemp
set_MaxAcel
set_Maxfeedrate
set_systemMode
set_extruderMode
set_position
set_homingOffset
set_hotEndOffset
set_retract
set_motorOFF
set_coldExtrude
display_message
go_pausa
do_retract
steps_unit
finishAllmoves_clearBuff
set_advancedSettings

Definition at line 30 of file interprete.h.

4.8.4 Function Documentation

4.8.4.1 void ini_comando ( )

ini_comando(): Inicializa la estructura que guarda los parametros del comando

4.8.4.2 comando interpretar ( char code[ ] )

interpretar(char code): Pre interpreta el comando de G code o M code


Parameters
char code: Evento a agregar a la cola

Returns

comando: Devuelve un tipo comando, que es una estrucutua del hecha a partir del code y mas facil de
interpretar.

4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/layerHW.h File Reference

#include "Arduino.h"
#include <stdbool.h>
#include <util/delay_basic.h>
#include <iom2560.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/layerHW.h File Reference 53

Macros

• #define F_CPU 16000000


• #define Contador_min 2000
• #define Contador_max 10000
• #define FrecCont_divider 7
• #define min_t 4
• #define CLK_X PORTA7
• #define SENTIDO_X PORTA6
• #define ENABLE_X PORTA5
• #define RESET_X PORTA4
• #define CLK_Y PORTA3
• #define SENTIDO_Y PORTA2
• #define ENABLE_Y PORTA1
• #define RESET_Y PORTA0
• #define CLK_Z PORTC4
• #define SENTIDO_Z PORTC5
• #define ENABLE_Z PORTC6
• #define RESET_Z PORTC7
• #define CLK_E PORTC0
• #define SENTIDO_E PORTC1
• #define ENABLE_E PORTC2
• #define RESET_E PORTC3
• #define SW_X0 0x20
• #define SW_X1 0x10
• #define SW_Y0 0x08
• #define SW_Y1 0x04
• #define SW_Z0 0x02
• #define SW_Z1 0x01
• #define BOTON_EMERGENCIA PINB0
• #define ini_systemClock() {CLKPR = 0x00;}
• #define moveX() {PORTA &= ∼(1<<CLK_X); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORT←-
A |=(1<<CLK_X);}
Macro para dar un paso en el motor X.
• #define moveY() {PORTA &= ∼(1<<CLK_Y); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORT←-
A |=(1<<CLK_Y);}
Macro para dar un paso en el motor Y.
• #define moveZ() {PORTC&= ∼(1<<CLK_Z); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORTC
|=(1<<CLK_Z);}
Macro para dar un paso en el motor Z.
• #define moveE() {PORTC&= ∼(1<<CLK_E); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORTC
|=(1<<CLK_E);}
Macro para dar un paso en el motor E.
• #define deshabMotorX() {PORTA &= ∼(1<<ENABLE_X);}
• #define deshabMotorY() {PORTA &= ∼(1<<ENABLE_Y);}
• #define deshabMotorZ() {PORTC &= ∼(1<<ENABLE_Z);}
• #define deshabMotorE() {PORTC &= ∼(1<<ENABLE_E);}
• #define MotorX_reset() { /∗PORTA |= (1 << ENABLE_X);∗/ PORTA &= ∼(1 << RESET_X); _delay_loop←-
_1(7); PORTA |= (1 << RESET_X);}
• #define MotorY_reset() { /∗PORTA |= (1 << ENABLE_Y);∗/ PORTA &= ∼(1 << RESET_Y); _delay_loop←-
_1(7); PORTA |= (1 << RESET_Y);}
• #define MotorZ_reset() { /∗PORTC |= (1 << ENABLE_Z);∗/ PORTC &= ∼(1 << RESET_Z); _delay_loop←-
_1(7); PORTC |= (1 << RESET_Z);}
• #define MotorE_reset() { /∗PORTC |= (1 << ENABLE_E);∗/ PORTC &= ∼(1 << RESET_E); _delay_loop←-
_1(7); PORTC |= (1 << RESET_E);}

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


54 File Documentation

Typedefs

• typedef enum motor_i motores


Se define el tipo motores para poder ser utilizada como una variable del tipo enum motor_i.

Enumerations

• enum motor_i { motorX, motorY, motorZ, motorE }


Enumeracion que hace referencia a cada uno de los motores.

Functions

• void iniMasterClock ()
• void deshabTimerX ()
• void deshabTimerY ()
• void deshabTimerZ ()
• void deshabTimerE ()
• void configPorts ()
• void configTimerX (unsigned int cantPulsosMclk)
• void configTimerY (unsigned int cantPulsosMclk)
• void configTimerZ (unsigned int cantPulsosMclk)
• void configTimerE (unsigned int cantPulsosMclk)
• void configDriver (motores motor, bool sentido)

Variables

• bool flagX
Variable booleana global flagX.
• bool flagY
Variable booleana global flagY.
• bool flagZ
Variable booleana global flagZ.
• bool flagE
Variable booleana global flagE.
• unsigned char flagEmer
Variable extern unsigned char flagEmer.
• unsigned char flagTimeout
Variable extern unsigned char flagTimeout.
• unsigned long int Pmax
Variable extern unsigned long int Pmax.
• unsigned int Cmin
Variable extern unsigned int Cmin.
• unsigned long int Ninst
Variable extern unsigned long int Ninst.
• unsigned int data_OCR3A
Variable extern unsigned int data_OCR3A.
• unsigned int flagReconfTimer
Variable extern unsigned int flagReconfTimer.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/layerHW.h File Reference 55

4.9.1 Macro Definition Documentation

4.9.1.1 #define BOTON_EMERGENCIA PINB0

Definition at line 212 of file layerHW.h.

4.9.1.2 #define CLK_E PORTC0

Definition at line 143 of file layerHW.h.

4.9.1.3 #define CLK_X PORTA7

Definition at line 59 of file layerHW.h.

4.9.1.4 #define CLK_Y PORTA3

Definition at line 87 of file layerHW.h.

4.9.1.5 #define CLK_Z PORTC4

Definition at line 115 of file layerHW.h.

4.9.1.6 #define Contador_max 10000

Definition at line 35 of file layerHW.h.

4.9.1.7 #define Contador_min 2000

Definition at line 33 of file layerHW.h.

4.9.1.8 #define deshabMotorE( ) {PORTC &= ∼(1<<ENABLE_E);}

Definition at line 406 of file layerHW.h.

4.9.1.9 #define deshabMotorX( ) {PORTA &= ∼(1<<ENABLE_X);}

Definition at line 385 of file layerHW.h.

4.9.1.10 #define deshabMotorY( ) {PORTA &= ∼(1<<ENABLE_Y);}

Definition at line 392 of file layerHW.h.

4.9.1.11 #define deshabMotorZ( ) {PORTC &= ∼(1<<ENABLE_Z);}

Definition at line 399 of file layerHW.h.

4.9.1.12 #define ENABLE_E PORTC2

Definition at line 155 of file layerHW.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


56 File Documentation

4.9.1.13 #define ENABLE_X PORTA5

Definition at line 71 of file layerHW.h.

4.9.1.14 #define ENABLE_Y PORTA1

Definition at line 99 of file layerHW.h.

4.9.1.15 #define ENABLE_Z PORTC6

Definition at line 127 of file layerHW.h.

4.9.1.16 #define F_CPU 16000000

Proyecto CtrlMotors3D Modulo layerHW Este modulo tendra la finalidad de implementar todas aquellas funciones
asi como tambien definiciones y rutinas de interrupcion que sean propias del microcontrolador a utilizar, para que
si se llegase a producir un cambio de hardware solo se tenga que reeescribir este modulo y se deje incambiados
todos los demas.
layerHW.h

Author

Guillermo Airaldi guillermo.airaldi@gmail.com


Guillermo Antunez antunezguillermo7@gmail.com
Jose Basualdo josebasualdo@gmail.com

Version

2.0

Date

5 de diciembre de 2014 ...Librerias ...Constantes

Definition at line 31 of file layerHW.h.

4.9.1.17 #define FrecCont_divider 7

Definition at line 37 of file layerHW.h.

4.9.1.18 #define ini_systemClock( ) {CLKPR = 0x00;}

...Pseudo-Funciones del modulo para menejo de Puertos de Salida


Definition at line 346 of file layerHW.h.

4.9.1.19 #define min_t 4

Definition at line 45 of file layerHW.h.

4.9.1.20 #define MotorE_reset( ) { /∗PORTC |= (1 << ENABLE_E);∗/ PORTC &= ∼(1 << RESET_E); _delay_loop_1(7);
PORTC |= (1 << RESET_E);}

Definition at line 434 of file layerHW.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/layerHW.h File Reference 57

4.9.1.21 #define MotorX_reset( ) { /∗PORTA |= (1 << ENABLE_X);∗/ PORTA &= ∼(1 << RESET_X); _delay_loop_1(7);
PORTA |= (1 << RESET_X);}

Definition at line 413 of file layerHW.h.

4.9.1.22 #define MotorY_reset( ) { /∗PORTA |= (1 << ENABLE_Y);∗/ PORTA &= ∼(1 << RESET_Y); _delay_loop_1(7);
PORTA |= (1 << RESET_Y);}

Definition at line 420 of file layerHW.h.

4.9.1.23 #define MotorZ_reset( ) { /∗PORTC |= (1 << ENABLE_Z);∗/ PORTC &= ∼(1 << RESET_Z); _delay_loop_1(7);
PORTC |= (1 << RESET_Z);}

Definition at line 427 of file layerHW.h.

4.9.1.24 #define moveE( ) {PORTC&= ∼(1<<CLK_E); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORTC


|=(1<<CLK_E);}

Macro para dar un paso en el motor E.


Macro encargado de ejecutar un paso en el motor E
Definition at line 378 of file layerHW.h.

4.9.1.25 #define moveX( ) {PORTA &= ∼(1<<CLK_X); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORTA


|=(1<<CLK_X);}

Macro para dar un paso en el motor X.


Macro encargado de ejecutar un paso en el motor X
Definition at line 357 of file layerHW.h.

4.9.1.26 #define moveY( ) {PORTA &= ∼(1<<CLK_Y); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORTA


|=(1<<CLK_Y);}

Macro para dar un paso en el motor Y.


Macro encargado de ejecutar un paso en el motor Y
Definition at line 364 of file layerHW.h.

4.9.1.27 #define moveZ( ) {PORTC&= ∼(1<<CLK_Z); _delay_loop_1(min_t);/∗__delay_cycles(min_t)∗/ PORTC


|=(1<<CLK_Z);}

Macro para dar un paso en el motor Z.


Macro encargado de ejecutar un paso en el motor Z
Definition at line 371 of file layerHW.h.

4.9.1.28 #define RESET_E PORTC3

Definition at line 161 of file layerHW.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


58 File Documentation

4.9.1.29 #define RESET_X PORTA4

Definition at line 77 of file layerHW.h.

4.9.1.30 #define RESET_Y PORTA0

Definition at line 105 of file layerHW.h.

4.9.1.31 #define RESET_Z PORTC7

Definition at line 133 of file layerHW.h.

4.9.1.32 #define SENTIDO_E PORTC1

Definition at line 149 of file layerHW.h.

4.9.1.33 #define SENTIDO_X PORTA6

Definition at line 65 of file layerHW.h.

4.9.1.34 #define SENTIDO_Y PORTA2

Definition at line 93 of file layerHW.h.

4.9.1.35 #define SENTIDO_Z PORTC5

Definition at line 121 of file layerHW.h.

4.9.1.36 #define SW_X0 0x20

Definition at line 171 of file layerHW.h.

4.9.1.37 #define SW_X1 0x10

Definition at line 178 of file layerHW.h.

4.9.1.38 #define SW_Y0 0x08

Definition at line 184 of file layerHW.h.

4.9.1.39 #define SW_Y1 0x04

Definition at line 190 of file layerHW.h.

4.9.1.40 #define SW_Z0 0x02

Definition at line 196 of file layerHW.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/layerHW.h File Reference 59

4.9.1.41 #define SW_Z1 0x01

Definition at line 202 of file layerHW.h.

4.9.2 Typedef Documentation

4.9.2.1 typedef enum motor_i motores

Se define el tipo motores para poder ser utilizada como una variable del tipo enum motor_i.
Definition at line 235 of file layerHW.h.

4.9.3 Enumeration Type Documentation

4.9.3.1 enum motor_i

Enumeracion que hace referencia a cada uno de los motores.


...Definicion de Variables

Enumerator

motorX Motor X
motorY Motor Y
motorZ Motor Z
motorE Motor E

Definition at line 225 of file layerHW.h.

4.9.4 Function Documentation

4.9.4.1 void configDriver ( motores motor, bool sentido )

Funcion para configurar SENTIDO apropiadamente.


Parameters
motores motor : indica el driver correspondiente a que motor hay que "inicializar" sentido
int sentido : indica sentido de giro para dicho motor

4.9.4.2 void configPorts ( )

Configura los puertos A y C como salidas para los motores, el pin 0 del puerto B para interrucion de EMERGENCIA,
y el Puerto L para entradas de los finales de carrera.

4.9.4.3 void configTimerE ( unsigned int cantPulsosMclk )

Funcion que realiza la configuracion de un timer virtual E, seteando la cuenta y habilitando la cuenta
Parameters

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


60 File Documentation

int cantPulsosMck: Cantidad de pulsos en unidades de Master clock para mover un paso

4.9.4.4 void configTimerX ( unsigned int cantPulsosMclk )

Funcion que realiza la configuracion de un timer virtual X, seteando la cuenta y habilitando la cuenta
Parameters
int cantPulsosMck: Cantidad de pulsos en unidades de Master clock para mover un paso

4.9.4.5 void configTimerY ( unsigned int cantPulsosMclk )

Funcion que realiza la configuracion de un timer virtual Y, seteando la cuenta y habilitando la cuenta
Parameters
int cantPulsosMck: Cantidad de pulsos en unidades de Master clock para mover un paso

4.9.4.6 void configTimerZ ( unsigned int cantPulsosMclk )

Funcion que realiza la configuracion de un timer virtual Z, seteando la cuenta y habilitando la cuenta
Parameters
int cantPulsosMck: Cantidad de pulsos en unidades de Master clock para mover un paso

4.9.4.7 void deshabTimerE ( )

Deshabilita la cuenta del Timer Virtual E

4.9.4.8 void deshabTimerX ( )

Deshabilita la cuenta del Timer Virtual X

4.9.4.9 void deshabTimerY ( )

Deshabilita la cuenta del Timer Virtual Y

4.9.4.10 void deshabTimerZ ( )

Deshabilita la cuenta del Timer Virtual Z

4.9.4.11 void iniMasterClock ( )

Funciones del modulo Inicializa el Timer que genera el Master Clock y configura las interrupciones

4.9.5 Variable Documentation

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.9 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/layerHW.h File Reference 61

4.9.5.1 unsigned int Cmin

Variable extern unsigned int Cmin.


Corresponde a la variable donde se registra la cantidad de pulsos de Master Clock del motor con mayor cadencia
de pasos. Se utiliza en la interrupción del Master Clock para determinar la condición de frenado.

4.9.5.2 unsigned int data_OCR3A

Variable extern unsigned int data_OCR3A.


Corresponde a la variable donde se realizan las cuentas para ajustar el contador del Timer 3 que genera el Master
Clock, hasta llegar al régimen y para desacelerar. Se utiliza para programar el registro OCR3A en el Round-Robin.

4.9.5.3 bool flagE

Variable booleana global flagE.


Corresponde a la bandera_E a ser utilizada en el polling de la funcion stepper

4.9.5.4 unsigned char flagEmer

Variable extern unsigned char flagEmer.


Corresponde a la bandera de emergencia a ser utilizada en el polling de la funcion stepper

4.9.5.5 unsigned int flagReconfTimer

Variable extern unsigned int flagReconfTimer.


Corresponde a la bandera que indica cuando se debe reconfigurar el Timer 3 con la nueva cuenta en data_OCR3A.
Se atiende en el bucle del Round-Robin .

4.9.5.6 unsigned char flagTimeout

Variable extern unsigned char flagTimeout.


Corresponde a la bandera de timeout manejada por el WATCHDOG

4.9.5.7 bool flagX

Variable booleana global flagX.


Corresponde a la bandera_X a ser utilizada en el polling de la funcion stepper

4.9.5.8 bool flagY

Variable booleana global flagY.


Corresponde a la bandera_Y a ser utilizada en el polling de la funcion stepper

4.9.5.9 bool flagZ

Variable booleana global flagZ.


Corresponde a la bandera_Z a ser utilizada en el polling de la funcion stepper

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


62 File Documentation

4.9.5.10 unsigned long int Ninst

Variable extern unsigned long int Ninst.


Corresponde a la variable donde se cuenta la cantidad de interrupciones del Master Clock mientras se acelera. Se
utiliza en la interrupción del Master Clock para determinar la condición de frenado.

4.9.5.11 unsigned long int Pmax

Variable extern unsigned long int Pmax.


Corresponde a la variable donde se registra la maxima variación de cantidad de pasos entre los motores del
posicionador y extrusor. Se utiliza en la interrupción del Master Clock para determinar la condición de frenado.

4.10 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/Main_imprimiendo.h File Reference

#include <LiquidCrystal.h>
#include "buffer.h"
#include "MovimientoManual.h"

Functions

• void MainImprimiendo (void)


• char ∗ LeoGcode ()

4.10.1 Function Documentation

4.10.1.1 char∗ LeoGcode ( )

∗LeoGcode(): Funcion lee un g-code.


Parameters

Returns

4.10.1.2 void MainImprimiendo ( void )

Proyecto Modular 3D Main imprimiendo


El objetivo de este modulo es el de inicializar las variables necesarias e invocar las funciones que sean necesarias
para la puesta en marcha de la impresion de un modelo
Main_imprimiendo.h

Version

1.0

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.11 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/MovimientoManual.h File Reference 63
Author

Guillermo Airaldiguillermo.airaldi@gmail.com
Guillermo Antunez antunezguillermo7@gmail.com
Nicolas Lamath ellama.ing@gmail.com

Date

04 de Setiembre 2014 MainImprimiendo(): Funcion que ejecuta todos los pasos necesarios durante la impre-
sion.

Parameters

Returns

4.11 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/MovimientoManual.h File Reference

#include "ejecutador.h"
#include "Display.h"
#include <LiquidCrystal.h>

Functions

• void MovimientoManual (int option)

4.11.1 Function Documentation

4.11.1.1 void MovimientoManual ( int option )

MovimientoManual(int option): funcion para realizar movimientos del posicionador con el Joystick. Se elige el eje
que se desea mover (X, Y o Z) y luego se elige con movimientos horizontales la distancia a desplazarse. Por ultimo
con movimientos verticales se realiza los movimientos y con el enter se setea el origen de coodenadas del alto
nivel.
Parameters
int option : Option indica si se permite setear el origen de coordenadas del alto nivel (1) o no
(0).

Returns

int:

4.12 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/setup.h File Reference

Macros

• #define PULGADASaMILIMETROS 25.4

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


64 File Documentation

• #define DiamTornilloEmm 11
• #define K_EXT 1
• #define HILOSxPULGADA 12
• #define PASOSxVUELTA 400
• #define VELOCIDAD_MAXIMA_ABSOLUTA_INCHES 30
• #define VELOCIDAD_MAXIMA_ABSOLUTA_MM 800
• #define VELOCIDAD_MAXIMA_ABSOLUTA_INCHES_EXTRUYENDO_SIN_MOV 44
• #define VELOCIDAD_MAXIMA_ABSOLUTA_MM_EXTRUYENDO_SIN_MOV 112
• #define X_MAX_INCHES 15
• #define Y_MAX_INCHES 15
• #define Z_MAX_INCHES 15
• #define E_MAX_INCHES 10000
• #define X_MAX_MM 350
• #define Y_MAX_MM 300
• #define Z_MAX_MM 300
• #define E_MAX_MM 10000
• #define MAX_TEMP_EXT 280
• #define MAX_TEMP_HEATEDBED 80
• #define frecMCLK 8000
• #define T_MCLK 1/frecMCLK

4.12.1 Macro Definition Documentation

4.12.1.1 #define DiamTornilloEmm 11

Definition at line 9 of file setup.h.

4.12.1.2 #define E_MAX_INCHES 10000

Definition at line 20 of file setup.h.

4.12.1.3 #define E_MAX_MM 10000

Definition at line 24 of file setup.h.

4.12.1.4 #define frecMCLK 8000

Definition at line 47 of file setup.h.

4.12.1.5 #define HILOSxPULGADA 12

Definition at line 11 of file setup.h.

4.12.1.6 #define K_EXT 1

Definition at line 10 of file setup.h.

4.12.1.7 #define MAX_TEMP_EXT 280

Definition at line 27 of file setup.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.12 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/setup.h File Reference 65

4.12.1.8 #define MAX_TEMP_HEATEDBED 80

Definition at line 28 of file setup.h.

4.12.1.9 #define PASOSxVUELTA 400

Definition at line 12 of file setup.h.

4.12.1.10 #define PULGADASaMILIMETROS 25.4

Definition at line 8 of file setup.h.

4.12.1.11 #define T_MCLK 1/frecMCLK

Definition at line 48 of file setup.h.

4.12.1.12 #define VELOCIDAD_MAXIMA_ABSOLUTA_INCHES 30

Definition at line 13 of file setup.h.

4.12.1.13 #define VELOCIDAD_MAXIMA_ABSOLUTA_INCHES_EXTRUYENDO_SIN_MOV 44

Definition at line 15 of file setup.h.

4.12.1.14 #define VELOCIDAD_MAXIMA_ABSOLUTA_MM 800

Definition at line 14 of file setup.h.

4.12.1.15 #define VELOCIDAD_MAXIMA_ABSOLUTA_MM_EXTRUYENDO_SIN_MOV 112

Definition at line 16 of file setup.h.

4.12.1.16 #define X_MAX_INCHES 15

Definition at line 17 of file setup.h.

4.12.1.17 #define X_MAX_MM 350

Definition at line 21 of file setup.h.

4.12.1.18 #define Y_MAX_INCHES 15

Definition at line 18 of file setup.h.

4.12.1.19 #define Y_MAX_MM 300

Definition at line 22 of file setup.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


66 File Documentation

4.12.1.20 #define Z_MAX_INCHES 15

Definition at line 19 of file setup.h.

4.12.1.21 #define Z_MAX_MM 300

Definition at line 23 of file setup.h.

4.13 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto


modular3D/Software/Anexo codigo/Codigo/stepper.h File Reference

#include <iom2560.h>
#include <ina90.h>
#include "controlXYZ_E.h"
#include "layerHW.h"
#include "errores.h"
#include "Arduino.h"
#include "math.h"

Macros

• #define LIMITE 3

Functions

• error ∗ stepper ()
• void home_all_axis ()

4.13.1 Macro Definition Documentation

4.13.1.1 #define LIMITE 3

Proyecto CtrlMotors3D Modulo Stepper


Funcion que realiza el movimiento coordinado de 4 motores stepper y retorna un reporte de los posibles errores
ocurridos en el proceso
stepper.h

Author

Guillermo Airaldi guillermo.airaldi@gmail.com


Guillermo Antunez antunezguillermo7@gmail.com
Jose Basualdo josebasualdo@gmail.com

Version

2.0

Date

3 septiembre 2014 ...Modulos basicos ...Modulos proyecto CrtlMotors3D ...Constantes

Definition at line 39 of file stepper.h.

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


4.13 C:/Documents and Settings/MODULAR3D/Mis documentos/Dropbox/Proyecto
modular3D/Software/Anexo codigo/Codigo/stepper.h File Reference 67

4.13.2 Function Documentation

4.13.2.1 void home_all_axis ( )

Función que realiza el homming mecánico de los ejes

4.13.2.2 error∗ stepper ( )

...Funciones del modulo Funcion que realiza el movimiento en los motores paso a paso
Parameters
error Devuelve un puntero a variable tipo error

Generated on Thu Apr 23 2015 20:16:58 for My Project by Doxygen


Apéndice B

Selección de los motores paso a paso

Los cálculos aquı́ presentes se justifican en “Formulas + Calculations for Op-


tium Selection of a stepmotor” [88] y “Selecting a Steping Motor” [89].

B.1. Descripción del sistema


El sistema mecánico a utilizar se compone de un motor paso a paso que será
el encargado de proveer el torque necesario para mover una cierta carga. Para
convertir el movimiento rotatorio en un movimiento lineal en este sistema se hace
necesario un tornillo, conocido como tornillo de potencia, ya que será el encargado
de transmitir la potencia del motor. La únion entre el motor y el tornillo se hace
mediante un acople que para los cálculos se supone tiene eficiencia igual a la unidad.
El otro extremo del tornillo se fija mediante el uso de un ruleman al perfil de
aluminio. De esta forma se consigue que el tornillo pueda girar manteniéndose en
posición horizontal o vertical según sea el caso. La carga se mueve acoplada a un
collar de empuje que se mueve sobre el tornillo. En la Figura B.1 se puede ver una
representación simplificada del sistema.

Figura B.1: Esquema del sistema, imagen tomada de [90].

Para la selección del motor de paso a utilizar se hace necesario determinar:


Apéndice B. Selección de los motores paso a paso

Ángulo de paso.

Torque requerido.

Frecuencia de trabajo.

Potencia.

Se busca obtener una cota del ángulo de paso, para discriminar que motores
cumplen con dicha cota, se determina el torque requerido y se compara con el
torque que se indica en las especificaciones del motor. Se debe cumplir que el
primero es menor que el segundo. No obstante, los motores paso a paso cumplen
con cierta curva torque-frecuencia, un ejemplo se ve en la Figura B.2. Con lo cual,
es necesario verificar que a la frecuencia de trabajo obtenida, el torque al que opera
el motor es mayor o igual al momento angular requerido.

Figura B.2: Ejemplo de curva Torque en función de las revoluciones por segundo, imagen
extraı́da de [91].

B.2. Cálculos teóricos referentes a la selección del motor


En esta sección se presentan las herramientas básicas para poder realizar una
aproximación del torque requerido, el ángulo de paso y la potencia. Se comienza
por listar algunos parámetros necesarios para el cálculo del torque.

p: Es la distancia axial entre roscas adyacentes.

N e: Es el número de hélices que posee tornillo.

L: Se denomina avance y es la distancia axial que avanza la rosca en una


vuelta completa. Se calcula como el producto entre N e y p.

λ: Es el ángulo que forma una recta tangente a la hélice del tornillo con una
recta perteneciente al plano perpendicular a la dirección axial.

244
B.2. Cálculos teóricos referentes a la selección del motor

θ: Es el ángulo que forma la superficie de la rosca con un plano perpendicular


al eje.

µc : Es el coeficiente de fricción sobre la superficie del tornillo.

Dm: Es el diámetro menor del tornillo.

rb: Es el radio principal del ruleman que va al extremo del eje.

µb : Es el coeficiente de fricción del ruleman.

η: Es la eficiencia del tornillo para convertir un movimiento rotatorio en uno


lineal. Se define como el trabajo sin rozamiento como el trabajo necesario
para hacer girar el tornillo con rozamiento.

En el sistema propuesto se tiene que el motor stepper realizará un trabajo Win


que deberá poder hacer girar el tornillo, por lo que dicho trabajo aportará las
perdidas por la fricción interna del sistema y el trabajo que realiza el tornillo para
mover linealmente a la carga.

Win = Wout + Wroz (B.1)

Wout
Por definición de la eficiencia se cumple que η =
Win
Siguiendo el razonamiento a partir de la ecuación anterior se sabe que el trabajo
sobre la carga esta dado por la fuerza efectiva integrado en la curva por la que se
desplaza dicha carga. El resultado de lo anterior teniendo una fuerza constante es

Wout = ∆XFout (B.2)

Asumiendo que se calculó el trabajo para que se desplace una cantidad igual
al avance, se tiene:

Wout = LFout = N epF = pF (B.3)

Realizando el mismo calculo pero para el trabajo a lo largo de la rosca del


tornillo en una vuelta, estando el mismo cargado

Win = 2πrFi n (B.4)

Donde r es Dm divido entre dos. Por lo tanto, se deduce la siguiente expresión


donde el producto de r por Fi n no es nada mas que un torque que se corresponde
con el torque de la carga.

245
Apéndice B. Selección de los motores paso a paso

pF
η2πrFi n = pF ⇒ rFi n = TL = (B.5)
2πη

De la ecuación anterior falta determinar la fuerza F que actúa en sentido axial


sobre la carga debido al giro del tornillo y la eficiencia η.
En cuanto a la fuerza eficaz, pensando en un caso genérico en que se tenga
el tornillo inclinado un ángulo α entre 0 y 2π, se plantea la ley de Newton. Es
importante resaltar que se consideró que el sistema a alcanzado el régimen y por
lo tanto su velocidad es constante y no se tiene aceleración axial.

N − W cos(α) = 0 (B.6)

Donde N es la normal y W el peso de la carga.

F − FR − W sin(α) = 0 (B.7)

Donde F r es la fuerza de rozamiento en el tornillo

FR = µc N (B.8)

Se obtiene entonces que la fuerza efectiva sobre la carga vale

F = W (sin(α) + µc cos(α)) (B.9)

Para estimar la eficiencia, se basó en los apuntes del curso de elementos de


máquinas de la Facultad de Ingenierı́a. En el mismo se llega a que la eficiencia se
puede determinar con el ángulo λ y θ mediante la siguiente expresión

(cos(θ) − µc tan(λ))
η = tan(λ) (B.10)
(tan(λ)cos(θ) + µc )

Donde θ se considera conocido y λ se puede obtener haciendo el desarrollo de


la hélice hasta una distancia igual al avance del tornillo. En la Figura B.3 se puede
observar este desarrollo. Se deduce por trigonometrı́a que el ángulo de la hélice se
puede determinar a partir de la siguiente expresión.

246
B.2. Cálculos teóricos referentes a la selección del motor

p
tan(λ) = (B.11)
πDm

Figura B.3: Desarrollo de la rosca del tornillo para avance l, imagen tomada de [92].

Para obtener el torque requerido, se necesita plantear la segunda cardinal para


obtener los momentos en el sentido axial. Se tiene que se cumple la siguiente
ecuación.

TT = TM − TL − TR ⇒ TM = TT + TR + TL (B.12)
Donde T r es un momento debido al rozamiento en el ruleman y que se calcula
como

TR = rb µb Nb (B.13)
N b coincide en módulo con la fuerza F en el caso particular en que el tornillo
esta horizontal. Y es para este caso en que se puede escribir la expresión siguiente
del torque requerido del motor

pF p p
TM = + rb µb F + TT = µc W ( + rb µb ) + TT = µc gMT ( + rb µb ) + TT
2πη 2πη 2πη
(B.14)
En el caso en que el tornillo yace completamente vertical, no se puede encontrar
una fuerza N b que se corresponda mediante el coeficiente de rozamiento dinámico
con la fuerza de rozamiento en el ruleman. Pero teniendo en cuenta los órdenes del
coeficiente de fricción, se desprecia este componente mas se considera un factor de
seguridad mayor al considerado en el caso horizontal.
Para tener una estimación del torque requerido, esta por calcular TT , que es
la suma de los momentos de inercia correspondientes al tornillo más la carga y el
rotor del motor, multiplicados por la aceleración angular. Por lo tanto, se puede
escribir la siguiente expresión.

247
Apéndice B. Selección de los motores paso a paso

TT = JT ω 0 = (Jtornillo + Jcarga + Jrotor )ω 0 (B.15)

Es importante destacar que Jrotor se obtiene de la hoja de datos del motor que
se quiere averiguar si cumple con las condiciones necesarias para su empleo.
La inercia del tornillo se calcula como:

1
JT ornillo = .π.(De )4 .L.dAc (B.16)
2

En la ecuación anterior De es el diámetro externo del tornillo y dAc la densidad


del tornillo de acero, como se puede ver, se aproxima por un cilı́ndro. La inercia
de la carga se obtiene mediante la siguiente expresión.

p 2
Jcarga = M ( ) (B.17)

Para estimar la aceleración angular se debe obtener una frecuencia de opera-


ción, que será la frecuencia del tren de pulsos que generó el driver del motor. Estos
pulsos determinaran el avance o retroceso de la carga.
Antes de continuar se presenta otra lista de paámetros necesarios para el análi-
sis a desarrollar.

∆L: Resolución de los desplazamientos axiales, o sea, desplazamiento por


paso (por cada pulso).

∆φ: Ángulo por paso.

Np : Es el número de pasos por revolución.

T : Periodo del tren de pulsos.

f : Frecuencia del tren de pulsos.

ω: Velocidad angular del tornillo.

t0 : Perı́odo de posicionamiento, es el intervalo de tiempo desde que aumenta


desde un valor nulo la frecuencia, hasta llegar a un valor tal que se tiene la
velocidad angular requerida y vuelve a cero.

El ángulo de paso y la resolución de la distancia axial cumplen las siguientes


ecuaciones
360∆L
∆φ = , este dato es uno de los relevantes para seleccionar el motor, se
p
toma el mismo como cota para seleccionar entre los valores estándar.

248
B.2. Cálculos teóricos referentes a la selección del motor

360 p p
Np = = ⇒ ∆L = (B.18)
∆φ ∆L Np

La posición que toma la carga es entonces un múltiplo de ∆L que se incrementa


cada un tiempo T , perı́odo del tren de pulsos. La gráfica de esta magnitud se
puede apreciar en la Figura B.4 y como puede verse es escalonada (seccionalmente
continua), ahora si es es lo suficientemente chico, se puede aproximar la función
∆L
de la posición por una recta por el origen, cuya pendiente es .
T

Figura B.4: El gráfico en azul representa la evolución de los pasos que da el motor en cada
perı́odo.

De lo anterior se puede deducir que la velocidad lineal que desarrolla la carga


esta dada por la siguiente expresión.

p Np
V = f ⇒f = V (B.19)
Np p

Por lo que conociendo un estimativo de la velocidad que se requiere de despla-


zamiento por pulso se puede estimar la frecuencia necesaria de tren de pulsos a
inyectar al driver del motor.
De forma análoga con la posición angular, se puede obtener una expresión de
la velocidad angular, habiendo expresado antes, la posición en radianes.

π π
∆φr = ∆φ ⇒ ω = ∆φ f (B.20)
180 180

249
Apéndice B. Selección de los motores paso a paso

Por lo tanto, para estimar la aceleración angular a partir de su velocidad an-


gular, se calcula la razón entre la velocidad angular y el tiempo de aceleración
considerado una porcentaje del llamado perı́odo de posicionamiento.

t1 = 0,25t0 (B.21)

Y t0 se aproxima conociendo la cantidad del pulsos por revolución y la fre-


cuencia de los mismos. Hay que tener en cuenta que el tiempo de posicionamiento
incluye un tiempo de aceleración y desaceleración. Por lo tanto, si bien una primera
aproximación del mismo es el número de pulsos sobre la frecuencia de los pulsos,
en realidad es mayor.

Np
t1 = 0,25 (B.22)
0,75f

Finalmente se obtiene una estimación de la aceleración angular por la siguiente


expresión

π 0,75π
ω 0 = ∆φ f = ∆φ f2 (B.23)
180t1 180 ∗ 0,25Np

Con esta estimación de la aceleración angular, se puede ahora obtener una


primera estimación del torque requerido y para cubrirse en seguridad se multiplica
esta primera aproximación por un factor K que esta entre 2 y 2,5.
A partir de lo anterior se puede obtener también una estimación de la potencia
que se necesita, por lo que se aplica el siguiente resultado teórico:P = TM ω, cabe
resaltar que esta todo determinado.
Este último dato puede ser usado para saber si con la velocidad de giro angular
que se pretende no se esta sobrecargando el motor (demandando mayor potencia).

B.3. Resultados de la selección de los motores


En función de los resultados hallados en la sección B.2 se implementaron en
Matlab los scripts Calculo.m que realiza los cálculos teóricos desarrollados, Ma-
saEjeX.m que calcula la carga en el eje X, MasaEjeY.m que calcula la carga en
el eje Y, MasaEjeZ.m que calcula la carga en el eje Z. El script Main.m hace
uso de los anteriores para calcular una estimación del torque en cada eje. Permite
elegir parámetros para los cálculos estándares y que se corresponden al sistema o
si se desea pueden ser personalizados.
Para realizar la selección de los motores se necesita conocer de ante mano en que
orden se encuentra la inercia del motor, por lo que se probo con un rango variado

250
B.3. Resultados de la selección de los motores

Figura B.5: Curva Par motor versus velocidad en pasos por segundo obtenida de [93].

Eje TorqueN.m
Eje X 0.0875
Eje Y 0.0779
Eje Z 0.1260

Tabla B.1: Resultados de estimación torque para cada grado de libertad, utilizando un factor
de cobertura K = 2.

de inercias que van desde 400 × 10−8 a 600 × 10−7 para estimar aproximadamente
el orden de torques requeridos. Luego se eligieron motores que cumplı́an con ambas
condiciones. Un dato importante a mencionar, es que en primera instancia se pensó
en realizar el prototipo utilizando hierro en la mesa del eje X, del y y el Z. La versión
actual es con aluminio por lo que los resultados que se mostrarán son para un caso
más limitante.
El modelo de motor elegido es Wantai 42BYGHW609 Stepper Motor y en la
Figura B.5 se puede apreciar la curva torque-velocidad (pasos por segundo) de
dicho motor. De la hoja de datos se obtuvo el valor de la inercia del rotor, su valor
se reporta como 54g.cm2 = 540 × 10−8 Kg.m2 . En base a estos datos se obtuvieron
los requerimientos de par motor que se observan en la Tabla B.1.
En la Figura B.5 se observa que la curva se encuentra en un rango de aproxi-
madamente 0,28N m a 0,32N m en un rango de velocidad que llega a 3600pps. Por
lo que se concluye, observando la Tabla B.1, que dichos motores son adecuados
para ser utilizados como actuadores mecánicos en el prototipo desarrollado.

251
Esta página ha sido intencionalmente dejada en blanco.
Apéndice C

Gestión de tiempos

C.1. Cambios en la planificación


La planificación de las tareas del proyecto sufrió transformaciones en el trans-
curso del mismo. En este anexo se justificarán dichas transformaciones y cómo
repercutieron en el diagrama de Gantt. Dado que se vio la necesidad de ir actua-
lizando el mismo a partir de tener una mejor estimación de las horas que exigı́an
diversas tareas, las cuales se habı́an subestimado.
Cabe mencionar que se llegó a acotar las tareas que figuraban en el alcance del
proyecto, siempre en consentimiento con los tutores.
Se comenzó con un diagrama de Gantt en el que, entre otras cosas, se pro-
yectaba tener el armado fı́sico del posicionador realizado para fines de enero del
2014. Éste es el más claro ejemplo de la subestimación de tareas, causado por la
inexperiencia de los integrantes. A mediados de febrero del 2014, fecha del primer
HITO, no se habı́a podido cumplir con el punto antes mencionado, ası́ como tam-
poco se habı́a decidido cual cabezal de impresión comprar. Con lo que las compras
se vieron demoradas.
Además tras un proceso de familiarización con las impresoras en tres dimen-
siones y con los comandos que éstas interpretan, se encontró pertinente extender
el tiempo dedicado a programar el firmware que controla el mecanismo.
Las compras que como se mencionó se vieron demoradas, pudieron llevarse a
cabo a fines de marzo, con lo cual en el mes de abril se volvió a ajustar el diagrama
de Gantt. En él se proyectó para junio la fecha de conclusión del armado del
posicionador. Además surgió a esta altura la opción de que el software encargado
del control de bajo nivel de los motores se efectuara en el contexto de la materia
“Sistemas embebidos en tiempo real”.
Otro cambio realizado en el software surgió de la necesidad de integrar los
distintos módulos del mismo por subgrupos, dedicando un tiempo para efectuar
pruebas.
En el mes de junio del 2014 al verse que el posicionador no se encontraba
finalizado y viendo que el tiempo necesario para concluirlo no era poco, se volvió
a extender el plazo con el fin de realizarlo para fines del mes agosto. Con lo que se
Apéndice C. Gestión de tiempos

proyectó poder trabajar en las otras tareas en paralelo, para lograr la culminación
general del proyecto en la fecha estipulada.
En el software se encontró la necesidad de realizar un agregado en el bajo nivel
de control de los motores, para suavizar arranques y detenciones.
A comienzos del mes de setiembre se logró tener el armado de todos los ejes,
mientras que la interconexión entre ellos y los testeos básicos se postergaron hacia
fines de dicho mes.
Asimismo en el transcurso de setiembre se resolvió realizar un pedido de prórro-
ga de un mes, el cual se justificó a partir de lo anteriormente expuesto. Junto con
esto se decidió dejar de lado la implementación del fresado, para lo que hubiese
sido necesario una dedicación mayor en el software y la electrónica. A su vez para
tener pruebas más completas del software se implementó el simulador.
Luego de tener el posicionador, los primeros testeos demostraron la necesi-
dad de cambiar el diseño, con el fin de implementar los movimientos verticales
utilizando 2 tornillos. Para lo cual fue necesario adquirir los materiales requeridos.
Próximo a la fecha estipulada para la culminación del proyecto aconteció un
imprevisto (rotura de un engranaje), lo que derivó en 2 semanas de postergación
en la fecha final de entrega.

C.2. Dedicación mensual

Mes Dedicación (hs/mes)


septiembre 2013 180
octubre 2013 180
noviembre 2013 135
diciembre 2013 135
enero 2014 165
febrero 2014 105
marzo 2014 150
abril 2014 150
mayo 2014 195
junio 2014 195
julio 2014 165
agosto 2014 240
septiembre 2014 285
octubre 2014 300
noviembre 2014 270
Total 2850
Tabla C.1: Dedicación horaria mensual del equipo del proyecto.

254
Apéndice D

Gestión de gastos

D.1. Distintos gastos previstos e imprevistos


En el presente proyecto se marcó como objetivo diseñar un prototipo replicable
en el Uruguay. Por esta razón se buscó realizarlo con piezas de caracterı́sticas
estándar y las cuales se hallen en el mercado local. Ésto se respetó salvo cuando
la diferencia de precios entre el mercado local o en el extranjero vı́a web marcara
una gran diferencia en el presupuesto del proyecto.
Además se entendı́o pertinente agrupar la mayor cantidad de compras online
posibles en dos envı́os. Éstas se realizaron en los meses de enero y marzo del 2014,
y son detalladas en las Tablas D.1 y D.2, donde se ven divididos por categorı́as.
Éstas son:

Cabezales: donde se engloban los cabezales y los distintos materiales y he-


rramientas que éstos necesitan para su correcto funcionamiento.

Mecánica: con los materiales necesarios para realizar la estructura.

Electrónica: con los elementos que componen la misma.

Categorı́a Costo total (U$S)(con envı́o) Costo total ($)(con envı́o)


Cabezales 183.05
Mecánica 132.97
Electrónica 11.91
Subtotal 327.93
Tabla D.1: Primeras compras efectuadas en el exterior.
Apéndice D. Gestión de gastos

Item Costo total (U$S)(con envı́o) Costo total ($)(con envı́o)


Cabezales 0
Mecánica 247.32
Electrónica 36.56
Subtotal 283.88
Tabla D.2: Segundas compras efectuadas en el exterior.

El sub-total de las compras realizadas en el exterior es de U$S 611.81.


Para elementos más cotidianos, como la tornillerı́a entre otros, las compras
se realizaron en el mercado local. Éstas abarcaron los productos detallados en la
Tabla D.3.

Item Costo total (U$S) Costo total ($)


Cabezales 207.4
Mecánica 71 6130
Electrónica 9167
Subtotal 71 15504.4
Tabla D.3: Compras efectuadas en el mercado local.

Considerando un precio del dolar de $ 24.00, el total asciende a U$S 1329. Hay
que tener en cuenta que existen elementos que no fueron comprados, por ejemplo
las placas de la electrónica, las cuales fueron brindadas por el Taller de Electrónica
Libre (TEL).
Ası́ como no resultó necesario comprar herramientas dado que se utilizaron las
que se encuentran en el taller del instituto o en el laboratorio de control.

256
Apéndice E

Manuales

E.1. Manual de uso y mantenimiento


En la siguiente sección se presentan los diferentes casos de uso del prototipo
desarrollado en el presente proyecto y una breve guı́a de mantenimiento. Los casos
de uso que quedan disponibles tras finalizado el proyecto son:

Impresión 3D.

Movimiento Manual.

Calibración.

E.1.1. Impresión 3D
Un resumen de los pasos a seguir para realizar una impresión son los siguientes:

Puesta a punto del modelo 3D.

Generar archivo G-code.

Transferir archivo a la máquina.

Ordenar impresión.

Puesta a punto del modelo 3D


El primer paso antes de realizar una impresión es decidir qué modelo se desea
realizar. El siguiente paso consiste en conseguirlo, puede ser que pueda hallarse
en un repositorio un modelo que cumpla con lo requerido, pero puede que no, en
especial si es algo muy particular. En caso de no encontrarse un modelo, el mismo
puede diseñarse en programas como:

Autocad.

Blender.
Apéndice E. Manuales

Solidworks.

Sketch up.

Luego de obtener el diseño en cierto formato se debe archivar el mismo con


formato .stl. Este formato es entendido por casi todos los generadores de G-code.
Autocad, Solidworks y Blender permiten exportar en dicho formato, pero otros
programas CAD puede que no lo permitan, por lo que deberá realizarse un paso
extra para obtener el modelo con el formato de fichero mencionado.

Generar el Archivo G-code

A continuación trataremos la obtención del archivo .gcode a partir del fichero


.stl del modelo 3D, en un PC con sistema operativo Windows. Se discutirá el uso
del software CURA 14.01. Para ello, se explicaran las diferentes configuraciones
necesarias a realizar para la generación de un archivo adecuado a la máquina.
Cuando por primera vez se inicia CURA se solicita configurar la impresora
y se solicita escoger un modelo. Como la máquina desarrollada no es un mode-
lo estándar comercial, el primer paso es seleccionar en el menú de selección de
máquina other(Ex: RepRap, MakerBot) como se muestra en la Figura E.1.

Figura E.1: Menú Configuration Wizard, selección máquina.

258
E.1. Manual de uso y mantenimiento

Figura E.2: Menú Configuration Wizard, otra información de máquina.

Figura E.3: Menú Configuration Wizard, información habitual de máquinas RepRap.

El siguiente paso es elegir la opción Custom.. del menú de Other Machine

259
Apéndice E. Manuales

Information, como se muestra en la Figura E.2. Realizado el anterior paso se


despliega un menú para configurar parámetros básicos para la impresión de una
máquina RepRap que se podrá utilizar. En la Figura E.3 se aprecia la configuración
realizada para la máquina M3D. Finalizado los pasos anteriores se podrá apreciar
el entorno gráfico de CURA como se muestra en la Figura E.4. Para que él tenga la
apariencia mostrada debe haberse establecido el modo Full-Settings en la pestaña
Expert.

Figura E.4: Entorno gráfico de CURA host software, en modo Full-Settings.

Los siguientes pasos consisten en verificar las configuraciones anteriores sobre


el volumen de trabajo disponible y realizar las restantes que incluyen velocidad y
temperatura. En la pestaña Basic que se observa en la Figura E.5 se pueden confi-
gurar parámetros para la calidad de impresión, el relleno, velocidad, temperatura,
soporte y filamento. Para el prototipo desarrollado se recomienda configurar como
se muestra en la Figura E.5.

260
E.1. Manual de uso y mantenimiento

Figura E.5: Menú de configuraciones básica, Basic.

En el menú Advanced se debe chequear el diámetro de la boquilla o Nozzle que


debe ser de 0,3mm. Los parámetros para retracción no son necesarios ya que no se
habilitó en el menú anterior. El resto de los recuadros se pueden configurar como
se aprecia en la Figura E.6.

261
Apéndice E. Manuales

Figura E.6: Menú de configuraciones avanzado, Advanced.

Luego se debe verificar en el menú Machine Settings las dimensiones del volu-
men de impresión. Se accede al mismo a través de la barra de herramientas, opción
Machine. Un detalle importante es que en la pestaña antes mencionada se debe
visualizar la selección de nuestra configuración, lo cual se verifica observando que
aparece seleccionado el nombre de nuestra máquina. En la Figura ?? se aprecia
como debe estar editado y el tipo de firmaware para el que se debe generar el
G-code. El offset del cabezal no se configura porque es resuelto en la etapa de
calibración.

262
E.1. Manual de uso y mantenimiento

Figura E.7: Menú de configuraciones de máquina, Machine settings.

En el menú de Expert Config es necesario revisar las configuraciones del Skirt y


Raft. Las primeras son de los trazos iniciales que realiza determinando un margen
para el área de impresión y las segundas determinan la superficie inicial para
mejorar la adhesión. Las configuraciones de ambas se ven en la Figura E.8. Por otro
lado, se debe mantener la opción de Spiralize desactivada, el Retraction (retraer
el filamento), se configura sólo si se habilita la opción en el menú básico y con los
valores mostrados en la siguiente figura.

Figura E.8: Menú de configuraciones de máquina, Machine settings.

Realizadas las anteriores configuraciones, se puede proceder a cargar el modelo


.stl y generar el archivo .gcode. Para ello, en la barra de herramientas se accede

263
Apéndice E. Manuales

a File/load model file... y se selecciona del directorio correspondiente el fichero


que se desee. Cuando se complete la carga, se puede proceder a generar el G-code
accediendo a File/Save GCode.. y eligiendo el directorio donde se desea almacenar
el archivo.
En lo que sigue de este manual se explicará la transferencia del archivo a la
máquina el cual se aloja en el computador Raspberry Pi y los pasos previos de
calibración antes de efectuar la impresión.

Transferir archivo a la máquina


En las siguientes lı́neas se describirá el proceso para transferir el archivo .gcode
al prototipo para su posterior impresión. Como se mencionó anteriormente, el ar-
chivo se transfiere mediante comunicación inalámbrica WIFI. Para ello, se requiere
que el dispositivo donde se encuentra alojado el archivo se conecte al servidor de
la máquina que se implementó con la placa Raspberry Pi. El SSID de la red WIFI
del prototipo es DIRECT-modular3D printer a la cual el usuario debe conectarse.
En la Figura 6.3 se aprecia la red de la máquina desde un celular.
Para transferir el archivo desde un PC debe contar con un software de trans-
ferencia de archivos. Para el sistema operativo Windows se utilizó el programa
WinSCP. En el caso de teléfonos con sistema operativo Android se utilizó AndFtp.

Realizar impresión
Una vez alojado el archivo que se desea imprimir en la máquina hay una serie
de pasos obligatorios para realizar antes de iniciar la impresión. Los mismos se
listan a continuación.
Homming: El mismo consiste en hallar el cero mecánico del posicionador.
Offset: Consiste en indicar el cero de alto nivel relativo al mecánico.
Además existen una serie de calibraciones que son necesarias realizar cada
cierto tiempo, para obtener el mejor rendimiento del prototipo. Las mismas se
explicarán más adelante. Continuando con los pasos previos en la Figura E.9 se
muestra el menú inicial al cual podrá acceder el usuario y manejar mediante uso
del joystick.

Figura E.9: Menú del display inicial, menú de calibración.

264
E.1. Manual de uso y mantenimiento

Para acceder al Homming se debe presionar ENTER (botón rojo del joystick )
y se visualizará el menú que se aprecia en la Figura E.10. Con un nuevo ENTER
comienza a operar la máquina, moviendo sus tres ejes simultáneamente hasta al-
canzar sus finales de carrera, para detectar su origen mecánico. El funcionamiento
del Homming puede consultarse por más detalle en el Capı́tulo 6.

Figura E.10: Opción para realizar Homming.

Cuando los tres ejes de la máquina se hayan detenido significará que se puede
iniciar la configuración del Offset para la posición de la máquina. En el caso del
eje Z, siempre se debe llevar el mismo a una posición inicial adecuada, es decir,
una distancia que medida desde la superficie de la mesa de trabajo, deje pasar tan
solo una hoja de papel. En cuanto a los restantes ejes, se puede setear un inicio
distinto del cero mecánico, pero no es obligatorio.
En la Figura E.11 se observa el menú a través del cual se accede a las opciones
de movimiento manual de cada eje, necesario para realizar el ajuste del cero de
software. En la Sección E.1.2 se detalla el proceso de operación que debe seguir el
usuario.

Figura E.11: Menú de movimiento manual.

La idea en éste punto es llevar cada eje a una posición deseada a través del
joystick. Y para indicar dicha ubicación como un cero del software de alto nivel se
debe accionar el botón de ENTER. Finalizada dicha tarea, ya se puede proceder
a desencadenar el proceso de impresión. Para ello, debe alcanzarse en la pantalla
del prototipo el menú que se aprecia en la Figura E.12 y presionar ENTER.

265
Apéndice E. Manuales

Figura E.12: Menú de impresión.

E.1.2. Movimiento Manual


Las funcionalidades del movimiento manual son dos: una es puramente recrea-
tiva y la segunda es la de poder realizar la configuración del offset de la máquina.
Para la segunda opción se debe acceder al menú de calibración y luego seleccionar
la opción de offset, que despliega las opciones de movimiento manual que habili-
tan la configuración del mismo. En la Sección E.1.3 se explica como acceder a ésta
opción y en los próximos párrafos de la presente sección como hacer uso de ésta
funcionalidad.
Se proporciona al usuario la posibilidad de escoger una variedad de desplaza-
mientos que van desde 10cm hasta 0,1mm de resolución en cada eje. El procedi-
miento para cada eje es análogo por lo que se explica el camino adecuado para un
solo eje, por ejemplo el eje Y. En la Figura E.13 podemos observar que la primera
opción brindada es mover el eje X, pero si desplazamos el joystick hacı́a la derecha
alcanzamos el eje Y.

Figura E.13: Menú de movimiento manual, opción eje X. A la derecha opción eje Y e izquierda
SALIR.

Una vez alcanzada la opción para el eje Y, se presiona ENTER y se tendrán


diferentes opciones para la distancia de los desplazamientos a realizar como se
mencionó anteriormente. En la Figura E.14(a), se aprecia la elección para desplazar
10cm, en la Figura E.14(b) 1cm y en la Figura E.14(c) para 1mm. El movimiento

266
E.1. Manual de uso y mantenimiento

se desencadena moviendo, en la dirección vertical, la palanca del joystick y según


si es hacia arriba o abajo se determina el sentido del desplazamiento.

(a) Opción de desplazamiento 10cm para el eje Y.

(b) Opción de desplazamiento 1cm para el eje Y.

(c) Opción de desplazamiento 1mm para el eje Y.

Figura E.14: Diferentes pantallas del menú de movimiento manual.

Luego de alcanzada cierta posición en el eje correspondiente se puede presionar


ENTER para indicar el offset del eje, o se puede buscar la opción de SALIR para
retornar al menú anterior.

E.1.3. Calibración
Dentro del proceso de calibración se pueden realizar las siguientes tareas:

Hallar cero mecánico.


Offset.

267
Apéndice E. Manuales

Ortogonalidad mesa de trabajo respecto al eje Z.


Milı́metros de filamento por paso del motor perteneciente al cabezal extrusor.

La primer opción ya se comentó en la Sección E.1.1. La segunda funcionalidad


que ofrece el menú de calibración fue explicada desde el punto de vista funcional
en E.1.2. Para acceder a dicha función se debe seleccionar el menú de Calibración
y seguidamente acceder a la opción de offset como se muestra en la Figura E.15.

Figura E.15: Menú inicial de offset.

Para calibrar la altura de la mesa se debe acceder a la opción correspondiente


y presionar ENTER. El procedimiento implementado a nivel software consiste en
recorrer cuatro puntos e ir verificando que la distancia entre el puntero del cabezal
de impresión sea tal que pase una hoja de papel. Para ello, en cada punto se debe
regular la altura de la mesa de trabajo, provista de resortes y tornillos para cumplir
el objetivo. En las Figuras E.16(a) y E.16(b) se observa la apariencia del menú
para el primer punto del recorrido P0 y P1 .
Para realizar el ajuste de la cantidad de filamento extruido por paso del motor
stepper el experimento que se debe realizar consiste en tomar una medida del
filamento que se desea extruir, por ejemplo 5cm, y luego realizar la extrusión
midiendo cuanto filamento de consumió respecto al origen de la marca anterior.
Luego se determina la razón entre ambas medidas. El factor hallado se utiliza para
determinar la constante para calibrar la cantidad de milı́metros extruidos en un
incremento angular del motor. En general se repite el experimento cierta cantidad
de veces y se utiliza un valor medio de dicho factor. Para realizar dicha función se
implementó el menú de la Figura E.17, al cual se debe acceder con ENTER.

Figura E.17: Menú para calibración de milı́metros por paso en el motor del extrusor.

268
E.1. Manual de uso y mantenimiento

(a) Ajuste altura mesa de trabajo, opción ir al primer punto.

(b) Ajuste altura mesa de trabajo, opción ir al segundo punto.

Figura E.16: Menú de calibración, opciones de ajuste de altura de la mesa de trabajo.

La cantidad de filamento a extruir se configura moviendo, en la dirección ver-


tical, la palanca del joystick. Una vez realizado ésto, se debe accionar el botón
de ENTER para comenzar la prueba. En las Figuras E.18(a) y E.18(b) podemos
apreciar el menú una vez accedido a la opción pertinente y la configuración de
filamento a extruir respectivamente.

E.1.4. Mantenimiento
El mantenimiento de la máquina involucra una serie de tareas necesarias para
el adecuado funcionamiento mecánico de la estructura y además de la extrusión.
Es recomendable aplicar un lubricante liviano (que además limpia) a las varillas
roscadas que traccionan en cada eje con cierta regularidad, no mayor a una semana
y mantener los ejes limpios.
Por otro lado, es recomendable limpiar regularmente la boquilla del extrusor,
para lo cual se debe calentar el nozzle previo a retirarlo y hacer extruir a la máquina
sin el mismo. A éste último limpiarlo retirando toda impureza posible y verificando
que el orificio de 0,3mm se encuentre desbloqueado.
Además se debe verificar el estado de los finales de carrera y verificar conexiones
en caso de mal funcionamiento. En caso de no solucionar el problema puede intentar
remplazarlo por otro.
En cuanto a la correa dentada, la misma no debe estar muy gastada. En caso de
detectarse dicho problema deberá reemplazarse por una nueva correa. Las medidas

269
Apéndice E. Manuales

(a) Configuración de milimetros a extruir para calibración1.

(b) Configuración de milimetros a extruir para calibración 2.

Figura E.18: Calibración del extrusor.

de la misma son 4900 de largo, 1cm de ancho y pase XL(distancia entre crestas),
dicha información se resume en el código 490XL.

E.2. Manual de construcción


E.2.1. Introducción
Uno de los objetivos del proyecto “Modular 3D” era tener redactado al final
del mismo un manual de construcción, donde se detallan los pasos para que el
armado del prototipo pueda ser replicado.

E.2.2. Piezas necesarias


Pieza con ruleman para los tornillos
Para fijar el tornillo a los perfiles cortos es necesario de una pieza como la
que se ve en la Figura E.19. Esta pieza se realiza con una planchuela de hierro de
10cm×3cm y de 1cm de espesor, la que se debe ahuecar para que entre el ruleman,
y a la planchuela de hierro se le debe hacer perforaciones de 3mm de diámetro en
las esquinas por los cuales pasaran los tornillos que la fijaran a los perfiles cortos.

270
E.2. Manual de construcción

Figura E.19: Pieza diseñada para la colocación del ruleman.

Obs (1): Se debe tornear los tornillos para que entren y calcen en el ruleman, que tiene un diámetro
interior de 8mm.
Obs (2): Se debe realizar tanto la colocación del tornillo en el ruleman y del ruleman en la planchuela
de la forma más justa posible y rematarlas con un martillazo.

Pieza para la tuerca


Esta pieza es necesaria para corregir la excentricidad de las varillas roscadas, y
es la que conecta las tuercas con las mesas. La pieza se muestra en la Figura E.20.
Se debe limar las caras de las tuercas hasta que entren en el perfil U, o sea que
debe poder deslizar por este pero sin quedar un espacio que introduzca un tiempo
muerto en los movimientos.

Figura E.20: Pieza para eliminar la excentricidad de los tornillos.

La tuerca entonces queda contenida entre el perfil en forma de “U” y de un


planchuela de aluminio de 4mm de espesor. La distancia entre estos dos elementos
se mantiene constante con separadores, los cuales son cilindros de aluminio.
Obs: Dependiendo de las dimensiones del perfil en forma de “U” puede resultar necesario limar sus
caras para que pueda pasar el tornillo .

271
Apéndice E. Manuales

Pieza para acoplamiento de los motores

Pieza hecha con perfil de sección cuadrada de 4cm × 4cm y de unos 10cm de
largo. Se le deben realizar 5 perforaciones en unos de los lados, una central circular
con un diámetro superior a Xcm y 4 para sujetar el motor a la pieza.
La otra perforación que se le debe realizar dependiendo como se va a acoplar
el eje del tornillo al tornillo, está puede ser en el lado opuesto a las otras 4 o en
uno de los lados adyacentes.
Esta pieza no es igual para el Eje X que para los otros dos. Esto es porque
depende de como es el acople entre el eje del motor y el tornillo (él cual debe ser
torneado para llevarlo hasta los 8mm de diámetro) se realice. Los dos casos se
muestran en la Figura E.21.

(a) Versión X. (b) Versión YZ.

Figura E.21: Ejemples de los dos tipos de acoples.

En el primer caso, en el que se muestra en la Figura E.21(a), el acople es directo


y se debe permitir que el tornillo sea lo suficientemente largo para encontrarse a
corta distancia del eje del motor, esto se hace con una pieza como la que se ve en
la Figura E.22(a). En los otros dos casos el eje del motor se encuentra paralelo al
tornillo y hace falta de un engranaje en cada uno y una correa que los una. Estas
piezas se muestran en la Figura E.22(b).

(a) Pieza necesaria para realizar el (b) Ejemplo de engranajes y co-


acople directo. rrea necesarias para realizar el
acople en paralelo.

Figura E.22: Ejemplos de los elementos claves para realizar los distintos acoples.

272
E.2. Manual de construcción

E.2.3. Armado de un eje genérico


Debido al carácter modular del prototipo se entiende existen varios puntos que
se deben explicar de forma general para todos los ejes y luego se detallará para
cada uno la información que sea pertinente, como pueden ser las medidas.

Figura E.23: Eje genérico.

Un ejemplo de los ejes que forman el toda la estructura, se puede ver en la


Figura E.23, esta figura es útil para fijar conceptos, donde se detallan los siguientes:

perfiles largos
perfiles cortos
largo interior y exterior
ancho interior y exterior

Perforaciones
Las perforaciones que se deben realizar en los perfiles de aluminio para todos
los ejes son:

perforaciones del lado inferior de los perfiles cortos y largos, donde se sujeta-
ran las placas que unen los perfiles y mantienen la forma de los rectángulos.
Para esto se deben realizar 4 perforaciones por esquina de Xcm de diámetro,
y centradas a la distancia que se muestran en la Figura E.24

Figura E.24: Perforaciones a realizar en las esquinas.

273
Apéndice E. Manuales

perforaciones en el lado interior de los perfiles cortos para sujetar las piezas
que fijan los tornillos, Subsección E.2.2.

perforaciones en el lado interior de los perfiles cortos de 8mm de diámetro


para colocar las guı́as de acero pulido.
La distancia de la mesa a tornillo queda fijada por la pieza que se construyo
para trasladar el movimiento, y esta depende básicamente de las dimensiones
del tornillo y del grosor de la placa que se le agrega. De la misma forma
la distancia de la mesa a las guı́as de acero pulido depende de los cojinetes
lineales. Estas dos distancias mencionadas no tienen porque ser iguales, para
corregir las diferencias se deben realizar las perforaciones contemplando las
distintas alturas, como se ve en la Figura E.25.

Figura E.25: Diferencia de altura entre las perforaciones de las guı́as y la del tornillo.

perforación en el lado interior de los perfiles cortos de un diámetro mayor a


8mm para que atraviese el tornillo.

Las posiciones exactas donde se debe perforar dependiendo de cual eje sea,
estas medidas se verán en la Sección E.2.4.

Placas para proteger las deformaciones

En la cara inferior de los rectángulos de perfiles se le deben colocar laminas


de aluminio de Xcm de espesor, que cumplen con 2 funciones: primero unen los
perfiles que se encuentran en caras adyacentes del rectángulo, y segundo protege
que rectángulo se deforme.
Las dimensiones de las mismas dependerán de en qué eje cumpla sus funcio-
nes y se detallaran en la siguiente sección, y a las placas se le debe realizar las
perforaciones pertinentes para coincidir con las perforaciones vistas en la Figura
E.24.
Por ultimo comentar que las placas que protegen de deformaciones al rectángu-
lo se pueden colocar de forma que una sola placa que cubra exactamente el área
exterior de los rectángulos, o se pueden colocar 2 placas más pequeñas que cubran
los lados cortos, esto se puede apreciar en la Figura E.26

274
E.2. Manual de construcción

(a) Una sola placa. (b) Dos placas.

Figura E.26: Distintos usos de la placas para proteger las deformaciones.

Para el caso de los ejes Y y Z las placas deben de tener un agujero por el que
pase la correa que se encarga de trasladar el movimiento del motor al tornillo.

Armado
El armado de un eje se realiza formando el rectángulo con las guı́as y el tor-
nillo, como se ve en la Figura E.23. Luego se colocan las placas para prevenir las
deformaciones del rectángulo.

275
Apéndice E. Manuales

E.2.4. Diferencias entre los distintos ejes


En la presente sección se detallarán las dimensiones necesarias que faltan para
poder dar armado a cada uno de los ejes:

Eje X
Para el Eje X los materiales necesarios se detallan en la Tabla E.2.4 y las
medidas del mismo se muestran en la Figura E.27.
Material cantidad
Perfiles de aluminio de sección de 3cm × 3cm 2 × 70cm
2 × 40cm
Pieza para acoplamiento 1 (versión X)
Pieza con ruleman 2
Tornillo de 1/2 pulgada de diámetro 1 ×1mt
Guias de acero pulido de 8mm de diámetro 2 ×80cm
Cojinetes lineales de 8mm de diámetro 4
Pieza para la tuerca 1
Placa de alumino de 4mm de espesor 36cm × 35cm
El tornillo debe tener 62cm con rosca y del lado que no se encuentra el motor
debe continuar torneado (8mm de diámetro) como máximo 2cm. Y del lado opuesto
el tornillo debe continuar torneado para quedar lo suficientemente cerca del eje del
motor y realizar el acoplamiento con la pieza del acople directo.

(a) Medidas totales del eje X. (b) Medidas de las perforaciones


en el eje X.

Figura E.27: Medidas eje X.

Y para proteger las deformaciones se deben colocar 2 placas iguales de 46cm ×


20cm, y 4mm de espesor, en los lados cortos.
Por último la mesa que corre por el Eje X debe ser un rectángulo de aluminio
de 4mm de espesor, de 36cm en la dirección perpendicular al tornillo y 35cm en
la otra dirección. La mesa debe contar con la pieza para la tuerca puesta de forma
centrada y con los 4 cojinetes formando un cuadrilátero de forma coherente.
Obs: En ambos perfiles largos se deben realizar 6 perforaciones que atravesaran los perfiles por las 2
caras. Con estas perforaciones se colocarán los Ejes Z.

276
E.2. Manual de construcción

Eje y
Para el Eje Y los materiales necesarios se detallan en la Tabla E.2.4 y las
medidas del mismo se muestran en la Figura E.28.

Material cantidad
Perfiles de aluminio de sección de 3cm × 3cm 2 × 40cm
2 × 26cm
Pieza para acoplamiento 1 (versión YZ)
Pieza con ruleman 2
Tornillo de 1/2 pulgada de diámetro 1 ×1mt
Guias de acero pulido de 8mm de diámetro 2 ×80cm
Cojinetes lineales de 8mm de diámetro 4
Pieza para la tuerca 1
Placa de alumino de 4mm de espesor 8cm × 21cm

El tornillo debe tener 54cm con rosca y del lado que no se encuentra el motor
debe continuar torneado (8mm de diámetro) como máximo 2cm. Y del lado opuesto
debe continuar torneado 2, 5cm.

(a) Medidas totales del eje Y. (b) Medidas de las perforaciones


en el eje Y.

Figura E.28: Medidas eje Z.

Y para proteger las deformaciones se deben colocar 1 placa de 26cm × 46cm,


y 4mm de espesor.
Por último la mesa que corre por el Eje Y debe ser un rectángulo de aluminio
de 4mm de espesor, de 8cm en la dirección perpendicular al tornillo y 21cm en la
otra dirección. La mesa debe contar con la pieza para la tuerca puesta de forma
centrada y con los 4 cojinetes formando un cuadrilátero de forma coherente.

Eje Z
Para el Eje Z los materiales necesarios se detallan en la Tabla E.2.4 y las
medidas del mismo se muestran en la Figura E.29.

277
Apéndice E. Manuales

Material cantidad
Perfiles de aluminio de sección de 3cm × 3cm 2 × 62cm
2 × 30cm
Pieza para acoplamiento 1 (versión YZ)
Pieza con ruleman 2
Tornillo de 1/2 pulgada de diámetro 1 ×1mt
Guias de acero pulido de 8mm de diámetro 2 ×80cm
Cojinetes lineales de 8mm de diámetro 4
Pieza para la tuerca 1
Placa de alumino de 4mm de espesor 22cm × 22cm

El tornillo debe tener 54cm con rosca y del lado que no se encuentra el motor
debe continuar torneado (8mm de diámetro) como máximo 2cm. Y del lado opuesto
debe continuar torneado 2, 5cm.

(a) Medidas totales del eje Z. (b) Medidas de las perforaciones


en el eje Z.

Figura E.29: Medidas eje Y.

Y para proteger las deformaciones se debe colocar 2 placas de 36cm × 15cm, y


4mm de espesor.
La mesa que corre por el Eje Z debe ser un cuadrado de aluminio de 4mm de
espesor, de 22cm. La mesa debe contar con la pieza para la tuerca puesta de forma
centrada y con los 4 cojinetes formando un cuadrilátero de forma coherente.
Recordar que se deben construir 2 ejes Z.
Obs: en los perfiles cortos que quedaran colocados hacia abajo se deben realizar perforaciones que
coincidan con las perforaciones hechas en los perfiles largos del Eje X.

E.2.5. Interconexión
Para formar la totalidad de la estructura, se deben juntar de forma que quede
armado como se presenta en la Figura E.30.

278
E.2. Manual de construcción

Figura E.30: Estructura completa armada.

Los Ejes Z se deben colocar parados a los lados del Eje X como se muestran en la
Figura E.30 y se deben ajustar con bulones utilizando las perforaciones realizadas
para tal fin. El Eje Y se coloca en las mesas de los Ejes Z.

E.2.6. Cabezal de impresión


Los detalles sobre el cabezal de impresión se omiten a causa de la variada
gama que se ofrece de los mismos con el objetivo de dejar con libertad de elección
al lector, se recomienda estudiar su colocación en la mesa del Eje Y con el fin de
aprovechar al máximo la excursión.

E.2.7. Tensor
Para cumplir con el objetivo de que el movimiento vertical sea uniforme y
partiendo de la hipótesis de que los tornillos son iguales, es importante trasladar
el movimiento de un tornillo al otro con relación 1 : 1. Esto se realiza con una
correa dentada y con engranajes aptos para la misma. Debido a la dificultad que
se presenta al encontrar una correa del largo exacto para que se encuentre tensada,
se coloca un tercer punto que forme un triangulo con los dos tornillos, con una
correa de 49 pulgadas y las distancias proyectadas se muestra en la Figura E.31,
se calcula la colocación del tensor.

Figura E.31: Colocación del tensor.

279
Apéndice E. Manuales

El tensor se implemento como dos rulemanes que giran en un bulon de 8mm


de diámetro. En la Figura E.31 se muestra un ejemplo de la triangulación formada
por la correa donde X es la distancia entre los tornillos de los Ejes Z y el pı́vot, y
H es la alturas del triangulo.

280
E.3. Armado de driver

E.3. Armado de driver


Los materiales necesarios para el armado del driver se muestran en la Tabla
E.1. En la Figura E.32 se aprecia el PCB de la versión 3.1 del driver, y en la Figura
E.33 se muestran donde se deben colocar los materiales en el driver.

Identificador Material Valor


C1 Capacitor electrolı́tico 10u/50V
C2 Capacitor electrolı́tico 10u/50V
C3 Capacitor 100n
C4 Capacitor 100n
C6 Capacitor 100n
C7 Capacitor 100n
C8 Capacitor 3,3u
C9 Cap. electrolı́tico 470u/50V
D1 Diodo SCHOTTKY SR3200
D2 Diodo SCHOTTKY SR3200
D3 Diodo SCHOTTKY SR3200
D4 Diodo SCHOTTKY SR3200
D5 Diodo SCHOTTKY SR3200
D6 Diodo SCHOTTKY SR3200
D7 Diodo SCHOTTKY SR3200
D8 Diodo SCHOTTKY SR3200
DC1 conversor DC-DC LM7805
IC1 4 AND MC4081
L297 Controlador de motores PAP L297
L298 2 puentes H L298
R1 Resistencia 1kΩ
R2 Resistencia 1Ω
R3 Resistencia 2,2kΩ
R4 Resistencia 1Ω
R5 Resistencia 1Ω
R6 Resistencia 1Ω
R7 Resistencia 47kΩ
R8 Resistencia 4,7kΩ
R9 Potenciómetro 5kΩ
R10 Resistencia 410Ω
R11 Resistencia 10kΩ
R12 Resistencia 390Ω
T1 Transistor BC547
LED1 Led
Tabla E.1: Tabla de componentes para el armado del driver.

281
Apéndice E. Manuales

VDD

GND
STEPPER

VCC
MOTOR
MODULAR3D V_3.1 DRIVER

Figura E.32: Diagrama PCB de la versión 3.1 del driver.

Figura E.33: Layout de la versión 3.1 del driver.

282
Referencias

[1] D. J. Harrop, Applications of 3D Printing 2014-2024 Forecasts, Markets, Pla-


yers. IDTechEx, 2014.
[2] “RepRap/es.” http://reprap.org/wiki/RepRap/es.
[3] “Impresoras 3D: historia, cómo trabajan y algunas de las impresoras más po-
pulares.” http://geeksroom.com/2014/02/impresoras-3d/82881/, 2014.
[Online; accessed: 2014-11-18].
[4] “6-axis 3D Printer (video) #3DThursday #3DPrin-
ting.” http://onestopbot.net/2013/10/10/
6-axis-3d-printer-video-3dthursday-3dprinting/, 2013. [Online;
accessed: 2014-11-15].
[5] “SCI-Arc student develops freeform 3D printing with
“undo”function.” http://www.dezeen.com/2013/07/23/
sci-arc-student-develops-freeform-3d-printing-with-undo-function/,
2013. [Online; accessed: 2014-11-15].
[6] “PiMaker 3D Printer.” http://www.thingiverse.com/thing:128700, 2013.
[Online; accessed: 2014-11-18].
[7] “News: Maplin brings 3D printing to the High Street.” http://www.rothbiz.
co.uk/2013/07/news-3468-maplin-brings-3d-printing-to.html, 2013.
[Online; accessed: 2014-11-18].
[8] “3D printing technologies.” http://www.3d-printing-experts.com/
knowledge-base/3d-printing-technologies/, 2014. [Online; accessed:
2014-10-30].
[9] J. R. S., “Ası́ funciona la extrusión en las impresoras 3d,” My
BQ y yo, 2014. http://www.mibqyyo.com/articulos/2014/09/22/
asi-funciona-la-extrusion-en-las-impresoras-3d/#/vanilla/
discussion/embed/?vanilla_discussion_id=0.
[10] “RepRap Argentina.” http://reprap-argentina.blogspot.com/, 2012.
[Online; accessed: 2014-11-18].
[11] “Orca review.” http://forums.reprap.org/read.php?152,94557, 2011.
[Online; accessed: 2014-11-18].
Referencias

[12] “The FlashForge Creator and the practicalties of 3D printing at home.” http:
//www.gizmag.com/review-3dprinter-flashforge/29064/, 2013. [Online;
accessed: 2014-11-18].

[13] “CNC Router 3D 40 x 30 para métal.” http://www.seul.cl/tienda/


277-cnc-router-3d-40-x-30-para-m%C3%A9tal.html. [Online; accessed:
2014-11-18].

[14] “NEW CNC 3020 Router Engraving Drilling/Milling Machine (UC124).”


http://www.marcmart.net/2012/02/16/manual-cnc-3020/, 2012. [Online;
accessed: 2014-11-18].

[15] “El hilo de mis impresoras.” http://spainlabs.com/foro/viewtopic.php?


f=36&t=509, 2013. [Online; accessed: 2014-11-18].

[16] “Impresora 3D de bothacker.” http://blog.bricogeek.com/noticias/


diy/impresora-3d-de-bothacker-hecha-con-t-slot/, 2012. [Online; ac-
cessed: 2014-11-18].

[17] “MakerBot Digitizer Brings Desktop 3D Scanning


To All.” http://www.nextpowerup.com/news/2891/
makerbot-digitizer-brings-desktop-3d-scanning-to-all.html, 2013.
[Online; accessed: 2014-11-18].

[18] C. Canto, “Motores de paso o steppers motors,” Facultad de Cien-


cias, UASLP, pp. 1–17, 2001. http://galia.fc.uaslp.mx/~cantocar/
microcontroladores/SLIDES_8051_PDF/21_MOTOR.PDF.

[19] C. y. M. Granda, “Brazo robótico,” I.E.S. VALLECAS I, pp. 3–


4, 2009. http://www.madridbot.org/Documentos/Documentos%202009/
Prueba%20Libre/Memoria%20Brazo%20Robotico.pdf.

[20] STMicroelectronics, “Stepper motor controllers,” Journal, vol. 10, no. 2,


pp. 1–2, 2001. http://www.st.com/st-web-ui/static/active/en/
resource/technical/document/datasheet/CD00000063.pdf.

[21] T. Loveland, “Understanding and writing g & m code for cnc machines,”
TECHNOLOGY AND ENGINEERING TEACHER, vol. 10, no. 2, pp. 1–2,
2012.

[22] “CNC Machine Overview and Computer Numerical Control History.” http:
//www.cnccookbook.com/CCCNCMachine.htm. Accessed: 2014-11-09.

[23] “3D Model Repositories.” http://3dprintingforbeginners.com/


3d-model-repositories/.

[24] “Where to find Models for 3d Printing.” http://www.3dprintingera.com/


where-to-find-models-for-3d-printing/.

[25] “Makerbot Thingverse.” http://www.thingiverse.com/.

284
Referencias

[26] “List of 3D modeling software.” http://en.wikipedia.org/wiki/List_of_


3D_modeling_software.

[27] “CURAfree and easy to use software.” https://www.ultimaker.com/pages/


our-software.

[28] “Slic3rg-code generator for 3d printers.” http://slic3r.org/.

[29] “Skeinforge3d model into g-code instructions for reprap.” http://reprap.


org/wiki/Skeinforge.

[30] “Teacup Firmware.” http://reprap.org/wiki/Teacup_Firmware.

[31] “RepRap Host Software.” http://reprap.org/wiki/Reprap_host_


software.

[32] “List of firmwarereprap.” http://reprap.org/wiki/List_of_Firmware.

[33] “Arduino Mega 1280 microcontroller board.” http://arduino.cc/en/Main/


arduinoBoardMega. Accessed: 2014-11-12.

[34] “ Arduino Mega 2560 microcontroller board.” http://arduino.cc/en/Main/


ArduinoBoardMega2560. Accessed: 2014-11-12.

[35] “Arduino MEGA ADK microcontroller board.” http://arduino.cc/en/


Main/ArduinoBoardMegaADK. Accessed: 2014-11-12.

[36] “Arduino DUE microcontroller board.” http://arduino.cc/en/Main/


arduinoBoardDue. Accessed: 2014-11-12.

[37] “Arduino TRE.” http://arduino.cc/en/Main/ArduinoBoardTret. Acces-


sed: 2014-11-12.

[38] “BegleBone Black development platform.” http://beagleboard.org/black.


Accessed: 2014-11-12.

[39] “WHAT IS A RASPBERRY PI?.” http://www.raspberrypi.org/help/


what-is-a-raspberry-pi/. Accessed: 2014-11-12.

[40] J. Kridner, “Introduction to 3D printing with BeagleBone Black,” Beagle-


Board.org blog, vol. 10, no. 2, p. 5, 2013.

[41] “Pi print run your 3d printer with only a raspberry pi.” https://github.
com/iandouglas96/piPrint. Accessed: 2014-11-12.

[42] “DC motor powered RAPY 3D printer ma-


de in Korea.” http://www.3ders.org/articles/
20140116-dc-motor-powered-rapy-3d-printer-made-in-korea.html.
Accessed: 2014-10-15.

285
Referencias

[43] “Arduino Mega Pololu Shield.” http://reprap.org/wiki/Arduino_Mega_


Pololu_Shield http://2.bp.blogspot.com/-L9q_ScmVcVI/UYFUGYXK-FI/
AAAAAAAABUg/0AOrsgd88uY/s1600/RepRapWiringDiagram.jpg, note = Ac-
cessed: 2014-11-10.
[44] “Beagle Bone CNChardware capes.” http://blog.machinekit.io/p/
hardware-capes.html. Accessed: 2014-11-12.
[45] “Alligator electronic control board for Reprap 3D printers.” http://www.
3dartists.org/#project. Accessed: 2014-10-30.
[46] Think3dPrint3d, “Duet - Arduino Due Compatible 3D Printer Electronics,”
journal, vol. 10, no. 2, p. 5, 2013.
[47] “Pololustepper motor driver carrier.” http://www.pololu.com/product/
1182. Accessed: 2014-10-12.
[48] “EasyDriver stepper motor driver.” https://www.sparkfun.com/products/
10267.
[49] “DRV8811 1.9a bipolar stepper motor driver.” http://www.ti.com/
product/drv8811.
[50] “Perfil estructural de alumninio.” http://articulo.mercadolibre.com.mx/
MLM-460607190-cnc-perfil-estructural-de-aluminio-routers-plasma-cnc-mmu-_
JM.
[51] E. Oberg, A. Valentine, and J. Stabel, Machinery’s reference series. The
Industrial press, 1910.
[52] M. I. Ltd, “3D Printer Extruder MC3D User Guide V1.0,” MIB Instruments
Ltd, 2013.
[53] “5mm shaft to 8mm screw rod flexible coupling.” http://www.aliexpress.
com/item/5mm-shaft-to-8mm-rod-flexible-coupling/1234314127.
html.
[54] A. Corporation, “Atmel atmega640/v-1280/v-1281/v-2560/v-2561/v,” Atmel
Corporation, vol. 10, no. 2, pp. 1–2, 2012.
[55] A. Corporation, “8-bit microcontroller with 8/16/32k bytes of isp flash and
usb controller,” Atmel Corporation, vol. 10, no. 2, pp. 1–2, 2012.
[56] “USB Peripheral/Host Controller with SPI Interface.”
http://www.maximintegrated.com/en/products/interface/
controllers-expanders/MAX3421E.html. Accessed: 2014-11-09.
[57] G. Airaldi, G. Antúnez, and J. Basualdo, “Ctrlmotors3d,” 2014.
[58] “Arduino Controlled CNC / 3D Printer Hybrid.” http://www.
instructables.com/id/Arduino-Controlled-CNC-3D-Printer/. Ac-
cessed: 2014-11-09.

286
Referencias

[59] “Archive for the ‘CNC’ Category.” http://blog.arduino.cc/category/


cnc/. Accessed: 2014-11-09.

[60] “Building Your Makeblock 3D Printing Pro-


ject with Arduino.” http://www.makeblock.cc/blog/
building-your-makeblock-3d-printing-project-with-arduino/. Ac-
cessed: 2014-11-09.

[61] STMicroelectronics, “Dual full-bridge driver,” Journal, vol. 10, no. 2, pp. 1–2,
2001. https://www.sparkfun.com/datasheets/Robotics/L298_H_Bridge.
pdf.

[62] H. Sax, “Stepper motor driving,” STMicroelectronics, vol. 10, no. 2, pp. 1–2,
1995. http://sites.poli.usp.br/d/pmr2570/1734_l297an.pdf.

[63] T. I. Incorporated, “Lm117/lm317a/lm317-n three-terminal adjustable regu-


lator,” Journal, vol. 10, no. 2, pp. 1–2, 2004. http://www.ti.com/lit/ds/
symlink/lm117.pdf.

[64] ST, “AN470 Application Note the l297 stepper motor controler,” journal,
2003.

[65] “DIY Stepper Controller.” http://www.pyroelectro.com/tutorials/


stepper_controller_board/. Accessed: 2014-11-19.

[66] ST, “AN235 Application Note stepper motor driving,” journal, no. 0788, p. 6,
1995. http://users.ece.utexas.edu/~valvano/Datasheets/Stepper_ST.
pdf.

[67] Fairchild, “3-terminal 1a positive voltage regulator,” Journal, vol. 10, no. 2,
pp. 1–2, 2014. https://www.fairchildsemi.com/datasheets/LM/LM7805.
pdf.

[68] “LiquidCrystal Library.” http://arduino.cc/en/Reference/


LiquidCrystal. Accessed: 2014-11-09.

[69] STMicroelectronics, “Stp60nf06,” Journal, vol. 10, no. 2, pp. 1–


2, 2007. http://www.st.com/web/en/resource/technical/document/
datasheet/CD00002318.pdf.

[70] T. I. Incorporated, “Lm35 precision centigrade temperature sensors,” Journal,


vol. 10, no. 2, pp. 1–2, 1999. http://www.ti.com/lit/ds/symlink/lm35.
pdf.

[71] “SD Library.” http://arduino.cc/en/pmwiki.php?n=Reference/SD. Ac-


cessed: 2014-11-09.

[72] “Scketchup.” http://www.sketchup.com/es/.

[73] “Blender.” https://www.blender.org/.

287
Referencias

[74] “AutoCad.” http://www.autodesk.es/products/autocad/overview.

[75] “ReplicatorG.” http://replicat.org/.

[76] Ladyada, “Setting up a raspberry pi as a wifi access point,” Adafruit Indus-


tries, 2014.

[77] “Adaptador USB Nano Inalámbrico N de 150Mbps.” http://www.tp-link.


com/mx/products/details/?model=TL-WN725N. Accessed: 2014-11-09.

[78] “RPi USB Wi-Fi Adapters.” http://elinux.org/RPi_USB_Wi-Fi_


Adapters. Accessed: 2014-11-09.

[79] “WinSCP Free SFTP, SCP and FTP client for Windows.” http://winscp.
net/eng/docs/lang:es, 2014. [Online; accessed: 2014-11-28].

[80] D. E. Simon, An Embedded Software Primer. Pearson Education, 1999.

[81] J. I. Quinones, “Applying acceleration and deceleration profiles to bipolar


stepper motors,” Analog Applications Journal, Texas Instrument, vol. 10,
no. 2, pp. 1–2, 2012.

[82] N. Instruments, “Fundamentos de control de movimiento,” 2013. http://


www.ni.com/white-paper/3367/es/.

[83] Atmel, “Avr446: Linear speed control of stepper motor,” journal, 2006. http:
//www.ni.com/white-paper/3367/es/.

[84] D. Austin, “Avr446: Linear speed control of stepper motor,” EE Times-India,


Junio, 2005. http://fab.cba.mit.edu/classes/MIT/961.09/projects/
i0/Stepper_Motor_Speed_Profile.pdf.

[85] A. V. Garcı́a, “Protocolo de calibración y optimización mecánica de una im-


presora 3D Open Source,” Master’s thesis, Universidad Carlos III de Madrid,
2012.

[86] “Calibration/es.” http://reprap.org/wiki/Calibration/es.

[87] A. DEVICES, “Monolithic thermocouple amplifiers with cold junction com-


pensation,” 1999. http://www.me.psu.edu/rahn/me462/AD594_5_c.pdf.

[88] B. Motoren, “Formulas + calculations for optium selection of a stepmotor,”


2014.

[89] O. M. G. CATALOGUE, “Selecting a stepping motor,” 2014.

[90] “WITS Students Suggest Mechatronic Design Improvements to Opti-


mize Peak Hour Trading in Restaurants.” http://www.pneudrive.co.
za/PastEntries/2011SubmissionSummaries/2011WITSAutoRestaurant/
tabid/100/Default.aspx, 2014. [Online; accessed: 2014-12-02].

288
Referencias

[91] “15Y - High Torque Stepper Motor - Anaheim Automation.” http://www.


anaheimautomation.com/products/gearbox/planetary-gearbox-item.
php?sID=11&pt=i&tID=109&cID=30, 2011. [Online; accessed: 2014-12-02].

[92] V. Bhandari, Design of Machine Elements. Tata McGraw-Hill, 2007.

[93] “42BYGHW609 Stepper Motor Datasheet.” https://


www.openimpulse.com/blog/document-viewer/?pdf_file=
42BYGHW609-Stepper-Motor-Datasheet1.pdf, 2014. [Online; accessed:
2014-12-02].

289
Esta página ha sido intencionalmente dejada en blanco.
Glossary

ABS acrilonitrilo butadieno estireno, es un termoplástico utilizado en la impresión


3D bajo el proceso de deposición fundida.. 9

Arduino Arduino es una plataforma de hardware libre, basada en una placa con
un microcontrolador y un entorno de desarrollo, diseñada para facilitar el
uso de la electrónica en proyectos multidisciplinares.. 24

ASCII American Standard Code for Information Interchange, en español: Código


Estándar Estadounidense para el Intercambio de Información. Es un código
de caracteres basado en el alfabeto latino.. 19

backlash Es el tiempo muerto producto del acople no perfecto entre piezas mecáni-
cas cuando ocurre un movimiento.. 32, 41

CAD Computer-Aided Design, en español: diseño asistido por computadora.. 9

DHCP Dynamic Host Configuration Protocol, en español: protocolo de configu-


ración dinámica de host. Es un protocolo de red que permite (servicio) a los
clientes de una red IP obtener sus parámetros de configuración automática-
mente.. 82

DNS Domain Name System, en español: Sistema de Nombres de Dominio. Es un


sistema de nomenclatura jerárquica para computadoras, servicios o cualquier
recurso conectado a Internet o a una red privada.. 82

HDMI High-Definition Multimedia Interface en español: interfaz multimedia de


alta definición. Es una norma de audio y vı́deo digital cifrado sin compresión..
49

MDF Medium Density Fibreboard, en español: tablero de fibra de densidad me-


dia.. 31

PLA poliácido láctico, es un termoplástico utilizado en la impresión 3D bajo el


proceso de deposición fundida.. 9
Glossary

PWM Pulse-Width Modulation, en español: modulación por ancho de pulsos. 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 informa-
ción a través de un canal de comunicaciones o para controlar la cantidad de
energı́a que se envı́a a una carga.. 49

SSH Secure SHell, en español: intérprete de órdenes segura. Es el nombre de un


protocolo y del programa que lo implementa, y sirve para acceder a máquinas
remotas a través de una red.. 84

SSID Service Set IDentifier es el identificador de la red inalámbrica.. 83

Stand Alone Sistema capaz de funcionar sin la necesidad de estar conectado a


un ordenador.. 123

TTL Transistor-Transistor Logic, en español: lógica transistor a transistor. Es


una familia lógica o lo que es lo mismo, una tecnologı́a de construcción de
circuitos electrónicos digitales. En los componentes fabricados con tecno-
logı́a TTL los elementos de entrada y salida del dispositivo son transistores
bipolares.. 53

WAP Wireless Access Point en español: dispositivo que interconecta otros dis-
positivos de comunicación alámbrica para formar una red inalámbrica.. 82

292
Índice de tablas

4.1. Ventajas y desventajas de las elecciones tomadas. . . . . . . . . . . 34


4.2. Tabla con los valores aproximados de los ejes. . . . . . . . . . . . . 35
4.3. Tabla de medidas de las mesas. . . . . . . . . . . . . . . . . . . . . 40

5.1. Caracterı́sticas principales de la placa computadora Raspberry Pi. 47


5.2. Caracterı́sticas principales de la placa microcontroladora Arduino
MEGA ADK. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.3. Entradas del integrado de control (L297 ) del driver de los motores
PAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4. Salidas generadas por el integrado de control (L297) del driver de
los motores PAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.5. Entradas del CI L298. . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.6. Salidas del CI L298. . . . . . . . . . . . . . . . . . . . . . . . . . . 53

6.1. Datos configurados para el servidor de DHCP. . . . . . . . . . . . . 83


6.2. Datos configurados para el punto de acceso. . . . . . . . . . . . . . 83
6.3. Limitaciones de tiempos impuestas por el integrado de control (L297 )
de los drivers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.4. Resumen de Macros en AVR IAR y equivalencia en Arduino IDE . 96
6.5. Campos en la estructura de datos “comando” . . . . . . . . . . . . 109
6.6. Instrucciones de tipo G-code que son interpretadas y cuyas corres-
pondientes acciones han sido implementadas para su correcta eje-
cución. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
6.7. Instrucciones de configuración (tipo M-code). . . . . . . . . . . . . 121

7.1. Parámetros caracterı́sticos del experimento número 1. . . . . . . . 131


7.2. Medida de distancias realizadas con el extensiómetro para cada pun-
to intermedio del recorrido. . . . . . . . . . . . . . . . . . . . . . . 134
7.3. Posición absoluta en pasos para cada punto del recorrido de prueba. 134
7.4. Valores medios, desviación estándar, rango y repetibilidad para cada
punto Xk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.5. Medida de distancias realizadas con el extensiómetro para cada pun-
to intermedio del recorrido en el eje Y. . . . . . . . . . . . . . . . . 138
7.6. Valores medios, desviación estándar, rango y repetibilidad para cada
punto Yk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Índice de tablas

7.7. Medida de distancias realizadas con el extensiómetro para cada pun-


to intermedio del recorrido en el eje Z. . . . . . . . . . . . . . . . . 142
7.8. Valores medios, desviación estándar, rango y repetibilidad para cada
punto Yk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.9. Ganancias mecánicas relevadas para cada eje y error relativo frente
al valor teórico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.10. Setpoint vs temperatura de estabilización. . . . . . . . . . . . . . . 151

B.1. Resultados de estimación torque para cada grado de libertad, utili-


zando un factor de cobertura K = 2. . . . . . . . . . . . . . . . . . 251

C.1. Dedicación horaria mensual del equipo del proyecto. . . . . . . . . 254

D.1. Primeras compras efectuadas en el exterior. . . . . . . . . . . . . . 255


D.2. Segundas compras efectuadas en el exterior. . . . . . . . . . . . . . 256
D.3. Compras efectuadas en el mercado local. . . . . . . . . . . . . . . . 256

E.1. Tabla de componentes para el armado del driver. . . . . . . . . . . 281

294
Índice de figuras

2.1. Historia de las impresoras 3D, primera parte. Imagen modificada


de [3]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2. Historia de las impresoras 3D, segunda parte. Imagen modificada
de [3]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Diseño de impresora 3D basado en coordenadas esféricas. . . . . . 8
2.4. Diseño de impresora 3D basado en coordenadas polares. Imagen
extraı́da de [6]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5. Diseño de impresora 3D basado en coordenadas cartesianas. Imagen
extraı́da de [7]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6. Sistema que muestra cómo trabaja la impresión por laminado. Ima-
gen extraı́da de [8]. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7. Esquema de un cabezal de impresión 3D por deposición fundida.
Imagen extraı́da de [9] . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8. Estructura de impresora 3D que usa partes impresas y guı́as de
acero pulido. Imagen extraı́da de [10] . . . . . . . . . . . . . . . . . 12
2.10. Estructura de impresora en madera liviana. Imagen extraı́da de [12] 12
2.9. Cabezal utilizado en la impresora mostrada en la figura 2.8. Imagen
extraı́da de [11] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.11. Estructuras en aluminio. . . . . . . . . . . . . . . . . . . . . . . . . 13
2.12. Scanner 3D. Imagen extraı́da de [17] . . . . . . . . . . . . . . . . . 14
2.13. Ejemplo de motor paso a paso. . . . . . . . . . . . . . . . . . . . . 15
2.14. Esquema de motores PAP (unipolares y bipolares). Imagen extraı́da
de [18] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.15. Principio de funcionamiento de un motor paso a paso. Imagen ex-
traı́da de [19] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.16. Curva Par-velocidad: fenómeno de resonancia, imagen tomada de [20] 18
2.17. Unas de las primeras máquinas de control numérico. Imagen ex-
traı́da de [22]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.18. Esquema genérico de electrónica necesaria para el control de movi-
miento y temperatura de una impresora 3D. . . . . . . . . . . . . . 24

3.1. Estructura mecánica basada en sistema de ejes cartesianos. . . . . 27


3.2. Diagrama de bloques de Hardware y relación con mecánica. . . . . 28
3.3. Esquema hardware y bloques internos básicos. . . . . . . . . . . . . 29
3.4. Esquema de ubicación cabezal impresión o fresador. . . . . . . . . 30
Índice de figuras

3.5. Menú principal circular. . . . . . . . . . . . . . . . . . . . . . . . . 30

4.1. Perfil de uso común en router CNC. Imagen extraı́da de [50]. . . . 32


4.2. Primer diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.3. Paso de un tornillo. Imagen modificada de [51]. . . . . . . . . . . . 35
4.5. Cabezal de extrusión adquirido. . . . . . . . . . . . . . . . . . . . . 36
4.4. Medidas reales de los ejes (cm). . . . . . . . . . . . . . . . . . . . . 37
4.6. Detalle de un eje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.7. Pieza de invención propia para la colocación del tornillo. . . . . . . 39
4.8. Diferencia de altura. . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.9. Ubicación de los motores. . . . . . . . . . . . . . . . . . . . . . . . 40
4.10. Acoples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.11. Placas que protegen del efecto paralelogramo. . . . . . . . . . . . . 42
4.12. Collar de empuje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.13. Solución backlash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.14. Diseño CAD final. . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.15. Geometrı́a usada para el calculo de la ubicación del tensor. . . . . 45

5.1. Diagrama de electrónica. . . . . . . . . . . . . . . . . . . . . . . . . 48


5.2. Solución general de diseño y marco del controlador de los motores
paso a paso del presente proyecto. . . . . . . . . . . . . . . . . . . 50
5.4. Diagrama de tiempos donde se muestran las fases al motor según
la señal de reloj para el modo de medio paso. A y B bornes de una
bobina, C y D de la restante. . . . . . . . . . . . . . . . . . . . . . 52
5.3. Secuencias para los distintos modos de funcionamiento de un motor
bipolar. Figura tomada de [20]. . . . . . . . . . . . . . . . . . . . . 52
5.5. Puente H tı́pico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.6. Diagrama de bloques interno del CI L298. Figura tomada de [61]. . 55
5.7. Configuración del regulador de voltaje. Figura tomada de [63]. . . 55
5.8. Diagrama de bloques interno del integrado LM317. Figura tomada
de [63]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.9. Gráfico donde se indica el “reverse recovery time” (trr ). . . . . . . 57
5.10. Diagrama de bloques genérico del driver. Figura modificada de [64]. 58
5.11. Diagrama de bloques interno del integrado L297. Figura tomada
de [20]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.12. Diagrama de tiempos que muestra la forma de onda de la tensión
aplicada a los bornes (A y B) de una bobina (utilización de un
puente H) en el tiempo. La parte sombreada es el perı́odo de tiempo
que se demora en dar un incremento en el motor (T = 8TM CLK ). . 59
5.13. Esquemático del driver versión 0.0. Figura tomada de [65]. . . . . 60
5.14. Realimentación para control de torque automático. Figura tomada
de [62]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.15. Gráficos comparativos de los modos de operación. Torque-frecuencia:
paso completo vs medio paso vs medio paso (2 estados de torque).
Figura tomada de [66]. . . . . . . . . . . . . . . . . . . . . . . . . . 62

296
Índice de figuras

5.16. Gráficos comparativos de los modos de operación. Figura tomada


de [66]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.17. Esquemático y layout del driver versión 1.0. . . . . . . . . . . . . . 64
5.18. Gráficos de las señales de salida del driver fabricado (f = 0,5Hz;
DC = 50 %) - versión 1.0. . . . . . . . . . . . . . . . . . . . . . . . 65
5.19. Fotografı́a tomada durante los primeras pruebas realizadas al eje X
utilizando la versión 2.0 del driver. . . . . . . . . . . . . . . . . . . 65
5.20. Configuración utilizada para generar la alimentación lógica del dri-
ver en la versión final. Figura tomada de [67]. . . . . . . . . . . . . 66
5.21. Circuito de chop. Figura tomada de [64]. . . . . . . . . . . . . . . . 67
5.22. Esquema de razonamiento para el control de corriente en un bobina.
Figura tomada de [64]. . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.23. Señales destacables obtenidas con el control de corriente de carga.
A y B señales de fase para una bobina, señal de inhabilitación,
corriente por resistencia de sensado y corriente de carga (diente de
sierra, debido a que con la bobina se logra un integrador). Figura
tomada de [64]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.24. Esquemático driver versión final. . . . . . . . . . . . . . . . . . . . 70
5.25. PCB driver versión final (escala 1:1). . . . . . . . . . . . . . . . . . 70
5.26. Layout driver versión final. . . . . . . . . . . . . . . . . . . . . . . 71
5.27. Fotografı́a de unos de los driver fabricados. . . . . . . . . . . . . . 71
5.28. Elementos que componen la interfaz con el usuario. . . . . . . . . . 72
5.29. Primer prototipo realizado de heated bed. . . . . . . . . . . . . . . 74
5.30. Diseño de la heated bed platform. . . . . . . . . . . . . . . . . . . . 75
5.31. Circuito de control de la heated bed. . . . . . . . . . . . . . . . . . 75
5.32. Diseño de la heated bed platform. . . . . . . . . . . . . . . . . . . . 77

6.1. Diagrama de bloques del software e interacción con electrónica y


mecánica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.2. Diagrama de flujo de información que presenta el marco de la red
inalámbrica a configurar. . . . . . . . . . . . . . . . . . . . . . . . . 82
6.3. Vista de un dispositivo que encuentra la red de la máquina (SSID
recuadrado). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.4. Diagrama que representa la comunicación entre el computador y el
microcontrolador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.5. Diagrama de tiempos de las entradas al integrado de control pre-
sente en el driver. Figura tomada de [20]. . . . . . . . . . . . . . . 88
6.6. Diagrama de bloques bajo Nivel e interacción con Alto Nivel. . . . 90
6.7. Generación de Relojes para cada motor a partir de Timers virtuales
comandados por un Master Clock. . . . . . . . . . . . . . . . . . . 90
6.8. Diagrama de flujo, donde se observa la implementación del Round
Robin con el control de los motores, los finales de carrera y el botón
de emergencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.9. Señales de Clock a 22KHz para cada driver del motor paso a paso. 94
6.10. Flujo de función void home all axis() . . . . . . . . . . . . . . . . . 98

297
Índice de figuras

6.11. Curva de torque velocidad para un motor bipolar. Imagen extraı́da


de [81]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.12. Perfil trapezoidal de velocidad. Imagen extraı́da de [82]. . . . . . . 101
6.13. Perfil de velocidad vs. velocidad (pulso/sec) motor stepper. Imagen
extraı́da de [83]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.14. Perfil de velocidad que se obtendrı́a según datos para K1 = 128. . . 104
6.15. Lógica del algoritmo de control de velocidad. . . . . . . . . . . . . 104
6.16. Medida relevada de la variación de velocidad. . . . . . . . . . . . . 106
6.17. Ejemplo de los contadores del control de temperatura. Donde se
muestran 2 contadores propios de las clase contTemp uno seteado
en 10 (50 % del tiempo) y otro en 5 (25 % del tiempo). . . . . . . 107
6.18. Cuerva controlador. . . . . . . . . . . . . . . . . . . . . . . . . . . 108
6.19. Diagrama entrada-salida del módulo interprete.cpp. . . . . . . . 108
6.20. Diagrama de Flujo de la función “comando interpretar(char gcode[
])”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.21. Diagrama lógico donde se enmarca el razonamiento desarrollado en
el módulo Ejecutador (no representa verdadero flujo de información).112
6.22. Comparación entre el sistema de coordenadas en lo que basan sus
razonamientos los módulos de bajo (control de motores) y alto nivel
(ejecutador). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.23. Diagrama de flujo para ejecutar la acción de movimiento lineal,
extruyendo o no. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.24. Esquema de movimiento en dos direcciones que muestra la diferencia
entre forzar la concurrencia (lı́nea punteada) o no forzarla (lı́nea
continua). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.25. Diagrama de flujo que representa la obtención de la velocidad en el
equivalente de cantidad de perı́odos de Master Clocks. . . . . . . . 119
6.26. Esquema de funcionamiento del Main Principal. . . . . . . . . . . . 122
6.27. Esquema de funcionamiento del Main de impresión. . . . . . . . . . 124

7.1. Descripción gráfica del experimento 1. . . . . . . . . . . . . . . . . 130


7.2. Descripción gráfica del error sistemático acumulado en el experi-
mento 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
7.3. Descripción gráfica del experimento 2. . . . . . . . . . . . . . . . . 131
7.4. Descripción gráfica del experimento para realizar la cuantificación
de la repetibilidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.5. Montaje del extensiómetro en el eje X. . . . . . . . . . . . . . . . 133
7.6. Mediciones de repetibilidad realizadas en el eje X. . . . . . . . . . 135
7.7. Montaje del extensiómetro en el eje Y. . . . . . . . . . . . . . . . 136
7.8. Mediciones de repetibilidad en el eje Y. . . . . . . . . . . . . . . . 137
7.9. Distancia de tramos para el experimento realizado en eje Y. . . . . 138
7.10. Medidas en el eje Y luego de realizar un lubricado en tornillo y
rulemanes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.11. Montaje del extensiómetro en el eje Z. . . . . . . . . . . . . . . . . 140
7.12. Mediciones de repetibiliad en el eje Z. . . . . . . . . . . . . . . . . 141
7.13. Distancia de tramos para el experimento realizado en eje Z. . . . . 142

298
Índice de figuras

7.14. Medidas del eje Z luego de aplicar la lubricación. . . . . . . . . . . 143


7.15. Comparación de las ganancias mecánicas para los tres grados de
libertad luego de lubricar tornillos y rulemanes. . . . . . . . . . . . 145
7.16. Temperatura de la heated bed platform con un setpoint de 60◦ C,
donde cada iteración es cada 1 segundo. . . . . . . . . . . . . . . . 146
7.17. Temperatura de la heated bed platform con un setpoint de 110◦ C. . 147
7.18. Medidas de la temperatura vs termómetro patrón. . . . . . . . . . 148
7.19. Medidas del extrusor con el factor corregido. . . . . . . . . . . . . 149
7.20. Temperatura del extrusor con un setpoint de 220◦ C. Iteraciones
cada un segundo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7.21. Temperatura medida con un setpoint igual a 220◦ C para los dos
sistemas de control. Iteraciones cada un segundo. . . . . . . . . . . 150
7.22. Temperatura medida con un setpoint igual a 220◦ C con distintos
rangos de control. Iteraciones cada un segundo. . . . . . . . . . . . 151
7.23. Temperatura medida con un setpoint igual a 220◦ C con distintos
rangos de control. Iteraciones cada un segundo. . . . . . . . . . . . 152
7.24. Resultados de simulación. . . . . . . . . . . . . . . . . . . . . . . . 154
7.25. Pruebas de impresión realizadas a la fecha. . . . . . . . . . . . . . 155
7.26. Simulación de una cuchara sin terminar, con sistema de coordenadas
absoluto y unidades en milı́metros. . . . . . . . . . . . . . . . . . . 155
7.27. Simulación del territorio Uruguayo, con sistema de coordenadas ab-
soluto y unidades en milı́metros. . . . . . . . . . . . . . . . . . . . 156

8.1. Fotografı́a del prototipo fabricado, vista frontal. . . . . . . . . . . . 157


8.2. Fotografı́a del prototipo fabricado, vista posterior. . . . . . . . . . 158

B.1. Esquema del sistema, imagen tomada de [90]. . . . . . . . . . . . . 243


B.2. Ejemplo de curva Torque en función de las revoluciones por segundo,
imagen extraı́da de [91]. . . . . . . . . . . . . . . . . . . . . . . . . 244
B.3. Desarrollo de la rosca del tornillo para avance l, imagen tomada
de [92]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
B.4. El gráfico en azul representa la evolución de los pasos que da el
motor en cada perı́odo. . . . . . . . . . . . . . . . . . . . . . . . . . 249
B.5. Curva Par motor versus velocidad en pasos por segundo obtenida
de [93]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

E.1. Menú Configuration Wizard, selección máquina. . . . . . . . . . . . 258


E.2. Menú Configuration Wizard, otra información de máquina. . . . . 259
E.3. Menú Configuration Wizard, información habitual de máquinas Re-
pRap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
E.4. Entorno gráfico de CURA host software, en modo Full-Settings. . . 260
E.5. Menú de configuraciones básica, Basic. . . . . . . . . . . . . . . . . 261
E.6. Menú de configuraciones avanzado, Advanced. . . . . . . . . . . . . 262
E.7. Menú de configuraciones de máquina, Machine settings. . . . . . . 263
E.8. Menú de configuraciones de máquina, Machine settings. . . . . . . 263
E.9. Menú del display inicial, menú de calibración. . . . . . . . . . . . . 264

299
Índice de figuras

E.10.Opción para realizar Homming. . . . . . . . . . . . . . . . . . . . . 265


E.11.Menú de movimiento manual. . . . . . . . . . . . . . . . . . . . . . 265
E.12.Menú de impresión. . . . . . . . . . . . . . . . . . . . . . . . . . . 266
E.13.Menú de movimiento manual, opción eje X. A la derecha opción eje
Y e izquierda SALIR. . . . . . . . . . . . . . . . . . . . . . . . . . 266
E.14.Diferentes pantallas del menú de movimiento manual. . . . . . . . 267
E.15.Menú inicial de offset. . . . . . . . . . . . . . . . . . . . . . . . . . 268
E.17.Menú para calibración de milı́metros por paso en el motor del extrusor.268
E.16.Menú de calibración, opciones de ajuste de altura de la mesa de
trabajo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
E.18.Calibración del extrusor. . . . . . . . . . . . . . . . . . . . . . . . . 270
E.19.Pieza diseñada para la colocación del ruleman. . . . . . . . . . . . 271
E.20.Pieza para eliminar la excentricidad de los tornillos. . . . . . . . . 271
E.21.Ejemples de los dos tipos de acoples. . . . . . . . . . . . . . . . . . 272
E.22.Ejemplos de los elementos claves para realizar los distintos acoples. 272
E.23.Eje genérico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
E.24.Perforaciones a realizar en las esquinas. . . . . . . . . . . . . . . . 273
E.25.Diferencia de altura entre las perforaciones de las guı́as y la del
tornillo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
E.26.Distintos usos de la placas para proteger las deformaciones. . . . . 275
E.27.Medidas eje X. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
E.28.Medidas eje Z. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
E.29.Medidas eje Y. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
E.30.Estructura completa armada. . . . . . . . . . . . . . . . . . . . . . 279
E.31.Colocación del tensor. . . . . . . . . . . . . . . . . . . . . . . . . . 279
E.32.Diagrama PCB de la versión 3.1 del driver. . . . . . . . . . . . . . 282
E.33.Layout de la versión 3.1 del driver. . . . . . . . . . . . . . . . . . . 282

300
Contenido del CD

Documentación del proyecto.

HTML generado con Doxygen de las interfaces de los módulos implementa-


dos.

Póster A0.

Artı́culo con formato IEEE.

Proyecto Eagle del Driver Stepper

Hojas de datos.
Esta es la última página.
Compilado el jueves 14 mayo, 2015.
http://iie.fing.edu.uy/

You might also like