TODOPIC

Mecatrónica => CNC - Control Numérico Computarizado => Mensaje iniciado por: ESTECA55 en 29 de Junio de 2008, 23:04:13

Título: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 29 de Junio de 2008, 23:04:13
Bueno este tema surge luego de la idea de hacer un proyecto para controlar una máquina CNC sin la PC que hablamos en otro tema (http://www.todopic.com.ar/foros/index.php?topic=21154.msg176359#msg176359) del foro.

En un principio la idea era hacer algo USB para usar con los soft mas comunes, que trabajan por el puerto paralelo, pero luego surgió la posibilidad de diseñar y construir algo independiente a la PC, o sea interpretar el código G, que eso si se crearía en una PC con todas las herramientas disponibles, y pasarlo a este hardware que se encargaría de controlar los ejes como lo hacen los software's por medio del puerto paralelo.

Creo que la primer meta seria hacer algo simple, nada de gráficos, para simular tenemos la PC, con un LCD común voltaria para visualizar las diferentes variables de configuración que podamos llegara tener, lo de graficar las trayectorias creo yo que seria una de las ultima cosas que encararía, lo importante es mover los ejes tal cual indica el código G.

Saludos




Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 30 de Junio de 2008, 03:59:12
Lo que hay que ver es si los pic pueden leer rápidamente una tarjeta de memoria tipo sd o mmc.

Yo, por comodidad usaré un PIC18, ya que no he usado nunca los dspic y esto me parece demasiado grande para empezar a usarlos.
Título: Re: Procesador CNC de Codigo G
Publicado por: Nocturno en 30 de Junio de 2008, 06:05:43
Son igual de cómodos que los PIC, Slalen. Es más, en muchas ocasiones es más cómodo porque vas sobrado de recursos y no necesitas exprimirte el coco.
Título: Re: Procesador CNC de Codigo G
Publicado por: Ferenczyg en 30 de Junio de 2008, 06:52:01
Con el registro de TurboCNC

http://www.dakeng.com/turbo.html

se envia el codigo fuente. TurboCNC tiene posibilidad de excitar los motores por fase ademas de por paso/dirección. Supongo que mirando la parte de TCNC que corresponde a interprete de G y control de bobinados se podria tener algo por donde orientarse uno. Evidentemente eso no entra 'a pelo' en un pic, básicamente porque es pascal para MSDOS, pero ideas si que supongo que podria dar.

Salu2
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 30 de Junio de 2008, 11:59:50
Si es verdad, yo la verdad con ese tipo de memorias no tengo experiencia.

Yo creo que no vamos a tener problemas, recordemos que estamos controlando una maquina, algo mecánico, tenemos que ganarle con la electrónica en velocidad jeje, lo que si por ahi leer la memoria SD con el mismo pic que esta generando los trenes de pulsos pueda llegar a dar problemas, en ningún momento tenemos que cortar el tren de pulsos para ponernos a atender otra cosa, si el tren de pulsos no es constante podemos tener grandes perdidas de paso en el motor, sobre todo si queremos trabajar rápido. Por ahi lo que se puede hacer es con otro micro leer la memoria, que seria la parte de comunicación, también podría tener en un futuro la conexión USB para no tener que andar pasando la tarjeta, y le entregue al Microcontrolador master los datos de una forma mas rápida, por ejemplo en paralelo.

Yo creo que también me voy a tirar por el lado de un 18F, es verdad lo que dice Nocturno, pero por estos lados son mas complicados de conseguir, tanta variedad no hay, y aca no llegan samples, cuando pase por una casa de electrónica voy a preguntar que tienen. Por lo pronto tengo un 18F4520 esperando ser programado, creo que voy a empezar con este.

Que opinas Slalen, largamos con este?? seria bueno ir haciendo todos el mismo hardware así desarrollamos el soft entre todos, es solo una idea, obviamente ponerse de acuerdo no es fácil, no tengo problemas en usar otro cosa, mejor definirlo ahora que no tenemos nada hecho jeje

Ferenczyg, exactamente eso es lo que se propone, un interprete de código G, si ven el turbo cnc es muy simple, no grafica ni genera G, simplemente lee el g y controla la máquina.

Yo me tiro por controlarlo como se hace en la PC a los ejes, con paso y dirección, es mas simple, cargaríamos menos al procesador, además la idea es usar un buen driver con control de corriente, o porque no un driver comercial que trabaja de este modo. Vamos por parte, si además pretendemos hacer el Traslator para generar la secuencia de activación de las bobinas, y ni hablar si qeremos hacer micro pasos, es complicarnos de entrada.

Lo que si tengo decidido es usar alguno de mis drivers que estan publicados en la web, tal cual estan, reemplasaria la Interfaz y la PC por este prototipo. Yo en los drivers uso el siguiente conector:

(http://www.******web eliminada por los administradores por quejas reiteradas sobre este usuario****/fotos/Interfaz%20CNC%20v1.2%20(4).jpg)

En un primer momento irían 3 de estos conectores (X, Y y Z), donde ahi tenemos presentes las señales de de Paso,y Dirección, y Enable que generaríamos con el Micro, u la de Paso o Medio paso, que esa la controlaría con un jumper, normalmente siempre uso medio paso, no vale la pena controlar eso desde el prototipo.

Bueno, estamos en contacto, saludos.
Título: Re: Procesador CNC de Codigo G
Publicado por: todopic en 30 de Junio de 2008, 16:01:11
Hola Amigos!, buen emprendimiento!  :-/
esto mas que programacion "es matematica pura" ja ja ja :mrgreen:
Entre dos puntos, la distancia es una recta, calcular la pendiente, generar los "triangulos" para los avances de cada motor.... ¿seria algo asi Esteban?

Ya estoy tildando como favorito  :-)

Norberto
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 30 de Junio de 2008, 16:58:46
Esteca,

Yo había pensado en el 18F4550 o el 18F2550 ya que ya tienen USB2.0.

Para lo del driver se me había ocurrido un 16F876 y unos transistores de potencia a la salida.

Se podría hacer una comunicación serie entre los pic tipo I2C o USART, me da igual.

La ventaja es que como dices los motores van a ser independientes de la decodificación y como mucho van a 16MHz (que para controlar los pap nos basta y nos sobra); y la decodificación USB o SD a 48MHz, con lo que podríamos poner un display y estaría bien gobernado.

El esquema de los drivers a ver si lo puedo subir mañana, que ya lo tengo en mente pero me falta echar cuentas. La idea de hacer así los drivers es porque me sale más barato que comprar un integrado de tanta potencia y el código ya lo tengo :mrgreen: (sólo faltaría la comunicación).

Lo de hacerlo en común me parece genial, así podremos depurar mucho el código.

Un menú, que yo creo que es totalmente necesario, es el de elegir el centro de coordenadas y que el micro recalcule todos los puntos del sistema.

Modificación:

PD.: ¿Qué lenguaje de programación queréis usar? Por mi el C-CCS con la librería de PalitroqueZ (sólo con su permiso) de las MMC y SD. Si no el C18 que trae librerías para las tarjetas.

Le pregunté a PalitroqueZ si cree que con su librería se podría hacer. El problema es que debe estar liado con exámenes y no me ha contestado.
Título: Re: Procesador CNC de Codigo G
Publicado por: todopic en 30 de Junio de 2008, 20:16:56
Hola Slalen, lo que llamas centro de coordenadas, se llama en el cnc cero de pieza, y eso, lo puedes alterar, es decir, colocas tus coordenadas de inicio, donde mas te convenga segun el tipo de pieza, algunas es mas somple en el centro, otras en los extremos...

Hay otra coodenada que se llama cero de maquina, que "normalmente" es fija y dada por el fabricante, por fines de carrera, por encoder, etc...

Estoy de acuerdo en que hay que apuntar al USB  :mrgreen: hay muchos del foro que ya lo saben emplear !  :-/

Los ingresos de datos, podrian ser con un teclado "Redpic (http://www.todopic.com.ar/foros/index.php?topic=2256.0)" pc  :D

Norberto
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 01 de Julio de 2008, 04:15:59
Lo que yo me refiero, (no se si me expliqué bien) es que puedas mover la herramienta de la máquina a un punto y lo elijas como cero de pieza y el pic recalcule todos los puntos con esa referencia. Osea, que no sea mediante programación y que lo haga la máquina ella sola.

Lo del teclado, si quereis uno de ordenador, por mi bien. Yo pensaba en uno numérico pero me gusta la idea :mrgreen:

De todo esto lo único que se controlar es el USB y los motores pap. TODO LO QUE TENGO QUE APRENDER!!!!! :mrgreen: :( :mrgreen:

Modificación:

PD.: ¿Qué os parece el display de un nokia para los menús?
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 01 de Julio de 2008, 07:08:10
Qué os parece hacer la estructura del compañero cucaracha http://webs.ono.com/cucaracha/fresadora3D.htm

Me gusta por seguir con la idea de hacer una CNC barata con medios accesibles y sencilla (aunque parezca de bricomania)
Título: Re: Procesador CNC de Codigo G
Publicado por: Renatox_ en 01 de Julio de 2008, 12:12:29
Hola como están yo también quiero colaborar. Esteca a la comunicación con los motores sería bueno agregarle una señal de alarmar "ALM" para el caso de un servomotor, el driver le manda una señal al control para indicar que ha ocurrido una falla, como sobretensión, sobrecorriente o error de posición.

Lo de usar una pantallita me parece que es importante, no para ver los gráficos del mecanizado, sino para ver el programa que se ha enviado, y cuando este esté ejecutándose se vea la línea de código sombreada. Me inclinaría más por usar una pantalla más grande a la de un celular, mínimo 128x64 si es el doble mucho mejor. También se tiene que tener la posibilidad de modificar y/o corregir el código enviado en el mismo control, para esto es importante tener un teclado.

Propongo que hay que atacar al problema desde lo principal, es decir procesar e interpolar un código G pequeño para saber la rapides de procesamiento que necesitamos, cuantos pic necesitaremos y si usaremos memorias, etc.

Por ejm un código como este:

T0101
G96 S600 M3
M8
G0 X100 Y50 Z-20
G1 X140 F400
M9
M5
M30

También hay que tener un puerto de expansión para las señales del PLC, algunas pueden ser:

Entradas:

Xhome, Yhome, Zhome
Stop de emergencia

Salidas

Pin de M3_M4 del husillo
Pin M5 parada del husillo
Bombda de agua.

Un G0 que pueda llegar por ejm a 4000mm/min, con opción de modificarlo estaría bien para empezar.
También hay que programar aceleración y desaceleración.

Hay muchas cositas a tener en cuenta, poco a poco las iremos descubriendo.

saludos.
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 01 de Julio de 2008, 12:29:21
Cuanto más grande es el display más caro es....

Yo no quiero olvidar el origen de esta cnc, y es el de hacerla con piezas recicladas y gastándo el mínimo dinero... Por eso mi idea del display de nokia
Título: Re: Procesador CNC de Codigo G
Publicado por: electrotacto en 01 de Julio de 2008, 13:57:14
hola amigos, mi nivel de programacion no me permite opinar refrente a al como y y que micro utilizar. En lo que si quiero opinar es en sistema como tal, como pienzan alimentar la informacion a la máquina si esta planteado que es autonoma, osea sin PC, no creo que manual porque el minimo diseño genera un larga llista de lineas de instruccion en G-Code.

Si una vez generado el G-code cual sería su tratamiento. supongo que ha de haber una memoria de desacarga, me imagino yo; pero como se llevaria el codificado de g-Code a valores hexadecimales los cuales llenaría el banco de memoria y cual sería el medio de transporte desde la Pc hasta la máquina ya que el puerto ya no trabajaría de modo maestro-esclavo si no mas bien para almacenar la lista de instrucciones para que la máquina pueda hacer su trabajo.

Bueno mas que un aporte es una inquietud, pero si fuese yo un usuario de este hermoso proyecto, sería la primera de mis inquietudes saber como funcionaría antes de entrar en los detalles de los controles. Hagamos un bosquejo preliminar de como pudiera funcionar y en funcion a este ir desarrollando cada bloque.

No puedo aportar ideas en las estructuras de programacion a utilizar pero si tengo ideas en cuanto al harwdware.

saludos.


Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 01 de Julio de 2008, 16:46:32
Electrotacto, tus inquietudes (como yo me lo imagino) se basa en la lectura de las sd.

Las sd estarían formateadas en fat ya sea 32, 16 u 8. Al leerlas con el pic te da igual ya que lee los bytes en hexadecimal.

Si buscas en la página de atiopes (www.ucontrol.com) y creo que en el foro, atiopes hizo un manual sobre las tarjetas multimedia.

Pues bien, todas las tarjetas sean del tipo que sean, tienen un bloque de inicialización que es donde se determina el formato (en nuestro caso da igual).

Depués, declara el nombre de los ficheros y por último están los ficheros.

Si obligamos a que el fichero se llame de una determinada manera, nos basta con realizar una búsqueda en la tarjeta.

Cuando encuentre el archivo, tendrá que decodificar los datos hexadecimales y realizar la instrucción.

El orden de los bloques no se si es así exactamente. Si alguien quiere más información os recomiendo que busquéis el tutorial porque no tiene nada de desperdicio.

Ahora hago los esquemas de los drivers para que opinéis.

Electrotacto tiene razón, tenemos que ir declarando lo básico para poder empezar.

¿Quién se apunta?

Mi idea: Como todo esto parte del post "Mini CNC" (http://www.todopic.com.ar/foros/index.php?topic=21154.0) el cual me animó a hacerme una, lo principal (como la anterior) muy barata, con materiales reutilizados.

La idea del teclado me ha gustado, yo quería un teclado matricial porque conseguí dos.

El display de nokia porque tengo varios y son fáciles de conseguir (y muy baratos).

Los drivers de los pap con un pic y unos transistores porque es mucho más barato que un driver de motor pap.

Puerto USB, por comodidad. Hasta se puede hacer que el PC reconozca la CNC como un lector de tarjetas y poder grabar los archivos directamente.

Y por último que el sistema sea todo lo compatible que se pueda con el resto de CNC
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 01 de Julio de 2008, 17:23:17
Os cuelgo dos amplificadores de corriente. Los transistores aguantan 100A y 100V.

(http://slalen.iespana.es/electronica/images/driver%20pap.jpg)

El mosfet es el BUK9575 cuesta como 1€ y el resto que lleva es un 1n4007 y un par de resistencias de 0.25W

Los bipolares son el MJD122 (es smd) cuesta como 0,25€ y lleva 4 resistencias de 0.25W

Os pongo los dos para que decidáis si lo hacemos smd o no
Título: Re: Procesador CNC de Codigo G
Publicado por: Ferenczyg en 01 de Julio de 2008, 18:40:47
A mi me interesa, yo me apunto. No obstante, lo primero que propongo es centrarnos en un solo objetivo porque si no se va a dispersar el esfuerzo. Es decir, lo primero que habría que hacer es una especificacion de objetivos, o dicho de otro modo, aclarar es lo que se pretende hacer. Me explico:

Si en un conjunto 'completo' CNC descartamos la parte CAD y nos centramos en la parte CAM yo distingo cuatro partes:

1.- generador de codigos G
2.- interprete de codigos G
3.- generador de pulsos de salida (step/dir, on/off de pínola, on/off de refrigerante, on/off de aspiracion) y receptor de señales de entrada (limites, home, e-stop..)
4.- drivers de motores
5.- mecanica

Mi propuesta se basa en que lo me parece mas lógico es dejar 1) en el PC donde vive la parte CAD, y partir de un fichero en formato *.nc -o txt de lineas con GCodes-  almacenado en una SD/MMC. O dicho de otro modo, no creo que debiéramos preocupamos de como se generan los códigos G en el alcance de este proyecto.
Por otro lado, 4) tampoco me parece que debiera estar en el alcance, primero porque 4) se dedica basicamente a controlar potencia, luego porque el mundo PaP y el mundo servo se parecen muy poco, y por ello tambien sus drivers son muy distintos, con lo cual es otra posibilidad de diluir el esfuerzo.
Del mismo modo, para 5) hay tantisimas soluciones, tan dependientes de lo que este al alcance de cada uno, que intentar definir un estándar me parece un poco demasiado complicado.

