CNC en un taller de hobby (parte 3)



Inicialmente, planeé limitarme a dos publicaciones ( una , dos ) sobre mis experimentos de CNC. Pero, el tema resultó ser interesante para muchos, por lo tanto, todavía lo estoy revelando un poco. En esta publicación, hablaremos sobre la escritura de software casero para controlar CNC de aficionados.

Prólogo


No sé si logré motivar a alguien con las primeras publicaciones, pero algunos comentarios me dieron buena comida para pensar. Un agradecimiento especial a @evilruff por la foto de su laboratorio y por el video con un coreano genial . Después de ver ambos, mi guantera en el sótano ya no parecía tan acogedora.

Reuniendo su fuerza, el fin de semana trajo algo que recordaba vagamente el orden y finalmente hizo 2 cosas que iba a hacer hace medio año.

En primer lugar, reemplazó una pieza de madera contrachapada que sirvió como mesa de sacrificio. Utilicé esta madera contrachapada desde el momento de comprar la máquina, atornillándola con tornillos y construyendo todo tipo de diseños locos con palos y cuñas. Todo para que la pieza no vaya en un vuelo impredecible durante el fresado.

Tal vez alguien necesita un truco de vida: hicieron una nueva mesa con una tabla de plástico (vendida en Castorama):



Atornilló las tablas directamente a la mesa nativa de aluminio. La ventaja eran las ranuras convenientes para las abrazaderas de la pieza de trabajo y la instalación rápida de la mesa de relleno. Todo sobre todo tomó un par de horas y ~ 1100r.

Y en segundo lugar, finalmente, escribió un software más o menos utilizable para administrar funciones CNC no estándar. Esta será la historia principal.

Declaración del problema.


El código G para las operaciones descritas en la segunda parte es el más simple. Sin embargo, el proceso de configuración en sí no puede llamarse rápido.

Como sucedio esto


Por ejemplo, para el aditivo era necesario: conocer el ancho del panel, calcular cuántos agujeros deberían ser, calcular la distancia exacta entre ellos, crear un archivo, escribir código g, cargarlo en Mach3. Todo esto lleva, en el mejor de los casos, entre 15 y 20 minutos. En este sentido, las ventajas de una máquina digital disminuyen significativamente en comparación con una herramienta manual, que al mismo tiempo puede hacer un montón de agujeros.

Lo que quería conseguir


En el caso del mismo aditivo, quería obtener un programa donde, en una interfaz muy simple, ingresaría el ancho y el grosor del panel y presionaría el botón para comenzar el proceso de perforar el número deseado de agujeros de relleno a la misma distancia entre sí.

Busca una solución


Lo primero que se me ocurrió fue escribir un programa autónomo que interactuaría directamente con un puerto paralelo. Una búsqueda rápida en Google mostró que la tarea de escribir en lpt es bastante solucionable, pero el demonio, como saben, se esconde en detalle. Con un estudio más a fondo del tema, me di cuenta de que puedes quedarte atrapado aquí en serio y durante mucho tiempo. Además, dicha solución no sería flexible: para otra máquina, por ejemplo con USB, no funcionaría.

Había una opción para lidiar con el SDK Mach3. En el proceso de recopilación de información sobre la creación de complementos mach, encontré una solución interesante. Describió cómo usar los mecanismos OLE puede extraer Mach3 de una aplicación de terceros. No soy un experto en tecnologías de Microsoft, pero después de ver la diagonal de un manual en el SDK de Mach3, si entendí correctamente la idea principal, no hay una viñeta plateada, los complementos usan los mismos métodos públicos de los objetos COM de Mach3. No iba a volver a dibujar la interfaz Mach3, por lo que la diferencia para el usuario entre el complemento y la aplicación independiente era solo que el complemento es accesible desde el menú Mach3, y la aplicación a través del icono en el escritorio de XP.

Una aplicación separada me parecía preferible. En este caso, teóricamente, podría iniciar mi programa inmediatamente después de cargar la computadora, que cargaría Mach3 con una locomotora de vapor (en lugar de cargar Mach3 primero y luego cavar en su menú para iniciar el complemento).

