找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3379|回复: 2
打印 上一主题 下一主题
收起左侧

Arduino自制实验用切割装置-自动控制机床程序

[复制链接]
跳转到指定楼层
楼主
ID:497114 发表于 2019-3-24 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,使用ardunio编写的一个自动控制机床实现简单切割的小程序,串口实时通信控制。

单片机源程序如下:
  1. #include "Arduino.h"
  2. #define CLK 5
  3. #define CLK_X 3
  4. #define CLK_Y 6
  5. #define CLK_Z 9
  6. #define DIR_X 2
  7. #define DIR_Y 5
  8. #define DIR_Z 8
  9. #define Stretch_1 A3
  10. #define Stretch_2 A2
  11. #define Scalpel_1 A1
  12. #define Scalpel_2 A0 //pin parament
  13. #define Choice_SW 16
  14. #define Forward_SW 14
  15. #define Backward_SW 15
  16. #define FORWARD 0
  17. #define BACKWARD 1 //motor direct parament
  18. #define STOP 100
  19. #define Solenoid 10
  20. #define FAST 98
  21. #define SLOW 99

  22. int case_var;
  23. float distance;
  24. float time_1;
  25. int m_var;


  26. //电机控制部分 //步进电机使用1600HZ CLK时钟 1600细分
  27. void motor_x(float); //输入浮点型位移 distance 行进完自动停止
  28. void motor_y(float); //输入浮点型位移 distance 行进完自动停止
  29. void motor_z(float); //输入浮点型位移 distance 行进完自动停止
  30. void motor_Scalpel(int); //输入 FORWARD前进 BACKWARD后退 STOP停止 (行进后必须再输入停止命令STOP才可以停止)
  31. void motor_Stretch(int); //输入 FORWARD前进 BACKWARD后退 STOP停止
  32. void motor_mx(int,int); //输入 FORWARD前进 BACKWARD后退 STOP停止 && 输入FAST快速模式,SLOW慢速模式,停止时随意速度模式
  33. void motor_my(int,int); //输入 FORWARD前进 BACKWARD后退 STOP停止 && 输入FAST快速模式,SLOW慢速模式,停止时随意速度模式
  34. void motor_mz(int,int); //输入 FORWARD前进 BACKWARD后退 STOP停止 && 输入FAST快速模式,SLOW慢速模式,停止时随意速度模式

  35. void setup()
  36. {
  37.   // put your setup code here, to run once:

  38.   pinMode(DIR_X,OUTPUT);
  39.   pinMode(DIR_Y,OUTPUT);
  40.   pinMode(DIR_Z,OUTPUT);
  41.   pinMode(CLK_X,OUTPUT);
  42.   pinMode(CLK_Y,OUTPUT);
  43.   pinMode(CLK_Z,OUTPUT);
  44.   pinMode(Scalpel_1,OUTPUT);
  45.   pinMode(Scalpel_2,OUTPUT);
  46.   pinMode(Stretch_1,OUTPUT);
  47.   pinMode(Stretch_2,OUTPUT);
  48.   pinMode(Choice_SW,INPUT_PULLUP);
  49.   pinMode(Forward_SW,INPUT);
  50.   pinMode(Backward_SW,INPUT); //Setting mode
  51.   Serial.begin(9600);
  52.   analogWrite(CLK_X,0);
  53.   analogWrite(CLK_Y,0);
  54.   analogWrite(CLK_Z,0); //Duty cycle is 0/255
  55.   delay(1200);
  56.   Serial.println("cutting start, please confirm air pump is working");
  57. }

  58. void loop()
  59. {
  60.   // put your main code here, to run repeatedly:
  61.   Serial.println("Select a control mode:");
  62.   Serial.println("x.x axis");
  63.   Serial.println("y.y axis");
  64.   Serial.println("z.z axis");
  65.   Serial.println("m.manual mode");
  66.   while(Serial.read()>=0){}//clear buffer
  67.   delay(100);
  68.   while(Serial.available()<=0){}
  69.   if (Serial.available()>0)
  70. {
  71.      case_var=Serial.read();
  72.          delay(100);
  73.      switch(case_var)
  74.            {
  75.           case 120: //x axis
  76.           Serial.println("Enter a distance:");
  77.           while(Serial.available()<=0){}
  78.           distance = Serial.parseFloat();
  79.           delay(100);
  80.     while(Serial.read()>=0){}//clear buffer
  81.           Serial.print("Advance in x axis: ");
  82.           Serial.println(distance);
  83.           motor_x(distance);
  84.           //Control stepper motor
  85.           break;
  86.         
  87.           case 121: //y axis
  88.           Serial.println("Enter a distance:");
  89.           while(Serial.available()<=0){}
  90.           distance = Serial.parseFloat();
  91.           delay(100);
  92.     while(Serial.read()>=0){}//clear buffer
  93.           Serial.print("Advance in y axis: ");
  94.           Serial.println(distance);
  95.           motor_y(distance);
  96.           //Control stepper motor
  97.           break;
  98.         
  99.           case 122: //z axis
  100.           Serial.println("Enter a distance:");
  101.           while(Serial.available()<=0){}
  102.           distance = Serial.parseFloat();
  103.           delay(100);
  104.     while(Serial.read()>=0){}//clear buffer
  105.           Serial.print("Advance in z axis: ");
  106.           Serial.println(distance);
  107.           motor_z(distance);
  108.           //Control stepper motor
  109.           break;

  110.           case 109: //manunal
  111.           manuallycontrol();
  112.           break;

  113.     default:
  114.       break;

  115.     }
  116. }
  117. }


  118. //电机控制部分
  119. void motor_x(float a_1)  //x轴自动前进
  120. {
  121.         if(a_1 >= 0)
  122.           {
  123.                  time_1 = 250*a_1;
  124.                  digitalWrite(DIR_X, HIGH);
  125.                  tone(CLK_X,1600);
  126.                  delay(time_1);
  127.                  noTone(CLK_X);
  128.           }
  129.           else
  130.           {
  131.                   a_1 = -a_1;
  132.                   time_1 = 250*a_1;
  133.                   digitalWrite(DIR_X,LOW);
  134.                   tone(CLK_X,1600);
  135.                   delay(time_1);
  136.                   noTone(CLK_X);
  137.           }  
  138. }

  139. void motor_y(float b_1)  //y轴自动前进
  140. {
  141.         if(b_1 >= 0)
  142.           {
  143.                  time_1 = 250*b_1;
  144.                  digitalWrite(DIR_Y, HIGH);
  145.                  tone(CLK_Y,1600)
  146.                  delay(time_1);
  147.                  noTone(CLK_Y);
  148.           }
  149.           else
  150.           {
  151.                   b_1 = -b_1;
  152.                   time_1 = 250*b_1;
  153.                   digitalWrite(DIR_Y,LOW);
  154.                   tone(CLK_Y,1600);
  155.                   delay(time_1);
  156.                   noTone(CLK_Y);
  157.           }
  158. }

  159. void motor_z(float c_1)  //z轴自动前进
  160. {
  161.         if(c_1 >= 0)
  162.           {
  163.                  time_1 = 250*c_1;
  164.                  digitalWrite(DIR_Z, HIGH);
  165.                  tone(CLK_Z,1600);
  166.                  delay(time_1);
  167.                  noTone(CLK_Z);
  168.           }
  169.           else
  170.           {
  171.                   c_1 = -c_1;
  172.                   time_1 = 250*c_1;
  173.                   digitalWrite(DIR_Z,LOW);
  174.                   tone(CLK_Z,1600);
  175.                   delay(time_1);
  176.                   noTone(CLK_Z);
  177.           }
  178. }

  179. void motor_Scalpel(int d_1) //刀具旋转
  180. {
  181.         if( d_1 == FORWARD )
  182.         {
  183.                 digitalWrite(Scalpel_1,HIGH);
  184.                 digitalWrite(Scalpel_2,LOW);
  185.         }
  186.         else if( d_1 == BACKWARD )
  187.         {
  188.                 digitalWrite(Scalpel_1,LOW);
  189.                 digitalWrite(Scalpel_2,HIGH);
  190.         }
  191.         else
  192.         {
  193.                 digitalWrite(Scalpel_1,LOW);
  194.                 digitalWrite(Scalpel_2,LOW);
  195.         }
  196. }

  197. void motor_Stretch(int e_1) //拉伸收缩
  198. {
  199.         if( e_1 == FORWARD )
  200.         {
  201.                 digitalWrite(Stretch_1,HIGH);
  202.                 digitalWrite(Stretch_2,LOW);
  203.         }
  204.         else if( e_1 == BACKWARD )
  205.         {
  206.                 digitalWrite(Stretch_1,LOW);
  207.                 digitalWrite(Stretch_2,HIGH);
  208.         }
  209.         else
  210.         {
  211.                 digitalWrite(Stretch_1,LOW);
  212.                 digitalWrite(Stretch_2,LOW);
  213.         }
  214. }

  215. void motor_mx(int f_1,int f_2)   //手控x轴
  216. {
  217.         if(f_1 == FORWARD,f_2 == FAST)
  218.         {
  219.         digitalWrite(DIR_X,HIGH);
  220.                 tone(CLK_X,1600);
  221.         }
  222.         else if(f_1 == FORWARD,f_2 == SLOW )
  223.         {
  224.         digitalWrite(DIR_X,HIGH);
  225.                 tone(CLK_X,800);
  226.         }
  227.         else if(f_1 == BACKWARD, f_2 == FAST)
  228.         {
  229.                 digitalWrite(DIR_X,LOW);
  230.                 tone(CLK_X,1600);
  231.         }
  232.         else if(f_1 == BACKWARD, f_2 == SLOW)
  233.         {
  234.                 digitalWrite(DIR_X,LOW);
  235.                 tone(CLK_X,800);
  236.         }
  237.         else
  238.         {
  239.         noTone(CLK_X);
  240.         }
  241. }

  242. void motor_my(int g_1,int g_2)   //手控y轴
  243. {
  244.         if(g_1 == FORWARD,g_2 == FAST)
  245.         {
  246.         digitalWrite(DIR_Y,HIGH);
  247.                 tone(CLK_Y,1600);
  248.         }
  249.         else if(g_1 == FORWARD,g_2 == SLOW )
  250.         {
  251.         digitalWrite(DIR_Y,HIGH);
  252.                 tone(CLK_Y,800);
  253.         }
  254.         else if(g_1 == BACKWARD, g_2 == FAST)
  255.         {
  256.                 digitalWrite(DIR_Y,LOW);
  257.                 tone(CLK_Y,1600);
  258.         }
  259.         else if(g_1 == BACKWARD, g_2 == SLOW)
  260.         {
  261.                 digitalWrite(DIR_Y,LOW);
  262.                 tone(CLK_Y,800);
  263.         }
  264.         else
  265.         {
  266.         noTone(CLK_Y);
  267.         }
  268. }

  269. void motor_mz(int h_1,int h_2)   //手控z轴
  270. {
  271.         if(h_1 == FORWARD,h_2 == FAST)
  272.         {
  273.         digitalWrite(DIR_Z,HIGH);
  274.                 tone(CLK_Z,1600);
  275.         }
  276.         else if(h_1 == FORWARD,h_2 == SLOW )
  277.         {
  278.         digitalWrite(DIR_Z,HIGH);
  279.                 tone(CLK_Z,800);
  280.         }
  281.         else if(h_1 == BACKWARD, h_2 == FAST)
  282.         {
  283.                 digitalWrite(DIR_Z,LOW);
  284.                 tone(CLK_Z,1600);
  285.         }
  286.         else if(h_1 == BACKWARD, h_2 == SLOW)
  287.         {
  288.                 digitalWrite(DIR_Z,LOW);
  289.                 tone(CLK_Z,800);
  290.         }
  291.         else
  292.         {
  293.         noTone(CLK_Z);
  294.         }
  295. }

  296. void manuallycontrolX()
  297. {
  298.         while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
  299.         while(1)
  300.                 {
  301.                 if(digitalRead(Forward_SW)) motor_mx(FORWARD);
  302.                 else if(digitalRead(Backward_SW)) motor_mx(BACKWARD);
  303.                 else motor_mx(STOP);
  304.     if(!digitalRead(Choice_SW)){
  305.       delay(50);
  306.       if(!digitalRead(Choice_SW))
  307.       break;
  308.     }
  309.                 }
  310.         motor_mx(STOP);
  311. }

  312. void manuallycontrolY()
  313. {
  314.         while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
  315.         while(1)
  316.                 {
  317.                 if(digitalRead(Forward_SW)) motor_my(FORWARD);
  318.                 else if(digitalRead(Backward_SW)) motor_my(BACKWARD);
  319.                 else motor_my(STOP);
  320.     if(!digitalRead(Choice_SW)){
  321.       delay(50);
  322.       if(!digitalRead(Choice_SW))
  323.       break;
  324.     }
  325.                 }
  326.         motor_my(STOP);
  327. }

  328. void manuallycontrolZ()
  329. {
  330.         while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
  331.         while(1)
  332.                 {
  333.                 if(digitalRead(Forward_SW)) motor_mz(FORWARD);
  334.                 else if(digitalRead(Backward_SW)) motor_mz(BACKWARD);
  335.                 else motor_mz(STOP);
  336.     if(!digitalRead(Choice_SW)){
  337.       delay(50);
  338.       if(!digitalRead(Choice_SW))
  339.       break;
  340.     }
  341.                 }
  342.         motor_my(STOP);
  343. }

  344. void manuallycontrolS()
  345. {
  346.         while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
  347.         while(1)
  348.                 {
  349.                 if(digitalRead(Forward_SW)) motor_Scalpel(FORWARD);
  350.                 else if(digitalRead(Backward_SW)) motor_Scalpel(BACKWARD);
  351.                 else motor_Scalpel(STOP);
  352.    if(!digitalRead(Choice_SW)){
  353.       delay(50);
  354.       if(!digitalRead(Choice_SW))
  355.       break;
  356.     }
  357.                 }
  358.         motor_Scalpel(STOP);
  359. }

  360. void manuallycontrolD()
  361. {
  362.         while(!digitalRead(Forward_SW)&&!digitalRead(Backward_SW)&&digitalRead(Choice_SW)){}
  363.         while(1)
  364.                 {
  365.                 if(digitalRead(Forward_SW)) motor_Stretch(FORWARD);
  366.                 else if(digitalRead(Backward_SW)) motor_Stretch(BACKWARD);
  367.                 else motor_Stretch(STOP);
  368.    if(!digitalRead(Choice_SW)){
  369.       delay(50);
  370.       if(!digitalRead(Choice_SW))
  371.       break;
  372.     }
  373.                 }
  374.         motor_Stretch(STOP);
  375. }

  376. void manuallycontrol()
  377. {
  378.         m_var=1;
  379.         Serial.println("Select a control mode:");
  380.     Serial.println("x.x axis");
  381.     Serial.println("y.y axis");
  382.     Serial.println("z.z axis");
  383.     Serial.println("s.scalpel");
  384.         Serial.println("d.drawing");
  385.           while(m_var!=0)
  386.           {
  387.                   if(Serial.available()>0)
  388.                   {
  389.                           case_var=Serial.read();
  390.                           delay(100);
  391.                           switch(case_var)
  392.                           {
  393.                                   case 120:
  394.                                   Serial.println("manually control x axis");
  395.                                   manuallycontrolX();
  396.                                   Serial.println("quit x manual mode");
  397.                                   break;
  398.                                  
  399.                                   case 121:
  400.                                   Serial.println("manually control y axis");
  401.                                   manuallycontrolY();
  402.                                   Serial.println("quit y manual mode");
  403.                                   break;
  404.                                  
  405.                                   case 122:
  406.                                   Serial.println("manually control z axis");
  407.                                   manuallycontrolZ();
  408.                                   Serial.println("quit x manual mode");
  409.                                   break;
  410.                                  
  411.                                   case 115:
  412.                                   Serial.println("rotate the scalpel");
  413.                                   manuallycontrolS();
  414.                                   Serial.println("quit scalpel mode");
  415.                                   break;
  416.                                  
  417.                                   case 100:
  418.                                   Serial.println("draw");
  419.                                   digitalWrite(Solenoid,LOW);
  420.                                   manuallycontrolD();
  421.                                   digitalWrite(Solenoid,HIGH);
  422.                                   Serial.println("quit drawing mode");
  423.           break;
  424.                                  
  425.                                   case 48:
  426.                                   m_var=0;
  427.                                   break;

  428.           default:
  429.             break;

  430.                           }
  431.                   }
  432.           }
  433. }
复制代码

所有资料51hei提供下载:
M_Controller_v1.8.zip (2.17 KB, 下载次数: 34)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-3-25 05:40 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:677714 发表于 2020-1-31 17:23 | 只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表