本帖最后由 风雪独步人 于 2018-5-18 23:20 编辑
大家用arduino把下列程序写入主机328P,然后用任何com调试程序打开端口,就可以用简单的命令移动XYZ坐标了,如X100 ,发送x轴正向100个脉冲,这时可以用尺子量一下X方向移动距离mm,然后可以求出X方向每mm需要多少脉冲,就可以设定到GRBL中去了。如:z-50 z轴移动-50脉冲,还可以增加s值,如y200S1000 要求y发送200个移动脉冲,但是每个脉冲之间间隔1000毫秒(1S),这样就可以看看在y方向每个脉冲是否形成有效的移动。
当然如果你的步进电机转向角,齿轮传动比已知的情况下,可以直接计算出各方向的参数(脉冲/mm),但我嫌他太麻烦,直接发送多少脉冲,测量一下实际移动长度就可以了。
#define EN 8 //步进电机使能端,低电平有效
#define X_DIR 5 //X轴 步进电机方向控制
#define Y_DIR 6 //y轴 步进电机方向控制
#define Z_DIR 7 //z轴 步进电机方向控制
#define X_STP 2 //x轴 步进控制
#define Y_STP 3 //y轴 步进控制
#define Z_STP 4 //z轴 步进控制
#define Lmain 10 //主激光强度口
void setup() {
// put your setup code here, to run once:
pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);
pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT);
pinMode(Lmain , OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN,LOW);//digitalWrite(EN, HIGH);
digitalWrite(Lmain , LOW);
Serial.begin(9600);
}
void loop() {
String STi="";
while (Serial.available() > 0) {STi += char(Serial.read());delay(2);}
if(STi!=""){ STi.toUpperCase(); step( STi ); }
delay(2000);
}
void step( String ST)
{ int X=0;int Y=0;int Z=0;int X_dir;int Y_dir;int Z_dir;int index;int L=0; int S=3;
Serial.println(ST);
index=ST.indexOf("X");if(index>=0){ X=ST.substring(index+1,ST.length()).toInt(); Serial.println( " X="); }
index=ST.indexOf("Y");if(index>=0){ Y=ST.substring(index+1,ST.length()).toInt(); Serial.println(" Y="); }
index=ST.indexOf("Z");if(index>=0){ Z=ST.substring(index+1,ST.length()).toInt(); Serial.println(" Z="); }
index=ST.indexOf("S");if(index>=0){ S=ST.substring(index+1,ST.length()).toInt(); }
index=ST.indexOf("L");if(index>=0){ L=ST.substring(index+1,ST.length()).toInt(); if(L<0){L=0;};if(L>255){L=255;} Serial.println(" L="); }
if( X>0){ X_dir=1;} else{ X_dir=0;X=-X; }
if( Y>0){ Y_dir=1;} else{ Y_dir=0;Y=-Y; }
if( Z>0){ Z_dir=1;} else{ Z_dir=0;Z=-Z; }
digitalWrite(5, X_dir);
digitalWrite(6, Y_dir);
digitalWrite(7, Z_dir);
analogWrite(Lmain ,L);
delay(50);
while ((X+Y+Z)>0){
if(X>0){ X--; digitalWrite(2, HIGH);}
if(Y>0){ Y--; digitalWrite(3, HIGH);}
if(Z>0){ Z--; digitalWrite(4, HIGH);}
delay(3);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(S);
}}
|