Rzeczy do zrobienia po instalacji LinuxCNC

Autor: Mateusz M.8 min czytaniaObsługa LinuxCNC
Spis treści
  1. Zmiany w pliku ini
  2. Zmiany w pliku axis
  3. Automatyczne uruchamianie
  4. Autologin
  5. Instalacja potrzebnych programów
  6. Wyłączenie wygaszacza ekranu
  7. Instalacja HeeksCAD w systemie LinuxCNC

Program LinuxCNC po prawidłowym skonfigurowaniu pracuje poprawnie. Jednak przydałoby się czasami zmienić niektóre opcje: konfigurację klawiszy lub sposób działania. Nie jest to łatwe, ponieważ część ustawień zapisana jest w plikach konfiguracyjnych ini, a część w pliku axis napisanym w Pythonie. Poniżej przedstawimy podstawowe zmiany, które usprawnią naszą pracę z programem.

1. Zmiany w pliku ini

Każde uruchomienie programu Stepconf nadpisuje nasze zmiany, dlatego kolejne konfiguracje osi warto przeprowadzać w pliku ini lub kopiować plik ze zmianami w inne, bezpieczne miejsce.

1.1. Maksymalna prędkość posuwu po uruchomieniu programu

Standardowo prędkość posuwu ustawiona jest na kilkadziesiąt procent tuż po uruchomieniu LinuxCNC. Zwykle na początku chcemy operować maszyną maksymalnie szybko, aby ustawić punkt początkowy lub przejechać osią w określone miejsce. Irytujące jest ciągłe zmienianie prędkości na maksimum.

Zmian dokonujemy w pliku ini w katalogu linuxcnc/config/, w sekcji [DISPLAY]. Podane mamy prędkości: minimalną, maksymalną i domyślną.

MIN_LINEAR_VELOCITY = 0
MAX_LINEAR_VELOCITY = 50.00 (mm/s)
DEFAULT_LINEAR_VELOCITY = 5.00 - zmienić na maksymalną czyli 50

1.2. Posuw inkrementalny

Zmiany również dokonujemy w pliku ini, w sekcji [DISPLAY]. Standardowo dokładności inkrementacji są bardzo duże, nieosiągalne dla domowych maszyn. Można więc usunąć te rzędu tysięcznych, a nawet setnych milimetra, aby nie przeszkadzały przy przełączaniu.

INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm

1.3. Obrazek przy starcie

To już bajer, ale zawsze fajnie jest zobaczyć swoją twórczość przy uruchamianiu lub skrócić czas ekranu startowego. To także zmienimy w sekcji [DISPLAY] pliku ini. Obrazek musi być w formacie gif i znajdować się tam, gdzie plik ini.

INTRO_GRAPHIC = linuxcnc.gif - można dodać swój obrazek
INTRO_TIME = 3

1.4. NGCGUI – dodatkowe zakładki szybkiego frezowania

Po dodaniu poniższych sekcji otrzymujemy dostęp do dodatkowych zakładek, w których znajdują się miniprogramy. Dzięki nim szybko ustawimy frezowanie najczęściej używanych przez nas schematów, typu: otwory w szyku, fasolka, kieszeń. Wystarczy podać ilość i wymiary, a program wygeneruje się automatycznie. W praktyce przydatne, lecz domyślne programy są pełne błędów, nie działają idealnie, a napisanie własnych jest już kłopotliwe. Wg mnie lepiej przygotować g-code w zewnętrznych programach. Uruchomienie opisane jest poniżej, podane są sekcje, w których wpisać określone formuły.

