Professional Documents
Culture Documents
Facultad de Ingenierı́a
Plataforma de posicionamiento
modular para impresión 3D, fresado y
otras aplicaciones
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.
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
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
Apéndices 163
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
Referencias 283
Glosario 289
viii
Capı́tulo 1
Introducción
1.1.5. Alcance
Se diseñará y construirá la mecánica del posicionador XYZ.
2
1.2. Estructura del Documento
3
Capı́tulo 1. Introducción
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.
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
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).
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.
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]
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]
12
2.5. Materiales de construcción
13
Capı́tulo 2. Antecedentes
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)
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)
Par dinámico máximo: Es el par máximo que el motor puede imponer sin
perder pasos.
17
Capı́tulo 2. Antecedentes
Número de pasos por vuelta: Se define como la cantidad de pasos para com-
pletar un giro de 360 grados.
18
2.8. Software
Figura 2.17: Unas de las primeras máquinas de control numérico. Imagen extraı́da de [22].
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
20
2.8. Software
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.
Slic3r [28]
Skeinforge [29]
Teacup [30]
22
2.8. Software
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]
24
2.9. Electrónica
Raspberry Pi [39]
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
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
control de temperatura.
29
Capı́tulo 3. Visión General del Proyecto
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.
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
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.
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
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.
37
Capı́tulo 4. Mecánica
38
4.5. Armado de un eje
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.
40
4.5. Armado de un eje
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
42
4.6. Interconexión entre ejes
43
Capı́tulo 4. Mecánica
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.
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
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
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
Figura 5.2: Solución general de diseño y marco del controlador de los motores paso a paso del
presente proyecto.
50
5.2. Controlador de los motores paso a paso
Tabla 5.3: Entradas del integrado de control (L297 ) del driver de los motores PAP.
Tabla 5.4: Salidas generadas por el integrado de control (L297) del driver de los motores PAP.
L297
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.
Figura 5.3: Secuencias para los distintos modos de funcionamiento de un motor bipolar. Figura
tomada de [20].
52
5.2. Controlador de los motores paso a paso
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
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].
55
Capı́tulo 5. Electrónica
Figura 5.8: Diagrama de bloques interno del integrado LM317. Figura tomada de [63].
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
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].
58
5.2. Controlador de los motores paso a paso
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 ).
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].
Figura 5.16: Gráficos comparativos de los modos de operación. Figura tomada de [66].
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
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
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.
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].
66
5.2. Controlador de los motores paso a paso
67
Capı́tulo 5. Electrónica
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].
69
Capı́tulo 5. Electrónica
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
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
(a) Display.
(b) Joystick.
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.
73
Capı́tulo 5. Electrónica
Vidrio
ρ×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
75
Capı́tulo 5. Electrónica
Bajo autocalentamiento
U2 122
P = = = 120W (5.5)
R 1,2
76
5.5. Comentarios generales
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.
77
Capı́tulo 5. Electrónica
78
Capı́tulo 6
Software
Figura 6.1: Diagrama de bloques del software e interacción con electrónica y mecánica.
80
6.2. Raspberry Pi: Configuración red inalámbrica y comunicación con Arduino
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
Dato Valor
Interface wlan0
Driver rtl8818eu
SSID DIRECT-modular3D printer
Hardware mode g
Seguridad WPA2
Seguridad password modular3D
Canal 6
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.
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.
84
6.3. Comunicación Computador-Microcontrolador
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
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
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:
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
Tabla 6.3: Limitaciones de tiempos impuestas por el integrado de control (L297 ) de los drivers.
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.
Figura 6.7: Generación de Relojes para cada motor a partir de Timers virtuales comandados
por un Master Clock.
90
6.4. Software para microcontrolador Arduino
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
• Devolución de error
93
Capı́tulo 6. Software
Figura 6.9: Señales de Clock a 22KHz para cada driver del motor paso a paso.
• Bloqueo de motores
94
6.4. Software para microcontrolador Arduino
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.
Librerı́as.
Declaración de interrupciones.
1
Los macros definen una secuencia de instrucciones.
95
Capı́tulo 6. Software
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.
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
98
6.4. Software para microcontrolador Arduino
99
Capı́tulo 6. Software
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.13: Perfil de velocidad vs. velocidad (pulso/sec) motor stepper. Imagen extraı́da
de [83].
101
Capı́tulo 6. Software
102
6.4. Software para microcontrolador Arduino
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
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.
104
6.4. Software para microcontrolador Arduino
Nx P ulsosM CLKy Vx
= = (6.6)
Ny P ulsosM CLKx Vy
105
Capı́tulo 6. Software
Consultar la temperatura.
106
6.4. Software para microcontrolador Arduino
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).
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
108
6.4. Software para microcontrolador Arduino
109
Capı́tulo 6. Software
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
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
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.
114
6.4. Software para microcontrolador Arduino
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
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
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
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
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.
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.
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
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 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.
124
6.5. Simulador
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
126
6.5. Simulador
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.
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
131
Capı́tulo 7. Testeos y medidas
Figura 7.4: Descripción gráfica del experimento para realizar la cuantificación de la repetibili-
dad.
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.
133
Capı́tulo 7. Testeos y medidas
Tabla 7.2: Medida de distancias realizadas con el extensiómetro para cada punto intermedio
del recorrido.
Tabla 7.3: Posición absoluta en pasos para cada punto del recorrido de prueba.
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
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.
136
7.2. Posicionador XYZ
137
Capı́tulo 7. Testeos y medidas
Tabla 7.5: Medida de distancias realizadas con el extensiómetro para cada punto intermedio
del recorrido en el eje Y.
138
7.2. Posicionador XYZ
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
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.
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
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
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
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 .
Pk+1 − Pk
G= (7.3)
∆Nk,k+1
Tabla 7.9: Ganancias mecánicas relevadas para cada eje y error relativo frente al valor teórico.
144
7.2. Posicionador XYZ
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.
Figura 7.16: Temperatura de la heated bed platform con un setpoint de 60◦ C, donde cada
iteración es cada 1 segundo.
146
7.3. Control de la temperatura
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 .
147
Capı́tulo 7. Testeos y medidas
160 160
Temperatura medida por el Arduino (ºC)
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.
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
250
150
100
50
0
0 50 100 150 200 250 300
Temperatura medida con el termometro patron (°C)
Figura 7.20: Temperatura del extrusor con un setpoint de 220◦ C. Iteraciones cada un segundo.
149
Capı́tulo 7. Testeos y medidas
200
180
160
Temperatura (ºC)
140
120
100
80
60
40
20
0 200 400 600 800 1000 1200 1400 1600
Iteracion
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
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.
151
Capı́tulo 7. Testeos y medidas
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
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
Figura 7.23: Temperatura medida con un setpoint igual a 220◦ C con distintos rangos de
control. Iteraciones cada un segundo.
futuro.
152
7.4. Simulación Software e Impresión
Un cubo de 2 × 2 × 2cm3
Una cuchara
153
Capı́tulo 7. Testeos y medidas
154
7.4. Simulación Software e Impresión
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
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.
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
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.
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
Electrónica:
Software:
161
Capı́tulo 8. Conclusiones y trabajo a futuro
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
2 File Index 3
2.1 File List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
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
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.2.1 err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6.2.2 indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.7.2.1 ve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7.2.2 vx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7.2.3 vy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7.2.4 vz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
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
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.1.1 POR_FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4.1.2 PROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4.2.1 controlarTemperatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4.2.2 iniTempClock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4.2.3 SetearCont_por . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
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.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
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
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
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
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
File Index
#include <ejecutador.h>
Data Fields
• int system_coordinates
• int extruder_mode
• int inches
• int sentido_CW
• int fan
• int extrudeON
• int retract
#include <buffer.h>
• buffer ()
• void add (char ∗gcode)
• int getEnvio ()
• int getGuardo ()
• char ∗ get (void)
• int len ()
• bool isFull ()
• bool isEmpty ()
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
Parameters
char∗ gcode: puntero al string
Returns
Returns
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.
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.
Returns
Parameters
Returns
Returns
The documentation for this class was generated from the following file:
#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
#include <contTemp.h>
• void on ()
• void off ()
3.4.2.2 contTemp ( int thermPin1, int controlPin1, int fanPin1, float factor1 )
Returns
Returns
Returns
Parameters
Returns
getFlag(): Funcion que retorna la bandera que avisa si la temperatura difiere del setpoint menos un determinado
valor relativo.
Parameters
Returns
Returns
Returns
Returns
Parameters
Returns
3.4.3.10 void on ( )
Returns
Returns
Returns
The documentation for this class was generated from the following file:
#include <ejecutador.h>
Data Fields
#include <errores.h>
Data Fields
• int indice
• error err [TAM]
#include <controlXYZ_E.h>
Data Fields
• unsigned int vx
• unsigned int vy
• unsigned int vz
• unsigned int ve
velocidad de e
Definition at line 65 of file controlXYZ_E.h.
velocidad en coordenada x
Definition at line 62 of file controlXYZ_E.h.
velocidad en coordenada y
Definition at line 63 of file controlXYZ_E.h.
velocidad en coordenada z
Definition at line 64 of file controlXYZ_E.h.
The documentation for this struct was generated from the following file:
File Documentation
#include "Arduino.h"
Data Structures
• class buffer
Macros
• #define LARGO_BUFFER 1
• #define LARGO_STRING 50
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
#include "Display.h"
#include "Main_imprimiendo.h"
#include <LiquidCrystal.h>
Functions
• void calibracion ()
Version
1.0
Author
Guillermo Airaldiguillermo.airaldi@gmail.com
Guillermo Antunez antunezguillermo7@gmail.com
Nicolas Lamath ellama.ing@gmail.com
Date
Parameters
Returns
#include <stdbool.h>
Data Structures
• struct vel
Typedefs
Enumerations
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 ()
Author
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
Enumerator
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
Returns
bool True indica que el motor se esta moviendo, false que no lo esta.
bool True indica que el motor se esta moviendo, false que no lo esta.
Returns
bool True indica que el motor se esta moviendo, false que no lo esta.
Returns
bool True indica que el motor se esta moviendo, false que no lo esta.
Funcion que devuelve un valor booleano que indica el sentido de giro del motor E.
Returns
...Funciones del modulo Funcion que devuelve un valor booleano que indica el sentido de giro del motor X.
Returns
Funcion que devuelve un valor booleano que indica el sentido de giro del motor Y.
Returns
Funcion que devuelve un valor booleano que indica el sentido de giro del motor Z.
Returns
Funcion que resetea el registro de un eje a cero, permite establecer el cero de ccoordenada por software del eje.
Parameters
eje_k eje: Parametro que indica que eje se debe resetear
#include "Arduino.h"
Data Structures
• class contTemp
Macros
Functions
• void iniTempClock ()
• void controlarTemperatura (contTemp ∗ct)
• void SetearCont_por ()
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
Returns
iniTempClock(): Funcion que inicializa el timer que impone la interrupcion cada 50 milisegundos.
Parameters
Returns
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
#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 ()
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
Parameters
Parameters
4.5.2.21 void RefreshDisplay ( float temp, float PosX, float PosY, float PosZ )
#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 ()
• 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 ()
Returns
Parameters
float velocidadINCHESxMIN: velocidad en inches x minuto.
Returns
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
Returns
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
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.
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
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
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.
Returns
Returns
Returns
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
distanciammAPasos(float distanciaMM): para el caso en el que se trabaje en mm, pasa las distancias a su equiva-
lente en numero de pasos
Parameters
float distanciaMM: distancias en mm.
Returns
Returns
Returns
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)
moverLinealSinExtruir(): Funcion que utiliza casi la totalidad de las demas funciones para ejecutar la accion de
mover lineal no extruyendo.
Parameters
Returns
Returns
Returns
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
Parameters
int cantidadPasos: numero de pasos.
Returns
setHomeOffset(): Funcion que se fija donde esta el bajo nivel y toma dicha posicion como el oofset de alto nivel.
Parameters
Returns
setRegistroEinchesAbs(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema absoluto
y inches.
Parameters
Returns
setRegistroEinchesRel(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema relativo e
inches.
Parameters
Returns
setRegistroEmmAbs(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema absoluto y
mm.
Parameters
Returns
setRegistroEmmRel(): Funcion que actualiza la posicion objetivo y la velocidad para el eje E. Sistema relativo y
mm.
Parameters
Returns
setRegistroXYZinchesAbs(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ.
Sistema absoluto e inches.
Parameters
Returns
setRegistroXYZinchesRel(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ.
Sistema relativo e inches.
Parameters
Returns
setRegistroXYZmmAbs(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ. Sistema
absoluto e mm.
Parameters
Returns
setRegistroXYZmmRel(): Funcion que actualiza la posicion objetivo y la velocidad para todos los ejes XYZ. Sistema
relativo e mm.
Parameters
Returns
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
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
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.
Parameters
.
Returns
float: tiempo minutos(sistema relativo). Se despreocupa del sistema de unidades, xq no ha que consultar
numero de pasos).
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
velejeEABSmm(): para el caso en el que se trabaje sistema absoluto y mm, calcula la velocidad del eje E.
Parameters
Returns
velejeErelINCHES(): para el caso en el que se trabaje sistema relativo e inches en E, calcula la velocidad del eje
E.
Parameters
Returns
velejeErelMM(): para el caso en el que se trabaje sistema relativo e mm en E, calcula la velocidad del eje E.
Parameters
Returns
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
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
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
Data Structures
• struct registroErrores
Macros
• #define TAM 8
Typedefs
Enumerations
• enum eventos {
ok =0, finCarreaX0, finCarreaX1, finCarreaY0,
finCarreaY1, finCarreaZ0, finCarreaZ1, salida_por_timeout_resetear,
salidaxFueraRango, setPointTempExtInvalid, setPointHeatedBedTempInvalid, velInvalida,
emergencia }
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
Data Structures
• struct comando
Macros
Typedefs
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
Enumerator
move_linear
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
Returns
comando: Devuelve un tipo comando, que es una estrucutua del hecha a partir del code y mas facil de
interpretar.
#include "Arduino.h"
#include <stdbool.h>
#include <util/delay_basic.h>
#include <iom2560.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
Macros
Typedefs
Enumerations
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.
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
Version
2.0
Date
4.9.1.20 #define MotorE_reset( ) { /∗PORTC |= (1 << ENABLE_E);∗/ PORTC &= ∼(1 << RESET_E); _delay_loop_1(7);
PORTC |= (1 << RESET_E);}
4.9.1.21 #define MotorX_reset( ) { /∗PORTA |= (1 << ENABLE_X);∗/ PORTA &= ∼(1 << RESET_X); _delay_loop_1(7);
PORTA |= (1 << RESET_X);}
4.9.1.22 #define MotorY_reset( ) { /∗PORTA |= (1 << ENABLE_Y);∗/ PORTA &= ∼(1 << RESET_Y); _delay_loop_1(7);
PORTA |= (1 << RESET_Y);}
4.9.1.23 #define MotorZ_reset( ) { /∗PORTC |= (1 << ENABLE_Z);∗/ PORTC &= ∼(1 << RESET_Z); _delay_loop_1(7);
PORTC |= (1 << RESET_Z);}
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.
Enumerator
motorX Motor X
motorY Motor Y
motorZ Motor Z
motorE Motor E
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.
Funcion que realiza la configuracion de un timer virtual E, seteando la cuenta y habilitando la cuenta
Parameters
int cantPulsosMck: Cantidad de pulsos en unidades de Master clock para mover un paso
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
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
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
Funciones del modulo Inicializa el Timer que genera el Master Clock y configura las interrupciones
#include <LiquidCrystal.h>
#include "buffer.h"
#include "MovimientoManual.h"
Functions
Returns
Version
1.0
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
#include "ejecutador.h"
#include "Display.h"
#include <LiquidCrystal.h>
Functions
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:
Macros
• #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
#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 ()
Author
Version
2.0
Date
...Funciones del modulo Funcion que realiza el movimiento en los motores paso a paso
Parameters
error Devuelve un puntero a variable tipo error
Á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].
λ: 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
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
Asumiendo que se calculó el trabajo para que se desplace una cantidad igual
al avance, se tiene:
245
Apéndice B. Selección de los motores paso a paso
pF
η2πrFi n = pF ⇒ rFi n = TL = (B.5)
2πη
N − W cos(α) = 0 (B.6)
F − FR − W sin(α) = 0 (B.7)
FR = µc N (B.8)
(cos(θ) − µc tan(λ))
η = tan(λ) (B.10)
(tan(λ)cos(θ) + µc )
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].
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
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
p 2
Jcarga = M ( ) (B.17)
2π
248
B.2. Cálculos teóricos referentes a la selección del motor
360 p p
Np = = ⇒ ∆L = (B.18)
∆φ ∆L Np
Figura B.4: El gráfico en azul representa la evolución de los pasos que da el motor en cada
perı́odo.
p Np
V = f ⇒f = V (B.19)
Np p
π π
∆φr = ∆φ ⇒ ω = ∆φ f (B.20)
180 180
249
Apéndice B. Selección de los motores paso a paso
t1 = 0,25t0 (B.21)
Np
t1 = 0,25 (B.22)
0,75f
π 0,75π
ω 0 = ∆φ f = ∆φ f2 (B.23)
180t1 180 ∗ 0,25Np
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
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.
254
Apéndice D
Gestión de gastos
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
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:
Ordenar impresión.
Autocad.
Blender.
Apéndice E. Manuales
Solidworks.
Sketch up.
258
E.1. Manual de uso y mantenimiento
259
Apéndice E. Manuales
260
E.1. Manual de uso y mantenimiento
261
Apéndice E. Manuales
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
263
Apéndice E. Manuales
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.
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.
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.
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.13: Menú de movimiento manual, opción eje X. A la derecha opción eje Y e izquierda
SALIR.
266
E.1. Manual de uso y mantenimiento
E.1.3. Calibración
Dentro del proceso de calibración se pueden realizar las siguientes tareas:
267
Apéndice E. Manuales
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
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
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.
270
E.2. Manual de construcción
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.
271
Apéndice E. Manuales
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.
Figura E.22: Ejemplos de los elementos claves para realizar los distintos acoples.
272
E.2. Manual de construcción
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
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.
Figura E.25: Diferencia de altura entre las perforaciones de las guı́as y la del 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.
274
E.2. Manual de construcción
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
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.
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.
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.
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
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.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.
279
Apéndice E. Manuales
280
E.3. Armado de driver
281
Apéndice E. Manuales
VDD
GND
STEPPER
VCC
MOTOR
MODULAR3D V_3.1 DRIVER
282
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].
[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.
284
Referencias
[41] “Pi print run your 3d printer with only a raspberry pi.” https://github.
com/iandouglas96/piPrint. Accessed: 2014-11-12.
285
Referencias
286
Referencias
[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.
[64] ST, “AN470 Application Note the l297 stepper motor controler,” journal,
2003.
[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.
287
Referencias
[79] “WinSCP Free SFTP, SCP and FTP client for Windows.” http://winscp.
net/eng/docs/lang:es, 2014. [Online; accessed: 2014-11-28].
[83] Atmel, “Avr446: Linear speed control of stepper motor,” journal, 2006. http:
//www.ni.com/white-paper/3367/es/.
288
Referencias
289
Esta página ha sido intencionalmente dejada en blanco.
Glossary
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
backlash Es el tiempo muerto producto del acople no perfecto entre piezas mecáni-
cas cuando ocurre un movimiento.. 32, 41
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
294
Índice de figuras
296
Índice de figuras
297
Índice de figuras
298
Índice de figuras
299
Índice de figuras
300
Contenido del CD
Póster A0.
Hojas de datos.
Esta es la última página.
Compilado el jueves 14 mayo, 2015.
http://iie.fing.edu.uy/