Arduino steruje ploterem.

Dyskusje o programowaniu mikroprocesorów.

Autor tematu
baxter12
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 17
Posty: 57
Rejestracja: 04 lut 2013, 17:03
Lokalizacja: Poznan

Arduino steruje ploterem.

#1

Post napisał: baxter12 » 08 wrz 2013, 13:02

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



Tagi:

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#2

Post napisał: Zienek » 08 wrz 2013, 14:20

O boże 300 linii w jednej funkcji :)

Mimo wszystko respect.

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

Pozdrawiam,
Zienek


Autor tematu
baxter12
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 17
Posty: 57
Rejestracja: 04 lut 2013, 17:03
Lokalizacja: Poznan

#3

Post napisał: baxter12 » 08 wrz 2013, 14:28

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.

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#4

Post napisał: Zienek » 08 wrz 2013, 16:47

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.

Awatar użytkownika

markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 9
Posty: 3975
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#5

Post napisał: markcomp77 » 08 wrz 2013, 17:38

fajnie to wygląda...
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


ezbig
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 9
Posty: 2103
Rejestracja: 07 lip 2006, 00:31
Lokalizacja: mazowieckie

#6

Post napisał: ezbig » 08 wrz 2013, 23:32

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 ;)


Autor tematu
baxter12
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 17
Posty: 57
Rejestracja: 04 lut 2013, 17:03
Lokalizacja: Poznan

#7

Post napisał: baxter12 » 09 wrz 2013, 10:20

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ę. :)

Awatar użytkownika

markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 9
Posty: 3975
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#8

Post napisał: markcomp77 » 09 wrz 2013, 12:45

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


Autor tematu
baxter12
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 17
Posty: 57
Rejestracja: 04 lut 2013, 17:03
Lokalizacja: Poznan

#9

Post napisał: baxter12 » 09 wrz 2013, 15:44

Tak. Najpierw mazakiem Teraz Proxonem .
http://www.rcclub.eu/viewtopic.php?f=28&t=5400


ezbig
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 9
Posty: 2103
Rejestracja: 07 lip 2006, 00:31
Lokalizacja: mazowieckie

#10

Post napisał: ezbig » 09 wrz 2013, 16:06

Pobieżnie patrząc, nie widzę abyś uwzględnił przyspieszanie i zwalnianie silników. Masz zamiar to wprowadzić?

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Arduino, Raspberry pi i inne systemy mikroprocesorowe”