31 maja 2019

Huanyang i LinuxCNC

Co chcemy osiągnąć

Chcemy sterować kierunkiem i obrotami wrzeciona z poziomu LinuxCNC tak, jak na filmie demo:

Założenia

Zakładam, że czytelnik potrafi sprawnie poruszać się w consoli linux. Pomocne może być skonfigurowanie zdalnych sesji X tak jak to opisałem w tym wpisie. W moim przypadku LinuxCNC jest bez monitora i wszystkie operacje wykonuje na nim zdalnie przy pomocy consoli, zdalnych X.

Konfiguracja

Konfiguracja falownika

Pierwszym krokiem jest konfiguracja falownika, aby przyjmował komendy przez port komunikacyjny, ten krok jest omówiony tu.

Parametr Wartość Opis
PD001 2 Sterowanie przez interfejs komunikacyjny
PD002 2 Źródło nastawy obrotów - port komunikacyjny
PD163 1 nadanie identyfikatora urządzenia
PD164 2 19200 b/s
PD165 3 8N1 RTU

Łączymy falownik z komputerem przez konwerter USB<->RS485.

linuxCNC usb spindle

Nic nie musimy instalować, driver jest częścią LinuxCNC. W moim przypadku port komunikacyjny był zmapowany jako /dev/ttyUSB0 ale nie jest to reguła, wiec sprawdź jak jest u ciebie.

Czysta bazowa konfiguracja maszyny CNC

Jako punkt wyjściowy bierzemy domyślną konfigurację wygenerowaną przez kreator. Uruchamiamy kreator i wybieramy tworzenie nowej czystej konfiguracji. Następnie nadajemy nazwę naszym ustawieniom, wybieramy jednostki i parametry silników, na tym etapie nie musimy wszystkiego ustawiać, bo zawsze możemy to zmienić edytując plik.

Odłączamy piny, które domyślnie służyły do sterowania wrzecionem (PIN: 14, 16), jeśli tego nie zrobimy teraz to będziemy musieli usunąć mapowania z pliku konfiguracyjnego ręcznie, bo inaczej aplikacja w chwili uruchomienia zgłosi błąd konfliktu przypisania pinów. Następnie, dodajemy panel z informacjami o aktualnych obrotach wrzeciona.

Konfigurujemy kolejne osie, możemy ominąć ten etap i wprowadzić zmiany w pliku konfiguracyjnym. Ostatnim krokiem jest potwierdzenie ustawień, na pulpicie powinniśmy widzieć nowy skrót do naszej konfiguracji. W moim przypadku nazywa się lunch wrzeciono_test. Kiedy uruchomimy aplikację sterującą na tym etapie, zobaczymy, że możemy virtualnie sterować wrzecionem, ale nic się nie dzieje fizycznie.

Manual spindle

Jeśli chcesz zdalnie wywołać konfiguracje przez zdalne X, opisane dokładnie w innym wpisie, użyj:

linuxcnc /home/cnc/linuxcnc/configs/wrzeciono_test/wrzeciono_test.ini

Zmiany w konfiguracji

Mając naszą bazową konfigurację, wprowadzamy w niej pewne zmiany. Do pliku custom.hal w katalogu naszej konfiguracji, który w moim przypadku jest "/home/cnc/linuxcnc/configs/wrzeciono_test/" dodajemy poniższy kod:

loadusr -Wn vfd hy_vfd -n vfd -t 1 -d /dev/ttyUSB0 -p none -r 19200 -s 1

net spindle-cmd-rpm-abs => vfd.speed-command
net spindle-cw motion.spindle-forward => vfd.spindle-forward
net spindle-ccw motion.spindle-reverse => vfd.spindle-reverse
net on motion.spindle-on => vfd.spindle-on

Ładujemy sterownik, z odpowiednimi parametrami transmisji oraz portem. Następnie łączymy wirtualne piny odpowiedzialne za wrzeciono. Jeśli w twoim przypadku adres portu komunikacyjnego jest inny to go zmień na właściwy dla ciebie, u mnie to jest /dev/ttyUSB0. Teraz edytujemy plik custom_postgui.hal. Końcówka powinna wygadać następująco:

# **** force spindle at speed indicator true because we have no feedback ****

net spindle-at-speed => pyvcp.spindle-at-speed-led
net spindle-at-speed => vfd.spindle-at-speed

setp vfd.enable 1

Pliku wrzeciono_test.hal nie musimy edytować, zamieszczam tu jego zawartość, aby pomóc przy rozwiązywaniu ewentualnych problemów przy konfliktach i błędach konfiguracji. Mogą się takie pojawić jeśli podłączymy dwa lub więcej wirtualnych źródeł do tego samego wirtualnego pinu.

# Generated by stepconf 1.1 at Fri Jun  7 16:18:24 2019
# 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 hal_parport cfg="0 out"
setp parport.0.reset-time 5000
loadrt stepgen step_type=0,0,0

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-rpm     <= motion.spindle-speed-out
net spindle-cmd-rpm-abs <= motion.spindle-speed-out-abs
net spindle-cmd-rps     <= motion.spindle-speed-out-rps
net spindle-cmd-rps-abs <= motion.spindle-speed-out-rps-abs
net spindle-at-speed    => motion.spindle-at-speed

net estop-out       => parport.0.pin-01-out
net xstep           => parport.0.pin-02-out
setp parport.0.pin-02-out-reset 1
net xdir            => parport.0.pin-03-out
net ystep           => parport.0.pin-04-out
setp parport.0.pin-04-out-reset 1
net ydir            => parport.0.pin-05-out
net zstep           => parport.0.pin-06-out
setp parport.0.pin-06-out-reset 1
net zdir            => parport.0.pin-07-out
net astep           => parport.0.pin-08-out
setp parport.0.pin-08-out-reset 1
net adir            => parport.0.pin-09-out
net xenable         => parport.0.pin-17-out

setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0
setp stepgen.0.dirhold 35000
setp stepgen.0.dirsetup 35000
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 xstep <= stepgen.0.step
net xdir <= stepgen.0.dir
net xenable axis.0.amp-enable-out => stepgen.0.enable

setp stepgen.1.position-scale [AXIS_1]SCALE
setp stepgen.1.steplen 1
setp stepgen.1.stepspace 0
setp stepgen.1.dirhold 35000
setp stepgen.1.dirsetup 35000
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 ystep <= stepgen.1.step
net ydir <= stepgen.1.dir
net yenable axis.1.amp-enable-out => stepgen.1.enable

setp stepgen.2.position-scale [AXIS_2]SCALE
setp stepgen.2.steplen 1
setp stepgen.2.stepspace 0
setp stepgen.2.dirhold 35000
setp stepgen.2.dirsetup 35000
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 zstep <= stepgen.2.step
net zdir <= stepgen.2.dir
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

Uwaga

Jeśli nadal masz problemy z konfiguracją maszyny CNC, podłączeniem falownika, napisaniem skryptu rozważ skorzystanie z moich komercyjnych usług.

Dodatkowe informacje