En resumen (ojo, se que mucho ya se ha comentado, solo intento organizar las cosas en mi cabeza  :-) y ademas eso es lo que yo habia entendido desde un principio y si no es asi corregidme) entiendo que habria que centrar el esfuerzo en un sistema que:

a) lea de una tarjeta SD/MMC un fichero conteniendo códigos G en texto plano. Adicionalmente, de origen o en una version posterior, podria ofrecer soporte de USB y volcar a la tarjeta de la que luego leeria.
b) interprete los códigos G y genere las secuencias de pulsos que se deriven de ellos en un formato step/dir, para motores paso a paso (es decir, sin soporte de encoders de cuadratura para servos, al menos en una version inicial), y para un numero de ejes por definir. En cuanto a ejes, lo mínimo funcional para una fresadora es tres, lo ideal es 4, y el máximo razonable 6. Quien tenga un torno o un sistema de corte de foam puede utilizar solo dos ejes y tan campante. La frecuencia del tren de pulsos no suele ser necesario que supere los 40KHz, pero si que es bueno que si sea mayor de 20KHz por temas de velocidad, de resonancia en los PaPs y por comodidad, para que no sea audible.
c) pueda asociar N señales de salida, a definir, para control de equipamiento accesorio
d) pueda recoger e interpretar M señales de entrada, a definir,  provenientes de la mecánica o el usuario
e) tenga algun tipo de dispositivo de visualizacion (i.e LCD texto HD44780 compatible o grafico T6963C compatible o lo que se decida)
f) tenga algun tipo de dispositivo de entrada de ordenes (teclado 4x4, o botonera, o lo que se decida)

Una vez definido todo esto, el resultado ya nos indicaria bastantes cosas, entre ellas el modelo de PIC a utilizar. Luego quedaria acordar lenguage (voto por CCS), etc.

Opiniones?

Salu2




Título: Re: Procesador CNC de Codigo G
Publicado por: melk en 01 de Julio de 2008, 20:57:51
Creo que la parte más dificil será realizar las interpolaciones , determinar los valores de aceleración admisibles e implementarlos sin perder la posición y luego enviar los pulsos en la secuencia correcta de modo simultaneo.

1º En un PC es sencillo realizar la ristra de calculos, pero empleando un micro la cosa se complica. Lo primero es convertir los valores de las instrucciones G-Code a numeros enteros de pasos o a la señal de voltaje correspondiente del servo, para ello habría que hacer para cada eje algo como NºPasos = (PosActualEje-PosDestinoEje)/Precision PaP o Giro en º Servo = (PosActualEje-PosDestinoEje)*Factor conversion
2º Establecer la aceleración máxima a traves del G-Code y la separación de los pulsos, sabiendo aquello de que v=v0+a*t
3º Ir almacenando los pulsos que se envian en alguna especie de buffer mientras se calculan los siguientes, ya que calcularlos todos y guardarlos en algun sitio, si el programa es muy grande, se hace imposible. Tambien es importante tener en cuenta que la diferencia de tiempos entre pulsos no sera constante, y que habrá que enviar los de cada eje con su frecuencia, lo que dista mucho de ser trivial.

Otra cosa, creo que al efectuar los calculos el tiempo necesario es muy variable, asi que, para hacer que el sistema fuese real-time habría que meter tambien algun TMR para controlar el envio de pulsos

Siento no ofrecer inicialmente nada más que posibles pegas... Un saludo a todos y gracias por el foro
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 02 de Julio de 2008, 04:09:25
Fernczyg esa es mi idea también

Yo creo que deberíamos empezar por la estructura y de avanzar con los cálculos.

Esteca55, ¿cuál es tu idea?
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 02 de Julio de 2008, 04:59:56
Melk,

Lo único que creo que ya es fijo es que vamos a usar pap. Como estos motores tienen una velocidad máxima, creo q no se complica tanto (puede que cuando empecemos me de cuenta de lo equivocado que estaba).

La idea es que un micro convierta las instrucciones a pasos y otro controle los pap y los mueva de acuerdo con esos pulsos.

Lo bueno de hacer esto es que el buffer se agranda y se puede conseguir más velocidad.

Lo del TMR creo que es necesario pero no por el real time, sino por la interrupción y que el micro pueda seguir trabajando.

Por cierto, lo del voto por CCS. Yo tengo todo lo relativo al USB en C18 y también una librería para las SD/MMC.
PalitroqueZ tiene un estudio del USB en CCS y la librería. No se si PalitroqueZ se apuntará o no....
Título: Re: Procesador CNC de Codigo G
Publicado por: Ferenczyg en 02 de Julio de 2008, 10:27:58
Bueno, no creo que haya mucho problema en que se utilicen dos versiones de lenguaje, lo importante es lo que se codifica. Yo tengo hecha la dssrboard 2 que ya me sirve para el 16F788 o el 18F450, y para programar/debug tengo un clon de icd2, o sea que como entorno de desarrollo probablemente tire por ahi.

BTW buscando un poco he visto algo parecido pero para basic stamp :

http://mcglothin.us/RobotScrapbook/CommunityPcbMill2005/BasicStampGCodeInterpreter/

aunque sea basic siempre se puede sacar alguna idea (me lo he mirado, pero poco, no he llegado a descifrarlo)

Yo por lo pronto me bajare el Ubuntu EMC2 linux al VMware de casa a  ver si soy capaz de descubrir las rutinas de motion control dentro del codigo fuente. A lo mejor consigo entender algun cacho de como lo hacen, al menos estan comentadas.

Salu2!
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 02 de Julio de 2008, 20:46:12
Hola todos, perdonen que estuve medio desaparecido, es que desde el lunes estoy en cama por suerte hoy ya me estoy mejorando, pasaba por el foro, y vi mas o meno lo que venían escribiendo pero el cuerpo no me daba para sentarme a escribir jejej.

Me alegro que mas gente se halla sumado!

Entre dos puntos, la distancia es una recta, calcular la pendiente, generar los "triangulos" para los avances de cada motor.... ¿seria algo asi Esteban?

Exactamente Norberto, la base va ser cálculos de triángulos jeje, en realidad segmentos de rectas con diferentes pendientes, luego hacer que el sistema siga esa recta, luego la otra, la siguiente y ....

Un menú, que yo creo que es totalmente necesario, es el de elegir el centro de coordenadas y que el micro recalcule todos los puntos del sistema.

Modificación:

PD.: ¿Qué lenguaje de programación queréis usar? Por mi el C-CCS con la librería de PalitroqueZ (sólo con su permiso) de las MMC y SD. Si no el C18 que trae librerías para las tarjetas.

Si tal cual, un menú es necesario, para configurar los parámetros de la maquina, la idea es que sea algo genérico y que se configure como los soft de CNC mas comunes, por ende los parámetros principales a poder configurar, serian los pasos por unidad de cada ese, la velocidad maquina de cada eje, que va a ser la de los movimientos rápidos (G0), y rampa de aceleraron de los ejes.

Respecto al lenguaje, nunca use CCS, la idea mia es usar C18, ya que además cuento con un ICD2 para debuggear desde el MPLAB, pero me puedo adaptar a otra cosa, no hay tanto problema.

Lo que si, como te dijo Norverto, eso del centro de coordenadas, lo que se hace es trabajar con coordenadas virtuales, digamos vos siempre partís del cero, desde ahi empieza a correr tu maquina, entonces lo que se hace es poner la maquina donde vos queres que este el cero, y ahi le decis que es el cero de coordenadas  virtual para correr el G, no hace falta recalcular nada, empieza a correr el g desde ahi, obviamente eso se aria desde el menú como vos decis. SI quieren díganme y les explico mejor como funciona esto.

A obviamente tenemos que agregar en control manual, justamente para posicionar la maquina donde queremos que sea el cero, en el mach por ejemplo se hace con las flechitas del teclado, así que paríamos hacerlo con la botonera que penamos ponerle al proyecto, yo había pensado en un teclado matricial de 4 x 4.

Qué os parece hacer la estructura del compañero cucaracha http://webs.ono.com/cucaracha/fresadora3D.htm

Me gusta por seguir con la idea de hacer una CNC barata con medios accesibles y sencilla (aunque parezca de bricomania)

Me parece una muy buena estructura esa, la idea mía es que se pueda aplicar a cualquier estructura y se sea independiente de que driver usemos, asi que motor mi cualquier cosa esta bien jejeje

Lo de usar una pantallita me parece que es importante, no para ver los gráficos del mecanizado, sino para ver el programa que se ha enviado, y cuando este esté ejecutándose se vea la línea de código sombreada. Me inclinaría más por usar una pantalla más grande a la de un celular, mínimo 128x64 si es el doble mucho mejor. También se tiene que tener la posibilidad de modificar y/o corregir el código enviado en el mismo control, para esto es importante tener un teclado.

........

También hay que tener un puerto de expansión para las señales del PLC, algunas pueden ser:

Entradas:

Xhome, Yhome, Zhome
Stop de emergencia

Salidas

Pin de M3_M4 del husillo
Pin M5 parada del husillo
Bombda de agua.

Un G0 que pueda llegar por ejm a 4000mm/min, con opción de modificarlo estaría bien para empezar.
También hay que programar aceleración y desaceleración.
....

Tal cual amigo Renatox_, la pantalla seria para eso, y creo que si o si es necesaria, yo había pensado en comprar algo asi, voy a evr que consigo cuando valla a las casas de electrónica. De todas formas eso no es lo que mas me preocupa cualquier pantalla esta bien por ahora, lo primordial y lo que mas me preocupa van a ser los cálculos y si vamos a ser capas de procesar esta información.

Esta perfecto lo de la mención e la entradas para los finales de carrera, los home que es para los cero de la maquina para quienes no lo saben, y para la parada de emergencia, como asi también las salidas para el husillo y porque no como vos decís la bomba de agua, mi idea es ponerle dos o tres salidas de tipo rele como mi interfaz para CNC por puerto paralelo.

Sigo en otro porque ya esta muy largo...
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 03 de Julio de 2008, 00:21:06
Os cuelgo dos amplificadores de corriente. Los transistores aguantan 100A y 100V.

El mosfet es el BUK9575 cuesta como 1€ y el resto que lleva es un 1n4007 y un par de resistencias de 0.25W

Los bipolares son el MJD122 (es smd) cuesta como 0,25€ y lleva 4 resistencias de 0.25W

Os pongo los dos para que decidáis si lo hacemos smd o no

Tene en cuanta que lo que importa es la potencia que pueden disipar, no vas a poder manejar 100A a 100V, si mal no vi en la hoja de datos podría manejar una potencia de 99W, de formas es mas que suficiente.


A mi me interesa, yo me apunto. No obstante, lo primero que propongo es centrarnos en un solo objetivo porque si no se va a dispersar el esfuerzo. Es decir, lo primero que habría que hacer es una especificación de objetivos, o dicho de otro modo, aclarar es lo que se pretende hacer. Me explico:

Si en un conjunto 'completo' CNC descartamos la parte CAD y nos centramos en la parte CAM yo distingo cuatro partes:

1.- generador de codigos G
2.- interprete de codigos G
3.- generador de pulsos de salida (step/dir, on/off de pínola, on/off de refrigerante, on/off de aspiracion) y receptor de señales de entrada (limites, home, e-stop..)
4.- drivers de motores
5.- mecanica

Mi propuesta se basa en que lo me parece mas lógico es dejar 1) en el PC donde vive la parte CAD, y partir de un fichero en formato *.nc -o txt de lineas con GCodes-  almacenado en una SD/MMC. O dicho de otro modo, no creo que debiéramos preocupamos de como se generan los códigos G en el alcance de este proyecto.
Por otro lado, 4) tampoco me parece que debiera estar en el alcance, primero porque 4) se dedica basicamente a controlar potencia, luego porque el mundo PaP y el mundo servo se parecen muy poco, y por ello tambien sus drivers son muy distintos, con lo cual es otra posibilidad de diluir el esfuerzo.
Del mismo modo, para 5) hay tantisimas soluciones, tan dependientes de lo que este al alcance de cada uno, que intentar definir un estándar me parece un poco demasiado complicado.

