如題,使用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
|