Buenas a todos!
Desde que tengo mi sable he querido que hiciera algunas cosillas mas de las que hace, pero por falta de tiempo nunca me pude poner a ello.
Ahora, no es que tuviera tiempo, pero me apetecia hacerlo, asi que pospuse algunas cosas y al fin termine mi pequeño anhelo


La "ampliacion" consta de:
-encendido del taladro con un rele, comandado automaticamente desde el mach
-control para una aspiradora
-control de velocidad del taladro desde el mach o con un potenciometro externo
-tacometro que muestra las RPM en mach
-el conjunto del control de la velocidad y el tacometro permiten un control PID de la velocidad desde mach
-limites y home switch para los 3 ejes
-auto tool zero (busca automaticamente el cero de la herramienta)
-dos entradas para usar como se quiera (para activar algo con un pulsado, para usar como entrada de señal, etc)
-una salida (para activar otro rele, una luz, etc... en mi caso sera para un LASER

)
-luz para el boton de EStop, que esta encendida mientras la maquina este funcionando, y se apague cuando se pulsa el boton o el reset
Bueno, esas son las capacidades de la expansion, que son las que pude aprovechar con los pines no usados del puerto paralelo.
Pasare a explicar como hacer cada cosa.
Lo primero fue "preguntarme" para que servia el conector DB15 que trae la controladora (
http://www.todopic.com.ar/foros/index.php?topic=29274.0)... y una vez intuido que seria para una expansion, tuve que buscar un esquema o alguna orientacion de que es cada pin... Por suerte encontre un esquema de nuestra controladora, donde viene todo lo que necesitaba saber!
Aqui encontraran el esquema:
http://www.todopic.com.ar/foros/index.php?topic=29327.0Esta es una descripcion de cada uno de los pines del DB15 y su correspondencia con el LPT
| Funcion | DB15 | LPT |
| Paso X | 1 | 2 |
| Dir X | 2 | 3 |
| Paso Y | 3 | 4 |
| Dir Y | 4 | 5 |
| Paso Z | 5 | 6 |
| Dir Z | 6 | 7 |
| Enabled todos los ejes | 7 | 16 |
| Rele | 8 | - |
| Paso A | 9 | 1 |
| Dir A | 10 | 14 |
| Enabled A | 11 | - |
| Señal para activar rele | 12 | 17 |
| Vcc | 13 | - |
| Entrada optoacoplada | 14 | 15 |
| Gnd | 15 | - |
Con el esquema pude ver que la controladora esta preparada para recibir el paso y la direccion para un cuarto eje (A), pero no tiene la electronica para controlar un PaP, por eso esa señal que le llega por el LPT la envia al DB15. Yo no quise mantener la posibilidad de un cuarto eje, y por eso aproveche esas dos salidas, una para el control de velocidad por PWM y otra como salida para lo que quiera (un laser, en su momento).
Tambien se puede ver en el esquema que se puede conectar un rele, y tambien estan los pines para ello en el DB15. Con el rele doy los 220v a un enchufe para una aspiradora, y tambien alimento el triac que controla el taladro. El triac esta controlado con un pic 12F683. Mi placa contiene la electronica necesaria para detectar el cruce por cero de los 220v y sincronizar el disparo del triac para controlar la velocidad del taladro.
El codigo del PIC es este:
#include <12F683.h>
#device adc=8
#FUSES WDT,NOMCLR,PUT,INTRC_IO,PROTECT
#use delay(clock=8000000)
#use fast_io(a)
//GPIO
#byte GP = 0x05
//0b00011110
//#bit DAT = GP.0 //tambien se usa como Tx para debug
//#bit CLK = GP.1
#bit CX0 = GP.2
//#bit VPP = GP.3
#define ADC 3 //GP4/AN3
#bit TRIAC = GP.5
//#use rs232(baud=2400, xmit=PIN_A0)
//Constantes
#define RES_ADC 255 //resolucion del adc
#define LIMINF 5 //limite inferior de velocidad
#define LIMSUP 250 //limite superior de velocidad
//Variables
short flagCX0 = FALSE; //flag de cruce por cero
int Velocidad = LIMINF; //velocidad actual del motor
long VelocidadCCP = 0; //cuando tiene que saltar la interrupcion CCP
long Semiciclo = 0; //duracion del semiciclo
//Rutinas
void CalcularVelocidad(void);
#int_EXT
void INT_EXT_isr(void){
TRIAC = FALSE; //empieza semiciclo, apagar triac
Semiciclo = get_timer1(); //establece la duracion del semciclo
set_timer1(0); //restablece timer
flagCX0 = TRUE; //flag para leer ADC y calcular velocidad
}
#int_CCP1
void CCP1_isr(void){
TRIAC = TRUE; //encender triac, estamos en la intensidad deseada
}
void main() {
setup_adc_ports(sAN3|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_wdt(WDT_18MS);
setup_ccp1(CCP_COMPARE_INT);
setup_comparator(NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
setup_oscillator(OSC_8MHZ);
set_tris_a(0b00011110);
set_adc_channel(ADC);
ext_int_edge(0,L_TO_H); //configura INT para que solo se active a la subida
TRIAC = FALSE; //pwm apagado
do{
if(flagCX0 == TRUE){
flagCX0 = FALSE;
CalcularVelocidad();
}
}while(TRUE);
}
void CalcularVelocidad(void){
long Step = 0;
restart_wdt(); //reinicio el watchdog
Velocidad = read_adc(); //leo adc
if(Velocidad < LIMINF) //comprueba que la velocidad nunca sea inferior al limite
Velocidad = LIMINF;
if(Velocidad > LIMSUP) //comprueba que la velocidad nunca sea superior al limite
Velocidad = LIMSUP;
Step = Semiciclo / RES_ADC;
VelocidadCCP = Semiciclo - (Step * Velocidad);
CCP_1 = VelocidadCCP;
}
El pic lo que hace es medir el voltaje en uno de sus pins y convertirlo con el ADC. Segun el valor obtenido regula la velocidad del motor disparando el triac. Se puede seleccionar la fuente del voltaje a medir. Si queremos controlar la velocidad con un potenciometro (actuando como divisor de tension) o desde un PWM proveniente del mach. El PWM es una señal pulsante, que convertimos en un voltaje de 0 a 5v con un filtro RC.
La velocidad ya puede ser controlada desde el mach, pero hay que configurar el PID para que vaya fluido.
Links de interes sobre control PID de velocidad:
http://www.cjh.com.au/PWM%20Spindle%20Control%20using%20Mach3.pdfhttp://www.vhipe.com/product-private/SuperPID.htmEl tacometro lo conecte a la entrada optoacoplada libre. Aqui se puede ver algo de informacion para hacer un tacometro:
http://www.todopic.com.ar/foros/index.php?topic=29669.0El pin de enabled "pone a la maquina a trabajar", y cuando apretamos el reset/Estop/limit switch el enabled se apaga. Yo lo aproveche y lo conecte a un transistor para iluminar mi boton de estop. Cuando el enabled esta activo el estop esta iluminado, en caso contrario se apaga.
El boton lo tienen en
SeeedStudio y en
SparkFun. Aqui explican como tunearlo:
http://stuffandymakes.com/2011/01/08/hack-the-sparkfun-big-red-dome-button/La sable tiene tambien una entrada de 5 pines donde se conectan los 3 limites y el estop. Yo conecte TODOS los limites (X, Y y Z) en la entrada del limite X, asi me ahorro dos entradas que puedo utilizar para otra cosa

Una de ellas es un "auto tool zero" con la capacidad de centrar la maquina con precision en un punto deseado:
http://www.cnczone.com/forums/mach_wizards_macros_addons/56079-xyz_probe_modification.htmlMas informacion sobre home y limit switches:
http://www.esteca55.com/tuto-home&limit.htmlADVERTENCIA: en mi placa solo hay una entrada de LIMIT SWITCH pues todos los interruptores que uso son NORMALMENTE CERRADOS y estan conectados todos en SERIE. Cuando alguno se active abriria el circuito disparando el limite. Como comenta Esteca en su tutorial, es mejor poner los finales de carrera como normalmente cerrados para evitar interferencias.
A la caja le puse un conector para la toma de 220v, dos tomas shuko, una para el taladro y otra para la aspiradora. Un conector DB15, y un conector PS/2. El conector PS/2 es de 6 pines, y lo use para conectar el Estop y los limites X, Y y Z. En la parte superior, los conectores para los limites, asi como para las entradas son RCA. El conector del tacometro y el de la salida son jack estereo de 3,5mm.
La caja la grabe con la CNC y luego le aplique unas pinturas que son como cera para llenar los huecos:


y asi queda acabada:

Hay que configurar el mach para que reconozca las nuevas entradas, el tacometro, la salida, el rele, y la regulacion de velocidad, asi como todos los limit switch en el mismo canal.
Esta es mi configuracion:





En Function Cfg's>Calibrate Spindle hay una utilidad para calibrar el control PID.
Para hacerlo funcionar primero hay que activar la CNC con el boton RESET y luego entrar en esa pantalla.
Si pulsamos el boton Spindle On/Off, logicamente encenderemos o apagaremos el rele del motor.
En las casillas P, I y D se pueden ir probando los valores deseados, en la casilla Control RPM pondremos la velocidad que queremos alcanzar. Cada vez que modifiquemos algo debemos pulsar el boton de UPDATE PID para que se refleje el cambio.
Los valores PID que utilice son validos para mi taladro, y aunque no son perfectos, me doy por satisfecho. Aqui se ve una grafica de como el motor alcanza la velocidad deseada:

Solo queda decir que estoy muy contento con esta nueva ampliacion, y que pronto habra mas. Como decia antes, el laser es inminente, y tambien un panel de control externo con joystick y unos cuantos botones para poder operar la maquina con mayor facilidad, todo por USB.
Os dejo los archivos de eagle con el esquema y la pcb. Podeis modificar a gusto siempre y cuando, si haceis alguna mejora teneis la obligacion de comentarla

Espero que alguien le saque provecho, ya que cada vez somos mas los poseedores de una Sable!
Edito:
15/2/11: actualizado el codigo del PIC, le puse un watchdog por las dudas
1/3/11: agregadas las pantallas de configuracion para el mach3, actualizada PCB