Cześć
Chciałbym przedstawić kolejny mój projekt, tym razem jest to sterownik CNC.
Jest już na rynku masa różnego rodzaju sterowników obrabiarek CNC, jak zwykle jednak chciałem zrobić coś własnego.
Najważniejsze założenia projektowe:
- Umiejscowienie całości kluczowych czasowo operacji w module wykonawczym.
- Połączenie modułu z PC przy użyciu interfejsu ethernet.
- Współbieżna obsługa 4 osi z możliwością rozszerzenia do 5.
- Możliwość w przyszłości dodania obsługi enkoderów na osiach.
- Sterowanie falownikiem z regulacją obrotów.
- Aplikacja na PC pracująca w środowisku Windows.
Zdecydowałem się na użycia mikrokontrolera STM32H725 - mocny, ma dużo liczników i w przystępnej cenie.
Standardowo już użyłem systemu FreeRTOS i bibliotek które juz we wcześniejszych projektach stosowałem. Najważniejszym dla mnie było generowanie impulsów sterujących przy maksymalnym wykorzystaniu zasobów sprzętowych w celu uzyskania jak największej stabilności czasowej.
W tym celu zastosowałem szeregowe połączenie liczników, master służy do generowania sygnału o zmiennej częstotliwości co odpowiada szybkości przesuwu, sygnał ten następnie napędza zestaw liczników - po jednym dla każdej osi, oraz dodatkowo jeden synchronizujący.
W ten sposób uzyskałem łatwy podział miedzy kierunkiem a szybkością ruchu. Polega to na ustawieniu dla danego odcinka ruchu odpowiednio rejestrów ARR i PSC dla każdego licznika osi oraz liczniku synchronizującym. W efekcie uzyskujemy określoną liczbę impulsów dla każdej osi.
Licznikiem master natomiast możemy dowolnie sterować prędkością pokonywania tego odcinka. Dzięki użyciu trybu preload dla liczników uzyskujemy możliwość załadowania parametrów następnego odcinka zanim bieżący się skończy - ładujemy nowe wartości w przerwaniu między ostatnim impulsem a końcem odcinka.
W efekcie odcinki są wykonywane bez jakichkolwiek zaburzeń czasowych.
Moduł otrzymuje z PC proste rozkazy, czyli tylko odcinki i łuki, wszystko już we współrzędnych maszynowych. Następnie łuki są dzielone na krótkie odcinki, i wraz z prostymi odcinkami są przeliczane na ustawienia rejestrów i buforowane.
Każdy odcinek ma również wyliczone wcześniej prędkość początkową, końcową i maksymalną.
Oprogramowanie na PC postanowiłem napisać w C# .net Windows Forms, w środowisku Visual Studio. Wybór ten wynikał z prostoty pisania rozbudowanej aplikacji z GUI i jednocześnie brakiem konieczności wykonywania krytycznych czasowo operacji.
Głównym zdaniem tej aplikacji jest parsowanie kodu G-Code i przetwarzanie do prostych poleceń wysyłanych do modułu zewnętrznego.
Przetwarzanie składa się z kilku etapów, pierwszym jest konwersja kodu G-code ze stringa do tablicy poleceń, jest na tym etapie sprawdzana poprawność składni, np czy wszystkie polecenia są obsługiwane, zmienne zdefiniowane a pętle i wyrazenia warunkowe odpowiednio pozamykane.
Kolejnym etapem jest przetwarzanie poleceń do postaci proste - wyliczane są wyrażenia matematyczne, wykonywane pętle i podprogramy. Na tym etapie również wyliczana jest maksymalna prędkość dla każdego prostego polecenia (odcinki i łuki). Wyliczone fragmenty są umieszczane w buforze fifo.
Ostatnim etapem jest skanowanie bufora fifo w celu wyliczenia dozwolonej prędkości przy przechodzeniu między segmentami przy uwzględnieniu kąta miedzy tymi segmentami, odległości do końca bufora i dozwolonych przyspieszeń. Po wyliczeniu szybkości początkowej i końcowej
segmenty są już pakowane i wysyłane do modułu sterującego.
Program obsługuje większość standardowych wyrażeń G-Code, ponadto dodałem nowy kody G2.1 i G3.1 - realizują one łuki w dowolnej płaszczyźnie równoległej do osi Z - przydatne np przy frezowaniu dekorów.
Drugą funkcjonalnością dodatkową jest automatyczny pomiar nierówności powierzchni - sondowany jest zadany obszar a zmierzona siatka poprawek jest przesyłana do modułu wykonawczego. Poprawki te są następnie uwzględniane przy wszystkich ruchach w tym obszarze. Funkcja powstała z
myślą o precyzyjnym frezowaniu płytek PCB ale można jej użyć również do grawerowania.
Sterownik działa stabilnie, używam go od jakiegoś czasu w swojej frezarce i jestem z niego zadowolony. Przy użyciu biblioteki MONO aplikacja uruchamia się również na linuksie z ograniczoną funkcjonalnością - nie działa tylko wizualizacja 3D.
Co zrobiłbym inaczej:
W zasadzie chyba tylko drobne poprawki w PCB, obwód od krańcówek możnaby ulepszyć i może rozważyć całkowicie sprzętową obsługę emergency stop i hard limit, z pominięciem uC ale to już dmuchanie na zimne.
Co jeszcze chciałbym zrobić:
Przede wszystkim jako że często piszę kod ręcznie chciałbym poprawić edytor kodu, dodać kolorowanie składni, skróty klawiszowe itp. Drugą rzeczą do poprawy jest wizualizacja 3D - na razie jest dość toporna.
Rozważam też inne podejście, czyli zastąpienie mojej aplikacji na PC jakąś wtyczką do LinuxCNC, natomiast na razie nie wiem jeszcze czy to jest możliwe i jak się za to zabrać ale może kiedyś w to popatrzę.
Program powstawał z myślą o konkretnej płytce PCB, ale nic nie stoi na przeszkodzie żeby uruchomić go na innym sprzęcie, np na jakimś EVM jako że na PCB w zasadzie poza uC są tylko bufory i izolatory na wejściach i wyjściach więc do eksperymentów można je pominąć. Można też próbować użyć innego uC, ważne jest przede wszystkim żeby dysponował odpowiednią ilością liczników - 1 master + 1 slave 32bit + Ilość osi x 1slave + 2 (sterowanie szybkością i i HAL). Wysoce wskazane jest te zeby posiadał FPU jako że spora część obliczeń, przede wszystkim prędkość i konwersja łuków na odcinki, jest właśnie realizowana na zmiennych float.
Kod i wzór PCB w formacie KiCAD: https://github.com/r-gal/CNC
Program sterujący na PC : https://github.com/r-gal/CNC_app
Chciałbym przedstawić kolejny mój projekt, tym razem jest to sterownik CNC.
Jest już na rynku masa różnego rodzaju sterowników obrabiarek CNC, jak zwykle jednak chciałem zrobić coś własnego.
Najważniejsze założenia projektowe:
- Umiejscowienie całości kluczowych czasowo operacji w module wykonawczym.
- Połączenie modułu z PC przy użyciu interfejsu ethernet.
- Współbieżna obsługa 4 osi z możliwością rozszerzenia do 5.
- Możliwość w przyszłości dodania obsługi enkoderów na osiach.
- Sterowanie falownikiem z regulacją obrotów.
- Aplikacja na PC pracująca w środowisku Windows.
Zdecydowałem się na użycia mikrokontrolera STM32H725 - mocny, ma dużo liczników i w przystępnej cenie.
Standardowo już użyłem systemu FreeRTOS i bibliotek które juz we wcześniejszych projektach stosowałem. Najważniejszym dla mnie było generowanie impulsów sterujących przy maksymalnym wykorzystaniu zasobów sprzętowych w celu uzyskania jak największej stabilności czasowej.
W tym celu zastosowałem szeregowe połączenie liczników, master służy do generowania sygnału o zmiennej częstotliwości co odpowiada szybkości przesuwu, sygnał ten następnie napędza zestaw liczników - po jednym dla każdej osi, oraz dodatkowo jeden synchronizujący.
W ten sposób uzyskałem łatwy podział miedzy kierunkiem a szybkością ruchu. Polega to na ustawieniu dla danego odcinka ruchu odpowiednio rejestrów ARR i PSC dla każdego licznika osi oraz liczniku synchronizującym. W efekcie uzyskujemy określoną liczbę impulsów dla każdej osi.
Licznikiem master natomiast możemy dowolnie sterować prędkością pokonywania tego odcinka. Dzięki użyciu trybu preload dla liczników uzyskujemy możliwość załadowania parametrów następnego odcinka zanim bieżący się skończy - ładujemy nowe wartości w przerwaniu między ostatnim impulsem a końcem odcinka.
W efekcie odcinki są wykonywane bez jakichkolwiek zaburzeń czasowych.
Moduł otrzymuje z PC proste rozkazy, czyli tylko odcinki i łuki, wszystko już we współrzędnych maszynowych. Następnie łuki są dzielone na krótkie odcinki, i wraz z prostymi odcinkami są przeliczane na ustawienia rejestrów i buforowane.
Każdy odcinek ma również wyliczone wcześniej prędkość początkową, końcową i maksymalną.
Oprogramowanie na PC postanowiłem napisać w C# .net Windows Forms, w środowisku Visual Studio. Wybór ten wynikał z prostoty pisania rozbudowanej aplikacji z GUI i jednocześnie brakiem konieczności wykonywania krytycznych czasowo operacji.
Głównym zdaniem tej aplikacji jest parsowanie kodu G-Code i przetwarzanie do prostych poleceń wysyłanych do modułu zewnętrznego.
Przetwarzanie składa się z kilku etapów, pierwszym jest konwersja kodu G-code ze stringa do tablicy poleceń, jest na tym etapie sprawdzana poprawność składni, np czy wszystkie polecenia są obsługiwane, zmienne zdefiniowane a pętle i wyrazenia warunkowe odpowiednio pozamykane.
Kolejnym etapem jest przetwarzanie poleceń do postaci proste - wyliczane są wyrażenia matematyczne, wykonywane pętle i podprogramy. Na tym etapie również wyliczana jest maksymalna prędkość dla każdego prostego polecenia (odcinki i łuki). Wyliczone fragmenty są umieszczane w buforze fifo.
Ostatnim etapem jest skanowanie bufora fifo w celu wyliczenia dozwolonej prędkości przy przechodzeniu między segmentami przy uwzględnieniu kąta miedzy tymi segmentami, odległości do końca bufora i dozwolonych przyspieszeń. Po wyliczeniu szybkości początkowej i końcowej
segmenty są już pakowane i wysyłane do modułu sterującego.
Program obsługuje większość standardowych wyrażeń G-Code, ponadto dodałem nowy kody G2.1 i G3.1 - realizują one łuki w dowolnej płaszczyźnie równoległej do osi Z - przydatne np przy frezowaniu dekorów.
Drugą funkcjonalnością dodatkową jest automatyczny pomiar nierówności powierzchni - sondowany jest zadany obszar a zmierzona siatka poprawek jest przesyłana do modułu wykonawczego. Poprawki te są następnie uwzględniane przy wszystkich ruchach w tym obszarze. Funkcja powstała z
myślą o precyzyjnym frezowaniu płytek PCB ale można jej użyć również do grawerowania.
Sterownik działa stabilnie, używam go od jakiegoś czasu w swojej frezarce i jestem z niego zadowolony. Przy użyciu biblioteki MONO aplikacja uruchamia się również na linuksie z ograniczoną funkcjonalnością - nie działa tylko wizualizacja 3D.
Co zrobiłbym inaczej:
W zasadzie chyba tylko drobne poprawki w PCB, obwód od krańcówek możnaby ulepszyć i może rozważyć całkowicie sprzętową obsługę emergency stop i hard limit, z pominięciem uC ale to już dmuchanie na zimne.
Co jeszcze chciałbym zrobić:
Przede wszystkim jako że często piszę kod ręcznie chciałbym poprawić edytor kodu, dodać kolorowanie składni, skróty klawiszowe itp. Drugą rzeczą do poprawy jest wizualizacja 3D - na razie jest dość toporna.
Rozważam też inne podejście, czyli zastąpienie mojej aplikacji na PC jakąś wtyczką do LinuxCNC, natomiast na razie nie wiem jeszcze czy to jest możliwe i jak się za to zabrać ale może kiedyś w to popatrzę.
Program powstawał z myślą o konkretnej płytce PCB, ale nic nie stoi na przeszkodzie żeby uruchomić go na innym sprzęcie, np na jakimś EVM jako że na PCB w zasadzie poza uC są tylko bufory i izolatory na wejściach i wyjściach więc do eksperymentów można je pominąć. Można też próbować użyć innego uC, ważne jest przede wszystkim żeby dysponował odpowiednią ilością liczników - 1 master + 1 slave 32bit + Ilość osi x 1slave + 2 (sterowanie szybkością i i HAL). Wysoce wskazane jest te zeby posiadał FPU jako że spora część obliczeń, przede wszystkim prędkość i konwersja łuków na odcinki, jest właśnie realizowana na zmiennych float.
Kod i wzór PCB w formacie KiCAD: https://github.com/r-gal/CNC
Program sterujący na PC : https://github.com/r-gal/CNC_app
Fajne? Ranking DIY