Rzeczy do zrobienia po instalacji LinuxCNC

Spis treści
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
#==================================================

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'

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.

Zdj. 5a. Zainstalowany program Qalculate

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.

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.

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