Recoge un sable


La última vez que tuve que escribir una aplicación de escritorio nativa para Windows fue en un año, en 2006, y fue en Delphi. Desde entonces, las tecnologías web con su Linux me han consumido por completo. Por lo tanto, ahora no tenía preferencias particulares en qué idioma esculpir un programa de Windows. El ejemplo simple encontrado fue escrito en C #, este lenguaje fue elegido como un conejo experimental.

No publicaré todo el código de la aplicación resultante aquí (si lo desea, puede encontrarlo en github usando el enlace en la parte inferior de la publicación). Explicaré las cosas básicas. Todos los experimentos que hice en una máquina virtual con WinXP SP3, VS 2003 y Mach3 Versión R3.043.062. Para aquellos que creen que es mejor ver el enlace al video en Youtube una vez, lo cual entendí. A continuación se muestra una transcripción de los aspectos más destacados.

Preparación


  1. Para que Visual Studio recoja correctamente el componente Mach3, debe estar registrado correctamente en el registro. Para hacer esto, descargue el archivo Mach3Registry.reg
  2. Inicie Mach3Registry.reg
  3. Comenzamos VS, creamos el proyecto de una aplicación de ventana en C #
  4. En el bloque Explorador de soluciones, haga clic con el botón derecho en Referencias, seleccione Agregar referencia en el menú. En la ventana que se abre, haga clic en Examinar y busque Mach3.exe



    Si todo es correcto, debería aparecer una línea en la lista de Referencias, que habría pensado Mach4 ...
  5. 5. Luego, dibuje la interfaz de usuario, cuelgue los controladores, implemente los algoritmos ...

Interacción con Mach3


Conectamos las bibliotecas necesarias, declaramos variables (Form1.cs)

... using System.Runtime.InteropServices; using Mach4; //   Mach namespace Cnc { public class Form1 : System.Windows.Forms.Form { private IMach4 _mach; private IMyScriptObject _mInst; ... //      Mach3 private void GetMachInstance() { try { _mach = (IMach4) Marshal.GetActiveObject("Mach4.Document"); _mInst = (IMyScriptObject) _mach.GetScriptDispatch(); } catch { _mach = null; _mInst = null; } } ... 

Uso:

 GetMachInstance(); // if(_mInst != null) { _mInst.DoOEMButton(1003); //    Stop  Mach3 _mInst.Code("G00 X100"); //  G-code _mInst.GetOEMDRO(800); //     X } 

Los códigos de los botones y los valores de los parámetros se pueden ver en la wiki: OEM_DROs y OEM_Buttons (no tienen una wiki, los valores de los parámetros no se muestran en la tabla, miré la pestaña "Ver fuente").

La primera versión del programa funcionó así: de acuerdo con los parámetros establecidos, se generó un código g que fue cuadro por cuadro (es decir, línea por línea) ejecutado por el método _mInst.Code . Y ese fue mi error. En un entorno de depuración en una máquina virtual, todo funcionó bien. En Mach3, corrieron los números correctos en las coordenadas. Pero hubo problemas al transferir a una computadora de la máquina. El carro se movió correctamente, pero el eje no se encendió.

Parece que la gestión del enrutador y el eje en Mach funciona en diferentes hilos. Resultó que los comandos de movimiento (G ...) se ejecutaron secuencialmente cuando ingresaron el método _mInst.Code en un hilo, y los comandos de control del cabezal (M3, M5), independientemente del primero, se ejecutaron en otro hilo. Como resultado, el husillo se encendió (M3) y se apagó inmediatamente (M5), mientras que el carro siguió su curso normal.

Intenté diferentes opciones, conecté demoras, intenté conducir todo el control del código g en una línea y enviarlo de una pieza a _mInst.Code. Como resultado, me decidí por la solución "en la frente": simplemente llevo el código generado a un archivo, abro este archivo mediante programación en Mach3 y presiono programáticamente el botón "Inicio". Fragmento de código de trabajo:

 _mInst.LoadFile("C:\\tmp\\gcode.txt"); System.Threading.Thread.Sleep(2000); _mInst.DoOEMButton(1000); 

