标题:
Arduino自制实验用切割装置-自动控制机床程序
[打印本页]
作者:
JohnRowton
时间:
2019-3-24 11:58
标题:
Arduino自制实验用切割装置-自动控制机床程序
如题,使用ardunio编写的一个自动控制机床实现简单切割的小程序,串口实时通信控制。
单片机源程序如下:
#include "Arduino.h"
#define CLK 5
#define CLK_X 3
#define CLK_Y 6
#define CLK_Z 9
#define DIR_X 2
#define DIR_Y 5
#define DIR_Z 8
#define Stretch_1 A3
#define Stretch_2 A2
#define Scalpel_1 A1
#define Scalpel_2 A0 //pin parament
#define Choice_SW 16
#define Forward_SW 14
#define Backward_SW 15
#define FORWARD 0
#define BACKWARD 1 //motor direct parament
#define STOP 100
#define Solenoid 10
#define FAST 98
#define SLOW 99
int case_var;
float distance;
float time_1;
int m_var;
//电机控制部分 //步进电机使用1600HZ CLK时钟 1600细分
void motor_x(float); //输入浮点型位移 distance 行进完自动停止
void motor_y(float); //输入浮点型位移 distance 行进完自动停止
void motor_z(float); //输入浮点型位移 distance 行进完自动停止
void motor_Scalpel(int); //输入 FORWARD前进 BACKWARD后退 STOP停止 (行进后必须再输入停止命令STOP才可以停止)
void motor_Stretch(int); //输入 FORWARD前进 BACKWARD后退 STOP停止
void motor_mx(int,int); //输入 FORWARD前进 BACKWARD后退 STOP停止 && 输入FAST快速模式,SLOW慢速模式,停止时随意速度模式
void motor_my(int,int); //输入 FORWARD前进 BACKWARD后退 STOP停止 && 输入FAST快速模式,SLOW慢速模式,停止时随意速度模式
void motor_mz(int,int); //输入 FORWARD前进 BACKWARD后退 STOP停止 && 输入FAST快速模式,SLOW慢速模式,停止时随意速度模式
void setup()
{
// put your setup code here, to run once:
pinMode(DIR_X,OUTPUT);
pinMode(DIR_Y,OUTPUT);
pinMode(DIR_Z,OUTPUT);
pinMode(CLK_X,OUTPUT);
pinMode(CLK_Y,OUTPUT);
pinMode(CLK_Z,OUTPUT);
pinMode(Scalpel_1,OUTPUT);
pinMode(Scalpel_2,OUTPUT);
pinMode(Stretch_1,OUTPUT);
pinMode(Stretch_2,OUTPUT);
pinMode(Choice_SW,INPUT_PULLUP);
pinMode(Forward_SW,INPUT);
pinMode(Backward_SW,INPUT); //Setting mode
Serial.begin(9600);
analogWrite(CLK_X,0);
analogWrite(CLK_Y,0);
analogWrite(CLK_Z,0); //Duty cycle is 0/255
delay(1200);
Serial.println("cutting start, please confirm air pump is working");
}
void loop()
{
// put your main code here, to run repeatedly:
Serial.println("Select a control mode:");
Serial.println("x.x axis");
Serial.println("y.y axis");
Serial.println("z.z axis");
Serial.println("m.manual mode");
while(Serial.read()>=0){}//clear buffer
delay(100);
while(Serial.available()<=0){}
if (Serial.available()>0)
{
case_var=Serial.read();
delay(100);
switch(case_var)
{
case 120: //x axis
Serial.println("Enter a distance:");
while(Serial.available()<=0){}
distance = Serial.parseFloat();
delay(100);
while(Serial.read()>=0){}//clear buffer
Serial.print("Advance in x axis: ");
Serial.println(distance);
motor_x(distance);
//Control stepper motor
break;
case 121: //y axis
Serial.println("Enter a distance:");
while(Serial.available()<=0){}
distance = Serial.parseFloat();
delay(100);
while(Serial.read()>=0){}//clear buffer
Serial.print("Advance in y axis: ");
Serial.println(distance);
motor_y(distance);
//Control stepper motor
break;
case 122: //z axis
Serial.println("Enter a distance:");
while(Serial.available()<=0){}
distance = Serial.parseFloat();
delay(100);
while(Serial.read()>=0){}//clear buffer
Serial.print("Advance in z axis: ");
Serial.println(distance);
motor_z(distance);
//Control stepper motor
break;
case 109: //manunal
manuallycontrol();
break;
default:
break;
}
}
}
//电机控制部分
void motor_x(float a_1) //x轴自动前进
{
if(a_1 >= 0)
{
time_1 = 250*a_1;
digitalWrite(DIR_X, HIGH);
tone(CLK_X,1600);
delay(time_1);
noTone(CLK_X);
}
else
{
a_1 = -a_1;
time_1 = 250*a_1;
digitalWrite(DIR_X,LOW);
tone(CLK_X,1600);
delay(time_1);
noTone(CLK_X);
}
}
void motor_y(float b_1) //y轴自动前进
{
if(b_1 >= 0)
{
time_1 = 250*b_1;
digitalWrite(DIR_Y, HIGH);
tone(CLK_Y,1600)
delay(time_1);
noTone(CLK_Y);
}
else
{
b_1 = -b_1;
time_1 = 250*b_1;
digitalWrite(DIR_Y,LOW);
tone(CLK_Y,1600);
delay(time_1);
noTone(CLK_Y);
}
}
void motor_z(float c_1) //z轴自动前进
{
if(c_1 >= 0)
{
time_1 = 250*c_1;
digitalWrite(DIR_Z, HIGH);
tone(CLK_Z,1600);
delay(time_1);
noTone(CLK_Z);
}
else
{
c_1 = -c_1;
time_1 = 250*c_1;
digitalWrite(DIR_Z,LOW);
tone(CLK_Z,1600);
delay(time_1);
noTone(CLK_Z);
}
}
void motor_Scalpel(int d_1) //刀具旋转
{
if( d_1 == FORWARD )
{
digitalWrite(Scalpel_1,HIGH);
digitalWrite(Scalpel_2,LOW);
}
else if( d_1 == BACKWARD )
{
digitalWrite(Scalpel_1,LOW);
digitalWrite(Scalpel_2,HIGH);
}
else
{
digitalWrite(Scalpel_1,LOW);
digitalWrite(Scalpel_2,LOW);
}
}
void motor_Stretch(int e_1) //拉伸收缩
{
if( e_1 == FORWARD )
{
digitalWrite(Stretch_1,HIGH);
digitalWrite(Stretch_2,LOW);
}
else if( e_1 == BACKWARD )
{
digitalWrite(Stretch_1,LOW);
digitalWrite(Stretch_2,HIGH);
}
else
{
digitalWrite(Stretch_1,LOW);
digitalWrite(Stretch_2,LOW);
}
}
void motor_mx(int f_1,int f_2) //手控x轴
{
if(f_1 == FORWARD,f_2 == FAST)
{
digitalWrite(DIR_X,HIGH);
tone(CLK_X,1600);
}
else if(f_1 == FORWARD,f_2 == SLOW )
{
digitalWrite(DIR_X,HIGH);
tone(CLK_X,800);
}
else if(f_1 == BACKWARD, f_2 == FAST)
{
digitalWrite(DIR_X,LOW);
tone(CLK_X,1600);
}
else if(f_1 == BACKWARD, f_2 == SLOW)
{
digitalWrite(DIR_X,LOW);
tone(CLK_X,800);
}
else
{
noTone(CLK_X);
}
}
void motor_my(int g_1,int g_2) //手控y轴
{
if(g_1 == FORWARD,g_2 == FAST)
{
digitalWrite(DIR_Y,HIGH);
tone(CLK_Y,1600);
}
else if(g_1 == FORWARD,g_2 == SLOW )
{
digitalWrite(DIR_Y,HIGH);
tone(CLK_Y,800);
}
else if(g_1 == BACKWARD, g_2 == FAST)
{
digitalWrite(DIR_Y,LOW);
tone(CLK_Y,1600);
}
else if(g_1 == BACKWARD, g_2 == SLOW)
{
digitalWrite(DIR_Y,LOW);
tone(CLK_Y,800);
}
else
{
noTone(CLK_Y);
}
}
void motor_mz(int h_1,int h_2) //手控z轴
{
if(h_1 == FORWARD,h_2 == FAST)
{
digitalWrite(DIR_Z,HIGH);
tone(CLK_Z,1600);
}
else if(h_1 == FORWARD,h_2 == SLOW )
{
digitalWrite(DIR_Z,HIGH);
tone(CLK_Z,800);
}
else if(h_1 == BACKWARD, h_2 == FAST)
{
digitalWrite(DIR_Z,LOW);
tone(CLK_Z,1600);
}
else if(h_1 == BACKWARD, h_2 == SLOW)
{
digitalWrite(DIR_Z,LOW);
tone(CLK_Z,800);
}
else
{
noTone(CLK_Z);
}
}
void manuallycontrolX()
{
while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
while(1)
{
if(digitalRead(Forward_SW)) motor_mx(FORWARD);
else if(digitalRead(Backward_SW)) motor_mx(BACKWARD);
else motor_mx(STOP);
if(!digitalRead(Choice_SW)){
delay(50);
if(!digitalRead(Choice_SW))
break;
}
}
motor_mx(STOP);
}
void manuallycontrolY()
{
while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
while(1)
{
if(digitalRead(Forward_SW)) motor_my(FORWARD);
else if(digitalRead(Backward_SW)) motor_my(BACKWARD);
else motor_my(STOP);
if(!digitalRead(Choice_SW)){
delay(50);
if(!digitalRead(Choice_SW))
break;
}
}
motor_my(STOP);
}
void manuallycontrolZ()
{
while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
while(1)
{
if(digitalRead(Forward_SW)) motor_mz(FORWARD);
else if(digitalRead(Backward_SW)) motor_mz(BACKWARD);
else motor_mz(STOP);
if(!digitalRead(Choice_SW)){
delay(50);
if(!digitalRead(Choice_SW))
break;
}
}
motor_my(STOP);
}
void manuallycontrolS()
{
while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
while(1)
{
if(digitalRead(Forward_SW)) motor_Scalpel(FORWARD);
else if(digitalRead(Backward_SW)) motor_Scalpel(BACKWARD);
else motor_Scalpel(STOP);
if(!digitalRead(Choice_SW)){
delay(50);
if(!digitalRead(Choice_SW))
break;
}
}
motor_Scalpel(STOP);
}
void manuallycontrolD()
{
while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
while(1)
{
if(digitalRead(Forward_SW)) motor_Stretch(FORWARD);
else if(digitalRead(Backward_SW)) motor_Stretch(BACKWARD);
else motor_Stretch(STOP);
if(!digitalRead(Choice_SW)){
delay(50);
if(!digitalRead(Choice_SW))
break;
}
}
motor_Stretch(STOP);
}
void manuallycontrol()
{
m_var=1;
Serial.println("Select a control mode:");
Serial.println("x.x axis");
Serial.println("y.y axis");
Serial.println("z.z axis");
Serial.println("s.scalpel");
Serial.println("d.drawing");
while(m_var!=0)
{
if(Serial.available()>0)
{
case_var=Serial.read();
delay(100);
switch(case_var)
{
case 120:
Serial.println("manually control x axis");
manuallycontrolX();
Serial.println("quit x manual mode");
break;
case 121:
Serial.println("manually control y axis");
manuallycontrolY();
Serial.println("quit y manual mode");
break;
case 122:
Serial.println("manually control z axis");
manuallycontrolZ();
Serial.println("quit x manual mode");
break;
case 115:
Serial.println("rotate the scalpel");
manuallycontrolS();
Serial.println("quit scalpel mode");
break;
case 100:
Serial.println("draw");
digitalWrite(Solenoid,LOW);
manuallycontrolD();
digitalWrite(Solenoid,HIGH);
Serial.println("quit drawing mode");
break;
case 48:
m_var=0;
break;
default:
break;
}
}
}
}
复制代码
所有资料51hei提供下载:
M_Controller_v1.8.zip
(2.17 KB, 下载次数: 34)
2019-3-24 11:58 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-3-25 05:40
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
nasony
时间:
2020-1-31 17:23
谢谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1