Dwugłowa Mesa czyli 5i25/6i25 + 7i67 w roli tokarki.

Pierwsze przykazanie Mesownika:
Nie będziesz używał niestabilnego!
Tyczy się to zarówno stabilnego LinuxCNC puszczonego na Ubuntu 12.04 jak i wszystkich MachineKitów. Uwierzcie – jeżeli trzeba zrobić robotę to stawiamy LinuxCNC 10.04, upgrejdujemy do 2.6.5 i cieszymy się, że dodatkowych parę setek włosów pozostało na głowie.
No, czyli mamy Ubuntu 10.04, na nim LinuxCNC 2.6.5.
Mesa. Skoro to czytasz to pewnie masz. Jeżeli nie masz to u nas najwygodniej kupić od Michała z ToroMatic, albo z Czech z http://www.duzi.cz – ja mam pół na pół: jedna Mesa stąd – druga stamtąd 😀 Mam 6i25 jako kartę-matkę. To jest to samo co 5i25. 6i25 jest na PCI-E, a 5i25 na PCI – bebechy są te same. Jako kartę-córkę zastosuję 7i76 (5 osi step/dir, enkoder wrzeciona i 48 pinów we/wy). Trochę za bogato, bo wystarczyłaby spokojnie 7i78 ale nie mam.
Instalujemy kartę-matkę w kompie. Aaa, jeszcze jedno. Karty-dzieci potrzebują 5V i większość(wszystkie?) Mesowe karty-matki mają możliwość przekazania 'dziecku’ napięcia 5V z komputera. Znajdujemy więc na 5i25/6i25 dwie zworki: W1 i W2 – domyślnie są w pozycji 'DOWN’. Przestawiamy obie na 'UP’.

Dobra, sterowniki: Ściągamy 5i25.zip z http://www.mesanet.com/software/parallel/5i25.zip Rozpakowujemy:
unzip 5i25.zipFlashujemy:
cd ~/Pobrane/5i25/utils/linux
chmod a+x mesaflash
sudo ./mesaflash –device 5i25 –write ../../configs/hostmot2/5i25_7i76x2.bit
sudo ./mesaflash –device 5i25 –verify ../../configs/hostmot2/5i25_7i76x2.bitPowinniśmy dostać: “Board configuration verified successfully”
rebootTestujemy czy zabawki działają:
$halrun
# loadrt hostmot2
# loadrt hm2_pci
# show pin hm2_5i25.0Powinniśmy dostać dłuuugą listę pinów:
Component Pins:
| Owner | Type | Dir | Value | Name |
|---|---|---|---|---|
| 5 | bit | OUT | FALSE | hm25i25.0.7i76.0.0.input-00 |
| 5 | bit | OUT | FALSE | hm25i25.0.7i76.0.0.input-00-not |
| 5 | bit | OUT | FALSE | hm25i25.0.7i76.0.0.input-01 |
| 5 | bit | OUT | FALSE | hm25i25.0.7i76.0.0.input-01-not |
| 5 | bit | OUT | FALSE | hm25i25.0.7i76.0.0.input-02 |
| 5 | bit | OUT | FALSE | hm25i25.0.7i76.0.0.input-02-not |
…
No to mamy sterowniki ogarnięte. Teraz kabelki na 7i76.

Złącze TB1.
Podajemy zewnętrzne zasilanie. Potrzeba 12V DC – u siebie maszynę przerabiałem ze sterowania opartego na OptoBoBie więc po prostu sobie pociągnąłem kabelki od zasilacza 🙂
| pin | funkcja |
|---|---|
| 1 | 12V |
| 8 | GND |
Złącze TB2.
Piny do podłączenia 4 silników krokowych. U mnie zwykła tokarka więc podłączyłem tylko dwa silniki:
| pin | funkcja |
|---|---|
| 3 | STEP0 |
| 5 | DIR0 |
| 9 | STEP1 |
| 11 | DIR1 |
Złącze TB3.
Piny do przypięcia 5 silnika krokowego, enkodera i RS-422. U mnie tylko enkoder.
| pin | funkcja |
|---|---|
| 7 | ENCA+ |
| 10 | ENCB+ |
| 13 | IDX+ |
Ponieważ mój enkoder ma tylko trzy wyjścia ustawiam zworki W3, W4, W5 w lewo – czyli typ sygnału 'pojedynczy’. W przypadku gdy enkoder ma 6 wyjść czyli daje sygnały różnicowe podpinamy wszystkie 6 do złącza TB3 i zworki W3, W4 i W5 przestawiamy w prawo.
Złącze TB4.
Złącze wrzeciona – u mnie falownik LG – więc ustawiłem sterowanie częstotliwością za pomocą napięcia 0-10V i podpiąłem tak:
| pin | nazwa | falownik |
|---|---|---|
| 4 | SPINDLE- | CM |
| 7 | SPINDLEOUT | V1 |
| 6 | SPINDLE+ | VR 12V |
Złącze TB6.
Wejścia 0-15 i wyjścia 0-7. U mnie tylko start/stop wrzeciona i chłodziwo.
| pin | funkcja |
|---|---|
| 17 | OUTPUT0 |
| 18 | OUTPUT1 |
Uff.
Zamontowane na miejscu wygląda jakoś tak:

Konfig.
Nie bardzo chyba jest się nad czym rozwodzić (jest?) – wyklikałem na PNCconfie, poprawiłem jakieś drobiazgi i biega. HALa załączam na dole w razie jakby ktoś chciał popatrzeć.
Załączniki:
Mój HAL:
loadrt trivkins
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hostmot2
loadrt hm2_pci config=" num_encoders=1 num_pwmgens=0 num_3pwmgens=0 num_stepgens=5 sserial_port_0=00xxx "
setp hm2_5i25.0.watchdog.timeout_ns 10000000
loadrt pid names=pid.s
addf hm2_5i25.0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf pid.s.do-pid-calcs servo-thread
addf hm2_5i25.0.write servo-thread
addf hm2_5i25.0.pet_watchdog servo-thread
# external output signals
# --- SPINDLE-CW ---
net spindle-cw hm2_5i25.0.7i76.0.0.output-01
# --- COOLANT-MIST ---
net coolant-flood hm2_5i25.0.7i76.0.0.output-00
# external input signals
#*******************
# AXIS X
#*******************
# Step Gen signals/setup
setp hm2_5i25.0.stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp hm2_5i25.0.stepgen.00.dirhold [AXIS_0]DIRHOLD
setp hm2_5i25.0.stepgen.00.steplen [AXIS_0]STEPLEN
setp hm2_5i25.0.stepgen.00.stepspace [AXIS_0]STEPSPACE
setp hm2_5i25.0.stepgen.00.position-scale [AXIS_0]STEP_SCALE
setp hm2_5i25.0.stepgen.00.step_type 0
setp hm2_5i25.0.stepgen.00.control-type 0
setp hm2_5i25.0.stepgen.00.maxaccel [AXIS_0]STEPGEN_MAXACCEL
setp hm2_5i25.0.stepgen.00.maxvel [AXIS_0]STEPGEN_MAXVEL
net x-pos-fb axis.0.motor-pos-fb <= hm2_5i25.0.stepgen.00.position-fb
net x-pos-cmd axis.0.motor-pos-cmd => hm2_5i25.0.stepgen.00.position-cmd
net x-enable axis.0.amp-enable-out => hm2_5i25.0.stepgen.00.enable
# ---setup home / limit switch signals---
net x-home-sw => axis.0.home-sw-in
net x-neg-limit => axis.0.neg-lim-sw-in
net x-pos-limit => axis.0.pos-lim-sw-in
#*******************
# AXIS Z
#*******************
# Step Gen signals/setup
setp hm2_5i25.0.stepgen.01.dirsetup [AXIS_2]DIRSETUP
setp hm2_5i25.0.stepgen.01.dirhold [AXIS_2]DIRHOLD
setp hm2_5i25.0.stepgen.01.steplen [AXIS_2]STEPLEN
setp hm2_5i25.0.stepgen.01.stepspace [AXIS_2]STEPSPACE
setp hm2_5i25.0.stepgen.01.position-scale [AXIS_2]STEP_SCALE
setp hm2_5i25.0.stepgen.01.step_type 0
setp hm2_5i25.0.stepgen.01.control-type 0
setp hm2_5i25.0.stepgen.01.maxaccel [AXIS_2]STEPGEN_MAXACCEL
setp hm2_5i25.0.stepgen.01.maxvel [AXIS_2]STEPGEN_MAXVEL
net z-pos-fb axis.2.motor-pos-fb <= hm2_5i25.0.stepgen.01.position-fb
net z-pos-cmd axis.2.motor-pos-cmd => hm2_5i25.0.stepgen.01.position-cmd
net z-enable axis.2.amp-enable-out => hm2_5i25.0.stepgen.01.enable
# ---setup home / limit switch signals---
net z-home-sw => axis.2.home-sw-in
net z-neg-limit => axis.2.neg-lim-sw-in
net z-pos-limit => axis.2.pos-lim-sw-in
#*******************
# SPINDLE S
#*******************
# ---digital potentionmeter output signals/setup---
setp hm2_5i25.0.7i76.0.0.spinout-minlim [SPINDLE_9]OUTPUT_MIN_LIMIT
setp hm2_5i25.0.7i76.0.0.spinout-maxlim [SPINDLE_9]OUTPUT_MAX_LIMIT
setp hm2_5i25.0.7i76.0.0.spinout-scalemax [SPINDLE_9]OUTPUT_SCALE
net spindle-vel-cmd-rpm-abs => hm2_5i25.0.7i76.0.0.spinout
net machine-is-enabled => hm2_5i25.0.7i76.0.0.spinena
net spindle-ccw => hm2_5i25.0.7i76.0.0.spindir
# ---Encoder feedback signals/setup---
setp hm2_5i25.0.encoder.00.counter-mode 0
setp hm2_5i25.0.encoder.00.filter 1
setp hm2_5i25.0.encoder.00.index-invert 0
setp hm2_5i25.0.encoder.00.index-mask 0
setp hm2_5i25.0.encoder.00.index-mask-invert 0
setp hm2_5i25.0.encoder.00.scale [SPINDLE_9]ENCODER_SCALE
net spindle-revs <= hm2_5i25.0.encoder.00.position
net spindle-vel-fb <= hm2_5i25.0.encoder.00.velocity
net spindle-index-enable <=> hm2_5i25.0.encoder.00.index-enable
# ---setup spindle control signals---
net spindle-vel-cmd-rps <= motion.spindle-speed-out-rps
net spindle-vel-cmd-rps-abs <= motion.spindle-speed-out-rps-abs
net spindle-vel-cmd <= motion.spindle-speed-out
net spindle-vel-cmd-rpm-abs <= motion.spindle-speed-out-abs
net spindle-on <= motion.spindle-on
net spindle-cw <= motion.spindle-forward
net spindle-ccw <= motion.spindle-reverse
net spindle-brake <= motion.spindle-brake
net spindle-revs => motion.spindle-revs
net spindle-at-speed => motion.spindle-at-speed
net spindle-vel-fb => motion.spindle-speed-in
net spindle-index-enable <=> motion.spindle-index-enable
# ---Setup spindle at speed signals---
sets spindle-at-speed true
#******************************
# connect miscellaneous signals
#******************************
# ---HALUI signals---
net joint-select-a halui.joint.0.select
net x-is-homed halui.joint.0.is-homed
net jog-x-pos halui.jog.0.plus
net jog-x-neg halui.jog.0.minus
net jog-x-analog halui.jog.0.analog
net joint-select-c halui.joint.2.select
net z-is-homed halui.joint.2.is-homed
net jog-z-pos halui.jog.2.plus
net jog-z-neg halui.jog.2.minus
net jog-z-analog halui.jog.2.analog
net jog-selected-pos halui.jog.selected.plus
net jog-selected-neg halui.jog.selected.minus
net spindle-manual-cw halui.spindle.forward
net spindle-manual-ccw halui.spindle.reverse
net spindle-manual-stop halui.spindle.stop
net machine-is-on halui.machine.is-on
net jog-speed halui.jog-speed
net MDI-mode halui.mode.is-mdi
# ---coolant signals---
net coolant-mist <= iocontrol.0.coolant-mist
net coolant-flood <= iocontrol.0.coolant-flood
# ---probe signal---
net probe-in => motion.probe-input
# ---motion control signals---
net in-position <= motion.in-position
net machine-is-enabled <= motion.motion-enabled
# ---digital in / out signals---
# ---estop signals---
net estop-out <= iocontrol.0.user-enable-out
net estop-out => iocontrol.0.emc-enable-in
# ---manual tool change signals---
loadusr -W hal_manualtoolchange
net tool-change-request iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-change-confirmed 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