EMC2 con motores Unipolares + ULN2803

Me han escrito de diferentes lugares preguntando por la configuracion de los pines para EMC2 y motores unipolares ya que la mayoria de las configuraciones son STEP, DIR y ENABLE en vez de direccionar los pulsos XA, XB, XC, XD y YA, YB, YC, YD; es decir :

net XA => parport.0.pin-06-out
net XB => parport.0.pin-07-out
net XC => parport.0.pin-08-out
net XD => parport.0.pin-09-out

net YA => parport.0.pin-02-out
net YB => parport.0.pin-03-out
net YC => parport.0.pin-04-out
net YD => parport.0.pin-05-out

net ZA => parport.0.pin-01-out
net ZB => parport.0.pin-14-out
net ZC => parport.0.pin-16-out
net ZD => parport.0.pin-17-out

Sin embargo no es solo esto lo que hay que colocar en el archivo HAL y archivo INI, Uds pueden usar los pines de salida según el diseño de su tarjeta de control; aunque EMC Linux en su sitio dice que no da soporte a tarjetas desarrolladas con ULN2803 porque las llama juguetes ya que no controla mas de 0.5 amperes. Aún así cuando leí casi todo su sitio no me desanimé y pude configurar mi primera minicnc y este año con mas calma y haciendo pruebas encontré como darle mas poder para que sea un Super Juguete.

Volviendo al tema es importante que los ajustes se hagan de manera manual en las siguientes lineas de los 3 ejes:

[AXIS_0] TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = .28 /velocidad del corte
MAX_ACCELERATION = 5
STEPGEN_MAXACCEL = 6
SCALE = 2400.0 /numero de pasos por pulgada
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = -10
MAX_LIMIT = 10
HOME_OFFSET = 0.0

Archivo uln2803.hal

# Generated by laconeccion.com  at Ago 20 11:55:55 2010
# If you make changes to this file, they will be
# overwritten when you run stepconf again
loadrt trivkins
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hal_parport cfg="0x1410 out  "
setp parport.0.reset-time 1000
loadrt stepgen step_type=5,5,5
addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread

addf stepgen.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
net spindle-cmd <= motion.spindle-speed-out

net XA => parport.0.pin-01-out
net XB => parport.0.pin-14-out
net XC => parport.0.pin-02-out
net XD => parport.0.pin-03-out

net YA => parport.0.pin-16-out
net YB => parport.0.pin-04-out
net YC => parport.0.pin-17-out
net YD => parport.0.pin-05-out

net ZA => parport.0.pin-06-out
net ZB => parport.0.pin-07-out
net ZC => parport.0.pin-08-out
net ZD => parport.0.pin-09-out

setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 50000
setp stepgen.0.dirdelay 100000
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net XA <= stepgen.0.phase-A
net XB <= stepgen.0.phase-B
net XC <= stepgen.0.phase-C
net XD <= stepgen.0.phase-D
net xenable axis.0.amp-enable-out => stepgen.0.enable

setp stepgen.1.position-scale [AXIS_1]SCALE
setp stepgen.1.steplen 50000
setp stepgen.1.dirdelay 100000
setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd
net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb
net YA <= stepgen.1.phase-A
net YB <= stepgen.1.phase-B
net YC <= stepgen.1.phase-C
net YD <= stepgen.1.phase-D
net yenable axis.1.amp-enable-out => stepgen.1.enable

setp stepgen.2.position-scale [AXIS_2]SCALE
setp stepgen.2.steplen 50000
setp stepgen.2.dirdelay 100000
setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
net ZA <= stepgen.2.phase-A
net ZB <= stepgen.2.phase-B
net ZC <= stepgen.2.phase-C
net ZD <= stepgen.2.phase-D
net zenable axis.2.amp-enable-out => stepgen.2.enable

net estop-out <= iocontrol.0.user-enable-out
net estop-out => iocontrol.0.emc-enable-in

loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

Archivo uln2803.ini

# Generated by laconeccion.com  at Ago 20 11:55:55 2011
# If you make changes to this file, they will be
# overwritten when you run stepconf again
[EMC] MACHINE = uln2803
NML_FILE = emc.nml
DEBUG = 0
[DISPLAY] DISPLAY = axis
EDITOR = gedit
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 5
PROGRAM_PREFIX = /home/laboratory/emc2/nc_files
INCREMENTS = .1in .05in .01in .005in .001in .0005in .0001in

[FILTER] PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python

[TASK] TASK = milltask
CYCLE_TIME = 0.010

[RS274NGC] PARAMETER_FILE = emc.var

[EMCMOT] EMCMOT = motmod
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
BASE_PERIOD = 100000
SERVO_PERIOD = 1000000

[HAL] HALFILE = uln2803.hal
HALFILE = custom.hal
POSTGUI_HALFILE = custom_postgui.hal

[TRAJ] AXES = 3
COORDINATES = X Y Z
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 0.28
MAX_LINEAR_VELOCITY = .4

[EMCIO] EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl

[AXIS_0] TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = .28
MAX_ACCELERATION = 5
STEPGEN_MAXACCEL = 6
SCALE = 2400.0
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = -10
MAX_LIMIT = 10
HOME_OFFSET = 0.0

[AXIS_1] TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = .28
MAX_ACCELERATION = 5
STEPGEN_MAXACCEL = 6
SCALE = 2400.0
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = -10
MAX_LIMIT = 10
HOME_OFFSET = 0.0

[AXIS_2] TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = .2333
MAX_ACCELERATION = 5
STEPGEN_MAXACCEL = 6
SCALE = 2400
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = -5
MAX_LIMIT = 5
HOME_OFFSET = 0.0

 
Estos dos archivos deben reemplazar los existentes generados por Uds ya que se enlazan con los preajustes del programa para tomar los valores de ajuste personalizado de estos archivos. Pueden cambiar lo valores de limites maximos y minimos de acuerdo al punto de origen de su CNC.

Hace 5 años vi un sitio que usó parte de esta configuracion y el lo llamó brute force CNC mantis, y el no utiliza ULN2803, el solo usa unos Diosdos SOT-23 para evitar el retorno de voltaje al puerto paralelo. Algo peligroso pero le fué funcional en su proyecto.