[DISPLAY]
#===================NGCGUI=========================
TKPKG = Ngcgui 1.0
TKPKG = Ngcguittt 1.0
# Ngcgui musi poprzedzać Ngcguittt
NGCGUI_FONT = Helvetica -12 normal
NGCGUI_PREAMBLE = mm_std.ngc
# tu podajemy nazwy naszych programów, ścieżki znajdują się w sekcji
[RS274NGC]
NGCGUI_SUBFILE = helix.ngc
NGCGUI_SUBFILE = helix_rtheta.ngc
NGCGUI_SUBFILE = iquad.ngc
NGCGUI_SUBFILE = arc1.ngc
NGCGUI_SUBFILE = arc2.ngc
NGCGUI_SUBFILE = hole_circle.ngc
NGCGUI_SUBFILE = qpocket.ngc
NGCGUI_SUBFILE = slot.ngc
# symbol "" otwiera pustą zakładkę
NGCGUI_SUBFILE = ""
NGCGUI_OPTIONS = noremove
#NGCGUI_OPTIONS = opt1 opt2 ...
# dostępne opcje:
# nonew -- nie pozwala na stworzenie nowej zakładki
# noremove -- nie pozwala na usunięcie żadnej zakładki
# noauto -- brak autowysyłania (makeFile, wysyłany ręcznie)
# noiframe -- obrazki wyświetlane w innym oknie na wierzchu
GCMC_INCLUDE_PATH = /home/myname/gcmc_includes
# włączenie generatora do graverowania napisów
TTT = truetype-tracer
TTT_PREAMBLE = mm_std.ngc
PROGRAM_PREFIX = ../../nc_files/examples/ngcgui_lib
#==================================================
[RS274NGC]
PARAMETER_FILE = linuxcnc.var
#======================NGCGUI======================
# ścieżka dostępu do plików ngcgui
SUBROUTINE_PATH = ../../nc_files/examples/ngcgui_lib:../../nc_files/examples/ngcgui_lib/utilitysubs
USER_M_PATH = ../../nc_files/ngcgui_lib/mfiles
#==================================================

Zakładki NGCGUI w LinuxCNC

Zdj. 1.4. Zakładki NGCGUI

2. Zmiany w pliku axis

Plik axis napisany jest w języku programowania Python. Aby się do niego dostać, musimy posiadać uprawnienia administratora. W Debianie wciskamy Alt+F2 i wpisujemy gksu thunar (w Ubuntu gksu nautilus). Znajdujemy go w katalogu usr/bin, otwieramy w jakimś edytorze tekstu i do dzieła.

2.1. Klawisze

