/*
//速度是由数字 0.1 到 1 控制,1 的速度最快
//@转速越慢 == 扭力越大
*/

#define DIR_PIN 2 //@定义控制方向引脚
#define STEP_PIN 3 //@定义步进控制引脚

void setup()
{ 
  pinMode(DIR_PIN, OUTPUT); //@通过 pinMode 函数设置方向引脚为输出模式
  pinMode(STEP_PIN, OUTPUT); //@通过 pinMode 函数设置步进引脚为输出模式
} 

void loop()
{
  rotateDeg(360, 1); //@旋转360度 
  delay(1000); //@延时1秒

  rotateDeg(-360, .1); //@反向旋转360度
  delay(1000); //@延时1秒

  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  rotate(1600, .5); 
  delay(1000); 

  rotate(-1600, .25); //@反向
  delay(1000); 
}

/*
//@函数: rotate 
//@变量: steps, speed
*/
void rotate(int steps, float speed)
{ 
  //@旋转deg变量给定角度,负值为反向
  //@速度是由数字 0.1 到 1 控制,1 的速度最快,速度越慢,扭力越大
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);
  digitalWrite(DIR_PIN,dir); 
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++)
  { 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  } 
}

/*
//@函数: rotate 
//@变量: steps, speed
*/
void rotateDeg(float deg, float speed)
{
  //@旋转deg变量给定角度,负数为反向
  //@速度是由数字 0.1 到 1 控制,1 的速度最快,速度越慢,扭力越大
  int dir = (deg > 0)? HIGH:LOW; //@当 deg 角度变量大于0时,声明整型变量 dir 等于高电平,反之等于低电平
  digitalWrite(DIR_PIN,dir); //@通过 Arduino 的 digitalWrite 函数,将 DIR_PIN 引脚写入上一行 dir 高电平或低电平

  int steps = abs(deg)*(1/0.225); //@声明整型变量 steps
  float usDelay = (1/speed) * 70; //@声明浮点数变量 usDelay

  for(int i=0; i < steps; i++)
  { 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  } 
}