一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2228|回复: 7

[其他DIY] 自动送料系统半成品

[复制链接]
发表于 2016-7-17 22:47 | 显示全部楼层 |阅读模式
本帖最后由 njzt 于 2016-7-17 22:55 编辑

这自从有了孩子,感觉好些空闲的时间都没了,老早就想给激光机配个自动送料的系统,主要用于激光切割纸,身在帝都,手头边没有工具,都是每次回家看孩子,趁孩子睡觉的时候才动手做,所以这都拖了两个多月了才弄了个雏形。好久不焊电路了,焊的比较难看大家多见谅。送料的机械结构有个大概的想法,但是还没有实施
1. 主控用的Arduino Nano
2. 电路也比较简单,多数是继电器控制
3. 位置检测用激光对管
目前先做一个最简单的版本,不带液晶显示的,用于串口连接电脑配置参数,配置参数主要是配加工次数。
1.pic.jpg 2.pic.jpg 3.pic.jpg

=======================================贴上现在的代码========================================
  1. /*
  2. * Description: auto feed system
  3. * Hardware   : Arduino nano 328p
  4. * Version    : V1.0
  5. * Author     : Ninja
  6. * Date       : 2016-06
  7. */
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. //#include <U8glib.h>

  11. #define SENSOR     5   //位移传感器信号
  12. #define SENSOR_POWER 7 //位移传感器电源开关
  13. #define LASER      10  //加工停止信号

  14. #define CUT_START  9   //加工启动面板
  15. #define CUT_STOP   8   //加工停止面板

  16. #define KEY_START  19   //开始按钮
  17. #define KEY_CONFIG 18   //参数配置按钮
  18. #define KEY_ESTOP  17   //急停按钮

  19. #define MOTOR      6   //送料电机

  20. #define DEBUG      1   //串口DEBUG开关

  21. #if 0
  22. #define CS         5   //LCD12864 CS
  23. #define RESET      7   //LCD12864 RESET

  24. U8GLIB_ST7920_128X64_1X LCD(CS,RESET);   // HW SPI: SCK MOSI

  25. #endif

  26. /*
  27. * 函数返回值
  28. */
  29. typedef enum rs_s{
  30.   RS_OK,
  31.   RS_FAIL
  32. }rs_t;

  33. /*
  34. *信号状态
  35. */
  36. typedef enum signal_state_s{
  37.   ON,
  38.   OFF
  39. }signal_state_t;

  40. /*
  41. * 系统状态
  42. */
  43. typedef enum state_s{
  44.   INIT,
  45.   CONFIG,
  46.   READY_CUT,
  47.   CUTTING,
  48.   FEEDING,
  49.   ESTOP
  50. }state_t;

  51. typedef struct feed_obj_s{
  52.   unsigned int cut_times;
  53.   unsigned char state;
  54. }feed_obj_t;


  55. typedef struct action_s{
  56.   rs_t (*sys_init)(feed_obj_t *feed_obj);
  57.   rs_t (*sys_config)(feed_obj_t *feed_obj);
  58.   rs_t (*sys_ready)(feed_obj_t *feed_obj);
  59.   rs_t (*sys_cutting)(feed_obj_t *feed_obj);
  60.   rs_t (*sys_feeding)(feed_obj_t *feed_obj);
  61.   rs_t (*sys_estop)(feed_obj_t *feed_obj);
  62.   void (*sys_key)(feed_obj_t *feed_obj);
  63. }action_t;


  64. /*
  65. * 启动送料电机
  66. */
  67. void motor_start(){
  68.   if(DEBUG){
  69.     Serial.println("motor_start\n");
  70.     delay(100);
  71.   }
  72.   digitalWrite(MOTOR,HIGH);
  73.   delay(2);
  74. }

  75. /*
  76. * 停止送料电机
  77. */
  78. void motor_stop(){
  79.    if(DEBUG){
  80.     Serial.println("motor_stop\n");
  81.     delay(100);
  82.   }
  83.   digitalWrite(MOTOR,LOW);
  84.   delay(2);
  85. }

  86. /*
  87. * 清除加工参数
  88. */
  89. void reset_cut_params(feed_obj_t *feed_obj){
  90.   if(DEBUG){
  91.     Serial.println("reset_cut_params");
  92.     delay(100);
  93.   }
  94.   feed_obj->cut_times = 0;
  95.   feed_obj->state = INIT;
  96.   sensor_power_off();
  97. }

  98. /*
  99. * 位移检测传感器
  100. */
  101. signal_state_t sensor_read(){
  102.   if(DEBUG){
  103.       Serial.println("sensor_read\n");
  104.       delay(100);
  105.   }
  106.   if(digitalRead(SENSOR) != HIGH){
  107.     return OFF;
  108.   }
  109.   else{
  110.     return ON;
  111.   }
  112. }

  113. /*
  114. * 加工停止信号检测
  115. */
  116. signal_state_t laser_stop(){
  117.   if(DEBUG){
  118.     Serial.println("laser_stop\n");
  119.     delay(100);
  120.   }
  121.   if(digitalRead(LASER) != HIGH){
  122.     return OFF;
  123.   }
  124.   else{
  125.     return ON;
  126.   }
  127. }

  128. /*
  129. * 自定义面板启动加工
  130. */
  131. void cut_start(){
  132.   if(DEBUG){
  133.     Serial.println("cut_start\n");
  134.     delay(100);
  135.   }
  136.   digitalWrite(CUT_START,HIGH);
  137.   delay(2);
  138. }

  139. /*
  140. * 自定义面板停止加工
  141. */
  142. void cut_stop(){
  143.   if(DEBUG){
  144.     Serial.println("cut_stop\n");
  145.     delay(100);
  146.   }
  147.   digitalWrite(CUT_STOP,HIGH);
  148.   delay(2);
  149. }

  150. /*
  151. * 开 位移传感器
  152. */
  153. void sensor_power_on(){
  154.   if(DEBUG){
  155.     Serial.println("sensor_power_on\n");
  156.     delay(100);
  157.   }
  158.   digitalWrite(SENSOR_POWER,LOW);
  159.   delay(2);
  160. }

  161. /*
  162. * 关 位移传感器
  163. */
  164. void sensor_power_off(){
  165.   if(DEBUG){
  166.     Serial.println("sensor_power_off\n");
  167.     delay(100);
  168.   }
  169.   digitalWrite(SENSOR_POWER,HIGH);
  170.   delay(2);
  171. }

  172. /*
  173. * 初始化系统
  174. */
  175. rs_t action_init(feed_obj_t *feed_obj){
  176.   if(DEBUG){
  177.     Serial.println("action_init");
  178.     delay(100);
  179.   }
  180.   if(NULL == feed_obj){
  181.     return RS_FAIL;
  182.   }
  183.   
  184.   if(feed_obj->state != INIT){
  185.     return RS_FAIL;
  186.   }
  187.   motor_stop();
  188.   reset_cut_params(feed_obj);
  189.   //feed_obj->state = CONFIG;
  190.   while(!Serial){
  191.    
  192.   }
  193.   Serial.println("\t");
  194.   Serial.println("***********自动送料系统************\t");
  195.   Serial.println("Version:V1.0 \t");
  196.   Serial.println("Author :Ning Jiang \t");
  197.   Serial.println("Date   :2016-06\t");
  198.   Serial.println("*********************************\t");
  199.   return RS_OK;
  200. }

  201. /*
  202. * 加工参数配置
  203. */
  204. rs_t action_config(feed_obj_t *feed_obj){
  205.   String val = "";
  206.   unsigned int i = 0;
  207.   if(DEBUG){
  208.     Serial.println("action_config\n");
  209.     delay(100);
  210.   }
  211.   if(NULL == feed_obj){
  212.     return RS_FAIL;
  213.   }
  214.   
  215.   if(feed_obj->state != CONFIG){
  216.     return RS_FAIL;
  217.   }

  218.   Serial.println("请输入加工次数:\t");
  219.   while(Serial.available() == 0){
  220.     //等待串口输入
  221.   }
  222.   while(Serial.available() > 0){
  223.     val += char(Serial.read());
  224.     delay(2);
  225.   }
  226.   if(val.length() > 5 || val.toInt() > 65535){
  227.     Serial.println("加工次数超出范围");
  228.     feed_obj->state = CONFIG;
  229.     return RS_FAIL;
  230.   }
  231.   for(i=0;i<val.length();i++){
  232.     if(val[i] < '0' || val[i] > '9'){
  233.       Serial.println("加工参数只能输入数字");
  234.       feed_obj->state = CONFIG;
  235.       return RS_FAIL;
  236.     }
  237.   }
  238.   if(val.toInt() == 0){
  239.     Serial.println("加工参数不能为0");
  240.     feed_obj->state = CONFIG;
  241.     return RS_FAIL;
  242.   }
  243.   feed_obj->cut_times = val.toInt();
  244.   feed_obj->state = READY_CUT;
  245.   Serial.println(feed_obj->cut_times,DEC);
  246.   Serial.println("请按加工按钮\t");
  247.   if(DEBUG){
  248.     Serial.println(feed_obj->cut_times,DEC);
  249.     delay(1000);
  250.   }
  251.   return RS_OK;
  252. }

  253. /*
  254. * 准备加工
  255. */
  256. rs_t action_ready(feed_obj_t *feed_obj){
  257.   if(DEBUG){
  258.     Serial.println("action_ready\n");
  259.     delay(100);
  260.   }
  261.   feed_obj->state = READY_CUT;
  262.   return RS_OK;
  263. }

  264. /*
  265. * 启动加工
  266. */
  267. rs_t action_cutting(feed_obj_t *feed_obj){
  268.   if(DEBUG){
  269.     Serial.println("action_cutting\n");
  270.     delay(100);
  271.   }
  272.   if(NULL == feed_obj){
  273.     return RS_FAIL;
  274.   }
  275.   if(feed_obj->cut_times == 0){
  276.     feed_obj->state = CONFIG;
  277.     return RS_FAIL;
  278.   }
  279.   cut_start();
  280.   while(laser_stop() != OFF){
  281.     //等待加工结束
  282.   }
  283.   feed_obj->state = FEEDING;
  284.   (feed_obj->cut_times)--;
  285.   if(DEBUG){
  286.     Serial.println(feed_obj->cut_times,DEC);
  287.     delay(1000);
  288.   }
  289.   return RS_OK;
  290. }

  291. /*
  292. * 启动送料
  293. */
  294. rs_t action_feeding(feed_obj_t *feed_obj){
  295.   if(DEBUG){
  296.     Serial.println("action_feeding\n");
  297.     delay(100);
  298.   }
  299.   if(feed_obj->state != FEEDING){
  300.     return RS_FAIL;
  301.   }
  302.   if(feed_obj->cut_times == 0){
  303.     feed_obj->state = CONFIG;
  304.     return RS_OK;
  305.   }
  306.   motor_start();
  307.   while(sensor_read() != OFF){
  308.     //等待位移检测信号
  309.   }
  310.   sensor_power_on();
  311.   motor_stop();
  312.   feed_obj->state = CUTTING;
  313.   sensor_power_off();
  314.   return RS_OK;
  315. }

  316. /*
  317. * 急停
  318. */
  319. rs_t action_estop(feed_obj_t *feed_obj){
  320.   if(DEBUG){
  321.     Serial.println("action_estop\n");
  322.     delay(100);
  323.   }
  324.   if(NULL == feed_obj){
  325.     return RS_FAIL;
  326.   }
  327.   cut_stop();
  328.   feed_obj->cut_times = 0;
  329.   feed_obj->state = INIT;
  330.   return RS_OK;
  331. }

  332. void func_init(action_t *action){
  333.   if(DEBUG){
  334.     Serial.println("func_init\n");
  335.     delay(100);
  336.   }
  337.   action->sys_init = action_init;
  338.   action->sys_config = action_config;
  339.   action->sys_ready = action_ready;
  340.   action->sys_cutting = action_cutting;
  341.   action->sys_feeding = action_feeding;
  342.   action->sys_estop = action_estop;
  343.   action->sys_key = key_scan;
  344. }

  345. /*
  346. * 控制引脚初始化
  347. */
  348. void port_init(){
  349.   pinMode(SENSOR,INPUT);
  350.   digitalWrite(SENSOR,HIGH);
  351.   pinMode(LASER,INPUT);
  352.   digitalWrite(LASER,LOW);

  353.   pinMode(SENSOR_POWER,OUTPUT);
  354.   digitalWrite(SENSOR_POWER,HIGH);

  355.   pinMode(CUT_START,OUTPUT);
  356.   digitalWrite(CUT_START,LOW);
  357.   pinMode(CUT_STOP,OUTPUT);
  358.   digitalWrite(CUT_STOP,LOW);

  359.   pinMode(KEY_START,INPUT);
  360.   digitalWrite(KEY_START,HIGH);
  361.   pinMode(KEY_CONFIG,INPUT);
  362.   digitalWrite(KEY_CONFIG,HIGH);
  363.   pinMode(KEY_ESTOP,INPUT);
  364.   digitalWrite(KEY_ESTOP,HIGH);

  365.   pinMode(MOTOR,OUTPUT);
  366.   digitalWrite(MOTOR,LOW);
  367. }

  368. /*
  369. * 操作按钮检测
  370. */
  371. void key_scan(feed_obj_t *feed_obj){
  372.   if(DEBUG){
  373.     Serial.println("key_scan\n");
  374.   }
  375.   if(digitalRead(KEY_START) == LOW){
  376.     delay(10);
  377.     if(digitalRead(KEY_START) == LOW){
  378.       feed_obj->state = CUTTING;
  379.       if(DEBUG){
  380.         Serial.println("KEY_START");
  381.       }
  382.     }
  383.   }
  384.   else if(digitalRead(KEY_CONFIG) == LOW){
  385.     delay(10);
  386.     if(digitalRead(KEY_CONFIG) == LOW){
  387.       feed_obj->state = CONFIG;
  388.       if(DEBUG){
  389.         Serial.println("KEY_CONFIG");
  390.       }
  391.     }
  392.   }
  393.   else if(digitalRead(KEY_ESTOP) == LOW){
  394.     delay(10);
  395.     if(digitalRead(KEY_ESTOP) == LOW){
  396.       feed_obj->state = ESTOP;
  397.       Serial.println("KEY_ESTOP");
  398.     }
  399.   }
  400.   else{
  401.     //feed_obj->state = INIT;
  402.     return;
  403.   }
  404. }

  405. void setup() {
  406.   // put your setup code here, to run once:
  407.   port_init();
  408.   Serial.begin(9600);
  409. // while(!Serial){
  410.     //等待串口连接
  411. // }

  412. }

  413. void loop() {
  414.   // put your main code here, to run repeatedly:
  415.   feed_obj_t feed_obj;
  416.   action_t action;
  417.   state_t state;
  418.   memset(&feed_obj,0,sizeof(feed_obj_t));
  419.   memset(&action,0,sizeof(action_t));
  420.   feed_obj.state = INIT;
  421.   func_init(&action);
  422.   while(1){
  423.     action.sys_key(&feed_obj);
  424.     switch(feed_obj.state){
  425.       case INIT:
  426.             action.sys_init(&feed_obj);
  427.             break;
  428.       case CONFIG:
  429.             action.sys_config(&feed_obj);
  430.             break;
  431.       case READY_CUT:
  432.             action.sys_ready(&feed_obj);
  433.           //  action.sys_key(&feed_obj);
  434.             break;
  435.       case CUTTING:
  436.             action.sys_cutting(&feed_obj);
  437.             break;
  438.       case FEEDING:
  439.             action.sys_feeding(&feed_obj);
  440.             break;
  441.       case ESTOP:
  442.             action.sys_estop(&feed_obj);
  443.             break;
  444.       default:
  445.             break;
  446.     }
  447.   }

  448. }
