LinuxCNC - jak podłączyć wszystkie czujniki bazowania oraz krańcowe do jednego pinu LPT
: 25 lut 2024, 18:56
Post ma charakter instrukcji, jak podłączyć wiele czujników z kilku osi pod jeden pin LPT.
Korzystając z Portu LPT, jeśli chodzi o wejścia to nie ma czym szastać. Najczęściej port skonfigurowany jest w tryb OUT co daje 12 wyjść i 5 wejść. Mając kilka osi, szkoda marnować na każdą oś osobnego pinu na czujniki krańcowe i czujnik bazowania. Można podłączyć je wszystkie pod jeden pin.
Rozwiązanie to daje dwie małe niedogodności:
-nie można bazować kilku osi jednocześnie, osie muszą bazować się sekwencyjnie, ale w zdecydowanej większości przypadków nie będzie to żadnym problemem (bazowanie wykonuje się raz na początku pracy, jeśli będzie ono trwać 15 sekund zamiast 5 to raczej nikt nawet nie zauważy)
-W przypadku najechania osią na czujnik krańcowy, linuxcnc zgłosi błąd ale nie będzie informacji która to oś (ponieważ zgłosi wszystkie) Ale z drugiej strony, komunikat wygląda tak:Napęd 1 na krańcówce awaryjnej więc
i tak nigdy nie pamiętamy czy napęd 0 to jest X, czy y czy może inna oś, więc w zasadzie ta informacja nie jest niezbędna
Zaleta zaś jest ogromna - można bazować nawet 4, 5, 6 osi a zużyte jest do tego tylko jedno wejście.
Noto do dzieła.
Poszukałem co na ten temat mówi LinuxCNC:
http://linuxcnc.org/docs/devel/html/con ... _is_shared
Po pierwsze, musi być włączona opcja HOME_IGNORE_LIMITS ponieważ skoro czujnik bazowania jest na tym samym wejściu co krańcowy (u mnie to jeden czujnik) to w momencie bazowania, linuxcnc zgłaszałby najechanie na czujnik krańcowy.
Dalej, interesuje nas możliwość podłączenia wiele czujników z różnych osi pod jedno wejście. Dokumentacja mówi tylko tyle (a przynajmniej tyle znalazłem):
Czyli, przykładowo u mnie mam 2 osie X oraz Z, sygnał bazowania/krańcowy dla osi Z może być równy 1 tylko wtedy, gdy oś X nie jest aktualnie bazowana. I odwrotnie, dla osi Z.
Użyłem do tego komponentu and2 oraz not.
not służy do odwróceniu sygnału mówiącego o trwającym bazowaniu drugiej osi.
komponent and2 ma na wejścia podłączone wyjście komponentu not oraz wejście z czujników.
Innymi słowy:
Dla osi Z pojawi się sygnał zadziałania krańcówki tylko wtedy, gdy na pinie czujników pojawi się sygnał oraz jednocześnie oś X nie jest w tym momencie bazowana.
Dla osi X pojawi się sygnał zadziałania krańcówki tylko wtedy, gdy na pinie czujników pojawi się sygnał oraz jednocześnie oś Z nie jest w tym momencie bazowana.
A oto kod konfiguracji hal:
Noi oczywiście w pliku ini trzeba ustawić dla poszczególnych napędów sekwencję bazowania HOME_SEQUENCE tak aby aby osie bazowały się sekwencyjnie.
Może można prościej, ja zrobiłem w ten sposób i działa.
Dzielę się, może się komuś przyda.
Korzystając z Portu LPT, jeśli chodzi o wejścia to nie ma czym szastać. Najczęściej port skonfigurowany jest w tryb OUT co daje 12 wyjść i 5 wejść. Mając kilka osi, szkoda marnować na każdą oś osobnego pinu na czujniki krańcowe i czujnik bazowania. Można podłączyć je wszystkie pod jeden pin.
Rozwiązanie to daje dwie małe niedogodności:
-nie można bazować kilku osi jednocześnie, osie muszą bazować się sekwencyjnie, ale w zdecydowanej większości przypadków nie będzie to żadnym problemem (bazowanie wykonuje się raz na początku pracy, jeśli będzie ono trwać 15 sekund zamiast 5 to raczej nikt nawet nie zauważy)
-W przypadku najechania osią na czujnik krańcowy, linuxcnc zgłosi błąd ale nie będzie informacji która to oś (ponieważ zgłosi wszystkie) Ale z drugiej strony, komunikat wygląda tak:Napęd 1 na krańcówce awaryjnej więc
i tak nigdy nie pamiętamy czy napęd 0 to jest X, czy y czy może inna oś, więc w zasadzie ta informacja nie jest niezbędna
Zaleta zaś jest ogromna - można bazować nawet 4, 5, 6 osi a zużyte jest do tego tylko jedno wejście.
Noto do dzieła.
Poszukałem co na ten temat mówi LinuxCNC:
http://linuxcnc.org/docs/devel/html/con ... _is_shared
Po pierwsze, musi być włączona opcja HOME_IGNORE_LIMITS ponieważ skoro czujnik bazowania jest na tym samym wejściu co krańcowy (u mnie to jeden czujnik) to w momencie bazowania, linuxcnc zgłaszałby najechanie na czujnik krańcowy.
Dalej, interesuje nas możliwość podłączenia wiele czujników z różnych osi pod jedno wejście. Dokumentacja mówi tylko tyle (a przynajmniej tyle znalazłem):
postanowiłem wykorzystać piny joint.X.homing (mówiące o tym, że dana oś jest aktualnie bazowana) aby wykluczyć działanie czujnika na innej osi.To use only one input for all homing and limits you will have to block the limit signals of the joints not homing in HAL and home one joint at a time.
Czyli, przykładowo u mnie mam 2 osie X oraz Z, sygnał bazowania/krańcowy dla osi Z może być równy 1 tylko wtedy, gdy oś X nie jest aktualnie bazowana. I odwrotnie, dla osi Z.
Użyłem do tego komponentu and2 oraz not.
not służy do odwróceniu sygnału mówiącego o trwającym bazowaniu drugiej osi.
komponent and2 ma na wejścia podłączone wyjście komponentu not oraz wejście z czujników.
Innymi słowy:
Dla osi Z pojawi się sygnał zadziałania krańcówki tylko wtedy, gdy na pinie czujników pojawi się sygnał oraz jednocześnie oś X nie jest w tym momencie bazowana.
Dla osi X pojawi się sygnał zadziałania krańcówki tylko wtedy, gdy na pinie czujników pojawi się sygnał oraz jednocześnie oś Z nie jest w tym momencie bazowana.
A oto kod konfiguracji hal:
Kod: Zaznacz cały
#Tworzy dwa komponenty and2 oraz 2 komponenty not
loadrt and2 count=2
addf and2.0 servo-thread
addf and2.1 servo-thread
loadrt not count=2
addf not.0 servo-thread
addf not.1 servo-thread
#Tworzy sygnał both-home-xz i podłącza do niego pin 11 (jako wejście bazujące i krańcowe dla osi x oraz z):
net both-home-xz <= parport.0.pin-11-in-not
#Tworzy sygnały (flagi) informujące o bazowaniu danej osi
net x_is_homing <= joint.0.homing
net z_is_homing <= joint.1.homing
#Podłącza do inwerterów sygnały informujące, że dana oś jest aktualnie bazowana
net x_is_homing => not.0.in
net z_is_homing => not.1.in
#podłącza do komponentów and2 (wejścia 0) sygnał both-home-xz
net both-home-xz => and2.0.in0
net both-home-xz => and2.1.in0
#Tworzy sygnały wyjściowe inwerterów
net not_0_out <= not.0.out
net not_1_out <= not.1.out
#podłącza do komponentów and2 (wejścia 1) zanegowany sygnał o bazowanu osi
net not_0_out => and2.0.in1
net not_1_out => and2.1.in1
#tworzy sygnały wyjściowe z komponentów and2
net and2_0_out <= and2.0.out
net and2_1_out <= and2.1.out
#podłącza sygnałe wyjście komponentu and2.1 na wejście bazujące i krańcowe x
net and2_1_out => joint.0.home-sw-in
net and2_1_out => joint.0.neg-lim-sw-in
net and2_1_out => joint.0.pos-lim-sw-in
#podłącza wyjście komponentu and2.0 na wejście bazujące i krańcowe z
net and2_0_out => joint.1.home-sw-in
net and2_0_out => joint.1.neg-lim-sw-in
net and2_0_out => joint.1.pos-lim-sw-in
Może można prościej, ja zrobiłem w ten sposób i działa.
Dzielę się, może się komuś przyda.