Recta a trozos
Al llegar a este punto ya tenemos la lectura del fichero y la interpretación de sus comandos. Es decir sabes con cada instrucción el punto objetivo al que queremos ir. Con esos datos y el punto inicial hay que movernos hacia allí.
Hay varias maneras pero creo que la correcta es trazar una recta entre el punto inicial y el final. Dado que nos movemos por incrementos que al final son la resolución de nuestro motor paso a paso hay que trocear esa recta en pequeños punto por los cuales habrá que moverse. Esos puntos si se ven de cerca no son rectos sino que forman escalones, pero al alejarnos nos parecerá que han dibujado una recta.
Hay varias maneras pero creo que la correcta es trazar una recta entre el punto inicial y el final. Dado que nos movemos por incrementos que al final son la resolución de nuestro motor paso a paso hay que trocear esa recta en pequeños punto por los cuales habrá que moverse. Esos puntos si se ven de cerca no son rectos sino que forman escalones, pero al alejarnos nos parecerá que han dibujado una recta.
Si nos acercamos en vez de una recta son escalones pero dado que se supone que la resolución del motor es menor que el error que podemos permitir al final nos parecerá que ha trazado una recta. El movimiento a parte de producirse por partes, un motor y luego otro aunque sea en tiempos muy pequeños también se produce desigualado en cada eje.
Puede que se nos pida que nos movamos 20 en el eje X y 10 en el eje Y. Suponiendo que el mínimo paso que podemos hacer es 1, lo mejor es adaptar el movimiento del eje Y al del eje X. En mi caso de la siguiente manera.
El mínimo paso del eje X sera 1. Es decir en cada iteración incrementaremos uno.
El mínimo paso del eje Y sera 10/20=0.5. Dado que hemos dicho que el mínimo paso es 1, esta claro que no podemos hacer esos incrementos, de echo no lo haremos simplemente le sumaremos el valor a una variable que sea del tipo float(X,Y) y se la asignaremos a otra del tipo int(Sistema.X,Sistema.Y). Vamos a ver como seria la supuesta ejecución del programa.
Iteración=1
X=X+1 En este caso la variable valdrá 1.
Sistema.X=X
Y=Y+0.5 En este caso la variable valdrá 0.5 Como esta posición no existe para el motor la variable Sistema.Y seguirá valiendo 0.
Sistema.Y=Y
Iteración=2
X=X+1 En este caso la variable valdrá 2.
Sistema.X=X
Y=Y+0.5 En este caso la variable valdrá 1 Ahora si que es posible acceder a esa posición con el motor por lo tanto Sistema.Y valdrá 1
Sistema.Y=Y
Cada cuantas iteraciones se actualice el valor de la variables mas pequeña dependerá de la relación entre las dos.
Aquí tenéis la implementación de código que realiza lo descrito.
Puede que se nos pida que nos movamos 20 en el eje X y 10 en el eje Y. Suponiendo que el mínimo paso que podemos hacer es 1, lo mejor es adaptar el movimiento del eje Y al del eje X. En mi caso de la siguiente manera.
El mínimo paso del eje X sera 1. Es decir en cada iteración incrementaremos uno.
El mínimo paso del eje Y sera 10/20=0.5. Dado que hemos dicho que el mínimo paso es 1, esta claro que no podemos hacer esos incrementos, de echo no lo haremos simplemente le sumaremos el valor a una variable que sea del tipo float(X,Y) y se la asignaremos a otra del tipo int(Sistema.X,Sistema.Y). Vamos a ver como seria la supuesta ejecución del programa.
Iteración=1
X=X+1 En este caso la variable valdrá 1.
Sistema.X=X
Y=Y+0.5 En este caso la variable valdrá 0.5 Como esta posición no existe para el motor la variable Sistema.Y seguirá valiendo 0.
Sistema.Y=Y
Iteración=2
X=X+1 En este caso la variable valdrá 2.
Sistema.X=X
Y=Y+0.5 En este caso la variable valdrá 1 Ahora si que es posible acceder a esa posición con el motor por lo tanto Sistema.Y valdrá 1
Sistema.Y=Y
Cada cuantas iteraciones se actualice el valor de la variables mas pequeña dependerá de la relación entre las dos.
Aquí tenéis la implementación de código que realiza lo descrito.
Os dejo el proyecto entero y una demostración de su funcionamiento con el ejemplo anterior. La función Mover() esta en Sistema.c

cnc_121216.zip | |
File Size: | 28 kb |
File Type: | zip |
Las unidades en que esta el fichero no son pasos del motor sino mm o pulgadas(tampoco eso sino menos), pero como aun no tengo el motor ni la relación de transmisión lo usare como si cada paso del motor fuese un mm. Es posible que mas adelante haya que mover mas de 1 paso para avanzar un mm.
Durante la ejecucción se guarda las posiciones por donde pasa el cabezal en un fichero, de esta manera vamos a ver cual es el recorrido real.
Se puede abrir con Matlab,Scilab,Octave o creo que incluso Excel. En ella se ve la trayectoria del fichero Borde.DIM que si recordamos era un cuadrado de perfil de una placa.
Durante la ejecucción se guarda las posiciones por donde pasa el cabezal en un fichero, de esta manera vamos a ver cual es el recorrido real.
Se puede abrir con Matlab,Scilab,Octave o creo que incluso Excel. En ella se ve la trayectoria del fichero Borde.DIM que si recordamos era un cuadrado de perfil de una placa.
Ahora vamos a comprobar el funcionamiento con algun diseño un poco mas complejo. En este caso un poligono con diversos lados.