FakeHome for GRBL

Rozmowy na temat układów elektronicznych sterowania obrabiarek CNC
Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 9320
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

FakeHome for GRBL

#1

Post napisał: tuxcnc » 16 gru 2021, 18:54

Zabierałem się do tematu jak pies do jeża, ale w końcu się zmobilizowałem.
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 ++;
    }  
}



Awatar użytkownika

gothye
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 1
Posty: 134
Rejestracja: 15 kwie 2009, 15:18
Lokalizacja: Płock

Re: FakeHome for GRBL

#2

Post napisał: gothye » 16 gru 2021, 19:38

Tak jak by nie można było po prostu w config.h zamiast

Kod: Zaznacz cały

#define homing_0 (1<<AXIS_Z)
#define homing_1 ((1<<AXIS_X) | (1<<AXIS_Y)
zrobić

Kod: Zaznacz cały

#define homing_0 ((1<<AXIS_X) | (1<<AXIS_Y)
i oś Z nie jest bazowana

https://github.com/bdring/Grbl_Esp32

Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 9320
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: FakeHome for GRBL

#3

Post napisał: tuxcnc » 16 gru 2021, 19:51

gothye pisze:
16 gru 2021, 19:38
Tak jak by nie można było po prostu w config.h zamiast

Kod: Zaznacz cały

#define homing_0 (1<<AXIS_Z)
#define homing_1 ((1<<AXIS_X) | (1<<AXIS_Y)
zrobić

Kod: Zaznacz cały

#define homing_0 ((1<<AXIS_X) | (1<<AXIS_Y)
i oś Z nie jest bazowana

https://github.com/bdring/Grbl_Esp32
Lepiej by było, gdybyś czytał posty na które odpowiadasz.


Steryd
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 4391
Rejestracja: 13 lut 2017, 19:34
Lokalizacja: Szczecin

Re: FakeHome for GRBL

#4

Post napisał: Steryd » 16 gru 2021, 20:09

Wiesz, za cenę tego arduinowego klona i meczarni pewnie byś kupił stepsticka, mini silniczek z drukarki i kawałek krzywki z druta, albo drukarki 3D, żeby to udawało oś.
Można?
Morzna!!!

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 4463
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

Re: FakeHome for GRBL

#5

Post napisał: pitsa » 16 gru 2021, 20:31

tuxcnc pisze:coś mi nie pasuje, jakby gubił zliczane impulsy

Może wewnętrzny pullup jest za mały i łapie zakłócenia?
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ

Awatar użytkownika

TOP67
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 2224
Rejestracja: 17 wrz 2018, 10:47
Lokalizacja: Wrocław
Kontakt:

Re: FakeHome for GRBL

#6

Post napisał: TOP67 » 16 gru 2021, 20:37

Steryd pisze:
16 gru 2021, 20:09
Wiesz, za cenę tego arduinowego klona i meczarni pewnie byś kupił stepsticka, mini silniczek z drukarki i kawałek krzywki z druta, albo drukarki 3D, żeby to udawało oś.
Wystarczy mikroprzełącznik, który trzeba 2 razy nacisnąć w odpowiednim odstępie.

Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 9320
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: FakeHome for GRBL

#7

Post napisał: tuxcnc » 16 gru 2021, 20:51

Steryd pisze:
16 gru 2021, 20:09
Wiesz, za cenę tego arduinowego klona i meczarni pewnie byś kupił stepsticka, mini silniczek z drukarki i kawałek krzywki z druta, albo drukarki 3D, żeby to udawało oś.
No niezupełnie.
Chodzi o to, że na przykład możesz przez pomyłkę zrobić jog w osi Z. Nie powinno to powodować najechania na krańcówkę, nie ważne czy rzeczywistą czy wirtualną. Dlatego u mnie trzeba przejechać sporo żeby układ zadziałał, nie ważne skąd się zacznie.
Cenowo też w najlepszym razie na jedno wyjdzie.
Co prawda chińskie Nano kosztuje około 20 PLN, ale nikt Ci nie broni użyć tańszego układu, bo to poniżej kilobajta kodu i jeden pin przerwania zewnętrznego, na wewnętrznym rezonatorze też pójdzie.
Znalazłem dzisiaj taki fajny filmik o bazowaniu w GRBL.
Warto zauważyć, że kilka parametrów jest współdzielonych i nie da się ich ustawić dla każdej osi osobno...


Dodane 3 minuty 56 sekundy:
TOP67 pisze:
16 gru 2021, 20:37
Wystarczy mikroprzełącznik, który trzeba 2 razy nacisnąć w odpowiednim odstępie.
W teorii.
W praktyce trzeba dobrze ucelować.
Zresztą o tak hardkorowych rozwiązaniach nie warto nawet rozmawiać.

Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 9320
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: FakeHome for GRBL

