/*Example sketch to control a stepper motor with A4988 stepper motor driver,
AccelStepper library and Arduino: continuous rotation.
More info: https://www.makerguides.com */
// Include the AccelStepper library:
#include <AccelStepper.h>
#define dirPin 8 //方向脚
#define stepPin 9 //脉冲脚
#define motorInterfaceType 1 //电机类型
#define XdirPin 10 //方向脚
#define XstepPin 11 //脉冲脚
#define StarBut 4 //启停按钮
#define HomeBut 2 //起点限位开关
#define EndBut 3 //结束点限位开关
#define DBLed 5 //打标状态灯
#define ButLed 6 //启动打标
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
AccelStepper XStepper = AccelStepper(motorInterfaceType, XstepPin, XdirPin);
//int btn_current = 0; //当前启停键状态
int btn_previous = 0; //最后启停键状态
//bool stepper_state = true; //当前电机状态
int Dev_state = 0; //设备有状态
int iMaxSpeed=500; // 工作时最大速度
int iAcceleration=500; //工作时加速度
int iStepMm=1; //走1mm的步数
int iXStepMm=1; //走1mm的步数
int iStepSpeed=1; //速度其数
int iXStepSpeed=1; //速度其数
int DevLength=560;//机器总长度
String input_val; //输入字符串值
int val = 0; //输入值
int WorkType=0; //工作方式(0 先出锡,1后出锡)
int OutLen=10;//出锡长度(mm)
int OutSpeed=1;//出锡速度(1-10级)
int BakLen=2;//回锡长度(mm)
int BakSpeed=3;//回锡速度
int WorkLen=20;//工作行程(0-50mm)
int WorkSpeed=5;//工作速度(1-10)
int WorkTime=2;//化锡时间(0-60)
int PakLen=5;//补锡长度(mm)
int PakSpeed=1;//补锡速度(1-10)
void setup() {
pinMode(StarBut, INPUT_PULLUP);
pinMode(HomeBut, INPUT_PULLUP);
pinMode(EndBut, INPUT_PULLUP);
pinMode(DBLed, OUTPUT);
pinMode(ButLed, OUTPUT);
Serial.begin(9600);
//从EEPROM中取出
//iMaxSpeed 工作时最大速度
//iAcceleration 工作时加速度
//iStepMm 走1mm的步数
//IsCOntinuous 是否连续打标(即是不回原点 省一个回原点的过程)
//DbNum单程打标次数
//iDbLength单程打标长度
//iDbTime 打标时间
//DevLength机器总长度
//慢速回归原点
stepper.setMaxSpeed(100);
stepper.setAcceleration(100); //设置工作时的加速度 从EEPROM中取出
stepper.moveTo(-DevLength*iStepMm); //慢速回归原点
Dev_state=0; //启动时归0
}
void loop()
{
long distance = XStepper.distanceToGo();
long position = XStepper.currentPosition();
Serial.print("distance: " + String(distance));
Serial.println(" position: " + String(position));
if (Serial.available())
input_val = Serial.readString();
if (val > 0)
val = input_val.toInt();
switch(Dev_state)
{
case 1: //启动时复位原点
if (stepper.distanceToGo() == 0)
{
Serial.println("回原点结束完成" );
Dev_state=0;
btn_previous=0; //可以打标
}
else
stepper.run();
break;
case 2: //运动时回原点
if (stepper.distanceToGo() == 0)
{
Serial.println("运动时回原点完成" );
if(stepper.currentPosition()==0)
{
Dev_state=0;
btn_previous=0; //可以打标
}
}
else
stepper.run();
break;
case 3: //出锡
if (XStepper.distanceToGo() == 0)
{
XStepper.setCurrentPosition(0); //出锡归0
Serial.println("出锡完成" );
if(WorkType==0)
{
if(WorkLen>0)
{
stepper.setMaxSpeed(WorkSpeed*iStepSpeed);
stepper.moveTo(WorkLen*iStepMm); //长度
}
Dev_state=6; //下烙铁
Serial.println("启动下烙铁");
}
else
{
if(PakLen>0)
{
XStepper.setMaxSpeed(PakSpeed*iXStepSpeed);
XStepper.moveTo(PakLen*iXStepMm); //长度
}
Dev_state=7; //补锡
Serial.println("启动补锡");
}
}
else
XStepper.run();
break;
case 6: //下烙铁
if (stepper.distanceToGo() == 0)
{
Serial.println("下烙铁完成" );
if(WorkType==0)
{
if(PakLen>0)
{
XStepper.setMaxSpeed(PakSpeed*iXStepSpeed);
XStepper.moveTo(PakLen*iXStepMm); //长度
}
Dev_state=7; //补锡
Serial.println("启动补锡");
}
else
{
if(OutLen>0)
{
XStepper.setMaxSpeed(OutSpeed*iXStepSpeed);
XStepper.moveTo(OutLen*iXStepMm); //长度
}
Dev_state=3; //启动出锡
Serial.println("启动出锡");
}
}
else
stepper.run();
break;
case 7: //补锡
if (XStepper.distanceToGo() == 0)
{
XStepper.setCurrentPosition(0); //出锡归0
Serial.println("补锡完成" );
delay(WorkTime);
Serial.println("化锡完成");
if(BakLen>0)
{
XStepper.setMaxSpeed(BakSpeed*iXStepSpeed);
XStepper.moveTo(-BakLen*iXStepMm); //长度
}
Dev_state=8; //启动回锡操作
Serial.println("启动回锡");
}
else
XStepper.run();
break;
case 8: //回锡
if (XStepper.distanceToGo() == 0)
{
Serial.println("回锡完成" );
XStepper.setCurrentPosition(0); //出锡归0
stepper.moveTo(0); //快速回归原点
Dev_state=2; //络铁回归原点
}
else
XStepper.run();
break;
default: break;
}
if (digitalRead(HomeBut)==0) //起点限位
{
stepper.stop();
stepper.setCurrentPosition(0);
Serial.println("原点限位开关启动");
Dev_state=0;
btn_previous=0; //可以焊接
}
if (digitalRead(EndBut)==0) //急停一次急停,再按回原点
{
stepper.stop();
XStepper.stop();
XStepper.setCurrentPosition(0);
Serial.println("急停");
btn_previous==1;
Dev_state=4; //终点限位,按一下回归0
}
if (digitalRead(StarBut)==0) //启动检及停止键
{
switch(Dev_state)
{
case 4: //启动时复位原点
stepper.moveTo(0); //快速回归原点
Dev_state=2; //归零
break;
default:
if(btn_previous==0)
{
if(WorkType==0) //先出锡
{
if(OutLen>0)
{
XStepper.setMaxSpeed(OutSpeed*iXStepSpeed);
XStepper.moveTo(OutLen*iXStepMm); //长度
}
Dev_state=3; //启动出锡
Serial.println("启动出锡");
}
else
{
if(WorkLen>0)
{
stepper.setMaxSpeed(WorkSpeed*iStepSpeed);
stepper.moveTo(WorkLen*iStepMm); //长度
}
Dev_state=6; //下烙铁
Serial.println("启动下烙铁");
}
}
break;
}
}
}