Problem w skrócie polega na tym, że niektóre maszyny nie mają osi Z, natomiast prekompilowany firmware GRBL zwykle ma. W efekcie nie można korzystać z bazowania, nawet jeśli krańcówki są zamontowane, bo GRBL najpierw będzie próbował zbazować nieistniejącą oś Z i wywali błąd. W prostych sterowaniach można sobie skompilować własny firmware, wprowadzając zmiany w pliku config, ale w bardziej skomplikowanych stracimy wiele użytecznych funkcji jeśli nie mamy kodu źródłowego od producenta sprzętu. Właśnie zakupiłem sobie Makerbase MKS DLC32 za prawie 90 PLN i mówiąc w przenośni walnąłem głową w ścianę. Bardzo fajny sprzęt na procesorze ESP32, z obsługą karty SD, wbudowanym serwerem wi-fi umożliwiającym podstawową obsługę poprzez smartfona, możliwością podłączenia wyświetlacza dotykowego, ale do mojego lasera CO2 nie podpasuje, bo albo zrezygnuję ze sprzętowego bazowania, albo z większości użyteczności, bo kod źródłowy od bajerów jest niedostępny...
Tak więc wziąłem się wreszcie za projekt który od kilku lat chodził mi po głowie, czyli udawaną krańcówkę na chińskim klonie Arduino Nano.
Wbrew pozorom sprawa nie jest prosta, bo krańcówka to wiadomo, jak się ją najedzie to prztyknie, a układ elektroniczny musi się domyślać nie tylko gdzie jest nieistniejąca oś, ale też czy jest wykonywany cykl bazowania, czy też inny, przypadkowy ruch.
Najpierw miało być ortodoksyjnie, z użyciem sprzętowego licznika, ale doszedłem do wniosku że zacznę od partactwa i zobaczę czy przypadkiem nie spełni oczekiwań.
Algorytm jest taki, że jeżeli ruch jest "w kierunku krańcówki" to są zliczane impulsy STEP korzystając z przerwania zewnętrznego. Jeśli natomiast wirtualny ruch odbywa się w przeciwnym kierunku, to licznik jest zerowany.
Dzięki temu krótkie ruchy w osi Z są ignorowane, dopiero gdy uzbiera się odpowiednio dużo impulsów STEP wystawiany jest sygnał udający zadziałanie krańcówki. Jeśli dzieje się to w cyklu bazowania, to GRBL sam odjeżdża, czyli zeruje licznik, a potem znowu szuka krańcówki i znowu odjeżdża zerując licznik.
Małe ruchy góra/dół w osi Z w czasie pracy są ignorowane, bo nie przepełnią licznika.
Na początku były dwie procedury sprawdzające stan licznika w zależności czy był to pierwszy czy drugi najazd na krańcówkę, ale wywaliłem to żeby program był bardziej czytelny i mniej awaryjny.
Na razie sprawdziłem tylko na sucho, podłączając dwa gołe Arduino do komputera z bCNC.
Zachwycony nie jestem, coś mi nie pasuje, jakby gubił zliczane impulsy, ale zasadniczo chyba działa, czego do końca nie mogę sprawdzić, bo nie mam trzech wolnych Nano żeby podpiąć na wszystkie osie.
Można pokombinować z ustawieniami osi Z w GRBL, żeby zmniejszyć częstotliwość impulsów STEP, ale dzisiaj już mi się nie chce.
Kod: Zaznacz cały
volatile int count=0;
void setup() {
pinMode(2, INPUT_PULLUP); // DIR pin
pinMode(3, INPUT_PULLUP); // STEP pin
pinMode(4, OUTPUT); // HOME pin
attachInterrupt(digitalPinToInterrupt(3), pulse, RISING);
PORTD |= B00010000; // set HOME to high
}
void loop() {
if (count > 1000){
PORTD &= B11101111; // set HOME to low
}
}
void pulse(){
if (PIND & B00000100){
count = 0;
PORTD |= B00010000;// set HOME to high
}
else{
count ++;
}
}