Strona 1 z 5

Arduino steruje ploterem.

: 08 wrz 2013, 13:02
autor: baxter12
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);
}
}

: 08 wrz 2013, 14:20
autor: Zienek
O boże 300 linii w jednej funkcji :)

Mimo wszystko respect.

Podpatrywałeś GRBL?
https://github.com/grbl/grbl

Pozdrawiam,
Zienek

: 08 wrz 2013, 14:28
autor: baxter12
Nic nie podpatrywalem . Wszystko sam wymyśliłem i jest to pierwszy kontakt z tym językiem więc zdaje sobie sprawę ze prostacko napisane. Ale działa bezbłędnie.

: 08 wrz 2013, 16:47
autor: Zienek
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

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); 
}
Ż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.

: 08 wrz 2013, 17:38
autor: markcomp77
fajnie to wygląda...
choć "ciurkiem pisanie" nie pomaga :(
wydzielenie procedur to jedyna szansa na zapanowanie nad kodem...

: 08 wrz 2013, 23:32
autor: ezbig
baxter12 pisze:Wiem że raczej sie nikomu nie przyda, ale chciałem sie pochwalić i pokazać że tez można.
Chyba nikt w to nie wątpi, że można ;)

: 09 wrz 2013, 10:20
autor: baxter12
ezbig pisze:
baxter12 pisze:Wiem że raczej sie nikomu nie przyda, ale chciałem sie pochwalić i pokazać że tez można.
Chyba nikt w to nie wątpi, że można ;)
No znaczy się że ja moge też, i dam radę. :)

: 09 wrz 2013, 12:45
autor: markcomp77
a ten program w arduino sterował realnym ustrojstwem?... chociażby mazakiem

: 09 wrz 2013, 15:44
autor: baxter12
Tak. Najpierw mazakiem Teraz Proxonem .
http://www.rcclub.eu/viewtopic.php?f=28&t=5400

: 09 wrz 2013, 16:06
autor: ezbig
Pobieżnie patrząc, nie widzę abyś uwzględnił przyspieszanie i zwalnianie silników. Masz zamiar to wprowadzić?