Arduino steruje ploterem.
-
Autor tematu - Sympatyk forum poziom 2 (min. 50)
- Posty w temacie: 17
- Posty: 57
- Rejestracja: 04 lut 2013, 17:03
- Lokalizacja: Poznan
Arduino steruje ploterem.
Zamieszczam skecz Arduino, sterujacy frezarka CNC.
Obsługuje kody G0,G1, oraz X,Y,Z.
Nie obsługuje jeszcze krańcówek (będzie),
oraz kodów "I" , "J", nie wiem czy będzie.
Skecz steruje wyswietlaczem LED 2 rzedowym, na którym wyswietla aktualne połozenie osi frezarki. Do przesyłania G code używam G-code sender.
Wiem że raczej sie nikomu nie przyda, ale chciałem sie pochwalić i pokazać że tez można.
#include <Stepper.h>
#include <LiquidCrystal595.h>
// initialize the library with the numbers of the interface pins + the row count
// datapin, latchpin, clockpin, num_lines
LiquidCrystal595 lcd(7,8,9);
//Inicjacja siilników krokowych
Stepper StepperX(120, 10,6); //Tu można zmienić numery portów
Stepper StepperY(120, 4,5);
Stepper StepperZ(120, 12,11);
//Zmienne
long x = 0; int y = 0 ;int a = 0 ; int b = 0 ; int c = 0 ;//Zmienna do obsługi pętli
float G = 0.00000; float X = 0.00000; float Y = 0.00000; float Z = 0.000;
//Poprzednie położenie plottera:
float OLD_G = 0.00000; float OLD_X = 0.00000; float OLD_Y = 0.00000; float OLD_Z = 0.000;
//Ilość milimetrów do pokonania w stosownych płaszczyznach.
float MM_X = 0.00000; float MM_Y = 0.00000; float MM_Z = 0.00000;
//Ilość kroków do zrobienia
float STEP_X = 0; float STEP_Y = 0; int STEP_Z = 0;
int A_1 = 0; float A = 0 ; float r = 0.000000; // Zmienne do obliczeń podzielnik i reszta
int A_2 = 0; int A_3 = 0;
int Dane = 0 ; //Nie wiem do czego
//Wielkość przesunięcia na jeden krok w milimetrach
float STEP_SIZE_X = 0.005; float STEP_SIZE_Y = 0.005; float STEP_SIZE_Z = 0.005;
void setup()
{
pinMode(13, OUTPUT);
//Inicjacja Stepperów ;L`R-
StepperX.setSpeed(30); // Prędkość obrotowa
pinMode(14,INPUT);//Pin krańcówki "X"
StepperY.setSpeed(30); // Prędkość obrotowa
pinMode(15,INPUT);//Pin krańcówki "Y"
StepperZ.setSpeed(30); // Prędkość obrotowa
pinMode(16,INPUT);//Pin krańcówki "Z"
Serial.begin(9600); //Inicjacja portu szeregowego
lcd.begin(16,2); //Inicjacja LCD
lcd.setCursor(0,0);lcd.print("START!!"); X = 0 ; Y = 0 ; Z = 0 ;//Sygnał końca inicjacji
}
void loop()
{
while (Serial.available()>0)
{
// delay(250);
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == 71 )
{
G = (Serial.parseFloat());
}
// Wycinanie ew. spacji
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == 88 )
{X = (Serial.parseFloat());
//Badanie czy są jeszcze dane do pobrania i interpretacja
}
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == 89 )
{
Y = (Serial.parseFloat());
//Badanie czy są jeszcze dane do pobrania i interpretacja
}
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == (90) )
{
Z = (Serial.parseFloat());
// Wycinanie ew. spacji
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
}
//Ustawienie prędkości poruszania "G"
if (G < 1){ StepperX.setSpeed(120);StepperY.setSpeed(120);StepperZ.setSpeed(120);}
// if (G > 0){StepperX.setSpeed(60);StepperY.setSpeed(60);StepperZ.setSpeed(Z15); }
if (G > 0){StepperX.setSpeed(80);StepperY.setSpeed(80);StepperZ.setSpeed(80); }
// Obliczenie odległości do pokonania w trzech płaszczyznach:
MM_X = X - OLD_X; MM_Y = Y - OLD_Y; MM_Z = Z - OLD_Z;
//Przeliczenie odległóści na kroki.
STEP_X = MM_X/STEP_SIZE_X;
STEP_Y = MM_Y/STEP_SIZE_Y;
STEP_Z = MM_Z/STEP_SIZE_Z;
Serial.print("G"); Serial.print (" ");Serial.print(G);
Serial.print(" STEP_X "); Serial.print (" ");Serial.print(STEP_X);
Serial.print(" STEP_Y "); Serial.print (" ");Serial.print(STEP_Y);
Serial.print(" STEP_Z "); Serial.print (" ");Serial.print(STEP_Z);Serial.print(" <<<<<");
//Ruch w osi "Z"
if (STEP_Z > 0){X == 0;
for (x = 0; x <= STEP_Z ; x++){
StepperZ.step(1);
}}
if (STEP_Z < 0){STEP_Z = abs(STEP_Z); X == 0;
for (x = 0; x <= STEP_Z ; x++){
StepperZ.step(-1);
}}
//UWAGA !!!! NA WARTOŚCI UJEMNE!!!!!
//Początek sterowania Silnikami krokowymi
//Obliczanie sekwencji kroków
// Gdy X = Y
//Gdy X lub Y = "0"
if (STEP_X == 0){x = 0 ;
if (STEP_Y > 0) { for ( x == 1 ; x <= STEP_Y ; x++ ){StepperY.step(1); }}
if (STEP_Y < 0) { for ( x == -1 ; x >= STEP_Y ; x--){StepperY.step(-1); }}
STEP_Y = 0;}
if (STEP_Y == 0){x = 0 ;
if (STEP_X > 0) { for ( x == 1 ; x <= STEP_X ; x++ ){StepperX.step(1); }}
if (STEP_X < 0) { for ( x == -1 ; x >= STEP_X ; x--){StepperX.step(-1); }}
STEP_X = 0;}
// Pierwsza cwiartka ukł. współrzędnych
if (STEP_X > 0 && STEP_Y > 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(1);StepperY.step(1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(1);
if (x == a ){ StepperY.step(1); a = a + A_1; }
if (x == b ){ StepperY.step(1); b = b + A_2; }
if (x == c ){ StepperY.step(1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(1);
if (x == a ){ StepperX.step(1); a = a + A_1; }
if (x == b ){ StepperX.step(1); b = b + A_2; }
if (x == c ){ StepperX.step(1); c = c + A_3; }
}
}
}
// Druga cwiartka ukł. współrzędnych
if (STEP_X > 0 && STEP_Y < 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(1);StepperY.step(-1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;}
a = A_1 ; b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(1);
if (x == a ){ StepperY.step(-1); a = a + A_1; }
if (x == b ){ StepperY.step(-1); b = b + A_2; }
if (x == c ){ StepperY.step(-1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(-1);
if (x == a ){ StepperX.step(1); a = a + A_1; }
if (x == b ){ StepperX.step(1); b = b + A_2; }
if (x == c ){ StepperX.step(1); c = c + A_3; }
}
}
}
// Trzecia cwiartka ukł. współrzędnych
if (STEP_X < 0 && STEP_Y < 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);Serial.print (" X<0>Y" );
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(-1);StepperY.step(-1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(-1);
if (x == a ){ StepperY.step(-1); a = a + A_1; }
if (x == b ){ StepperY.step(-1); b = b + A_2; }
if (x == c ){ StepperY.step(-1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(-1);
if (x == a ){ StepperX.step(-1); a = a + A_1; }
if (x == b ){ StepperX.step(-1); b = b + A_2; }
if (x == c ){ StepperX.step(-1); c = c + A_3; }
}
}
}
// Czwarta cwiartka ukł. współrzędnych
if (STEP_X < 0 && STEP_Y > 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);Serial.print (" X<0<0Y" );
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(-1);StepperY.step(1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(-1);
if (x == a ){ StepperY.step(1); a = a + A_1; }
if (x == b ){ StepperY.step(1); b = b + A_2; }
if (x == c ){ StepperY.step(1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(1);
if (x == a ){ StepperX.step(-1); a = a + A_1; }
if (x == b ){ StepperX.step(-1); b = b + A_2; }
if (x == c ){ StepperX.step(-1); c = c + A_3; }
}
}
}
//Na LCD
lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(0,0);lcd.print("G "); lcd.print(G);
lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(8,0);lcd.print("X "); lcd.print(X);
lcd.setCursor(0,1);lcd.print(" ");lcd.setCursor(0,1);lcd.print("Y "); lcd.print(Y);
lcd.setCursor(8,1);lcd.print(" ");lcd.setCursor(8,1);lcd.print("Z "); lcd.print(Z);
//Zmiana pozycji parametry "nowe" na "stare"
OLD_X = X; OLD_Y = Y; OLD_Z = Z;
//Zerowanie stepperów
STEP_X = 0; STEP_Y = 0; STEP_Z = 0 ;
//Zerowanie zmiennych
A_1 = 0; A = 0 ; r = 0.0000; A_2 = 0; A_3 = 0;
x = 0; y = 0 ; a = 0 ; b = 0 ; c = 0 ;
//Na koniec inicjacja transmisji następnej linii kodu.
Serial.println("NEXT LINE");
//delay(250);
}
}
Obsługuje kody G0,G1, oraz X,Y,Z.
Nie obsługuje jeszcze krańcówek (będzie),
oraz kodów "I" , "J", nie wiem czy będzie.
Skecz steruje wyswietlaczem LED 2 rzedowym, na którym wyswietla aktualne połozenie osi frezarki. Do przesyłania G code używam G-code sender.
Wiem że raczej sie nikomu nie przyda, ale chciałem sie pochwalić i pokazać że tez można.
#include <Stepper.h>
#include <LiquidCrystal595.h>
// initialize the library with the numbers of the interface pins + the row count
// datapin, latchpin, clockpin, num_lines
LiquidCrystal595 lcd(7,8,9);
//Inicjacja siilników krokowych
Stepper StepperX(120, 10,6); //Tu można zmienić numery portów
Stepper StepperY(120, 4,5);
Stepper StepperZ(120, 12,11);
//Zmienne
long x = 0; int y = 0 ;int a = 0 ; int b = 0 ; int c = 0 ;//Zmienna do obsługi pętli
float G = 0.00000; float X = 0.00000; float Y = 0.00000; float Z = 0.000;
//Poprzednie położenie plottera:
float OLD_G = 0.00000; float OLD_X = 0.00000; float OLD_Y = 0.00000; float OLD_Z = 0.000;
//Ilość milimetrów do pokonania w stosownych płaszczyznach.
float MM_X = 0.00000; float MM_Y = 0.00000; float MM_Z = 0.00000;
//Ilość kroków do zrobienia
float STEP_X = 0; float STEP_Y = 0; int STEP_Z = 0;
int A_1 = 0; float A = 0 ; float r = 0.000000; // Zmienne do obliczeń podzielnik i reszta
int A_2 = 0; int A_3 = 0;
int Dane = 0 ; //Nie wiem do czego
//Wielkość przesunięcia na jeden krok w milimetrach
float STEP_SIZE_X = 0.005; float STEP_SIZE_Y = 0.005; float STEP_SIZE_Z = 0.005;
void setup()
{
pinMode(13, OUTPUT);
//Inicjacja Stepperów ;L`R-
StepperX.setSpeed(30); // Prędkość obrotowa
pinMode(14,INPUT);//Pin krańcówki "X"
StepperY.setSpeed(30); // Prędkość obrotowa
pinMode(15,INPUT);//Pin krańcówki "Y"
StepperZ.setSpeed(30); // Prędkość obrotowa
pinMode(16,INPUT);//Pin krańcówki "Z"
Serial.begin(9600); //Inicjacja portu szeregowego
lcd.begin(16,2); //Inicjacja LCD
lcd.setCursor(0,0);lcd.print("START!!"); X = 0 ; Y = 0 ; Z = 0 ;//Sygnał końca inicjacji
}
void loop()
{
while (Serial.available()>0)
{
// delay(250);
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == 71 )
{
G = (Serial.parseFloat());
}
// Wycinanie ew. spacji
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == 88 )
{X = (Serial.parseFloat());
//Badanie czy są jeszcze dane do pobrania i interpretacja
}
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == 89 )
{
Y = (Serial.parseFloat());
//Badanie czy są jeszcze dane do pobrania i interpretacja
}
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
if (Serial.available() > 0 && Serial.peek() == (90) )
{
Z = (Serial.parseFloat());
// Wycinanie ew. spacji
while (Serial.available() >0 && Serial.peek() != 71 && Serial.peek()!= 88 && Serial.peek()!= 89 && Serial.peek()!= 90)
// Wycinanie ew. spacji
{
Serial.read() ;
}
}
//Ustawienie prędkości poruszania "G"
if (G < 1){ StepperX.setSpeed(120);StepperY.setSpeed(120);StepperZ.setSpeed(120);}
// if (G > 0){StepperX.setSpeed(60);StepperY.setSpeed(60);StepperZ.setSpeed(Z15); }
if (G > 0){StepperX.setSpeed(80);StepperY.setSpeed(80);StepperZ.setSpeed(80); }
// Obliczenie odległości do pokonania w trzech płaszczyznach:
MM_X = X - OLD_X; MM_Y = Y - OLD_Y; MM_Z = Z - OLD_Z;
//Przeliczenie odległóści na kroki.
STEP_X = MM_X/STEP_SIZE_X;
STEP_Y = MM_Y/STEP_SIZE_Y;
STEP_Z = MM_Z/STEP_SIZE_Z;
Serial.print("G"); Serial.print (" ");Serial.print(G);
Serial.print(" STEP_X "); Serial.print (" ");Serial.print(STEP_X);
Serial.print(" STEP_Y "); Serial.print (" ");Serial.print(STEP_Y);
Serial.print(" STEP_Z "); Serial.print (" ");Serial.print(STEP_Z);Serial.print(" <<<<<");
//Ruch w osi "Z"
if (STEP_Z > 0){X == 0;
for (x = 0; x <= STEP_Z ; x++){
StepperZ.step(1);
}}
if (STEP_Z < 0){STEP_Z = abs(STEP_Z); X == 0;
for (x = 0; x <= STEP_Z ; x++){
StepperZ.step(-1);
}}
//UWAGA !!!! NA WARTOŚCI UJEMNE!!!!!
//Początek sterowania Silnikami krokowymi
//Obliczanie sekwencji kroków
// Gdy X = Y
//Gdy X lub Y = "0"
if (STEP_X == 0){x = 0 ;
if (STEP_Y > 0) { for ( x == 1 ; x <= STEP_Y ; x++ ){StepperY.step(1); }}
if (STEP_Y < 0) { for ( x == -1 ; x >= STEP_Y ; x--){StepperY.step(-1); }}
STEP_Y = 0;}
if (STEP_Y == 0){x = 0 ;
if (STEP_X > 0) { for ( x == 1 ; x <= STEP_X ; x++ ){StepperX.step(1); }}
if (STEP_X < 0) { for ( x == -1 ; x >= STEP_X ; x--){StepperX.step(-1); }}
STEP_X = 0;}
// Pierwsza cwiartka ukł. współrzędnych
if (STEP_X > 0 && STEP_Y > 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(1);StepperY.step(1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(1);
if (x == a ){ StepperY.step(1); a = a + A_1; }
if (x == b ){ StepperY.step(1); b = b + A_2; }
if (x == c ){ StepperY.step(1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(1);
if (x == a ){ StepperX.step(1); a = a + A_1; }
if (x == b ){ StepperX.step(1); b = b + A_2; }
if (x == c ){ StepperX.step(1); c = c + A_3; }
}
}
}
// Druga cwiartka ukł. współrzędnych
if (STEP_X > 0 && STEP_Y < 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(1);StepperY.step(-1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;}
a = A_1 ; b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(1);
if (x == a ){ StepperY.step(-1); a = a + A_1; }
if (x == b ){ StepperY.step(-1); b = b + A_2; }
if (x == c ){ StepperY.step(-1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(-1);
if (x == a ){ StepperX.step(1); a = a + A_1; }
if (x == b ){ StepperX.step(1); b = b + A_2; }
if (x == c ){ StepperX.step(1); c = c + A_3; }
}
}
}
// Trzecia cwiartka ukł. współrzędnych
if (STEP_X < 0 && STEP_Y < 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);Serial.print (" X<0>Y" );
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(-1);StepperY.step(-1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(-1);
if (x == a ){ StepperY.step(-1); a = a + A_1; }
if (x == b ){ StepperY.step(-1); b = b + A_2; }
if (x == c ){ StepperY.step(-1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(-1);
if (x == a ){ StepperX.step(-1); a = a + A_1; }
if (x == b ){ StepperX.step(-1); b = b + A_2; }
if (x == c ){ StepperX.step(-1); c = c + A_3; }
}
}
}
// Czwarta cwiartka ukł. współrzędnych
if (STEP_X < 0 && STEP_Y > 0){STEP_X = abs(STEP_X); STEP_Y = abs(STEP_Y);Serial.print (" X<0<0Y" );
if (STEP_X == STEP_Y){ x = 0 ; for ( x == 0; x <= STEP_X ; x++){ StepperX.step(-1);StepperY.step(1);}}
if (STEP_X > STEP_Y){
A_1 = STEP_X / STEP_Y ;
float A = STEP_X / STEP_Y ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_Y - (STEP_X/A_1);
if ( r > 0){ A_2 = STEP_X / r ;
r = STEP_Y - (STEP_X/A_1) - (STEP_X/A_2) ;}
if ( r > 0){
A_3 = STEP_X / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_X ; x++){ StepperX.step(-1);
if (x == a ){ StepperY.step(1); a = a + A_1; }
if (x == b ){ StepperY.step(1); b = b + A_2; }
if (x == c ){ StepperY.step(1); c = c + A_3; }
}
}
if (STEP_Y > STEP_X){
A_1 = STEP_Y / STEP_X ;
float A = STEP_Y / STEP_X ;
if (A_1 < A) { A_1 = A_1 + 1 ; }
r = STEP_X - (STEP_Y/A_1);
if ( r > 0){ A_2 = STEP_Y / r ;
r = STEP_X - (STEP_Y/A_1) - (STEP_Y/A_2) ;}
if ( r > 0){
A_3 = STEP_Y / r ;
}
a = A_1 ;b = A_2 ; c = A_3;
//Wycinanie
x = 0;
for (x == 1; x <= STEP_Y ; x++){StepperY.step(1);
if (x == a ){ StepperX.step(-1); a = a + A_1; }
if (x == b ){ StepperX.step(-1); b = b + A_2; }
if (x == c ){ StepperX.step(-1); c = c + A_3; }
}
}
}
//Na LCD
lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(0,0);lcd.print("G "); lcd.print(G);
lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(8,0);lcd.print("X "); lcd.print(X);
lcd.setCursor(0,1);lcd.print(" ");lcd.setCursor(0,1);lcd.print("Y "); lcd.print(Y);
lcd.setCursor(8,1);lcd.print(" ");lcd.setCursor(8,1);lcd.print("Z "); lcd.print(Z);
//Zmiana pozycji parametry "nowe" na "stare"
OLD_X = X; OLD_Y = Y; OLD_Z = Z;
//Zerowanie stepperów
STEP_X = 0; STEP_Y = 0; STEP_Z = 0 ;
//Zerowanie zmiennych
A_1 = 0; A = 0 ; r = 0.0000; A_2 = 0; A_3 = 0;
x = 0; y = 0 ; a = 0 ; b = 0 ; c = 0 ;
//Na koniec inicjacja transmisji następnej linii kodu.
Serial.println("NEXT LINE");
//delay(250);
}
}
Tagi:
-
- Lider FORUM (min. 2000)
- Posty w temacie: 4
- Posty: 3730
- Rejestracja: 13 gru 2008, 19:32
- Lokalizacja: Szczecin
- Kontakt:
O boże 300 linii w jednej funkcji
Mimo wszystko respect.
Podpatrywałeś GRBL?
https://github.com/grbl/grbl
Pozdrawiam,
Zienek

