Diseño del software de control

**Inicio**

## Firmware

El firmware es el programa cargado en la placa Arduino encargado de interpretar las órdenes recibidas desde la computadora y traducirlas en órdenes de movimiento a través de los drivers hacia los motores que gobiernan los ejes, así como en señales que activen o desactiven la herramienta asignada.

La idea de este firmware surgió como una necesidad a partir de las carencias del proyecto grbl, que fue pensado para drivers bipolares manejados por dos señales generadas desde Arduino: **STEP** (pasos) y **DIR** (sentido de giro) .Por cada STEP (un pulso), el driver realiza una secuencia de conmutación de las bobinas, con lo que el motor da 1 paso (o medio paso, según como esté configurado el driver).Cada driver a partir de esas señales, conmuta los bobinados, dejando al firmware en Arduino la tarea de generar sólo dos señales por motor. Además, el proyecto ***grbl*** fue pensado para placas Arduino **UNO**, con una cantidad de pines disponibles mucho menor que otras placas como la Mega 2560. De más está decir que la documentación exclusivamente en inglés -en muchos casos ambigua- y la confusión que puede generar el proceso de compilación del código para cargar en la placa (no es un simple sketch de Arduino), constituyen elementos adicionales al momento de considerar el desarrollo de un firmware más "educativo".

Debido a la abundancia de motores unipolares de desguace (léase, scanners e impresoras) de voltajes de operación relativamente bajos, y a la escasa diferencia monetaria entre las placas *UNO* y *Mega*, se decidió crear un firmware que operara directamente sobre las secuencias de conmutación de motores unipolares como los de uso general 28BYJ48, usando sólo como intermediarios arrays *ULN2003*. Por supuesto, esto implica un ahorro considerable que contrasta mucho con la adquisición de los drivers.

Es necesario destacar que con el desarrollo de los drivers basados en las compuertas 74LS194, es posible optar por otros sistemas como el ya mencionado ***grbl,*** aunque deberá tener en cuenta las adaptaciones correspondientes si no emplea una placa Arduino UNO.

## ¿Cómo funciona?

Este es quizás el "secreto" detrás del funcionamiento de la máquina: la forma en la que se trasforman las coordenadas escritas por el usuario u otro programa en movimientos de los motores. El funcionamiento del firmware se puede dividir en dos etapas:

**Información generada desde la computadora:** se envían coordenadas cartesianas relativas,es decir, un número determinado de unidades que debe moverse la herramienta en cada eje a partir de la última posición alcanzada.

Por ejemplo, si la máquina arranca en (X,Y,Z) = (0,0,1) y luego pasa a (X,Y,Z)' = (1,1,1), cuando enviemos (X,Y,Z)'' = (10,10,1) , la herramienta se moverá 10 unidades a partir de la coordenada anterior - (X,Y,Z)' = (1,1,1).

**Procesamiento en la placa:**

1. **Procesamiento de la cadena recibida:** En esta etapa se recibe la cadena con datos, y mediante funciones como parsefloat() y parseint(), se rastrean los valores correspondientes a cada eje cartesiano, los cuales son almacenados en variables.
2. **Transformación de las coordenadas en pasos:** Una vez almacenadas en cada variable, las coordenadas se traducen en pasos que debe dar cada motor. Para eso, el usuario previamente debe ingresar la relación pasos por milímetro (en una varible), la cual servirá para realizar la conversión.
3. **Operación de dos o mas motores en simultáneo:** Debido a que las distancias recorridas por los motores no siempre son las mismas (si fuera así, los trazos serían líneas a 45º), se debe "distribuir" de forma exacta el intervalo de pasos entre ambos motores, es decir, indistintamente de la cantidad de pasos que deba moverse cada motor, *ambos deben finalizar sus respectivas distancias al mismo tiempo*. Esto se logró a partir de una adaptación del Algoritmo de Bresenham, permitiendo a los motores recorrer distancias diferentes en un mismo período de tiempo, lo que en definitiva permite generar trayectorias en todo tipo de ángulos.

#### **Estado actual del firmware y modificaciones a futuro.**

Actualmente existen versiones para Arduino UNO, Mega 2560 y Nano del firmware. Como limitaciones actuales y a mejorar a futuro se pueden mencionar:

1. **No se han implementado finales de carrera** (por eso, por el momento, es preferible que las máquinas comiencen sus operaciones en 0,0 siendo este el margen superior izquierdo del area de trabajo -vista desde arriba).
2. No se ha establecido la posibilidad de **setear en tiempo real la velocidad de trabajo o de movimiento de la herramienta** (feed rate, jogging). Esto se podrá implementar en ediciones posteriores, ya sea al comenzar un nuevo trabajo o cada vez que se especifique en el código.
3. No se ha implementado la posibilidad de **hacer Home la posición actual** (sí se puede volver a Home desde la posición actual, siempre que no se desconecte la placa). Esto también se encuentra en proceso de revisión.
4. **Ampliar el listado de comandos G**: Se espera a futuro ampliar el listado de comandos G, para dibujar por ejemplo círculos y semicírculos de radio definido. Actualmente, el firmware permite dibujar rectángulos de ancho predefinido (al cargar el sketch).
5. La relación de **pasos/mm** sólo puede setearse al cargar el sketch. Esto también debería poder cargarse en tiempo real.

####

## Descarga del Firmware para motores unipolares y Arduino

El código para emplear drivers unipolares puede bajarse desde el repositorio del proyecto en GitHub

El mismo debe ser compilado y cargado desde el IDE de Arduino más reciente.

Deben definirse los pines a emplear en cada caso (ver las indicaciones en el código).

## Software de control (lanzador de G-Code) (En preparación)

Actualmente estamos desarrollando nuestro propio lanzador de G-Code. Recientemente se ha subido la versión 0.1 para que pueda ser ejecutado. Se trata de una interfase desarrollada en Processing 2.2.1, que requiere la librería para interfases gráficas G4P (www.lagers.org.uk/**g4p**/). Por otra parte, esta librería funciona (por el momento) en esta versión de Processing, pero existe un problema en torno a la comunicación serial en esta versión al compilar para Windows (sí funciona al ejecutar desde processing), funcionando sólo compilado para Linux 32 y 64. En cuanto se actualice la libreria para versiones más recientes de Processing, recompilaremos el software para que pueda usarse normalmente en Windows x32 y x64.

***Ver sección descargas para más detalles.***

El código se debería enviar en formato cadena, una línea a la vez,siempre que no se esté realizando una operación. Esto se logra a partir de un código de retorno (un sending request) desde el firmware.

A futuro se espera desarrollar una versión para Python.

Por otra parte, se encuentran también en desarrollo:

* Un conversor de formatos Gerber RS-274 al formato de trabajo de la máquina.
* Una interfase para trazar y dibujar lineas, y puntos, y eventualmente, generar diseños de PCBs y su respectivo código de trabajo.
* Un conversor de SVG y/o DXF a las coordenadas de la máquina.

Es imprescindible recordar que, si bien existen alternativas de muy buena calidad para realizar las tareas descritas arriba, el objetivo del proyecto MECAA no es desarrollar herramientas que compitan con las alternativas pagas o gratuitas existentes, sino permitirle a los estudiantes e interesados conocer la forma en la que se programan estos dispositivos y las diversas herramientas para generar código operable por las máquinas, de una manera sencilla.

## Formato de los archivos de trabajo

Dado que la mayoría de las máquinas propuestas en este proyecto no contemplan movimientos de alturas variables en el eje Z (en el caso de las aplicaciones con plotter, sólo se requiere subir y levantar el lapiz para dejar de escribir, mientras que en el caso del grabado laser sucede algo similar con la activación y desactivación del diodo láser), la versión de código G empleada es una simplificación de los estándares existentes, a los fines de hacer más comprensivo el contacto inicial con estas tecnologías.

Cada comando comienza con:

Para realizar movimientos de desplazamiento en la máquina, las coordenadas enviadas deberán comenzar con:

**G00**

Ej: G00X100.234Y100.001Z1 //Indica que la máquina se mueve desde la posición actual 100.234 unidades en X y 100.001 en Y, con Z=1 (es decir, la herramienta levantada)

Para realizar movimientos de trabajo en la máquina (con y sin la herramienta bajada), las coordenadas enviadas deberán comenzar con:

**G01**

Ej: G01X123.333Y900.333Z0 //Indica que la maquina se mueve desde la posición actual 123.333 unidades en X y 900.333 en Y, con la herramienta bajada.

***Atención! Debido a que la versión inicial del firmware no contempla aún finales de carrera, se debe tener cuidado al asignarle las diferentes coordenadas de trabajo a la máquina, para no forzar los ejes y generar una posible avería.***

## Descargas del soft de control

Código fuente del programa de control (MECAA\_HOST) en GitHub

Codigo fuente para descargar y abrir con Processing 2.2.1

Compilación para Linux32.

###