复制代码



评分

参与人数 1一乐金币 +100 收起 理由
yleee + 100 赞一个!

查看全部评分

发表于 2016-7-18 07:12 | 显示全部楼层
雕刻盒子的激光功率要多大,也想添置一个激光雕刻头
回复

使用道具 举报

发表于 2016-7-18 07:58 | 显示全部楼层
哈哈  我想了解的也是雕刻的方面
回复

使用道具 举报

发表于 2016-7-18 09:09 | 显示全部楼层
同问楼主用的激光头是多大的功率
回复

使用道具 举报

 楼主| 发表于 2016-7-18 09:32 | 显示全部楼层
100abc 发表于 2016-7-18 07:12
雕刻盒子的激光功率要多大,也想添置一个激光雕刻头

60W的激光管
回复

使用道具 举报

 楼主| 发表于 2016-7-18 09:32 | 显示全部楼层
blueruby 发表于 2016-7-18 07:58
哈哈  我想了解的也是雕刻的方面

想问哪方面的 我知无不言
回复

使用道具 举报

 楼主| 发表于 2016-7-18 09:33 | 显示全部楼层
ain365 发表于 2016-7-18 09:09
同问楼主用的激光头是多大的功率

60W的激光管
回复

使用道具 举报

发表于 2016-7-19 08:17 | 显示全部楼层
60W 的激光管太危险了...不敢玩.
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-1-12 20:51 , Processed in 0.038039 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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