Mimo wszystko respect.
Podpatrywałeś GRBL?
https://github.com/grbl/grbl
Pozdrawiam,
Zienek
-
- Lider FORUM (min. 2000)
- Posty w temacie: 4
- Posty: 3730
- Rejestracja: 13 gru 2008, 19:32
- Lokalizacja: Szczecin
- Kontakt:
Winszować 
Pisanie fajnego kodu polega na tym, żeby wyczuwać "code smells" tzw miejsca, gdzie "coś śmierdzi" w kodzie.
Najprostszym zapachem do wyniuchania są powtórzenia.
Po napisaniu kodu, który działa niezbędnie, później jest czas na refactoring. To jest właśnie usuwanie code smells.
Fajnym wyzwaniem na teraz przed kolejnym dopisywaniem funkcjonalności będzie przeniesienie powtarzalnych elementów kodu do oddzielnych funkcji.
http://arduino.cc/en/Reference/FunctionDeclaration
Pierwszy lepszy przykład
Żeby kod nie był ciurkiem także parsowanie wejścia serial możesz wydzielić do osobnej funkcji.
A to co powtarzasz dla każdej osi, jako funkcję, gdzie podajesz jako parametr char S - znak który wzkazuje, jaką osią w tym wywołaniu dana funkcja się zajmuje.