Aby wygodniej operować maszyną z klawiatury lub dostosować ją do naszego kontrolera, musimy znaleźć poniższą sekcję ze spisem klawiszy i ich funkcjami. Poniższy przykład to nasz układ klawiszy dostosowany pod pada od PlayStation 3. Zmiany są następujące:

  • wyłączona reakcja na przycisk Escape (#nothing)
  • wszystkie ważne funkcje bez Shift, czyli z małych liter
  • bazowanie wszystkich osi bez Ctrl
root_window.bind("<Escape>", "#nothing")
root_window.bind("l", commands.toggle_override_limits)
root_window.bind("o", commands.open_file)
root_window.bind("s", commands.task_resume)
root_window.bind("t", commands.task_step)
root_window.bind("p", commands.task_pause)
root_window.bind("v", commands.cycle_view)
root_window.bind("<Alt-p>", "#nothing")
root_window.bind("r", commands.task_run)
root_window.bind("<Control-r>", commands.reload_file)
root_window.bind("<Control-s>", commands.save_gcode)
root_window.bind_class("all", "<Key-F1>", commands.estop_clicked)
root_window.bind("<Key-F2>", commands.onoff_clicked)
root_window.bind("<Key-F7>", commands.mist_toggle)
root_window.bind("<Key-F8>", commands.flood_toggle)
root_window.bind("<Key-F9>", commands.spindle_forward_toggle)
root_window.bind("<Key-F10>", commands.spindle_backward_toggle)
root_window.bind("<Key-F11>", commands.spindle_decrease)
root_window.bind("<Key-F12>", commands.spindle_increase)
root_window.bind("B", commands.brake_on)
root_window.bind("b", commands.brake_off)
root_window.bind("q", commands.clear_live_plot)
root_window.bind("x", lambda event: activate_axis(0))
root_window.bind("y", lambda event: activate_axis(1))
root_window.bind("z", lambda event: activate_axis(2))
root_window.bind("a", lambda event: activate_axis(3))
root_window.bind("`", lambda event: activate_axis_or_set_feedrate(0))
root_window.bind("1", lambda event: activate_axis_or_set_feedrate(1))
root_window.bind("2", lambda event: activate_axis_or_set_feedrate(2))
root_window.bind("3", lambda event: set_feedrate(5))
root_window.bind("4", lambda event: set_feedrate(20))
root_window.bind("5", lambda event: set_feedrate(35))
root_window.bind("6", lambda event: set_feedrate(50))
root_window.bind("7", lambda event: set_feedrate(65))
root_window.bind("8", lambda event: set_feedrate(80))
root_window.bind("9", lambda event: set_feedrate(90))
root_window.bind("0", lambda event: set_feedrate(100))
root_window.bind("c", lambda event: jogspeed_continuous())
root_window.bind("d", lambda event: widgets.rotate.invoke())
root_window.bind("i", lambda event: jogspeed_incremental())
root_window.bind("k", lambda event: jogspeed_incremental(-1))
root_window.bind("!", "set metric [expr {!$metric}]; redraw")
root_window.bind("@", commands.toggle_display_type)
root_window.bind("#", commands.toggle_coord_type)
root_window.bind("$", commands.toggle_teleop_mode)  #old version: commands.toggle_joint_mode
root_window.bind("<Control-Home>", commands.home_axis)
root_window.bind("<KP_Home>", kp_wrap(commands.home_axis, "KeyPress"))
root_window.bind("<Home>", commands.home_all_axes)
root_window.bind("<Shift-Home>", commands.set_axis_offset)
root_window.bind("<End>", commands.touch_off_system) #old version: commands.touch_off
root_window.bind("<Control-KP_Home>", kp_wrap(commands.home_all_axes, "KeyPress"))
root_window.bind("<Shift-KP_Home>", kp_wrap(commands.set_axis_offset, "KeyPress"))
root_window.bind("<KP_End>", kp_wrap(commands.touch_off_system, "KeyPress")) #old version: commands.touch_off
widgets.mdi_history.bind("<Configure>", "%W see end" )
widgets.mdi_history.bind("<ButtonRelease-1>", commands.mdi_history_butt_1)
widgets.mdi_history.bind("<Double-Button-1>", commands.mdi_history_double_butt_1)
widgets.mdi_command.unbind("<Control-h>")
widgets.mdi_command.bind("<Control-m>", commands.clear_mdi_history)
widgets.mdi_command.bind("<Control-h>", commands.mdi_history_hist2clip)
widgets.mdi_command.bind("<Control-Shift-H>", commands.mdi_history_clip2hist)
widgets.mdi_command.bind("<Key-Return>", commands.send_mdi)
widgets.mdi_command.bind("<Up>", commands.mdi_up_cmd)
widgets.mdi_command.bind("<Down>", commands.mdi_down_cmd)
widgets.mdi_command.bind("<Key-KP_Enter>", commands.send_mdi)
widgets.mdi_command.bind("<KP_Up>", commands.mdi_up_cmd)
widgets.mdi_command.bind("<KP_Down>", commands.mdi_down_cmd)
widgets.mdi_command.bind("<KeyRelease-minus>", "break")
widgets.mdi_command.bind("<KeyRelease-equal>", "break")

Przykład na wersji LinuxCNC 2.7.3 (w wersji 2.6 należy podmienić nazwy 3 zakomentowanych funkcji).

2.2. Zmiana prędkości wolno/szybko za pomocą dwóch klawiszy

Oryginalnie mamy do wyboru konkretnie przypisane wartości prędkości posuwu pod przyciskami od 0 do 9 oraz „`”. My zmieniliśmy funkcję klawiszy 1 oraz 2 do zwiększania i zmniejszania prędkości o 5%. Jak w przykładzie 2.1, do tych klawiszy przypisana jest funkcja activate_axis_or_set_feedrate. My zmieniliśmy jej zawartość jak poniżej. Pozostałe klawisze numeryczne są przypisane do funkcji set_feedrate(n) i podana jest w nich konkretna procentowa wartość posuwu. Jest to jedna z najbardziej podstawowych zmian, ułatwiających pracę.

def set_feedrate(n):
    widgets.feedoverride.set(n)
def set_rapidrate(n):
    widgets.rapidoverride.set(n)
def activate_axis_or_set_feedrate(n):
    ustawiona_predkosc = widgets.feedoverride.get()
    if n == 0:
        set_feedrate(0)
    if n == 1:
        ustawiona_predkosc -= 5
        if ustawiona_predkosc < 0:
            ustawiona_predkosc = 0
        set_feedrate(ustawiona_predkosc)
    if n == 2:
        ustawiona_predkosc += 5
        if ustawiona_predkosc > 100:
            ustawiona_predkosc = 100
        set_feedrate(ustawiona_predkosc)

NALEŻY ZWRACAĆ UWAGĘ NA TABULACJĘ W TEKŚCIE, INACZEJ PROGRAM NIE ZADZIAŁA!

2.3. Zmiana wolno/szybko w LinuxCNC 2.7 (dla ręcznego przejazdu)

W wersji LinuxCNC 2.7 funkcja zmiany prędkości, a dokładnie skala prędkości (feed override), nie działa przy ustawianiu maszyny ręcznie, ale nie ma problemów z działaniem w automacie. Mamy do wyboru zmienianie pozycji suwaka prędkość posuwu (jog speed) ręcznie lub powrót do ustawień z LinuxCNC 2.6. Zmieniamy funkcję jog_on(a,b) jak poniżej:

def jog_on(a, b):
    if not manual_ok(): return
    if not manual_tab_visible(): return
    if isinstance(a, (str, unicode)):
        a = "xyzabcuvws".index(a)
    if a < 3:
        if vars.metric.get(): b = b / 25.4
        b = from_internal_linear_unit(b)
    if jog_after[a]:
        root_window.after_cancel(jog_after[a])
        jog_after[a] = None
        return
    b = b*vars.feedrate.get()/100.0
    jogincr = widgets.jogincr.get()
    if s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP:
        if jogincr != _("Continuous"):
            jogging[a] = 0
            print "WARNING: do not allow incremental jogging in TELEOP mode"
        else:
            jogging[a] = b
        jog_cont[a] = True
        cartesian_only=jogging[:6]
        c.teleop_vector(*cartesian_only)
    else:
        if jogincr != _("Continuous"):
            s.poll()
            if s.state != 1: return
            distance = parse_increment(jogincr)
            jog(linuxcnc.JOG_INCREMENT, a, b, distance)
            jog_cont[a] = False
        else:
            jog(linuxcnc.JOG_CONTINUOUS, a, b)
            jog_cont[a] = True
            jogging[a] = b

2.4. Pełny ekran

Wystarczy, że w pliku axis dodamy poniższą linijkę z rozdzielczością naszego monitora.

root_window.tk.call("wm","geometry",".","1920x1080")

lub jeśli zadziała (w starej wersji na Ubuntu):

maxgeo=root_window.tk.call("wm","maxsize",".")
fullsize=maxgeo.split(' ')[0] + 'x' + maxgeo.split(' ')[1]
root_window.tk.call("wm","geometry",".",fullsize)

3. Automatyczne uruchamianie

Wchodzimy w Programy/Ustawienia/Sesja i uruchamianie. Klikamy przycisk Dodaj, w nazwie wpisujemy co chcemy, np. LinuxCNC, a w poleceniu dodajemy ścieżkę do własnego pliku ini:

usr/bin/linuxcnc '/home/linuxcnc/linuxcnc/configs/Fox_conf/Fox_conf.ini'

lub jeśli nie zadziała (w przypadku LinuxCNC 2.7):

/usr/bin/linuxcnc '/home/linuxcnc/linuxcnc/configs/Fox_conf/Fox_conf.ini'

Ustawienie autouruchomienia w LinuxCNC

Zdj. 3. Ustawienie autouruchomienia w LinuxCNC

4. Autologin

Normalnie w Debianie nie mamy opcji w systemie ani przy instalacji wyłączenia autologinu. Musimy to zrobić ręcznie w pliku lightdm.conf, z uprawnieniami administratora oczywiście. Plik znajduje się w katalogu etc/lightdm/, tam szukamy sekcji [SeatDefaults]. Musimy odkomentować i dopisać naszą nazwę użytkownika tak jak poniżej:

autologin-user=linuxcnc
autologin-user-timeout=1

5. Instalacja potrzebnych programów

W Debianie nie mamy zainstalowanych podstawowych programów, takich jak kalkulator i dobry edytor plików. Aby zainstalować jakiś program, wchodzimy w Programy/Ustawienia/Synaptic Menedżer Pakietów. Musimy znać nazwę naszego programu, na przykład Qalculate (kalkulator) lub gedit (program do edycji tekstu). Klikamy ikonkę szukaj, wpisujemy nazwę programu, lewym klawiszem zaznaczamy pozycję do instalacji i zieloną fajeczką zapisujemy zmiany.

Zainstalowany kalkulator Qalculate!

Zdj. 5a. Zainstalowany program Qalculate

Okno Menedżera Pakietów Synaptic

Zdj. 5b. Menedżer Pakietów Synaptic

6. Wyłączenie wygaszacza ekranu

Jeżeli chcemy, aby nasza maszyna działała płynnie w przypadku, gdy ustawiamy mniejszą wartość odchylenia bazowego (jitter), wypada wyłączyć wygaszacz ekranu. U nas przy długich obróbkach i troszkę zaniżonej wartości jittera maszyna potrafiła się zawiesić i pojechać za daleko w pewnej osi. Należy wejść w Programy/Ustawienia/Wygaszacz ekranu, tam mamy opcję wyłączenia.

Ustawienia wygaszacza ekranu z wyłączonym wygaszaczem

Zdj. 6. Wyłączenie wygaszacza ekranu

7. Instalacja HeeksCAD w systemie LinuxCNC

HeeksCAD jest bardzo przydatnym i prostym programem do projektowania elementów oraz tworzenia g-code. Po instalacji w systemie LinuxCNC mamy możliwość wysłania stworzonego kodu jednym przyciskiem do maszyny. Jest to bardzo dobra alternatywa dla zakładek NGCGUI: dużo prościej stworzyć kod w HeeksCAD niż zaprogramować ręcznie kod do NGCGUI. Program niestety (przynajmniej na dzień dzisiejszy) będziemy musieli skompilować. Instrukcja jest dostępna na stronie: https://blog.cyplo.net/2015/05/28/cnc-workflow/. Poniżej znajduje się opis całej kompilacji.

Wysyłanie g-code do LinuxCNC w programie HeeksCAD

Zdj. 6. Wysyłanie g-code do LinuxCNC w programie HeeksCAD

Aktualizacja bibliotek:

sudo apt-get update

Instalacja potrzebnych bibliotek:

sudo apt-get install subversion build-essential debhelper cmake libboost-python-dev liboce-visualization-dev libwxgtk2.8-dev libgtkglext1-dev python-dev python-area bzr git libboost-dev liboce-ocaf2 liboce-ocaf-dev oce-draw

Utworzenie nowego katalogu o nazwie heekscad, domyślnie w /home:

mkdir heekscad

Wejście do katalogu heekscad:

cd heekscad

Pobranie źródeł:

svn checkout http://libarea.googlecode.com/svn/trunk/ libarea

Wejście do katalogu trunk:

cd libarea/trunk

Budowanie paczek z plikami:

dpkg-buildpackage -b -us -uc

Wyjście do poprzedniego folderu:

cd ..

Instalacja potrzebnych bibliotek:

sudo dpkg -i libarea*.deb python-area*.deb
cd ..

Pobranie źródeł HeeksCAD:

svn checkout http://heekscad.googlecode.com/svn/trunk/ heekscad
cd heekscad
sudo apt-get install wx2.8-i18n
cd ..

Instalacja HeeksCAD:

sudo dpkg -i *heeks*.deb

Instalacja HeeksCNC (na wcześniej zainstalowanym HeeksCAD):

svn checkout http://heekscnc.googlecode.com/svn/trunk/ heekscnc
cd heekscnc
dpkg-buildpackage -b -us -uc
cd ..
git clone https://github.com/aewallin/opencamlib.git
cd opencamlib
bzr branch lp:~neomilium/opencamlib/packaging debian
dpkg-buildpackage -b -us -uc -d
cd ..
sudo dpkg -i python-ocl*.deb
sudo dpkg -i heekscnc*.deb