Se necesita una pausa entre descargar un archivo y presionar un botón para que Mach pueda abrir el archivo. Quizás haya alguna forma más elegante. Si alguien lo sabe, escriba los comentarios.

Una ventaja adicional de esta solución es que ahora puede observar la visualización del proceso de procesamiento en la interfaz de Mach.

Lo que finalmente sucedió


Además, en pocas palabras sobre la aplicación resultante. Por separado, hablaré sobre la interfaz de usuario para cada operación.

Cortar




Aquí todo es bastante transparente. El parámetro S es necesario para compensar el tamaño L si la pieza de trabajo no está fijada en el punto cero a lo largo de X (o a lo largo de Y cuando se corta).

Aditivo


Para el aditivo, son posibles 2 configuraciones de ajuste. El primero con una amoladora para taladrar agujeros finales. Y el segundo con el husillo habitual para perforar en el plano del escudo (por alguna razón lo llamé "aditivo frontal").

Cara aditiva




Con el aditivo final, es importante establecer con precisión el cero en la esquina inferior derecha de la pieza de trabajo (tengo el ángulo del tope lateral y la mesa allí). Con un taladro en madera, esto no es difícil de hacer: hay una punta afilada que necesita para llegar a esta esquina. Arreglando la pieza de trabajo sobre la mesa, simplemente la dejo descansar en el taladro.


Sin cambiar el equipo de la misma manera, hago agujeros recíprocos al fijar la pieza de trabajo verticalmente:


El parámetro X es necesario para conectar paneles de diferentes anchos (por ejemplo, cuando los paneles inferior y superior del gabinete son más anchos que los paneles laterales por el grosor de las puertas).

Aditivo frontal




El equipo para el frente es un eje regular. Este tipo de aditivo se usa cuando necesita perforar agujeros en una superficie horizontal, no solo a lo largo de los bordes sino también en algún lugar en el medio. Por ejemplo, si hay varios compartimentos en el gabinete y además de las paredes laterales hay interiores. Si el panel es más largo que la longitud de la máquina, el aditivo se puede hacer en 2 juegos con un giro de 180 grados de la pieza. En este caso, el parámetro X también es útil.

Girando




Para mí, la principal dificultad para preparar un código g con un camino de giro era no exagerar con la máxima profundidad de inmersión del disco. El hecho es que a la salida de Inkscape se obtiene una línea y el giro ocurre en una pasada. Debido a esto, tuve que crear un código separado para cilindrar la pieza de trabajo y solo después de eso se lanzó el pasaje principal que creaba el formulario. Y hubo algunas restricciones en este formulario. En particular, era necesario asegurarse de que la trayectoria no fuera demasiado profunda. Intenté no ir más allá de 10-15 mm del nivel del cilindro original.

Todos estos problemas se resolvieron en el nuevo programa. Funciona así: cargue el código g "crudo" obtenido de Inkscape, establezca el tamaño del lado de la barra de la pieza de trabajo e indique la profundidad máxima de procesamiento en 1 pasada (cuanto más dura sea la madera, menor será esta profundidad). Según el código fuente y los parámetros, el programa calculará una ruta segura y la enviará al CNC.

Planes futuros


El programa ha simplificado enormemente la rutina, pero aún está lejos de ser perfecta. En primer lugar, será necesario optimizar el algoritmo para perforar agujeros profundos (el taladro está obstruido con astillas y sobrecalentamiento, debe balancearse hacia adelante y hacia atrás). En segundo lugar, surgió la idea de hacer una biblioteca de formas giratorias. Es decir varias formas estándar (como un cilindro, cono, rodillo, etc.) con la capacidad de ajustar dimensiones sin la necesidad de crear trayectorias en programas de terceros.

Referencias


Mach3Registry.reg
Mach3 SDK y otros programas
Repositorio de proyectos en Github (pido disculpas a los sharpoviks por las jambas arquitectónicas de antemano; este es mi primer programa en C #).

Source: https://habr.com/ru/post/439022/


All Articles