wieslawbarek pisze:Przez przypadek znalazłem cos takiego
http://www.machsupport.com/forum/index. ... ic=11422.0
właśnie o takie coś mi chodzi
wieslawbarek pisze:Przez przypadek znalazłem cos takiego
http://www.machsupport.com/forum/index. ... ic=11422.0
ruchy w programie realizuje ten sam mechanizm więc pozycja jest z tą samą dokładnością jak reszta.andrzej31-91 pisze:wydaje mi się że prędzej G28 tylko na ile ono będzie precyzyjne
Mach potrzebuje długiej krańcówki, indeks jest szpilką i Mach go nie obsłuży. Potrzebujesz dodatkowej płytki która zatrzaśnie się na indeksie - Mach wtedy widzi to jak krańcówkę i odwróci kierunek ruch aby z niej zejść - a płytka sterowana sygnałem DIR osi obrotowej "odtrzaśnie" się po ponownym impulsie zera enkodera. Aby nie było bałaganu tą płytkę powinieneś aktywować gdy faktycznie chcesz pozycjonowania - czyli dodatkowe wyjście w Machu. W normalnej pracy nie będziesz wiedział jaki jest jej stan i czasem byś trafił na komunikaty że na krańcówce Mach stoi co utrudni jednoznaczne działanie programowego przejścia z kręcenia tokarką na kręcenie 4osią (programowo wstawiasz makro które dodatkowym wyjściem kasuje stan płytki, wywołuje pozycjonowanie osi obrotowej a gdy zgaśnie czerwony led i zapala się zielony to puszcza program dalej)andrzej31-91 pisze: ↑07 lis 2024, 17:36czy oś dojedzie di punktu index bo właśnie tak bym to chciał rozwiązać używając sygnału index z serwa
To jest typowy problem i w Linuxcnc miałem to samo.andrzej31-91 pisze: ↑07 lis 2024, 17:36Bawiłem się właśnie w taki sposób gdzie serwo jest sterowane za pomocą sygnału krok/kierunek.
I problem jest taki że gdy serwo pracuje jako 4ta oś mach wie w jakiej jest pozycji (kąt) natomiast gdy przejdziemy na toczenie to mach przestaje "zliczać" o jaki kąt oś została obrócona.
Kod: Zaznacz cały
#define forward_pin 5
#define reverse_pin 6
#define dir_pin 3
#define step_pin 4
#define encA_pin 0
#define encB_pin 1
#define encZ_pin 2
#define steplen 8 //increase for lower rpm
#define microstep 16 //as at driver
#define cpr 200*microstep
uint8_t dir = 0;
uint8_t speed = 0;
uint8_t cmd = 0;
uint8_t enc = 0;
int16_t enc_count = 0;
bool enc_A[4] = {0,0,1,1};
bool enc_B[4] = {0,1,1,0};
void setup() {
pinMode(forward_pin, INPUT_PULLDOWN);
pinMode(reverse_pin, INPUT_PULLDOWN);
pinMode(dir_pin, OUTPUT);
pinMode(step_pin, OUTPUT);
pinMode(encA_pin, OUTPUT);
pinMode(encB_pin, OUTPUT);
pinMode(encZ_pin, OUTPUT);
}
void loop() {
while (speed == 0){
if (digitalRead(forward_pin)){
dir = 1;
speed = 1;
digitalWrite(dir_pin, 1);
}
if (digitalRead(reverse_pin)){
dir = 2;
speed = 1;
digitalWrite(dir_pin, 0);
}
}
digitalWrite(step_pin, 1);
delayMicroseconds(steplen);
digitalWrite(step_pin, 0);
delayMicroseconds((256*steplen) - (steplen*speed));
if (dir == 1) {
enc++;
enc_count++;
if (enc_count > (cpr - 1)) {enc_count = 0;}
digitalWrite(encA_pin, enc_A[(enc & 3)]);
digitalWrite(encB_pin, enc_B[(enc & 3)]);
}
if (dir == 2) {
enc--;
enc_count--;
if (enc_count < 0) {enc_count = (cpr - 1);}
digitalWrite(encA_pin, enc_A[(enc & 3)]);
digitalWrite(encB_pin, enc_B[(enc & 3)]);
}
if (enc_count < 2) { digitalWrite(encZ_pin, 1);}
else { digitalWrite(encZ_pin, 0);}
if (((digitalRead(forward_pin)) && (dir == 1)) || ((digitalRead(reverse_pin)) && (dir == 2))) {
if (speed < 255){ speed++;}
}
else {
if (speed > 0){ speed--;}
}
}
Gkod tokarkowy w wersji średnicowej lub promieniowej to tylko odpowiedni mnożnik dla współrzędnej X.andrzej31-91 pisze: ↑09 lis 2024, 14:43mój prosty generator kodów może generować albo w wersji średnica albo promieniowo
nie tylko ta płytka ale reszta też.