Pisanie fajnego kodu polega na tym, żeby wyczuwać "code smells" tzw miejsca, gdzie "coś śmierdzi" w kodzie.
Najprostszym zapachem do wyniuchania są powtórzenia.
Po napisaniu kodu, który działa niezbędnie, później jest czas na refactoring. To jest właśnie usuwanie code smells.
Fajnym wyzwaniem na teraz przed kolejnym dopisywaniem funkcjonalności będzie przeniesienie powtarzalnych elementów kodu do oddzielnych funkcji.
http://arduino.cc/en/Reference/FunctionDeclaration
Pierwszy lepszy przykład
Kod: Zaznacz cały
void wyswietl_koordynaty(float G, float X, float Y, float Z){
lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(0,0);lcd.print("G "); lcd.print(G);
lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(8,0);lcd.print("X "); lcd.print(X);
lcd.setCursor(0,1);lcd.print(" ");lcd.setCursor(0,1);lcd.print("Y "); lcd.print(Y);
lcd.setCursor(8,1);lcd.print(" ");lcd.setCursor(8,1);lcd.print("Z "); lcd.print(Z);
}
A to co powtarzasz dla każdej osi, jako funkcję, gdzie podajesz jako parametr char S - znak który wzkazuje, jaką osią w tym wywołaniu dana funkcja się zajmuje.
-
- Lider FORUM (min. 2000)
- Posty w temacie: 9
- Posty: 3962
- Rejestracja: 18 wrz 2004, 12:51
- Lokalizacja: k/w-wy
- Kontakt:
fajnie to wygląda...
choć "ciurkiem pisanie" nie pomaga
wydzielenie procedur to jedyna szansa na zapanowanie nad kodem...
choć "ciurkiem pisanie" nie pomaga

wydzielenie procedur to jedyna szansa na zapanowanie nad kodem...
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm
-
- Lider FORUM (min. 2000)
- Posty w temacie: 9
- Posty: 3962
- Rejestracja: 18 wrz 2004, 12:51
- Lokalizacja: k/w-wy
- Kontakt:
a ten program w arduino sterował realnym ustrojstwem?... chociażby mazakiem
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm