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’.

IMG_1246_2

Dobra, sterowniki:
Ściągamy 5i25.zip z http://www.mesanet.com/software/parallel/5i25.zip
Rozpakowujemy:

unzip 5i25.zip

Flashujemy:

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.bit

Powinniśmy dostać: “Board configuration verified successfully”

reboot

Testujemy czy zabawki działają:

$halrun

# loadrt hostmot2
# loadrt hm2_pci
# show pin hm2_5i25.0

Powinniśmy dostać dłuuugą listę pinów:

Component Pins:

Owner   Type   Dir         Value  Name
  5      bit   OUT         FALSE  hm2_5i25.0.7i76.0.0.input-00
  5      bit   OUT         FALSE  hm2_5i25.0.7i76.0.0.input-00-not
  5      bit   OUT         FALSE  hm2_5i25.0.7i76.0.0.input-01
  5      bit   OUT         FALSE  hm2_5i25.0.7i76.0.0.input-01-not
  5      bit   OUT         FALSE  hm2_5i25.0.7i76.0.0.input-02
  5      bit   OUT         FALSE  hm2_5i25.0.7i76.0.0.input-02-not

...

No to mamy sterowniki ogarnięte. Teraz kabelki na 7i76.

IMG_1247_2

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:

IMG_1264

 

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:

Manual Mesa 6i25

Manual Mesa 7i76

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