#8

Post napisał: tuxcnc » 17 gru 2021, 20:21

Wykombinowałem drugie Nano.
Udawacze wpiąłem w osie X i Y, zetkę zerowałem ręcznie.
Wychodzi na to, że udawane bazowanie trwa około czterech sekund.
Nie pytajcie dlaczego, bo nie mam pojęcia.

Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 9320
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: FakeHome for GRBL

#9

Post napisał: tuxcnc » 24 gru 2021, 16:40

tuxcnc pisze:
16 gru 2021, 20:51
TOP67 pisze:
16 gru 2021, 20:37
Wystarczy mikroprzełącznik, który trzeba 2 razy nacisnąć w odpowiednim odstępie.
W teorii.
W praktyce trzeba dobrze ucelować.
Potwierdziłem to w praktyce.
Do pewnych testów potrzebowałem układu udającego wszystkie krańcówki, więc postanowiłem zrobić na Arduino Nano układ wystawiający trzy sygnały HOME w odpowiednich przedziałach czasowych.
Po prostu, po wydaniu polecenia $H w programie sterującym naciska się RESET w udawaczu, który wydaje sygnały w odpowiednim porządku, po czym zawiesza się w martwej pętli.
Niby proste, ale namęczyłem się jak diabli.
Z osią Z żaden problem, ale X i Y nie chciały się bazować za żadną cholerę.
No po prostu sygnały X i Y nie trafiały w te momenty, kiedy GRBL ich oczekiwał...
W końcu zrezygnowałem z osobnych sekwencji dla X i Y, sygnały są wystawiane równocześnie, tak jakby najazd na obie krańcówki odbywał się w tym samym momencie.
Pomiędzy zbazowaniem osi Z a X i Y jest cztery sekundy opóźnienia. Nie pytajcie dlaczego i co GRBL w tym czasie robi, bo nie wiem i nie chce mi się tego dochodzić.
Ogólnie, to wartości opóźnień zależą od wartości niektórych parametrów $ w GRBL. Te które są tutaj powinny działać z domyślnymi wartościami.

Kod: Zaznacz cały

// Pins :
// D2 homeZ
// D3 homeX
// D4 homeY

void setup() {  
  PORTD |= 0b00011100;
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  delay(1000);
// homeZ  
  PORTD &= 0b11111000;
  delay(300);
  PORTD |= 0b00011100;
  delay(1000);
  PORTD &= 0b11111000;
  delay(300);
  PORTD |= 0b00011100;
  delay(4000);
// homeX, homeY  
  PORTD &= 0b11100100;
  delay(300);
  PORTD |= 0b00011100;
  delay(1000);
  PORTD &= 0b11100100;
  delay(300);
  PORTD |= 0b00011100;
}

void loop() {
  // do nothing
}

Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 9320
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: FakeHome for GRBL

#10

Post napisał: tuxcnc » 26 gru 2021, 16:45

Ostatecznie padło na ATTiny13.
Nawet nie o to chodzi żeby było kilka PLN taniej, ile o to żeby użyć gołego scalaka z wewnętrznym rezonatorem i zaoszczędzić sporo miejsca.
Trzeba doinstalować "płytki" MicroCore i użyć programatora, może być USBAsp albo Nano/Uno z wgranym ISP.
ATTiny13 ma raptem 1 kB pamięci programu, dlatego program wygląda zupełnie inaczej, bo z zasady nie używa się gotowych bibliotek.
Nawiasem mówiąc, program na ATTiny13 zajmuje 158 bajtów kodu, a robiący to samo program na ATMegę358 888 bajtów kodu. Warto o tym wiedzieć, że samo użycie funkcji setup() i loop() to 444 bajty kodu...

Kod: Zaznacz cały

#define F_CPU 9600000         // clock 9.6 MHz, internal oscillator
volatile int count=0;
#define HOME PB2              // PB2 as HOME output
                              // PB1 as STEP input
                              // PB0 as DIR input
int main(void) {
  
GIMSK |= _BV (INT0);           // Enable external interrupts INT0
MCUCR |= _BV (ISC01);          // PCINT0 is triggered on rising
MCUCR |= _BV (ISC00);          // PCINT0 is triggered on rising
sei();                         // Global enable interrupts
DDRB |= (1 << HOME);           // Set direction register output
PORTB |= B00000100;            // set HOME to high

for (;;) {                     // loop (endless)     
    if (count > 1000){
    PORTB &= B11111011;        // set HOME to low    
    }
  }
}

ISR (INT0_vect)                 // INT0 interrupt vector
{ 
  if  (PINB & B00000001){
    count = 0;
    PORTB |= B00000100;         // set HOME to high
    }
  else{
    count ++;
    }  
}

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Elektronika CNC”