標(biāo)題:
Arduino自制實驗用切割裝置-自動控制機(jī)床程序
[打印本頁]
作者:
JohnRowton
時間:
2019-3-24 11:58
標(biāo)題:
Arduino自制實驗用切割裝置-自動控制機(jī)床程序
如題,使用ardunio編寫的一個自動控制機(jī)床實現(xiàn)簡單切割的小程序,串口實時通信控制。
單片機(jī)源程序如下:
#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;
//電機(jī)控制部分 //步進(jìn)電機(jī)使用1600HZ CLK時鐘 1600細(xì)分
void motor_x(float); //輸入浮點型位移 distance 行進(jìn)完自動停止
void motor_y(float); //輸入浮點型位移 distance 行進(jìn)完自動停止
void motor_z(float); //輸入浮點型位移 distance 行進(jìn)完自動停止
void motor_Scalpel(int); //輸入 FORWARD前進(jìn) BACKWARD后退 STOP停止 (行進(jìn)后必須再輸入停止命令STOP才可以停止)
void motor_Stretch(int); //輸入 FORWARD前進(jìn) BACKWARD后退 STOP停止
void motor_mx(int,int); //輸入 FORWARD前進(jìn) BACKWARD后退 STOP停止 && 輸入FAST快速模式,SLOW慢速模式,停止時隨意速度模式
void motor_my(int,int); //輸入 FORWARD前進(jìn) BACKWARD后退 STOP停止 && 輸入FAST快速模式,SLOW慢速模式,停止時隨意速度模式
void motor_mz(int,int); //輸入 FORWARD前進(jìn) 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;
}
}
}
//電機(jī)控制部分
void motor_x(float a_1) //x軸自動前進(jìn)
{
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軸自動前進(jìn)
{
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軸自動前進(jìn)
{
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) //刀具旋轉(zhuǎn)
{
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;
}
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
M_Controller_v1.8.zip
(2.17 KB, 下載次數(shù): 34)
2019-3-24 11:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2019-3-25 05:40
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
nasony
時間:
2020-1-31 17:23
謝謝分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1