Создание станка с ЧПУ из доступных деталей с минимум слесарной работы
#include
int _s=begin_cmd; const int max_len_cmd=500; char cmd[max_len_cmd]; char tag[100][20]; char val[100][20]; int n_t=0; int c_i=0; char c; int i, j; int amount_G=0; int len=0; char*trash; int n_run_cmd=0; int g_cmd_prev; //ya предыдущее значение G class _g_cmd{ public: _g_cmd (){ reset (); } int n; //ya int g; double x; double y; double z; void reset (void){ n=g=x=y=z=99999; } }; double _x,_y,_z; double cur_abs_x, cur_abs_y, cur_abs_z; //ya stoyalo int int f_abs_coord=1;
_g_cmd g_cmd[100];
void setup () {
stepper0.setSpeed (150); stepper1.setSpeed (150); stepper2.setSpeed (1000); Serial.begin (9600); pinMode (inPinX, INPUT); pinMode (inPinY, INPUT); pinMode (inPinZ, INPUT); pinMode (x_en, OUTPUT); pinMode (x_dir, OUTPUT); pinMode (x_step, OUTPUT); pinMode (y_en, OUTPUT); pinMode (y_dir, OUTPUT); pinMode (y_step, OUTPUT); digitalWrite (x_en, 1); digitalWrite (y_en, 1); to_begin_coord (); //UNIimpstep (12,13,2,7,3,1000); //UNIimpstep (12,13,2,7,3,-1000); }
void to_begin_coord (void) { impstep (_X,-10000,1); impstep (_Y,-10000,1); cur_abs_x=cur_abs_y=cur_abs_z=0; }
void loop () { switch (_s){ case begin_cmd: Serial.println (»&»); //038 //to_begin_coord (); n_t=0; _s=wait_first_byte; len=0; break; case wait_first_byte: if (Serial.available ()){ Serial.print (»>»); _s=get_cmd; c_i=0; } break; case get_cmd: c=Serial.read (); if (c!=-1){ if (c=='~'){ _s=get_tag; c_i=0; n_t=0; break; } Serial.print©; if ((c>=97)&&(c<=122)) c-=32; if( (c==32)||(c==45)||(c==46)||((c>=48)&&(c<=57))||((c>=65)&&(c<=90)) ){ cmd[c_i++]=c; len++; } } break;
case get_tag: while ((c_i
for (i=0; i while (i Serial.print («compilation cmd, output (»);
Serial.print (amount_G);
Serial.println (»):»);
for (j=0; j case run_cmd:
Serial.print («run cmd [»);
Serial.print («N»); Serial.print (g_cmd[n_run_cmd].n); Serial.print (» »);
Serial.print («G»); Serial.print (g_cmd[n_run_cmd].g); Serial.print (» »);
Serial.print («X»); Serial.print (g_cmd[n_run_cmd].x); Serial.print (» »);
Serial.print («Y»); Serial.print (g_cmd[n_run_cmd].y); Serial.print (» »);
Serial.print («Z»); Serial.print (g_cmd[n_run_cmd].z); Serial.print (» »);
Serial.println (»]»); int f_cmd_coord=0;
if (g_cmd[n_run_cmd].g==90){
f_abs_coord=1;
f_cmd_coord=1;
Serial.println («change to ABS coord»);
}
if (g_cmd[n_run_cmd].g==91){
f_abs_coord=0;
f_cmd_coord=1;
Serial.println («change to REL coord»);
}
Serial.print («cur_abs (»); Serial.print (cur_abs_x); Serial.print (»,»); Serial.print (cur_abs_y); Serial.print (»,»); Serial.print (cur_abs_z); Serial.println (»)»);
if (f_cmd_coord){if (++n_run_cmd>=amount_G) _s=begin_cmd; break;}
if (f_abs_coord){
Serial.println («zdes kosjak G90 ABS»);
if (g_cmd[n_run_cmd].x==99999)
_x=0;
else
_x=g_cmd[n_run_cmd].x-cur_abs_x;
if (g_cmd[n_run_cmd].y==99999)
_y=0;
else
_y=g_cmd[n_run_cmd].y-cur_abs_y;
if (g_cmd[n_run_cmd].z==99999)
_z=0;
else
_z=g_cmd[n_run_cmd].z-cur_abs_z;
}else{
Serial.println («normalno G91 REL»);
_x=g_cmd[n_run_cmd].x;
_y=g_cmd[n_run_cmd].y;
_z=g_cmd[n_run_cmd].z;
} if ((_x==0)&&(_y==0)&&(_z==0)){
Serial.println («exit: _x=0,_y=0,_z=0»);
if (++n_run_cmd>=amount_G) _s=begin_cmd; break;
}
// _x=_x*koefx;
// _y=_y*koefy;
//_z=_z*koef;
double max_l=abs (_x); //ya
if (abs (_y)>max_l)
max_l=abs (_y);
if (abs (_z)>max_l)
max_l=abs (_z);
double unit_scale=90; // steps in 1.0
double unit_len=max_l*unit_scale, unit_step;
double px=0, py=0, pz=0, x=0, y=0, z=0, kx, ky, kz;
int all_x_steps=0, all_y_steps=0, all_z_steps=0;
kx=_x/unit_len;
ky=_y/unit_len;
kz=_z/unit_len;
// Serial.print («unit_len — »); Serial.print (unit_len); Serial.print (» _x- »); Serial.print (_x); Serial.print (» max_l- »); Serial.println (max_l);
// Serial.print («kx=»); Serial.print (kx); Serial.print (» ky=»); Serial.print (ky); Serial.print (» kz=»); Serial.println (kz);
if ((kx==0)&&(ky==0)&&(kz==0)){if (++n_run_cmd>=amount_G) _s=begin_cmd; break;}
for (unit_step=0; unit_step if ((abs (x-px)*unit_scale)>=1){
impstep (_X, STEP_MOTOR*kx/abs (kx),1); //stepper0.step (STEP_MOTOR*kx/abs (kx));
//Serial.print («x_step »); Serial.println (kx/abs (kx));
all_x_steps++;
px=x;
}
if ((abs (y-py)*unit_scale)>=1){
impstep (_Y, STEP_MOTOR*ky/abs (ky),1); //stepper1.step (STEP_MOTOR*ky/abs (ky));
//Serial.print («y_step »); Serial.println (ky/abs (ky));
all_y_steps++;
py=y;
}
if ((abs (z-pz)*unit_scale)>=1){
UNIimpstep (12,13,2,7,3,10*kz/abs (kz)); //stepper2.step (STEP_MOTOR*kz/abs (kz));
//Serial.print («z_step »); Serial.println (kz/abs (kz));
all_z_steps++;
pz=z;
}
x+=kx; y+=ky; z+=kz;
// Serial.print (unit_step); Serial.print (» :»);
// Serial.print (x); Serial.print (» | »); Serial.print (y); Serial.print (» | »); Serial.println (z);
}
Serial.println (»-----------------------------------------»);
Serial.print («all_steps (»); Serial.print (all_x_steps); Serial.print (»,»); Serial.print (all_y_steps); Serial.print (»,»); Serial.print (all_z_steps); Serial.print (»)»);
cur_abs_x+=_x; cur_abs_y+=_y; cur_abs_z+=_z;
Serial.print («cur_abs (»); Serial.print (cur_abs_x); Serial.print (»,»); Serial.print (cur_abs_y); Serial.print (»,»); Serial.print (cur_abs_z); Serial.println (»)»);
Serial.println (»-----------------------------------------»);
if (++n_run_cmd>=amount_G) _s=begin_cmd;
}//switch (_s)
} char end_button (int coord)
{
int but=0;
if (coord==_X)
but=digitalRead (inPinX);
if (coord==_Y)
but=digitalRead (inPinY);
if (but){
if (coord==_X)
Serial.println (»[ X out of range ]»);
if (coord==_Y)
Serial.println (»[ Y out of range ]»);
}
return but;
}
char impstep (int coord, int kol, int f_test_coord)
{
int IN_en, IN_dir, IN_step, pause;
pause=2; //35
switch (coord){
case _X: IN_en=x_en; IN_dir=x_dir; IN_step=x_step;
digitalWrite (IN_en, 0);
break;
case _Y: IN_en=y_en; IN_dir=y_dir; IN_step=y_step;
digitalWrite (IN_en, 0);
break;
}
if (! f_test_coord)
Serial.println (»[ break step ]»);
//delay (100);
if (kol<0)
for (int i=0; i<=abs(kol); i++){
if(f_test_coord&&end_button(coord)){
impstep(coord,200,0);
return 0;
}
digitalWrite(IN_dir, LOW);
digitalWrite(IN_step, HIGH);
delay(pause);
digitalWrite(IN_step, LOW);
delay(pause);
}else
for (int i=0; i <= kol; i++){
if(f_test_coord&&end_button(coord)){
impstep(coord,200,0);
return 0;
}
digitalWrite(IN_dir, HIGH);
digitalWrite(IN_step, HIGH);
delay(pause);
digitalWrite(IN_step, LOW);
delay(pause);
}
digitalWrite(IN_en, 1);
return 1;
} void UNIimpstep (int IN1, int IN2, int IN3, int IN4, int pause, int kol)
{
//delay (100);
if (kol<0)
for (int i=0; i<=abs(kol); i++){
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
delay(pause);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
delay(pause);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
delay(pause);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
delay(pause);
}
else
for (int i=0; i <= kol; i++){
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
delay(pause);
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
delay(pause);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
delay(pause);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
delay(pause);
}
}