Coincido plenamente con este planteamiento!

b) interprete los códigos G y genere las secuencias de pulsos que se deriven de ellos en un formato step/dir, para motores paso a paso (es decir, sin soporte de encoders de cuadratura para servos, al menos en una version inicial), y para un numero de ejes por definir.

Creo que generar toda la secuencia de pasos de una no va a ser posible, no va a dar la memoria del micro, eso va a ser demasiado extenso, recordemos que como dijo electrotacto los códigos g suelen ser bastante extensos.

Che que al G hay que ir tratándolo, no línea por línea, eso aria lenta la cosa pero si mientras se ejecuta una linea ir leyendo y calculando la segunda en una de esas. Por ejemplo les cuento como dato que el turboCNC que corre en MSdos hace algo así, me di cuento una vez que corrí un G desde un disco de 3 1/4, ya que luego de abrir el G y al  darle  RUN, cada tanto encendía el led de la disketera y se escuchaba que esta comenzaba a trabajar, es mas en un oportunidad lo probé en una PC muy vieja y se ve que la lectora estaba algo dañada, como tardaba en leer, el programa detenía la maquina hasta que leía una parte del diskete y luego seguía, o sea que no cargaba todo el G, les estoy hablando de una 486 con 8 mega de ram!.

Coincido con esto:

3º Ir almacenando los pulsos que se envian en alguna especie de buffer mientras se calculan los siguientes, ya que calcularlos todos y guardarlos en algun sitio, si el programa es muy grande, se hace imposible. Tambien es importante tener en cuenta que la diferencia de tiempos entre pulsos no sera constante, y que habrá que enviar los de cada eje con su frecuencia, lo que dista mucho de ser trivial.


Por ultimo:

Lo único que creo que ya es fijo es que vamos a usar pap. Como estos motores tienen una velocidad máxima, creo q no se complica tanto (puede que cuando empecemos me de cuenta de lo equivocado que estaba).

La idea es que un micro convierta las instrucciones a pasos y otro controle los pap y los mueva de acuerdo con esos pulsos.

Lo bueno de hacer esto es que el buffer se agranda y se puede conseguir más velocidad.

Eso es verdad, en lo que creo que vamos a diferir un poco es que vos vas a usar un driver convencional, sin control de corriente, la idea mía es aplicarlo a un driver con control de corriente, seguramente use alguno de los de mi web, la idea de esto es porque cuando termine mi nueva máquina, para probar va a ser muy censillo, desconecto la interfaz de la pc, conecto esta placa y listo, ya estoy controlando la máquina.

A lo que me refería es que con los driver con control de corriente al menos voy a tener 3 o 4 veces mas velocidad en los motores, con lo cual voy a necesitar mas velocidad de procesamiento, pero para empezar eso no es problema, lo primero es que ande bien, aunque sea despacio.

Obviamente la de desligar a la etapa del procesamiento la del control de las bobinas del motor es lo mejor, como vos decís ahí se gana en velocidad.

Es mas, yo estoy pensado en utilizar dos micros para procesar el G, asi se puede con uno leer el g, y hacer el calculo del movimiento, para los ejes, y después se lo pasa al otro que genera los pulsos teniendo en cuenta la aceleración velocidad y demás, y mientras ese produce eso el otro va haciendo los cálculos para las siguientes líneas de G.

Es mas, lo que mas me resulta complicado va  a ser como poder generar supongamos para 3 códigos g tres trene de pulsos de distinta frecuencia, y con rampas de aceleración distintas, hasta pensé poner un micro para eso por eje de esa manera al independizarse es mas fácil, ahi el problema seria el sincronismo de los movimientos.

Pasa como querer construir con un solo microcontrolador un driver para tres ejes, que trabajen de la forma convencional con paso y dirección. Esto no es recomendable, ya que de ese modo la forma de trabajo es hacer un paso por cada pulso presente en la señal de paso en la dirección que indica el estado de la señal justamente de dirección. Es algo simple, pero con un solo micro no se podrían detectar dos pasos que vienen al mismo tiempo para dos ejes distintos, perderíamos uno de los dos pasos, además los pulsos de los programas suele ser de 1 microsegundo de ancho, yo uso ese valor en el mach, entonces la mejo forma es tratarlos por interrupción, pero no podemos tener dos interrupciones al mismo tiempo. Por eso ahí lo mejor es trabajar con un micro independiente por cada eje.

Me gusta el dicho, divide y vencerás jejeje

Saludos

MODIFICADO: reformule el último párrafo.
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 03 de Julio de 2008, 04:20:17
Me alegro de que estés mejor!!! :mrgreen:


Eso es verdad, en lo que creo que vamos a diferir un poco es que vos vas a usar un driver convencional, sin control de corriente, la idea mía es aplicarlo a un driver con control de corriente, seguramente use alguno de los de mi web, la idea de esto es porque cuando termine mi nueva máquina, para probar va a ser muy censillo, desconecto la interfaz de la pc, conecto esta placa y listo, ya estoy controlando la máquina.

A lo que me refería es que con los driver con control de corriente al menos voy a tener 3 o 4 veces mas velocidad en los motores, con lo cual voy a necesitar mas velocidad de procesamiento, pero para empezar eso no es problema, lo primero es que ande bien, aunque sea despacio.

¿Porqué se gana en velocidad? Se supone que una etapa con transistores amplificando totalmente sobredimensionados van a dar toda la corriente que puedan en cada momento, y eso será la que necesite el motor, ¿no?

Obviamente la de desligar a la etapa del procesamiento la del control de las bobinas del motor es lo mejor, como vos decís ahí se gana en velocidad.

Es mas, yo estoy pensado en utilizar dos micros para procesar el G, asi se puede con uno leer el g, y hacer el calculo del movimiento, para los ejes, y después se lo pasa al otro que genera los pulsos teniendo en cuenta la aceleración velocidad y demás, y mientras ese produce eso el otro va haciendo los cálculos para las siguientes líneas de G.

Es mas, lo que mas me resulta complicado va  a ser como poder generar supongamos para 3 códigos g tres trene de pulsos de distinta frecuencia, y con rampas de aceleración distintas, hasta pensé poner un micro para eso por eje de esa manera al independizarse es mas fácil, ahi el problema seria el sincronismo de los movimientos.

Yo también había pensado en usar un micro para transmisión de datos, otro de decodificador y por último otro para los drivers...

Se puede mirar lo de poner un pic por eje...

Pasa como queres hacer un drive con un solo pic para tres ejes, yomo uso paso y dirección, eso no puedo usarlo, ya que la mejor forma de tratar eso es por interrupción, uso la interrupción de cambio de flanco, pero que pasa si los dos ejes se mueven al mismo tiempo, el pic no puede detectar dos cosas al mismo tiempo, perderíamos pasos, por ejemplo en el mach los pulsos de paso son de 1 microsegundo.

No entiendo este párrafo :(

Respecto al lenguaje, nunca use CCS, la idea mia es usar C18, ya que además cuento con un ICD2 para debuggear desde el MPLAB, pero me puedo adaptar a otra cosa, no hay tanto problema.

Vale, usamos el C18 (si el maestro es el que maneja mejor hacerle caso....)
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 03 de Julio de 2008, 08:17:09
Hola Slalen,

Si queres entender mejor como funciona lo del control de corriente te recomiendo que pases por el siguiente link, veas y escuches el video, ahi trate de explicar del mejor modo como es esto del control de corriente:

Motor PAP a 3000 RPM con driver con control de corriente (http://www.todopic.com.ar/foros/index.php?topic=20470.0)

El control de corriente es lo que se usa en todos los sistemas profesionales, o sea cualquier buen driver comercial es asi, es increíble la mejora que se logra, muy notable, obviamente no vas a poder trabajar a 3000 RPM como en el video ese, eso es en vacio, pero si tranquilamente trabajar a 500 o 600 RPM, cuando con un driver convencional, ni en vacio se llegra a las 600 RPM.

Que bueno que compartimos lo de usar Dos micros para procesar datos, tamos pensando mas o menos igual jeje

Vale, usamos el C18 (si el maestro es el que maneja mejor hacerle caso....)

Para.. ningún maestro ee, es mas siempre trabaje con ASM, hace poco que esoy incursionando en el C, y bueno lo único que vi fue algo de C18, nada mas, por eso en una de esas largarme con otro compilador no es tanto problema.

No entiendo este párrafo :(

Yo tampoco, jaja, ahi lo reformule, lo modifique, se ve que ya me estaban haciendo efecto las pastillas por la gripe anoche jejejeje

Saludos

Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 03 de Julio de 2008, 10:54:07
Yo tampoco, jaja, ahi lo reformule, lo modifique, se ve que ya me estaban haciendo efecto las pastillas por la gripe anoche jejejeje

Ahora todo encaja!!!!!

No me había parado a pensar esa posibilidad.... Ok, pues entonces un PI16f84 por eje :mrgreen:
Título: Re: Procesador CNC de Codigo G
Publicado por: Ferenczyg en 03 de Julio de 2008, 20:00:14
Holas

Respecto a si procesar de una pasada todo el conjunto de Gcodes, no creo haber dicho eso (o al menos no era la intencion), es mas, la logica indica que la tarjeta SD solo almacenaria el fichero con los Gcodes y de ahi se irian leyendo. No obstante, dado el tamaño de una tarjeta SD de las baratas (las de 32 MB cuestan como 10 euros) que otras opciones nos proporcionaría tener todo ese espacio? Es mas, vale la pena definir una tarjeta SD de un tamaño minimo (digamos 256 ó 512 MB) y hacer un preprocesado de todo el gcode, escritura a dicha tarjeta, y luego unicamente lectura y envio a los puertos? creeis que habria alguna ventaja en cuanto a velocidad, disminucion de necesidades de memoria del pic, etc.?

Btw, para arduino/reprap ya ha habido alguien que ha hecho un interprete de Gcodes:

http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter

Nos acorta eso el camino de algun modo?

Salu2!

Título: Re: Procesador CNC de Codigo G
Publicado por: Renatox_ en 04 de Julio de 2008, 03:33:05
Hola compañeros del foro, veo que este proyecto ha sido bien acogido que bien espero que podamos avanzar bastante, al parecer llegar a un concenso para usar un mismo hardware no va a ser posible, pero si habrán algunos módulos y códigos de programa que podrán ser usados por todos.

Recuerden que este hilo trata la parte del control numérico de un CNC es decir, ve la interpolación, la lógica del PLC y la comunicación con los drivers. Detalles de como construir un driver pap o servos pienso que no deben ser tratados aquí, hacer un cnc básico es largo y no debemos perder el rumbo.

Las señales de interfaz con el driver es bastante parecido tanto para un pap como un servo, setp_dir_enable lo básico, y half/full y ALM como opciones al tipo de driver.

Veo que ya están proponiendo el hardware a usar, como usb memoria sd, número de pics, eso está bien, pero ahora debemos atacar el problema en lo principal, es decir la interpolación y como enviar el setp_dir a los tres drivers.

Todas las trayectorias de mecanizado pueden ser realizadas con estos dos bloques básicos:

G0_G1
G2_G3

Que les parece si desarrollamos estos bloques matemáticamente, y resolver algunas dudas como:

* podrá procesarse en tiempo real?
* Necesitará memria para almacenar los datos interpolados? será necesario almacenar también los tiempos?
* Si necesitamos memoria, que velocidad de escritura debe tener?
* Cómo enviar los datos interpolados como pulsos y dirección.
* La velocidad máxima de mecanizado.

Al responder estas preguntas y otras más, podemos definir el hardware con mayor presición.

Hay mienbros enchufados en esto como Esteca, Stalen, Ferenczyg, etc que bien.

saludos.

Pdta: Ya pues IvanCarlos colabora  :)
Título: Re: Procesador CNC de Codigo G
Publicado por: Renatox_ en 04 de Julio de 2008, 04:07:31
Empezando a ver el Primer bloque G0_G1

(http://img76.imageshack.us/img76/393/dibujo1fx6.jpg)

Esto puede ser representado por la sgte. línea de código G:

G1 X60 Y80 Z100 F400

Estuve haciendo los cálculos, tomando al eje X:

Resolución = 0.001mm = 1 paso   (por ejm)

Fórmulas Básicas:
Nºpasos = (Xf-Xi)/RES
T(A->B)=(Xf-Xi)*60/F         (seg)
T(1p)=(RES*60)/F          (tiempo de un pulso seg)

Nºpasos=(60-0)/0.001=60 000
T(A->B)=(60-0)*60/400=9seg
T(1p)=0.001*60/400=0.15mseg=150useg

Supongamos:

G0 en F=1000mm/min => T(1p)=60useg
G0 en F=8000mm/min => T(1p)=7.5useg

Sigamos con los cálculos, yo continuo después.

saludos.
Título: Re: Procesador CNC de Codigo G
Publicado por: Sispic en 04 de Julio de 2008, 13:26:51
Yo puedo contar  mi experiencia con un aparatejo de estos questoy liado.

Empece con un pic18 usb , pero se quedo algo chico para este proposito , mas que nada  cambie por comodidad ya que todo se puede con uno de estos.
Con un pic33f da gusto , mas bits en los timmer + ram + mips etc .

prove varios metodos con la ayuda de nuestro amigo Manolo Nocturno , al final use para ir de paseo con los motores 2 timmers de 16 bits + otro para  marcar la velocidad aceleracion y desaceleracion .

va fino fino , aunque la aceleracion y desacel se queda corto con los saltos del contador y aunque es algo brusca la curva va bien  , se podria solucionar con una tabla o algo asi , al final ya lo refinare .

Muestra de parte del codigo en el sitio importante  , la acel + desacel + comandos la he sacado para no liar .


Código: C
  1. /*******************************  X  ***********************************/
  2. void __attribute__((__interrupt__))  _T5Interrupt(void) {
  3. /***********************************************************************/
  4. _T5IF = 0;    
  5.  
  6. if(Tics_X != 0){
  7.     SPED_X=0; asm("nop"); SPED_X=1;
  8.     Tics_X--;
  9.  
  10. }else T5CONbits.TON=0;   // fin
  11.  
  12. }
  13.  
  14. /*******************************  Y ************************************/
  15. void __attribute__((__interrupt__))  _T7Interrupt(void) {
  16. /***********************************************************************/
  17. _T7IF = 0;
  18.  
  19. if(Tics_Y != 0){
  20.     SPED_Y=0; asm("nop"); SPED_Y=1;
  21.     Tics_Y--;
  22. }else T7CONbits.TON=0;   // fin
  23.  
  24. }
  25.  
  26.  
  27. /*********** Velocidad y aceleracion desaceleracion ********************/
  28.  void __attribute__((__interrupt__ ))  _T2Interrupt(void) {
  29. /***********************************************************************/
  30.  
  31. _T2IF = 0;
  32.  
  33. // da los pulsos por un pin a los timers x y , configurados con entrada externa .
  34.  
  35. MOTOR_VELOCIDAD_CK=0; asm("nop");  MOTOR_VELOCIDAD_CK=1;
  36. }
  37.  
  38.  
  39. #define precision 0x1ff
  40.  
  41. /***********************************************************************************/
  42. void  goto_xy(unsigned int x,unsigned int y){
  43. /***********************************************************************************/  
  44.  
  45.  float tx,ty;
  46.  float temp1,temp;
  47.  
  48.  unsigned int Tck_Velocidad ;
  49.  
  50.  Cancela=0;
  51.  
  52.  Posicion_Hasta_X = x;
  53.  Posicion_Hasta_Y = y;
  54.  
  55.     if( x > Posicion_X ){
  56.        DIR_X = Avanza;
  57.        tx = x-Posicion_X;
  58.      } else if( x < Posicion_X ){
  59.        DIR_X = Retrasa;
  60.        tx = Posicion_X-x;
  61.      }
  62.  
  63.  
  64.     if( y > Posicion_Y ){
  65.        DIR_Y = Avanza;
  66.        ty = y-Posicion_Y;      
  67.      } else  if( y < Posicion_Y ){
  68.        DIR_Y = Retrasa;
  69.        ty = Posicion_Y-y;
  70.      }
  71.  
  72.  
  73.  
  74.      Tics_X = tx;
  75.      Tics_Y = ty;
  76.  
  77.      temp1=precision;
  78.  
  79.     Tics_Hasta_X=precision;
  80.     Tics_Hasta_Y=precision;
  81.      
  82.    
  83.  
  84.     if( tx != ty ){
  85.         if (tx > ty){    
  86.             Max_Tics = tx;  Desacelera_X=1;    
  87.             temp= (((tx ) / (ty)));
  88.             Tics_Hasta_Y = (temp )* precision;        
  89.         } else {    
  90.             Max_Tics = ty; Desacelera_X=0;  
  91.             temp= (((ty ) / (tx )));
  92.             Tics_Hasta_X =(temp )* precision;
  93.         }
  94.      }else {
  95.            Max_Tics=tx;  Desacelera_X=1;  
  96.      }
  97.  
  98.  
  99. TMR4=0;  TMR5=0; TMR6=0; TMR7=0; TMR2=0;
  100.  
  101. /*********  Carga timmer X *********/
  102.  
  103. asm("mov #_Tics_Hasta_X ,w0");
  104. asm("mov [w0++] ,w1"); // Alta
  105. asm("mov [w0] ,w2");   // Baja
  106. asm("mov w2 , PR5");   // Alta
  107. asm("mov w1 , PR4");   // Blta    
  108.  
  109. /*********  Carga timmer Y *********/
  110.  
  111. asm("mov #_Tics_Hasta_Y ,w0");
  112. asm("mov [w0++] ,w1"); // Alta
  113. asm("mov [w0] ,w2");   // Baja
  114. asm("mov w2 , PR7");   // alta
  115. asm("mov w1 , PR6");   // Baja
  116.  
  117.  
  118. T4CONbits.TON=1;
  119. if(Tics_X != 0)T5CONbits.TON=1;
  120. T6CONbits.TON=1;
  121. if(Tics_Y != 0)T7CONbits.TON=1;
  122.  
  123. T2CONbits.TON=1;   // a moverse
  124.    
  125. }


La precision es el valor fijo a poner al timmer que hara mas pasos , si los 2 recorren la misma distancia el valor sera el mismo en cada uno .
No son necesarios los 40MIPS A 12MIPS funciona tambien muy bien .
LOs comandos los envio por el puerto paralelo usando otra interrupcion y hay comunicacion simultania de su posicion en cada momento con el programa PC.
Es vastante rapido ya que se envian 8 bits para escritura y 4 para lectura de golpe , aunque con un pic24F + usb seria comodo tambien .


Pues nada , un poco por encima por si puede ayudar en ideas y si necesitais el codigo completo lo cuelgo .








Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 07 de Julio de 2008, 18:27:19
Esteca, tu vídeo me ha convencido..... Felicidades por él....

Sispic, es muy interesante tu proyecto; se puede saber que va a ser????

Renatox_ a ver si me puedo poner a echar un unos cálculos
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 08 de Julio de 2008, 01:05:46
Hola todos, tengo una semana a mil, por eso desaparecí un poco jeje

Gracias por el aporte Sispic, veo que te pusiste a jugar con la CNC que estabas armando jejeje

Saludos
Título: Re: Procesador CNC de Codigo G
Publicado por: elliot en 11 de Julio de 2008, 03:16:33

  Que tal amigos
  He aqui un enlace interesante, algo para motivarse
  http://www.cnczone.com/forums/showthread.php?t=59461

 Saludos
  Jesus
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 08 de Agosto de 2008, 17:42:03
Buenas!!!!

La próxima semana tengo vacaciones!!!

Me vuelvo a casa (salamanca) con lo que estaré algo desaparecido.

La buena noticia es que me pondré con mi padre a hacer las cnc. Si, LAS.

Vamos a hacer dos, con los drivers de Esteca. Una bipolar y la otra unipolar.

La unipolar (popr ahora) será por puerto paralelo, ya que mi padre tiene....

La bipolar es la mia y es la que tenemos he echar a andar  :mrgreen:

Bueno, ya tengo los motores y mañana voy a insolar las placas de control y los drivers... Ya os contaré


Por cierto Esteca, la fuente de alimentación que utilizas ¿de que tensión y corriente es?
Título: Re: Procesador CNC de Codigo G
Publicado por: FuYiVape en 09 de Agosto de 2008, 11:37:53
Hola Muchachos!

Muy interesante el proyecto! aunque esta verde todavia.

Tengan en cuenta que son muchas la cosas que tiene que hacer el microcontrolador.
Hay que seleccionar el o los microcontroladores adecuados. Inclusive, tengan en cuenta las CPLDs.
Los tiempos son criticos. y los calculos deben ser lo mas exactos posibles! Entonces tambien hay que considerar el lenguaje de programacion a utilizar.

Sugiero un diseño multiprocessor. Un microcontrolador para cada axis y un microcontrolador maestro.
De esta forma, cada microcontrolador encargado de su motor, podra inclusive, leer el encoder que le corresponde sin miedo a perder pasos ni distancias.
En tanto el maestro se encargaria de:

Recibir el archivo
Controlar el teclado
Dibujar en el display
Enviar las coordenadas a cada micro para cada motor
Leer los sensores de limites
Controlar el spindle (inclusive agregaria un micro mas para controlar el spindle si fuera necesario)

Obviamente que esto no termina ahi ni sera facil. Pero les aseguro que va a ser mas barato y mucho mas preciso.

¿Como seria el diagrama?
¿Como trabajarian los microcontroladores?

si les gusta la idea, les puedo pasar un diagrama en bloques de la idea (no lo tengo dibujado)

Pero, y siempre hay un pero. Aunque me odien y como dije en otro post, "Aunque me desterren" Yo no usaria PIC.
Ojo! no es por fanatismo ni nada por el estilo.
Hace unos 5 años o mas, no recuerdo bien, tuve que hacer un trabajo. En el prototipo utilice un PIC. El 876. Todavia tengo 5 guardados y sin uso. Pero me encontre que, dada la criticidad del proyecto, me resultaba digamos, lento. Intente por todos los medios acelerar los procesos (hardware y software) pero no hubo caso, era lento. Entonces probe con un AVR. El ATMEGA32. Y logre el objetivo!. A partir de ese momento, me incline por los AVR y los emplee en todos los proyectos que tuve. No me decepcionaron nunca. Es mas! las veces que creia que habia que cambiar de micro, me encontre que el problema era mi codigo o estructura del programa que estaba desarrollando.
¿Porque resulto mas rapido el AVR? muy simple, el AVR es 4 veces mas rapido que el PIC. Ejecuta instrucciones en un ciclo de reloj mientras que el pic lo hace en 4. De ahi que por hardware no podia conseguir el objetivo. Le ponia un crystal de 20MHZ y lo tenia funcionando a 5MIPS mientras que con el AVR, con un crystal de 12MHZ lo tenia funcionando a 12MIPS. se entiende chicos?
Tengan en cuenta esto, porque el proyecto es muy critico a la hora de ejecutar instrucciones.

Estare al tanto de este proyecto, me gusta la idea!

abrazos!

Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 09 de Agosto de 2008, 15:55:44
Fuyivpe,

El problema es que, los del proyecto manejamos los pic y no los atmel.

Si tenemos que aprender atmel para hacerlo se va a eternizar...

Lo que dices de los micros es cierto, vamos a usar varios micros. Puede que usemos uno para el teclado, el display y las transmisiones, otro para los cálculos y varios para el resto.

Si nos mandas el diagrama siempre es bien recibido. Cuantas más cabezas pensantes el proyecto mejorar :mrgreen:
Título: Re: Procesador CNC de Codigo G
Publicado por: FuYiVape en 10 de Agosto de 2008, 18:04:16
Tampoco es tan complicado papa!

si sabes programar en un micro, no te lleva mas de una semana programar otro.
Y mas! si se programa en C!

Pero bue... cualquier cosa al respecto, estoy para ayudarlos.

Les dejo el pdf con la tentiva de multiprocesor.

Abrazos!
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 12 de Agosto de 2008, 10:01:08
Hola todos!

Slalen, que bueno que ahora te pongas a ful con la construccion de dos CNC! me alegro que sean de utilidad mis drivers.

Yo este tiempo e estado con muchísimo trabajo, la verdad no puede adelantar nada de esto.

FuYiVape, muy bueno el esquema, eso es lo que tengo pensado yo hacer, vamos a ver cuando agarro un poco de tiempo.

Saludos

Título: Re: Procesador CNC de Codigo G
Publicado por: jmorfeo en 20 de Agosto de 2008, 15:22:38
Hola a todos!!

Justo lo que vi en este foro es lo que también quiero hacer , así que voy a colaborar lo más posible.

Por lo que leí hasta ahora es muy parecido a lo que tenía en mente, solo que yo empecé por la estructura general, veo que otros por el detalle, más que nada estoy de acuerdo en que dividir es reinar en este tema. Por lo que he visto en varios CNC reales, están planteados en forma modular, una placa para controlar los ejes, otra de procesamiento, control y comunicación , otra de HMI (teclado, display, etc).

Mi idea empezó porque tengo que hacer un control de un eje, entonces pensé si a este control le agrego dos más y una placa "madre" que las controle y se comunique con el mundo exterior... Bingo, tenemos un mini CNC. Entré a pensar y armé esta idea que es muy parecida al PDF de FuYiVape se las adjunto en un diagrama en bloques.

La idea me parece no es hacer un driver de Stepper porque ya hay muchos disponibles, pero no está descartado pero como algo externo. Me gusta el integrado de U$S 5 A3986 (http://www.allegromicro.com/en/Products/Part_Numbers/3986/) de Allegro que usa Mosfet externos y hay varias tentativas de diseño PCB en CNCzone (http://www.cnczone.com/forums/showthread.php?t=24699).

Yo propongo:

1 - una placa de control microprocesada por cada Eje, recibiría el dato de la coordenada a donde dirigir el motor, manejaría las señales de los driver comerciales Step, Dir, En, Ready (entrada), conexión con Encoder para hacer lazo realimentado, no es difícil con el AM26LS32, Salida 0-10 V aprovechando que se puede filtrar una salida PWM del micro para generar la. Entradas de Switches de limite, fin de carrera, home, parada de emergencia, etc. Opcional: para que el módulo sea además independiente, le pondría 6 display de 7 segmentos y  5 teclas de control.
Aprovechando que los micros traen muchas I/O y no se encarecen tanto por eso, puede ser 16F877A porque lo conozco y es económico, pero estoy abierto a otras opciones.

2 - Placa "Madre": interprete del código G que carga por USB a una memoria SD de 256 MB o 512 MB como dijeron antes, comando los ejes y la configuración mediante el HMI. Puede ser 18F4550 por la velocidad de datos que antes calcularon, recordemos que al ser todo microprocesado, los otros micros de los ejes pueden ir acumulando coordenadas, mientras este sigue procesando el código G, o sea es relativo el tema de la velocidad, el tema sería diseñar un buen bus de datos para asegurar la comunicación o usar los existentes I2C, CAN, UART, etc.

3 - Placa HMI: Display LCD de buen tamaño para poder usar menúes de configuración, visualización, etc. Y las teclas o teclados alfanuméricos para acceder a las distintas configuraciones. Yo lo haría también microprocesado, con el mismo criterio de la placa de los ejes.

Bueno, espero se entienda y que el foro siga vivo ya que estuve con problemas estos para entrar. Saludos y espero sus propuestas.


Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 25 de Agosto de 2008, 21:12:14
Hola jmorfeo, bienvenido al foro.

Interesante lo que planteas, me alegro que mas gente se sume al proyecto, yo la verdad últimamente ando  bastante atareado, espero retomar esto pronto, aunque la idea es darle fuerte luego de terminar la construccion de la máquina que estoy armado, para probar y demás.

Saludos
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 27 de Agosto de 2008, 15:50:19
Ya tengo una!!!

A ver si mañana o pasado termino la segunda y os puedo subir fotos :mrgreen:
Título: Re: Procesador CNC de Codigo G
Publicado por: ESTECA55 en 28 de Agosto de 2008, 02:56:21
Que bueno Slalen, nos quedamos a la espera de las fotos!

Sino anda tirando algunos detalles escritos jajaja

Exitos
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 06 de Septiembre de 2008, 08:06:15
Se que os debo las fotos!!!!


Es que he tenido una semana muy liada...

A ver si la próxima (el miércoles o jueves) puedo...
Título: Re: Procesador CNC de Codigo G
Publicado por: newnaf en 06 de Septiembre de 2008, 19:07:57
esteca como siempre en la punta del iceberg!

un capo.. los estuve pensando el sistema.. muy bueno.. epero en poco tiempo sumarme y aportar mi ayuda!

tengo algo en mente.


saludos!
Título: Re: Procesador CNC de Codigo G
Publicado por: jmorfeo en 07 de Septiembre de 2008, 20:28:55
Bienvenido Newnaf!!
Con esto de que no anda bien el foro y esperando las fotos de Slalem han pasado unas semanas. Yo estuve ocupado porque terminé de hacer una placa de interfaz para el Mach3 a drivers de motores PAP comerciales. O sea tiene las clásicas salidas de PULSE, DIR y Enable. Usé las salidas diferenciales de un 75174 para excitar los diodos del optoacoplador de entrada y anduvo 10 puntos.

Con respecto al proyecto del Mini CNC deberíamos ponernos de acuerdo en el formato de las coordenadas. No conozco bien el código G  pero si entiendo que tenemos que definir la resolución de pasos mínima y la la máxima distancia a cubrir. Eso nos va dar el tamaño en bits que tenemos que manejar, O sea qué le tiene que transmitir el PIC "maestro" a los PIC "esclavos" por cada eje como coordenada y la velocidad de ese movimiento.
Yo calculé con 3 decimales (hasta la milésima de resolución) y hasta 16 mts de recorrido máximo, pasado a mm me da 16.000.000 de posibles puntos, o sea 24 bits.
En 16 bits da 65536 nos queda corto y menos de 24 creo que es más complicado de calcular. Yo creo que va a haber mucho procesamiento por lo menos por el uC "Maestro".  En los "esclavos" no tanto porque solo hacen diferencias de un punto a otro teniendo en cuenta la velocidad del movimiento. No sé que tan rápido podemos transmitir esa información a nivel de un bus serial para ahorrarnos pines de I/O. Habría que definir el bus de datos también.

Espero sus comentarios, buena suerte.

 :-/
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 10 de Septiembre de 2008, 16:01:46
lo prometido es deuda!!!!

Estas son de la mia:
(http://slalen.iespana.es/robotica/images/cnc1.jpg)
(http://slalen.iespana.es/robotica/images/cnc2.jpg)
(http://slalen.iespana.es/robotica/images/cnc4.jpg)
(http://slalen.iespana.es/robotica/images/cnc5.jpg)

Es de 300x450.

Y esta s la de mi padre:
(http://slalen.iespana.es/robotica/images/cnc6.jpg)

Es de 450x650.

Las fotos están hechas con el móvil... no tiene mucha calidad.

Se aceptan sugerencias :mrgreen:
Título: Re: Procesador CNC de Codigo G
Publicado por: ismaelima en 10 de Septiembre de 2008, 20:35:11
holis como va!!, me parece que nos estamos llendo por las ramas con este tema, que por cierto esta muy interesante, me parece que deberiamos hablar un poc sobre programacion,
Hay alguien que sepa algo de C++???
porque resulta que puede que consiga codigo fuente de un programa CNC que esopen Source, lo que se me ocurre es que podemos adaptar la codificacion a un micro, memoria y demas. recien me entero de este tema del foro, si me equivoco corriganme jejej, la idea es armar una maquina CNC como las profesionales??? esto entendi yo, estaria muy bueno y dejariamos de depender de una PC. cualquier cosa yo ahora me pongo a revolver y busco el codigo fuente que lo tenia por no se donde metido..... y si le pinta a alguien que sepa programacion lo podemos ir convirteindo.

Otra cosita que estaria bueno que pudieramos desarrollar seria, por lo que yo he visto, en el interior de las maquinas profesionales (yo solo conozco un torno NUM 720T y un centro de mecnizado NUM no se que modelo, que usamos en la facu) no se usan motore PAP, se usan servo motores de CC con sistema de encoder, por lo que la maquina tiene idea Real de donde esta ubicada, eses es otro punto por el que creo le deberiamos dar importancia, porque al fin y al cabo, tengo programas que corren en una 486 y esta exactamente igual la interfas a la de los tornos profesionales que yo conozco y el costo de una maquina de esas no pasa los $200, (cosa que en circuiteria para este proyecto me parece que se va a gastar mas, desde mi punto de vista de no saber mucha electronica... jejej) a mi me pareceria bueno que tambien desarrollaramos algo sobre control de mtores de CC o Servos y nuestras maquinas tendrian mas poder o LECHE jeje y con mas presicion... Uds que opinan???  Les pinta entrar con el tema de los encoders????
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 11 de Septiembre de 2008, 04:06:14
Si puedes conseguir el programa genial!!! Se podría adaptar a los pics

Lo que comentas de los servos con encoder, sería cosa del driver del motor. Habría que hacer una placa que controle la posición y se mueva hasta la posición que necesitemos.
Título: Re: Procesador CNC de Codigo G
Publicado por: ismaelima en 13 de Septiembre de 2008, 00:56:29
Como va to muchachos, todavia estoy revolviendo entre mis cosas buscando lo del codigo CNC, pero tambien viendo por la web encontre esta pagina de unos muchachos que facrican los controles para servos y hasta tienen un software libre de CNC que adjuntan con unos codigos liberados. parece que esta bueno lo que hacen puesto las ventajas que nos ofrecen los servos con respecto a el  control de posicion y demas... les paso el link yo igual recien le he pegado una miradita pero a ver que onda si hay algo que nos sirva para seguir con este proyecto....
esta esw la pagina:
http://www.jrkerr.com/ (http://www.jrkerr.com/)
y aca esta lo del CNC
http://www.jrkerr.com/pscmc.html (http://www.jrkerr.com/pscmc.html)

a ver si os sirve jejej
Título: Re: Procesador CNC de Codigo G
Publicado por: FuYiVape en 06 de Enero de 2009, 17:51:33
Hola Gente!

Quedo un poco en el olvido esta idea del CNC autonomo...
en el fondo, segui maquinando la cosa...
y entonces fue que......
Me llegaron dos muestras de ATMEL 8) Si si!!! insisto con los AVR... :-/
Estas muestras son AT32UC3A0512 una maravilla!!!
32bits RISC CPU
90MIPS!!!  :shock: a 60MHZ
512K flash
64K IRAM
7 DMA
USB2 OTG
ETHERNET 10/100 MBPS
Posibilidad de direccionar 16MB SRAM externas
7 PWM
2 TWI

En fin... toda una maravilla!
El micro vale unos 40 dolares, creo que es admisible para el proyecto.
Estoy dispuesto a destinar uno al proyecto porque el otro ya lo tengo destinado.

Tambien segui buscando en la web alguna info para orientarnos en el interprete del codigo G
Encontre esta pagina
Un proyecto mas... (http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter)

Y entre la busqueda, encontre esto
Archivo PDF con una tentativa de diseño (http://www.google.com.ar/url?sa=t&source=web&ct=res&cd=10&url=http%3A%2F%2Fsoc-machines.com%2Fpdfs%2FMC433G%2520Hardware%2520Technical%2520Manual%2520R0.97.pdf&ei=jKljSf72L5S48ATDkKjWCQ&usg=AFQjCNEXLZzdPuazJYbEryiXgPFuP3UKJQ&sig2=vI6BI0Hogo-tri_aKWASlA)

Podriamos acceder al codigo del TurboCNC. si lo compramos nos dan el codigo. por lo menos para tener una referencia.
Insisto en programarlo en C. son muchas las ventajas y la portabilidad es mas simple.

Bueno. Estoy a la espectativa.

P.D. Slalem. Muy buena tu maquina. pero sugiero sacar las fotos del post. lo hace muy pesado y estamos en una etapa en la que hay leer y escribir nada mas.
Título: Re: Procesador CNC de Codigo G
Publicado por: LABmouse en 06 de Enero de 2009, 18:16:38
Pues podríamos empezar con un PIC4550 que todos tenemos en casa y con la SD empezar a entender en formato FAT16 para que se pueda así capturar la información generada en el PC y almacenada en la SD.

Les parece?
Título: Re: Procesador CNC de Codigo G
Publicado por: Slalen en 07 de Enero de 2009, 06:03:30
Pues podríamos empezar con un PIC4550 que todos tenemos en casa y con la SD empezar a entender en formato FAT16 para que se pueda así capturar la información generada en el PC y almacenada en la SD.

Les parece?

Esa es mi idea. Así tendríamos la opción de configurar el usb como lector de tarjetas y grabar los archivos en la tarjeta
Título: Re: Procesador CNC de Codigo G
Publicado por: LABmouse en 07 de Enero de 2009, 11:46:15
Slalen, lo que sucede es que para MSD no necesariamente el PIC implementa directamente FAT, eso lo hace el PC directamente dándole las indicaciones al PIC. Ahora, el PIC4550 tiene su talón de aquiles y es su capacidad de memoria FLASH y RAM cuando de USB se trata. prácticamente la ocupa toda y FAT es siempre grande como para que convivan juntos. Seria entonces usar un PIC18F87J50.
Título: Re: Procesador CNC de Codigo G
Publicado por: FuYiVape en 08 de Enero de 2009, 12:38:14
Lo primero que deberiamos hacer a mi criterio, es definir el lenguaje a utilizar para la programacion y tambien el compilador
Esto es importante para el intercambio de las rutinas que se van a desarrollar de forma independiente.
Esto obliga a definir el C como lenguaje. Y el compilador es un problema. Deberia ser un compilador Free y/u open source.
por ejemplo el SDCC (http://sdcc.sourceforge.net/).
Pero aca hay que tener mucho cuidado ya que hay que asegurarse de que los dispositivos a usar, sean soportados por el compilador.
Por que C?. Muy simple. Portabilidad. Claridad. Estructura. Potencia.
Y ultimamente, los compiladores estan generando muy buen codigo assembler. lo cual no deberia ser una excusa.
Ademas, el C, segun el compilador, te permite embeber codigo assembler para aquellas rutinas que necesitan velocidad de procesamiento.

Creo que tendriamos que empezar por evaluar cual es el tamaño de un archivo en g-code.
a partir de ahi, dimensionar un dispositivo de intercambio.
Este dispositivo deberia ser lo mas estandard posible, inclusive preever la existencia a futuro.
asegurarse que los fabricantes no lo van a descartar.
entonces sugiero:

Primero. Definir el lenguaje de programacion el compilador y tambien el IDE para escribir y manipular el codigo.

Segundo. comentemos cual fue el tamaño de archivo maximo que hemos visto con codigo G.
el que yo vi tenia casi 1Mb y la maquina estuvo trabajando casi 40 minutos.
Esto nos va a dar una idea del tamaño que necesitamos para la memoria que contendra el codigo en el circuito. Aunque esto se puede manejar de otra forma.

Tercero. analicemos cual seria este dispositivo de intercambio.
Yo creo que un pen usb seria el adecuado.

Cuarto. Analizar tambien la estrucura de archivo del dispositivo de intercambio.
FAT, FAT32 o cualquier otra que se considere standard y perdure un soporte de los fabricantes.

Quinto. Conseguir librerias para manejar la estructura de archivo decidida. FAT, FAT32, etc.
si no hay, codificarlas. si hay que codificarlas, hay que desarrollar un prototipo para poder hacer pruebas de lectura.

Sexto. Si hay librerias, desarrollar un prototipo para leer el dispositivo y porbar la estructura de archivos.

Septimo. Desarrolladas las rutinas de lectura del dispositivo. empezariamos por la parte de interpretacin del codigo G.
y asi seguir "paso a paso" el proyecto.

Tambien habria que distribuir entre nosotros, la codificacion de las rutinas.
un grupo se encargaria de la lectura del dispositivo de intercambio.
Otro, de las rutinas de codigo G entre los cuales se repartirian la intrepretacion de cada funcion G.
Otro , se encargaria del manejo de los envios a los controladores de los ejes
Otro grupo se encargaria del sistema operativo a implementar para el manejo del circuito principal.
Otro, se encargaria del protocolo de conmunicacion interporcesador
Otro, se encargaria del diseño electrico.
etc.

Cada uno de nosotros, deberia decir cual es su especialidad en cada caso.
para dedicarse a esa parte del proyecto.
Cada grupo deberia tener un coordinador
Y deberia existir un coordinador general del proyecto.

Creo que esta seria una forma ordenada de empezar con el proyecto.
Si esto toma cuerpo y lo empezamos a tratar seriamente. Tendriamos que pensar en montar un manejador de proyecto o versiones para controlar los cambios y avances. porque sino, se va a complicar.

bueno gente, fijense y vemos como seguir.





Título: Re: Procesador CNC de Codigo G
Publicado por: lectra en 09 de Enero de 2009, 05:11:52
Hola amigos estoy de acuerdo con la idea de FuYiVape en cuaanto a la organizacion por grupos,  y su comentario hacerca del lenguaje de programacion en "C" para mi caso lo domino un poco, debido que para los  de los Pic prefiero el asm pero para este proyecto  por la complegidad de los calculos me pareceria mejor utilizar este ultimo, me gustaria  empezar a familiarizarme con los comandos propios del G-code si alguien me puede faciltar un link al respecto se lo agradeceria.

Quedo pendiente hacerca del orden que  va a tomar  este proyecto.
Título: Re: Procesador CNC de Codigo G
Publicado por: taipan en 10 de Enero de 2009, 22:32:30
Hola a todas/os como podreis comprovar soy nuevo aqui  :)
Hace algun tiempo que peleo con controles numericos comerciales y diseño de maquina.
Estoy diseñando un driver bipolar de 100V/20A para usos industriales. :mrgreen:
Y parte de la tecnologia se puede emplear en este.
Me encantaria echar una mano en este proyecto.   :roll:

 Un saludo
Título: Re: Procesador CNC de Codigo G
Publicado por: FuYiVape en 11 de Enero de 2009, 13:06:19
Hola taipan!

Bienvenido! y bienvenida tu propuesta.
Te cuento que con esteca55 tambien estamos desarrollando un driver bipolar de hasta 160V y 20A con micropasos.
Aunque la idea es comercializarlo, tambien queremos tenerlo en este proyecto. Para fines de enero estaremos en condiciones de producirlo en serie, si toda esta cuestion economica/financiera ayuda.
Pero seria bueno contar con tu experiencia para aportar ideas al proyecto para desarrollarlo lo mas profesionalmente posible.

Citar
me gustaria  empezar a familiarizarme con los comandos propios del G-code si alguien me puede faciltar un link al respecto se lo agradeceria.

Lectra. Solo busca en google y vas a tener un monton de info sobre el tema. tanto en español como en ingles.

Saludos
Título: Re: Procesador CNC de Codigo G
Publicado por: taipan en 11 de Enero de 2009, 18:38:47
HOLA a todas/os
Interesante sitio de CNC explica los codigos G y M.Y como interpretarlos en los programas
Como interpolar puntos de una trayectotoria.Y como programarlo en VB
Y mucha mas info de CNC y todo esto en españich  :P
ftp://http://r-luis.xbot.es/cnc/index.html

Este luis es una maquina

SALU2
Título: Re: Procesador CNC de Codigo G
Publicado por: jmorfeo en 17 de Enero de 2009, 20:17:54
Hola a todos, estoy de acuerdo con FuyiVape. Hace tiempo que propuse lo mismo y estuvo en stand by el proyecto. Yo me ofrezco para la parte de lectura de archivos FAT del pendrive. Hay algunos ejemplos de Microchip como el AN1189 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en536602) que estuve viendo porque me interesa. No tenemos muchas opciones en tamaño ya que los pendrive más chicos que vienen ahora son de 1 Gb creo. Habría que saber si el PIC puede leer tanta información en formato FAT.

Por otro lado:
Citar
Deberia ser un compilador Free y/u open source.
por ejemplo el SDCC.
Por lo que vi todavía no soporta programación de PIC o ¿leí mal en la página?
Pero tampoco encontré otra opción gratuita.

Saludos
Título: Re: Procesador CNC de Codigo G
Publicado por: FuYiVape en 20 de Enero de 2009, 14:55:08
jmorfeo!

Creo que leiste mal la pagina. porque soporta PIC. el problema es que soporta muy pocos "modelos".
Lo que va a ser muy critico. Porque para este proyecto, hay que utilizar un micro con mucha... pero muchaaa capacidad. Al menos para el que interpreta y controla todo.
Y es cierto! no hay otra opcion gratuita!

Por eso tambien me incline en su momento a los AVR. ya que el compilador free de AVR (WINAVR AVRGCC) soporta una gran cantidad de tipos de micros y esta en constante actualizacion. ;-)

Saludos
Título: Re: Procesador CNC de Codigo G
Publicado por: FREDD en 15 de Febrero de 2009, 15:18:25
Hola amigos
el mach asepta cogigo g generado con mastercam
por hay bi que generan muy fasimente con este programa y lo cargan a una cnc
Título: Re: Procesador CNC de Codigo G
Publicado por: Judas_MzA en 29 de Marzo de 2009, 02:57:48
Buenas Noches... En estos días empiezo con mi CNC, asi que voy a intertar colaborar con este hilo. Aunque sea con alguna idea...
Con todos los cerebros que hay trabajando en esto algo bueno va a salir...
Saludos
Título: Re: Procesador CNC de Codigo G
Publicado por: ADE en 30 de Marzo de 2009, 23:01:58
Boa noite desculpas por não falar espanhol mas quero colaborar a algum vizualizo este link para poder fazer um processador de código "G" aqui no brasil algumas pessoas já fizeram com TCC(trabalho de conclusão de curso).estou tentando passar a rotina abaixo para o CCS a rotina abaixo interpleta código "G" em dois eixos X Y feita para um torno CNC por favor me ajudem estou com o pi18f2550 enão cabe dentro dele gostaria de passar  a usar os cartões MMC abaixo segue o código do processador RABbit quero passar para o pic logo em seguida segue meu código no pic.....aguardo respostas
...
#define BINBUFSIZE   255
#define BOUTBUFSIZE  255
#define MAX         1000
#define TMAX          23
#define TMIN           4
#define TESPERA       10
#define NAO            0
#define SIM            1
#define LIGA           1
#define DESLIGA        0
#define ABSOLUTA       0
#define INCREMENTAL    1
#define RAIO           1
#define DIAMETRO       0
#define POLEGADAS      0
#define MILIMETROS     1

int sair, count, coordenadas, tipoX, medidas;
long t[TMAX], vEixo, bloco;
double k1, k2, k3, k4, k5, x, z;

int comentario(char linha[MAX], int i);
int G00(char linha[MAX], int i);
int G01(char linha[MAX], int i);
int inibeBloco(char linha[MAX], int i);
int N(char linha[MAX], int i);
void automatico();
void codigoG(char linha[MAX]);
void espera1(long i);
void espera2(int ti);
void manual();
void movG00(long xr, long zr);
void movG01(long xr, long zr, long ti);
void movPasso(int motor);
void recebeString(char linha[MAX]);
void timerb_isr();
void zeraString(char linha[MAX]);

main(){
   char aux[20];
     k1 = 80;     // k = 400/3,5 pulsos/mm
     k2 = 80;
     k3 = 80;
     k4 = 80;
     k5 = 7150;
     t[0] = 101;
     t[1] = 42;
    t[2] = 32;
     t[3] = 27;
     t[4] = 24;
     t[5] = 22;
     t[6] = 20;
     t[7] = 19;
     t[8] = 18;
     t[9] = 17;
     t[10] = 16;
     t[11] = 15;
     t[12] = 14;
     t[13] = 13;
     t[14] = 12;
     t[15] = 11;
     t[16] = 10;
     t[17] = 9;
     t[18] = 8;
     t[19] = 7;
     t[20] = 6;
     t[21] = 5;
     t[22] = 4;

     coordenadas = INCREMENTAL;
     medidas = MILIMETROS;
     tipoX = RAIO;

     WrPortI(SPCR, &SPCRShadow, 0x84);  //seta todas as portas PA como saida


   //Seta as Portas PD6 e PD7 como output para controlar o multiplexador
   WrPortI(PDFR, &PDFRShadow, 0x3f);
     WrPortI(PDDCR, &PDDCRShadow, 0x3f);
     WrPortI(PDDDR, &PDDDRShadow, 0xc0);
     //Fim do set

     //Zera todos os pinos, caso estejam em 1
     WrPortI(PADR, &PADRShadow, 0x00);
     BitWrPortI(PDDR, &PDDRShadow, 1, 6);
     BitWrPortI(PDDR, &PDDRShadow, 0, 6);
     WrPortI(PADR, &PADRShadow, 0x24);     //da ENABLE nos dois motores de passo
     BitWrPortI(PDDR, &PDDRShadow, 1, 7);
     BitWrPortI(PDDR, &PDDRShadow, 0, 7);
 
     count = 0;
   
     SetVectIntern(0x0B, timerb_isr);      // set up ISR

     WrPortI(TBCR, &TBCRShadow, 0x01);   // clock timer B with (perclk/2) and
                                       //     set interrupt level to 1

     WrPortI(TBL1R, NULL, 0x00);         // set initial match!
     WrPortI(TBM1R, NULL, 0x00);

     WrPortI(TBCSR, &TBCSRShadow, 0x03);   // enable timer B and B1 match interrupts

     x = z = 0;
     sair = NAO;
     serBopen(9600);
     serBparity(PARAM_EPARITY);
     serBdatabits(PARAM_8BIT);
     sair = NAO;
     while(sair == NAO){
      manual();
   }
     WrPortI(TBCSR, &TBCSRShadow, 0x00);   // disable timer B and its interrupts
     serBclose();
     WrPortI(PADR, &PADRShadow, 0x00);
     BitWrPortI(PDDR, &PDDRShadow, 1, 6);
     BitWrPortI(PDDR, &PDDRShadow, 0, 6);
     BitWrPortI(PDDR, &PDDRShadow, 1, 7);
     BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}

void zeraString(char linha[MAX]){
  int i;
  for(i=0; i < MAX; i++)
    linha = 0;
}

void recebeString(char linha[MAX]){
   int c;
   int i;
   i = 0;
   c = 0;
   while (c != '?' && i < MAX) {  // Sai com o caracter ?
      c = -1;
      while ((c = serBgetc()) == -1);
      linha = c;
      i++;
   }
}

void movPasso(int motor){
  BitWrPortI(PADR, &PADRShadow, 1, motor);  //envia um pulso para o motor
  BitWrPortI(PDDR, &PDDRShadow, 1, 7);
  BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  BitWrPortI(PADR, &PADRShadow, 0, motor);  //volta a zero
  BitWrPortI(PDDR, &PDDRShadow, 1, 7);
  BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}

void manual(){
  char c, aux[MAX];
  long k;
  int ti;
  double v;
  ti = 100;
  while(sair == NAO){
    k=0;
    c = serBgetc();
    if(c == 'A'){
        BitWrPortI(PADR, &PADRShadow, 1, 0);
       BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
        while(c != 'P'){  // Move motor x em sentido positivo em VMAX
          movPasso(1);
          espera1(k);
           k = k+1;
          c = serBgetc();
        }
    x = x + (double)(k)/k1;
    }
    if(c == 'B'){
       BitWrPortI(PADR, &PADRShadow, 0, 0);
        BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
       while(c != 'P'){  //Move motor x em sentido negativo em VMAX
         movPasso(1);
         espera1(k);
           k = k+1;
         c = serBgetc();
        }
        x = x - (double)(k)/k1;
     }
     if(c == 'C'){
       BitWrPortI(PADR, &PADRShadow, 1, 3);
       BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
        while(c != 'P'){ //Move motor z em sentido positivo em VMAX
         movPasso(4);
          espera1(k);
          k = k+1;
        c = serBgetc();
      }
       z = z + (double)(k)/k2;
    }
    if(c == 'D'){
       BitWrPortI(PADR, &PADRShadow, 0, 3);
      BitWrPortI(PDDR, &PDDRShadow, 1, 7);
      BitWrPortI(PDDR, &PDDRShadow, 0, 7);
       while(c != 'P'){  //Move motor z em sentido negativo em VMAX
         movPasso(4);
         espera1(k);
         k = k+1;
         c = serBgetc();
       }
       z = z - (double)(k)/k2;
    }
    if(c == 'E'){
       BitWrPortI(PADR, &PADRShadow, 1, 0);
       BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
       while(c != 'P'){  // Move motor x em sentido positivo em V
         movPasso(1);
         espera2(ti);
         k = k + 1;
         c = serBgetc();
       }
       x = x + (double)(k)/k3;
    }
    if(c == 'F'){
       BitWrPortI(PADR, &PADRShadow, 0, 0);
       BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
       while(c != 'P'){  //Move motor x em sentido negativo em V
         movPasso(1);
         espera2(ti);
         k = k + 1;
         c = serBgetc();
       }
       x = x - (double)(k)/k3;
    }
    if(c == 'G'){
       BitWrPortI(PADR, &PADRShadow, 1, 3);
       BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
       while(c != 'P'){ //Move motor z em sentido positivo em V
         movPasso(4);
         espera2(ti);
         k = k + 1;
         c = serBgetc();
       }
       z = z + (double)(k)/k4;
    }
    if(c == 'H'){
       BitWrPortI(PADR, &PADRShadow, 0, 3);
       BitWrPortI(PDDR, &PDDRShadow, 1, 7);
       BitWrPortI(PDDR, &PDDRShadow, 0, 7);
       while(c != 'P'){  //Move motor z em sentido negativo em V
         movPasso(4);
         espera2(ti);
         k = k + 1;
         c = serBgetc();
       }
       z = z - (double)(k)/k4;
    }

    if(c == 'I'){
      recebeString(aux);
      v = atof(aux);
      ti = (int)(k5/(400*v));
    }
   
    if(c == 'Y')  // modo automático
      automatico();

    if(c == 'Z')
      sair = SIM;
  }
}

void espera1(long i){
  int j;
  if(i >= TMAX){
    count = 0;
    while(count < TMIN);
  }
  else{
    j = (int)(i);
    count = 0;
    while(count < t[j]);
  }
}

void espera2(int ti){
  count = 0;
  while(count < ti);
}

void movG00(long xr, long zr){
  long k;
  double e, l;
  int sentx, sentz;
 
  sentx = sentz = 1;
 
  if(xr >= 0){
    BitWrPortI(PADR, &PADRShadow, 0, 0);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  else{
    sentx = -1;
    xr = -xr;
    BitWrPortI(PADR, &PADRShadow, 1, 0);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  if(zr >= 0){
    BitWrPortI(PADR, &PADRShadow, 1, 3);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  else{
    sentz = -1;
    zr = -zr;
    BitWrPortI(PADR, &PADRShadow, 0, 3);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  if(xr >= zr){
    l = (double)(zr)/xr;
    e = l - .5;
    k = 0;
    while(k < xr){
      if(e > 0){
        e = e - 1;
        movPasso(4);
        z = z + (double)(sentz)/k2;
      }
      k++;
      e = e + l;
      movPasso(1);
      x = x + (double)(sentx)/k1;
      if(k < xr/2)
        espera1(k);
      else
        espera1(xr-k);
    }
  }
  else{
    l = (double)(xr)/zr;
    e = l - .5;
    k = 0;
    while(k < zr){
      if(e > 0){
        e = e - 1;
        movPasso(1);
        x = x + (double)(sentx)/k1;
      }
      k = k + 1;
      e = e + l;
      movPasso(4);
      z = z + (double)(sentz)/k2;
      if(k < zr/2)
        espera1(k);
      else
        espera1(zr-k);
    }
  }
}

void movG01(long xr, long zr, long ti){
  int k, tl;
  double e, l;
  int sentx, sentz;
 
  sentx = sentz = 1;
 
  if(xr >= 0){
    BitWrPortI(PADR, &PADRShadow, 0, 0);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  else{
    sentx = -1;
    xr = -xr;
    BitWrPortI(PADR, &PADRShadow, 1, 0);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  if(zr >= 0){
    BitWrPortI(PADR, &PADRShadow, 1, 3);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }
  else{
    sentz = -1;
    zr = -zr;
    BitWrPortI(PADR, &PADRShadow, 0, 3);
    BitWrPortI(PDDR, &PDDRShadow, 1, 7);
    BitWrPortI(PDDR, &PDDRShadow, 0, 7);
  }

  if(xr >= zr){
    l = (double)(zr)/xr;
    tl = (int)(ti/xr);
    e = l - .5;
    k = 0;
    while(k < xr){
      if(e > 0){
        e = e - 1;
        movPasso(4);
        z = z + (double)(sentz)/k4;
      }
      k++;
      e = e + l;
      movPasso(1);
      x = x + (double)(sentx)/k3;
      espera2(tl);
    }
  }
  else{
    l = (double)(xr)/zr;
    tl = (int)(ti/zr);
    e = l - .5;
    k = 0;
    while(k < zr){
      if(e > 0){
        e = e - 1;
        movPasso(1);
        x = x + (double)(sentx)/k3;
      }
      k = k + 1;
      e = e + l;
      movPasso(4);
      z = z + (double)(sentz)/k4;
      espera2(tl);
    }
  }
}

void automatico(){
  char linha[MAX];
  while(sair == NAO){
     recebeString(linha);
       codigoG(linha);
  }     
}

#asm
timerb_isr::
   push   af                     ; save registers
   push   hl

   ld      hl, (count)
   inc   hl                     ; increment counter
   ld      (count), hl

   ld      a, 00h
   ioi   ld (TBL1R), a         ; set up next B1 match (at timer=0000h)
   ioi   ld (TBM1R), a         ; NOTE:  you _need_ to reload the match
                              ;   register after every interrupt!

done:
   ioi   ld a, (TBCSR)         ; load B1, B2 interrupt flags (clears flag)

   pop   hl                     ; restore registers
   pop   af
   
   ipres                        ; restore interrupts
   ret                        ; return
#endasm

void codigoG(char linha[MAX]){
   int i, n;
   n = strlen(linha);
   i = 0;
   while(i < n){
      if(linha == 'G' || linha == 'g'){
         i++;
         if(linha == ' '){ //G00
            i++;
            i = G00(linha, i);
         }
         else{
            if(linha == '0'){
               i++;
               if(linha == ' '){ //G00
                  i++;
                  i = G00(linha, i);
               }
               else{
                  if(linha == '0'){ //G00
                     i++;
                     i = G00(linha, i);
                  }
                  else{
                     if(linha == '1'){ //G01
                        i++;
                        i = G01(linha, i);
                     }
                     else
                        i++;
                  }
               }
            }
            else{
               if(linha == '1'){ //G01
                  i++;
                  i = G01(linha, i);
               }
               else{
                  if(linha == '2'){
                     i++;
                     if(linha == '0'){ //G20
                        i++;
                        tipoX = DIAMETRO;
                     }
                     else{
                        if(linha == '1'){ //G21
                           i++;
                           tipoX = RAIO;
                        }
                        else
                           i++;
                     }
                  }
                  else{
                     if(linha == '7'){
                        i++;
                        if(linha == '0'){ //G70
                           i++;
                           medidas = POLEGADAS;
                        }
                        else{
                           if(linha == '1'){ //G71
                              i++;
                              medidas = MILIMETROS;
                           }
                           else
                              i++;
                        }
                     }
                     else{
                        if(linha == '9'){
                           i++;
                           if(linha == '0'){ //G90
                              i++;
                              coordenadas = ABSOLUTA;
                           }
                           else{
                              if(linha == '1'){ //G91
                                 i++;
                                 coordenadas = INCREMENTAL;
                              }
                              else
                                 i++;
                           }
                        }
                        else
                           i++;
                     }
                  }
               }
            }
         }
      } //Fim do G
      else{
         if(linha == 'N' || linha == 'n'){
            i++;
            i = N(linha, i);
         } //Fim do N
         else{
            if(linha == '/'){
               i++;
               i = inibeBloco(linha, i);
            }
            else{
               if(linha == ';'){
                  i++;
                  i = comentario(linha, i);
               }
               else{
                  if(linha == 'M' || linha == 'm'){
                     i++;
                     if(linha == '0'){
                        i++;
                        if(linha == '2'){ //M02
                           i++;
                           sair = SIM;
                        }
                        else
                           i++;
                     }
                  }
                  else
                     i++;
               }
            }
         }
      }
   }
}

int comentario(char linha[MAX], int i){
   int k;
   for(k = 0; linha[i+k] != '#'; k++);
   return i+k;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int G00(char linha[MAX], int i){
   int k, j;
   double xr, zr, xr2, zr2;
   char aux[MAX];
   int xi, zi;
   long xr3, zr3;
   
   k = 0;
   xi = zi = NAO;
   while(linha[i+k] != 'G' && linha[i+k] != 'g' && linha[i+k] != 'M' && linha[i+k] != 'm' && sair == NAO && linha[i+k] != '?'){
      if(linha[i+k] == 'N'){
         k++;
         k = N(linha, i+k) - i;
      }
      else{
         if(linha[i+k] == 'X' || linha[i+k] == 'x'){
            k++;
            j = 0;
            zeraString(aux);
            while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
               aux[j] = linha[i+k+j];
               j++;
            }
            k = k+j;
            if(linha[i+k] == '.')
               xr = atof(aux);
            else
               xr = atof(aux)/10000;
            if(medidas == POLEGADAS)
               xr = 2.54*xr;
            if(tipoX == DIAMETRO)
               xr = xr/2;
            xi = SIM;
         }
         else{
            if(linha[i+k] == 'Z' || linha[i+k] == 'z'){
               k++;
               j = 0;
               zeraString(aux);
               while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
                  aux[j] = linha[i+k+j];
                  j++;
               }
               k = k+j;
               if(linha[i+k] == '.')
                  zr = atof(aux);
               else
                  zr = atof(aux)/10000;
               if(medidas == POLEGADAS)
                  zr = 2.54*zr;
               zi = SIM;
            }
            else{
               if(linha[i+k] == '#'){
                  if(xi == SIM)
                     xr2 = xr;
                  else
                     xr2 = 0;
                  if(zi == SIM)
                     zr2 = zr;
                  else
                     zr2 = 0;
                  if(coordenadas == ABSOLUTA){
                        xr2 = xr2 - x;
                        zr2 = zr2 - z;
                  }
                  xr3 = (long)(k3*xr2);
                  zr3 = (long)(k4*zr2);
                  movG00(xr3, zr3);
                  xr = zr = 0;
                  k++;
                  xi = zi = NAO;
               }
               else
                  k++;
            }
         }
      }
   }
   return i+k;
}

int G01(char linha[MAX], int i){
   int k, j;
   long fr3;
   double xr, zr, fr, xr2, zr2, fr2;
   char aux[MAX];
   int xi, zi, fi;
   long xr3, zr3;
   
   k = 0;
   fr = 0;
   xi = zi = fi = NAO;
   while(linha[i+k] != 'G' && linha[i+k] != 'g' && linha[i+k] != 'M' && linha[i+k] != 'm' && sair == NAO && linha[i+k] != '?'){
      if(linha[i+k] == 'N'){
         k++;
         k = N(linha, i+k) - i;
      }
      else{
         if(linha[i+k] == 'X' || linha[i+k] == 'x'){
            k++;
            j = 0;
            zeraString(aux);
            while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
               aux[j] = linha[i+k+j];
               j++;
            }
            k = k+j;
            if(linha[i+k] == '.')
               xr = atof(aux);
            else
               xr = atof(aux)/10000;
            if(medidas == POLEGADAS)
               xr = 2.54*xr;
            if(tipoX == DIAMETRO)
               xr = xr/2;
            xi = SIM;
         }
         else{
            if(linha[i+k] == 'Z' || linha[i+k] == 'z'){
               k++;
               j = 0;
               zeraString(aux);
               while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
                  aux[j] = linha[i+k+j];
                  j++;
               }
               k = k+j;
               if(linha[i+k] == '.')
                  zr = atof(aux);
               else
                  zr = atof(aux)/10000;
               if(medidas == POLEGADAS)
                  zr = 2.54*zr;
               zi = SIM;
            }
            else{
               if(linha[i+k] == 'F' || linha[i+k] == 'f'){
                  k++;
                  j = 0;
                  zeraString(aux);
                  while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
                     aux[j] = linha[i+k+j];
                     j++;
                  }
                  k = k+j;
                  if(linha[i+k] == '.')
                     fr = atof(aux);
                  else
                     fr = atof(aux)/10000;
                  if(medidas == POLEGADAS)
                     fr = 2.54*fr;
                  fi = SIM;
               }
               else{
                  if(linha[i+k] == '#'){
                     if(xi == SIM)
                        xr2 = xr;
                     else
                        xr2 = 0;
                     if(zi == SIM)
                        zr2 = zr;
                     else
                        zr2 = 0;
                     if(coordenadas == ABSOLUTA){
                           xr2 = xr2 - x;
                           zr2 = zr2 - z;
                     }
                     if(fi == SIM)
                        fr2 = sqrt(xr2*xr2+zr2*zr2)/fr;
                     xr3 = (int)(k3*xr2);
                     zr3 = (int)(k4*zr2);
                     fr3 = (long)(k5*fr2);
                     movG01(xr3, zr3, fr3);
                     xr = zr = 0;
                     k++;
                     xi = zi = NAO;
                  }
                  else
                     k++;
               }
            }
         }
      }
   }
   return i+k;
}

int inibeBloco(char linha[MAX], int i){
   int k;
   for(k = 0; linha[i+k] != '#'; k++)
   return i+k;
}

int N(char linha[MAX], int i){
   int k;
   char aux[MAX];

   for(k = 0; linha[i+k] != ' ' && linha[i+k] != '#'; k++)
      aux[k] = linha;

   bloco = atol(linha);
   return i+k;
}
...

meu código.....
...
#include<18F2550.h >
#include<usart.c>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#use delay(clock=2000000)
#fuses XT,PUT,NOWDT,NOBROWNOUT,NOLVP
//#include <lcd1.c>
#define BINBUFSIZE   255
#define BOUTBUFSIZE  255
#define MAX         1000
#define TMAX          23
#define TMIN           4
#define TESPERA       10
#define NAO            0
#define SIM            1
#define LIGA           1
#define DESLIGA        0
#define ABSOLUTA       0
#define INCREMENTAL    1
#define RAIO           1
#define DIAMETRO       0
#define POLEGADAS      0
#define MILIMETROS     1

int sair, count, coordenadas, tipoX, medidas;//counter
int t[TMAX], vEixo, bloco;
int k1, k2, k3, k4, k5, x, z;
/////////////////////////////////////////////////////////////////////////////////////////////////
#int_TIMER0
void TIMER0(void)
{

count++;
}

/////////////////////////////////////////////////////////////////////////////////////////////////

void zeraString(char linha[MAX]){
  char i;
  for(i=0;i<MAX;i++){
    linha = 0;
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////
void espera1(int i){
  int j;
  if(i >= TMAX){
    count = 0;
    while(count < TMIN);
  }
  else{
    j = (int)(i);
    count = 0;
    while(count < t[j]);
  }
}
////////////////////////////////////////////////////////////////////////////////////////////////
void espera2(int ti){
  count = 0;
  while(count < ti);
}
//////////////////////////////////////////////////////////////////////
void recebeString(char linha[MAX]){
   char c;
   int i;
   i = 0;
   c = 0;
   while (c != '?' && i < MAX) {  // Sai com o caracter ?
      c = 1;
      while ((c = usart_recebe()) == 1);//RECEBE COMUNICAÇAÕ DA USART
      linha = c;
      i++;
   }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////
void movPasso(char motor){
if(motor==1){
  output_high(PIN_B0);//RODA MOTOR "X"
  output_low(PIN_B0);                                                   
  }
if(motor==4){
  output_high(PIN_B1);//RODA MOTOR "Y"
  output_low(PIN_B1);                                                     
  }
}                     
////////////////////////////////////////////////////////////////////////////////////////////////////// /

/////////////////////////////////////////////////////////////////
int inibeBloco(char linha[MAX], int i){
   int k;
   for(k = 0; linha[i+k] != '#'; k++)
   return i+k;
}
////////////////////////////////////////////////////////
int comentario(char linha[MAX], int i){
   int k;
   for(k = 0; linha[i+k] != '#'; k++);
   return i+k;
}
////////////////////////////////////////////////////////
void movG00(long xr, long zr){
  signed int k;
  signed int e, l;
  signed int sentx, sentz;
 
  sentx = sentz = 1;
 
  if(xr >= 0){
       output_low(PIN_B1);
   
  }
  else{
    sentx = -1;
    xr = -xr;
       output_high(PIN_B1);
   
  }
  if(zr >= 0){
      output_high(PIN_B2);
   
  }
  else{
    sentz = -1;
    zr = -zr;
   output_low(PIN_B2);
 
  }
  if(xr >= zr){
    l = (int)(zr)/xr;
    e = l - .5;
    k = 0;
    while(k < xr){
      if(e > 0){
        e = e - 1;
        movPasso(4);
        z =z +(int)(sentz)/k2;
      }
      k++;
      e = e + l;
      movPasso(1);
      x = x +(int)sentx/k1;
      if(k < xr/2)
        espera1(k);
      else
        espera1(xr-k);
    }
  }
  else{
     l = (int)(xr)/zr;
    e = l - .5;
    k = 0;
    while(k < zr){
      if(e > 0){
        e = e - 1;
        movPasso(1);
        x = x +(int) (sentx)/k1;
      }
      k = k + 1;
      e = e + l;
      movPasso(4);
      z = z + (int)(sentz)/k2;
      if(k < zr/2)
        espera1(k);
      else
        espera1(zr-k);
    }
  }
}
//////////////////////////////////////////////////////////
void movG01(long xr, long zr, long ti){
  int k, tl;
  long e, l;
  char sentx, sentz;
 
  sentx = sentz = 1;
 
  if(xr >= 0){
   output_low(PIN_B1);
   
  }
  else{
    sentx = 2;//substituido -1 por 2
    xr = -xr;
   output_high(PIN_B1);
   
  }
  if(zr >= 0){
   output_high(PIN_B2);
   
  }
  else{
    sentz = 2;//substituido -1 por 2
    zr = -zr;
   output_low(PIN_B2);
   
  }

  if(xr >= zr){
    l = (int)(zr)/xr;
    tl = (int)(ti/xr);
    e = l - .5;
    k = 0;
    while(k < xr){
      if(e > 0){
        e = e - 1;
        movPasso(4);
        z =z +(int)(sentz)/k4;
      }
      k++;
      e = e + l;
      movPasso(1);
      x = x +(int) (sentx)/k3;
      espera2(tl);
    }
  }
  else{
    l = (int)(xr)/zr;
    tl = (int)(ti/zr);
    e = l - .5;
    k = 0;
    while(k < zr){
      if(e > 0){
        e = e - 1;
        movPasso(1);
        x = x +(int) (sentx)/k3;
      }
      k = k + 1;
      e = e + l;
      movPasso(4);
      z =z +(int)(sentz)/k4;
      espera2(tl);
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////
int N(char linha[MAX], int i){
   int k;
   char aux[MAX];

   for(k = 0; linha[i+k] != ' ' && linha[i+k] != '#'; k++)
      aux[k] = linha;

   bloco = atol(linha);
   return i+k;
}
////////////////////////////////////////////////////////////////////////////////////////////////
int G01(char linha[MAX], int i){
   int32 k, j;
   int32 fr3;
   long xr, zr, fr, xr2, zr2, fr2;
   char aux[MAX];
   int xi, zi, fi;
   int32 xr3, zr3;
   
   k = 0;
   fr = 0;
   xi = zi = fi = NAO;
   while(linha[i+k] != 'G' && linha[i+k] != 'g' && linha[i+k] != 'M' && linha[i+k] != 'm' && sair == NAO && linha[i+k] != '?'){
      if(linha[i+k] == 'N'){
         k++;
         k = N(linha, i+k) - i;
      }
      else{
         if(linha[i+k] == 'X' || linha[i+k] == 'x'){
            k++;
            j = 0;
            zeraString(aux);
            while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
               aux[j] = linha[i+k+j];
               j++;
            }
            k = k+j;
            if(linha[i+k] == '.')
               xr = atof(aux);
            else
               xr = atof(aux)/10000;
            if(medidas == POLEGADAS)
               xr = 2.54*xr;
            if(tipoX == DIAMETRO)
               xr = xr/2;
            xi = SIM;
         }
         else{
            if(linha[i+k] == 'Z' || linha[i+k] == 'z'){
               k++;
               j = 0;
               zeraString(aux);
               while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
                  aux[j] = linha[i+k+j];
                  j++;
               }
               k = k+j;
               if(linha[i+k] == '.')
                  zr = atof(aux);
               else
                  zr = atof(aux)/10000;
               if(medidas == POLEGADAS)
                  zr = 2.54*zr;
               zi = SIM;
            }
            else{
               if(linha[i+k] == 'F' || linha[i+k] == 'f'){
                  k++;
                  j = 0;
                  zeraString(aux);
                  while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
                     aux[j] = linha[i+k+j];
                     j++;
                  }
                  k = k+j;
                  if(linha[i+k] == '.')
                     fr = atof(aux);
                  else
                     fr = atof(aux)/10000;
                  if(medidas == POLEGADAS)
                     fr = 2.54*fr;
                  fi = SIM;
               }
               else{
                  if(linha[i+k] == '#'){
                     if(xi == SIM)
                        xr2 = xr;
                     else
                        xr2 = 0;
                     if(zi == SIM)
                        zr2 = zr;
                     else
                        zr2 = 0;
                     if(coordenadas == ABSOLUTA){
                           xr2 = xr2 - x;
                           zr2 = zr2 - z;
                     }
                     if(fi == SIM)//////////////////////////PARTE PRINCIPAL DA INTERPOLAÇÃO///
                        fr2 = sqrt(xr2*xr2+zr2*zr2)/fr;
                     xr3 = (k3*xr2);
                     zr3 = (k4*zr2);
                     fr3 = (k5*fr2);
                     movG01(xr3, zr3, fr3);
                     xr = zr = 0;
                     k++;
                     xi = zi = NAO;
                  }
                  else
                     k++;
               }
            }
         }
      }
   }
   return i+k;
}
/////////////////////////////////////////////////////////
int G00(char linha[MAX], int i){
   int k, j;
   long xr, zr, xr2, zr2;
   char aux[MAX];
   int xi, zi;
   long xr3, zr3;
   
   k = 0;
   xi = zi = NAO;
   while(linha[i+k] != 'G' && linha[i+k] != 'g' && linha[i+k] != 'M' && linha[i+k] != 'm' && sair == NAO && linha[i+k] != '?'){
      if(linha[i+k] == 'N'){
         k++;
         k = N(linha, i+k) - i;
      }
      else{
         if(linha[i+k] == 'X' || linha[i+k] == 'x'){
            k++;
            j = 0;
            zeraString(aux);
            while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
               aux[j] = linha[i+k+j];
               j++;
            }
            k = k+j;
            if(linha[i+k] == '.')
               xr = atof(aux);
            else
               xr = atof(aux)/10000;
            if(medidas == POLEGADAS)
               xr =2.54*xr;
            if(tipoX == DIAMETRO)
               xr = xr/2;
            xi = SIM;
         }
         else{
            if(linha[i+k] == 'Z' || linha[i+k] == 'z'){
               k++;
               j = 0;
               zeraString(aux);
               while(linha[i+k+j] != '.' && linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
                  aux[j] = linha[i+k+j];
                  j++;
               }
               k = k+j;
               if(linha[i+k] == '.')
                  zr = atof(aux);
               else
                  zr = atof(aux)/10000;
               if(medidas == POLEGADAS)
                  zr = 2.54*zr;
               zi = SIM;
            }
            else{
               if(linha[i+k] == '#'){
                  if(xi == SIM)
                     xr2 = xr;
                  else
                     xr2 = 0;
                  if(zi == SIM)
                     zr2 = zr;
                  else
                     zr2 = 0;
                  if(coordenadas == ABSOLUTA){
                        xr2 = xr2 - x;
                        zr2 = zr2 - z;
                  }
                  xr3 =(k3*xr2);
                  zr3 = (k4*zr2);
                  movG00(xr3, zr3);
                  xr = zr = 0;
                  k++;
                  xi = zi = NAO;
               }
               else
                  k++;
            }
         }
      }
   }
   return i+k;
}
//////////////////////////////////////////////////////////

void codigoG(char linha[MAX]){
   int i, n;
   n = strlen(linha);
   i = 0;
   while(i < n){
      if(linha == 'G' || linha == 'g'){
         i++;
         if(linha == ' '){ //G00
            i++;
            i = G00(linha, i);
         }
         else{
            if(linha == '0'){
               i++;
               if(linha == ' '){ //G00
                  i++;
                  i = G00(linha, i);
               }
               else{
                  if(linha == '0'){ //G00
                     i++;
                     i = G00(linha, i);
                  }
                  else{
                     if(linha == '1'){ //G01
                        i++;
                        i = G01(linha, i);
                     }
                     else
                        i++;
                  }
               }
            }
            else{
               if(linha == '1'){ //G01
                  i++;
                  i = G01(linha, i);
               }
               else{
                  if(linha == '2'){
                     i++;
                     if(linha == '0'){ //G20
                        i++;
                        tipoX = DIAMETRO;
                     }
                     else{
                        if(linha == '1'){ //G21
                           i++;
                           tipoX = RAIO;
                        }
                        else
                           i++;
                     }
                  }
                  else{
                     if(linha == '7'){
                        i++;
                        if(linha == '0'){ //G70
                           i++;
                           medidas = POLEGADAS;
                        }
                        else{
                           if(linha == '1'){ //G71
                              i++;
                              medidas = MILIMETROS;
                           }
                           else
                              i++;
                        }
                     }
                     else{
                        if(linha == '9'){
                           i++;
                           if(linha == '0'){ //G90
                              i++;
                              coordenadas = ABSOLUTA;
                           }
                           else{
                              if(linha == '1'){ //G91
                                 i++;
                                 coordenadas = INCREMENTAL;
                              }
                              else
                                 i++;
                           }
                        }
                        else
                           i++;
                     }
                  }
               }
            }
         }
      } //Fim do G
      else{
         if(linha == 'N' || linha == 'p'){
            i++;
            i = N(linha,i);
         } //Fim do N


         else{
            if(linha == '/'){
               i++;
               i = inibeBloco(linha, i);
            }
            else{
               if(linha == ';'){
                  i++;
                  i = comentario(linha, i);
               }
               else{
                  if(linha == 'M' || linha == 'm'){
                     i++;
                     if(linha == '0'){
                        i++;
                        if(linha == '2'){ //M02
                           i++;
                           sair = SIM;
                        }
                        else
                           i++;
                     }
                  }
                  else
                     i++;
               }
            }
         }
      }
   }
}

////////////////////////////////////////////////////////////////

void automatico(){
  char linha[MAX];
  while(sair == NAO){
     recebeString(linha);
       codigoG(linha);
  }     
}

///////////////////////////////////////////////////////////////////
void manual(){
  char c, aux[MAX];
  int k;
  int ti;
  int v;
  ti = 100;
     while(sair == NAO){
     k=0;
    c = usart_recebe();
    if(c == 'A'){
         output_high(PIN_B1);
      
        while(c != 'P'){  // Move motor x em sentido positivo em VMAX
          movPasso(1);
          espera1(k);
           k = k+1;
           c = usart_recebe();
        }
    x = x +(int) k/k1;
    }
    if(c == 'B'){
         output_low(PIN_B1);
       
       while(c != 'p'){  //Move motor x em sentido negativo em VMAX
         movPasso(1);
          k = k+1;
            espera1(k);
           
          c = usart_recebe();
        }
        x = x-(int) k/k1;//48
     }
     if(c == 'C'){
        output_high(PIN_B2);
       
        while(c != 'P'){ //Move motor z em sentido positivo em VMAX
         movPasso(4);
          espera1(k);
          k = k+1;
         c = usart_recebe();
      }
       z = z +(int) k/k2;
    }
    if(c == 'D'){
       output_low(PIN_B2);
      
       while(c != 'P'){  //Move motor z em sentido negativo em VMAX
         movPasso(4);
         espera1(k);
         k = k+1;
          c = usart_recebe();
       }
       z =z -(int) k/k2;
    }
    if(c == 'E'){
    output_high(PIN_B1);
   
       while(c != 'P'){  // Move motor x em sentido positivo em V
         movPasso(1);
         espera2(ti);
         k = k + 1;
          c = usart_recebe();
       }
       x = x +(int) k/k3;
    }
    if(c == 'F'){
       output_low(PIN_B1);
       
       while(c != 'P'){  //Move motor x em sentido negativo em V
         movPasso(1);
         espera2(ti);
         k = k + 1;
         c = usart_recebe();
       }
       x =x -(long) k/k3;
    }
    if(c == 'G'){
       output_high(PIN_B2);
   
       while(c != 'P'){ //Move motor z em sentido positivo em V
         movPasso(4);
         espera2(ti);
         k = k + 1;
       c = usart_recebe();
       }
       z = z +(long) k/k4;
    }
    if(c == 'H'){
       output_low(PIN_B1);
       
       while(c != 'P'){  //Move motor z em sentido negativo em V
         movPasso(4);
         espera2(ti);
         k = k + 1;
         c = usart_recebe();
       }
       z =z -(long) k/k4;
    }

    if(c == 'I'){
      recebeString(aux);
      v = atof(aux);
      ti = k5/(400*v);
    }
   
    if(c == 'Y')  // modo automático
      automatico();

    if(c == 'Z')
      sair = SIM;
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void main(void){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_tris_b(0x00);//define a direçao do portB
usart_inicializa(12,1);//INICIA USART
//char aux[20];
     k1 = 80;     // k = 400/3,5 pulsos/mm
     k2 = 80;
     k3 = 80;
     k4 = 80;
     k5 = 7150;
     t[0] = 101;
     t[1] = 42;
    t[2] = 32;
     t[3] = 27;
     t[4] = 24;
     t[5] = 22;
     t[6] = 20;
     t[7] = 19;
     t[8] = 18;
     t[9] = 17;
     t[10] = 16;
     t[11] = 15;
     t[12] = 14;
     t[13] = 13;
     t[14] = 12;
     t[15] = 11;
     t[16] = 10;
     t[17] = 9;
     t[18] = 8;
     t[19] = 7;
     t[20] = 6;
     t[21] = 5;
     t[22] = 4;

     coordenadas = INCREMENTAL;
     medidas = MILIMETROS;
     tipoX = RAIO;
    count = 0;
     x = z = 0;
     sair = NAO;
    while(sair == NAO){
      manual();
   }
 }

...
ADEMILSON ANTUNES
ademilsonantunes@uol.com.br
Título: Re: Procesador CNC de Codigo G
Publicado por: ema en 30 de Marzo de 2009, 23:20:30
Bienvenido al foro ADE, te comento que en este foro vas a encontrar mucha ayuda, pero no creo que alguien se lea todo este codigo y te diga en que estas fallando o que haga el trabajo por ti.
Te recomiendo que lo separes de acuerdo a la funcionalidad de cada parte del código y ademas comentes cada algunas lineas.

Saludos

Título: Re: Procesador CNC de Codigo G
Publicado por: NANO1985 en 11 de Mayo de 2010, 14:28:45
coindido con ema jajajaja  :D ....
qu lindo proycto ést.... lastima que se haya estancado...  :(
voy a ver si puerdo remontar con algo!
Título: Re: Procesador CNC de Codigo G
Publicado por: REL en 31 de Mayo de 2010, 23:22:44
Aiiii, estoy llegando muy tarde a este foro :( porque yo estaba tratando por mis medios de hacer algo asi... ahora mismo estoy en proyecto de hacerme una fresadora de 4 ejes, pero en cuanto pueda voy a intentar dar mi aporte para hacer un interprete de G.