AccelStepper库

参考:步进电机相关文章

AccelStepper步进电机库简介

AccelStepper 是一款功能强大,简单易用的控制步进电机的Arduino第三方库。 目前Arduino内置的stepper库只能控制一台步进电机,如果您需要控制两台及以上的的步进电机,那么AccelStepper库是一个非常好的选择。同时在使用Arduino官方stepper库时,Arduino开发板在控制步进电机的过程中是无法进行其它工作的。在这一点上,使用AccelStepper库可以让Arduino在控制步进电机的同时完成其它工作。

本页面将主要分为以下部分讲述AccelStepper的相关软硬件知识。

  • 控制电路 -通过AccelStepper库使用Arduino控制步进电机。
  • 常用AccelStepper函数 -AccelStepper库常用的步进电机控制函数。

在本教程中,我们将以Arduino Uno配合28BYJ-48步进电机,演示如何使用AccelStepper库。

为了让您更好的理解如何使用AccelStepper库,我们专门制作了一系列视频教程。您可以通过点击以下链接进入视频教程页面。

AccelStepper步进电机库视频教程(上)AccelStepper步进电机库视频教程(下)


使用AccelStepper步进电机库准备工作

实现步进电机控制的Arduino库有很多,不过在我们认为AccelStepper库无论在功能还是在易用性上都远远超过了Arduino官方Stepper库。如需要获得更多的该库的最新介绍,您也可以访问AccelStepper库英文官方网站。

在学习如何使用AccelStepper库以前,请确保您做好了以下的准备工作:

  1. 下载AccelStepper库 – 您可通过点击这里打开我们网站的下载页面并找到这款库的下载链接。
  2. 将下载的Arduino库安装到Arduino IDE中 – 假如不知道如何操作,没关系,您可通过我们网站的“安装第三方库指南”页面找到答案。

假如您还不知道如何使用Arduino,那么在这里您可以找到Arduino开发板的相关介绍。另外我们 太极创客团队制作了《零基础入门学用Arduino教程》希望对您有所帮助。


AccelStepper库控制步进电机示例1

本示例程序旨在演示用Arduino通过AccelStepper库控制两个28BYJ-48步进电机

whisper库使用_Arduino

用Arduino通过ULN2003控制两个28BYJ-48步进电机。

ACCELSTEPPER库示例程序1

无法复制本站示例代码

/*
  Arduino通过AccelStepper库控制28BYJ-48步进电机测试程序
  by 太极创客(www.taichi-maker.com)
  本示例程序旨在演示如何通过AccelStepper库控制两个28BYJ-48步进电机。
  
  如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:
  http://www.taichi-maker.com/homepage/reference-index/arduino-library-index/accelstepper-library/
*/
 
//本示例程序使用AccelStepper库
 
 
#include "AccelStepper.h"
 
// 电机步进方式定义
#define FULLSTEP 4    //全步进参数
#define HALFSTEP 8    //半步进参数
 
// 定义步进电机引脚 
#define motor1Pin1  8     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define motor1Pin2  9     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define motor1Pin3  10    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define motor1Pin4  11    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in4
                                   
#define motor2Pin1  4     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define motor2Pin2  5     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define motor2Pin3  6     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define motor2Pin4  7     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4
 
// 定义两个步进电机对象
// 1号电机设置为半步进运行,2号电机设置为全步进运行
AccelStepper stepper1(HALFSTEP, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);
AccelStepper stepper2(FULLSTEP, motor2Pin1, motor2Pin3, motor2Pin2, motor2Pin4);
 
void setup() {
  stepper1.setMaxSpeed(500.0);    // 1号电机最大速度500 
  stepper1.setAcceleration(50.0);  // 1号电机加速度50.0
 
  stepper2.setMaxSpeed(500.0);    // 2号电机最大速度500 
  stepper2.setAcceleration(50.0);  // 2号电机加速度50.0
}
 
void loop() {
  if ( stepper1.currentPosition() == 0 && stepper2.currentPosition() == 0 ){
    // 1号电机转动半周
    stepper1.moveTo(2048);              
    // 2号电机转动一周
    stepper2.moveTo(2048);  
    
  } else if ( stepper1.currentPosition() == 2048 && stepper2.currentPosition() == 2048 ){
    // 1号电机转动半周
    stepper1.moveTo(0);            
    // 2号电机转动一周
    stepper2.moveTo(0);  
  }         
  
  stepper1.run();   // 1号电机运行
  stepper2.run();   // 2号电机运行
}

AccelStepper库控制步进电机示例2

本示例程序旨在演示AccelStepper库的move/moveTo/runToNewPosition函数区别 (28BYJ-48电机演示)

此示例电路连接与以上“AccelStepper库控制步进电机示例1”电路连接相同

ACCELSTEPPER库示例程序2

无法复制本站示例代码

/*
  Arduino通过AccelStepper库控制28BYJ-48步进电机示例程序-2
  by 太极创客(www.taichi-maker.com)
  可通过Arduino IDE 串口监视器输入电机指令
  本程序旨在演示move/moveTo/runToNewPosition区别 (两个28BYJ-48电机演示)
  
  如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:
  http://www.taichi-maker.com/homepage/reference-index/arduino-library-index/accelstepper-library/
 
 * 电机指令列表
 * 'o' 利用currentPosition获取当前电机输出轴位置并通过串口监视器输出该信息
 * 'v' 利用moveTo函数使电机运行到用户指定坐标位置,moveTo函数不会“block”程序。
 *     例:v1024 - 将电机moveTo到1024位置
 * 'm' 利用move函数使电机运行相应步数。move函数不会“block”程序。
 *     例:m1024 - 使电机运行1024步 
 * 'r' 利用runToNewPosition函数让电机运行到用户指定坐标位置。runToNewPosition函数功能
 *     与moveTo函数功能基本相同。唯一区别是runToNewPosition函数将“block”程序运行。
 *     即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。
 *     这一点很像Arduino官方Stepper库中的step函数。
 *     例:r1024 - 将电机runToNewPosition到1024位置。Arduino在电机达到1024位置前将停止
 *     其它程序任务的执行。
 * 's' 利用setCurrentPosition函数设置当前位置为用户指定位置值。
 *     例:s0 - 设置当前位置为0
 * 'a' 利用setAcceleration函数设置加速度 
 *     例:a100 - 设置电机运行的加速度为100 
 * 'x' 利用setMaxSpeed函数设置最大速度 
 *     例:x500 - 设置电机运行的最大速度为500 
 * 'd' 用户通过此指令可指定哪一个电机进行工作  
 *     例:d1 一号电机工作,d2 二号电机工作, d0 两个电机同时工作
*/
 
#include "AccelStepper.h"
 
// 电机步进方式定义
#define FULLSTEP 4    //全步进参数
#define HALFSTEP 8    //半步进参数
 
// 定义步进电机引脚 
#define motor1Pin1  8     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define motor1Pin2  9     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define motor1Pin3  10    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define motor1Pin4  11    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in4
                        
                        
#define motor2Pin1  4     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define motor2Pin2  5     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define motor2Pin3  6     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define motor2Pin4  7     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4
 
// 定义两个步进电机对象
// 定义中ULN2003驱动板引脚顺序为 in1-in3-in2-in4
// 1号电机设置为全步进运行,2号电机设置为全步进运行
AccelStepper stepper1(FULLSTEP, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);
AccelStepper stepper2(FULLSTEP, motor2Pin1, motor2Pin3, motor2Pin2, motor2Pin4);
 
char cmd;        //电机指令字符
int data;        //电机指令参数
int stepperNum;  //控制电机编号
 
void setup()
{
  stepper1.setMaxSpeed(500.0);    // 1号电机最大速度500 
  stepper1.setAcceleration(50.0);  // 1号电机加速度50.0
 
  stepper2.setMaxSpeed(500.0);    // 2号电机最大速度500 
  stepper2.setAcceleration(50.0);  // 2号电机加速度50.0
 
  Serial.begin(9600);
  Serial.println(F("++++++++++++++++++++++++++++++++++"));     
  Serial.println(F("+ Taichi-Maker AccelStepper Demo +"));   
  Serial.println(F("+     www.taichi-maker.com       +"));  
  Serial.println(F("++++++++++++++++++++++++++++++++++"));  
  Serial.println(F(""));  
  Serial.println(F("Please input motor command:"));   
}
 
 
void loop(){
  if (Serial.available()) {     // 检查串口缓存是否有数据等待传输 
    cmd = Serial.read();        // 获取电机指令中指令信息    
    Serial.print(F("cmd = "));
    Serial.print(cmd);    
    Serial.print(F(" , ")); 
    
    data = Serial.parseInt();   // 获取电机指令中参数信息  
    Serial.print(F("data = "));
    Serial.print(data);   
    Serial.println(F(""));    
    
    runUsrCmd();
  }
 
  stepper1.run();
  stepper2.run();
}
 
 
void runUsrCmd(){
  switch(cmd){ 
    case 'o': //利用currentPosition获取当前电机输出轴位置并通过串口监视器输出该信息
    
      Serial.print(F("stepper1 Position: ")); 
      Serial.println(stepper1.currentPosition());   
      Serial.print(F("stepper2 Position: ")); 
      Serial.println(stepper2.currentPosition()); 
      Serial.print(F("Current Running Motor: "));  
      
      if (stepperNum == 1 || stepperNum == 2 ) {
        Serial.print(F("Motor# ")); 
        Serial.println(stepperNum); 
      } else if (stepperNum == 0 ) {
        Serial.println(F("Both Motors")); 
      }
      break;    
           
    case 'v': //利用moveTo函数使电机运行到用户指定坐标位置,moveTo函数不会“block”程序。
       
      if (stepperNum == 1){
        Serial.print(F("Motor1 'moveTo' "));  Serial.println(data); 
        stepper1.moveTo(data); 
      } else if (stepperNum == 2){
        Serial.print(F("Motor2 'moveTo' "));  Serial.println(data); 
        stepper2.moveTo(data); 
      }else if (stepperNum == 0){
        Serial.print(F("Both Motors 'moveTo' "));  Serial.println(data); 
        stepper1.moveTo(data);
        stepper2.moveTo(data); 
      } 
      break;
      
    case 'm':   // 利用move函数使电机运行相应步数。move函数不会“block”程序。
      
      if (stepperNum == 1){
        Serial.print(F("Motor1 'move'  "));  Serial.println(data); 
        stepper1.move(data); 
      } else if (stepperNum == 2){
        Serial.print(F("Motor2 'move'  "));  Serial.println(data);
        stepper2.move(data); 
      }else if (stepperNum == 0){
        Serial.print(F("Both Motors 'move'  "));  Serial.println(data);
        stepper1.move(data);
        stepper2.move(data); 
      } 
      break;
 
    case 'r':  //利用runToNewPosition函数让电机运行到用户指定位置值。  
      if (stepperNum == 1){
        Serial.print(F("Motor1 'runToNewPosition' "));
        Serial.println(data);
        stepper1.runToNewPosition(data);  
      } else if (stepperNum == 2){
        Serial.print(F("Motor2 'runToNewPosition' "));
        Serial.println(data);
        stepper2.runToNewPosition(data);  
      }else if (stepperNum == 0){
        Serial.print(F("Both Motors 'runToNewPosition' "));
        Serial.println(data);
        stepper1.runToNewPosition(data); 
        stepper2.runToNewPosition(data);   
      }      
      break;   
      
    case 's':   //利用setCurrentPosition函数设置当前位置为用户指定位置值。
      if (stepperNum == 1){
        Serial.print(F("Set stepper1 Current Position to "));
        Serial.println(data);
        stepper1.setCurrentPosition(data); 
      } else if (stepperNum == 2){
        Serial.print(F("Set stepper2 Current Position to "));
        Serial.println(data);
        stepper2.setCurrentPosition(data);
      }else if (stepperNum == 0){
        stepper1.moveTo(data);
        Serial.print(F("Set both steppers' Current Position to "));
        Serial.println(data);
        stepper1.setCurrentPosition(data);
        stepper2.setCurrentPosition(data);
      }         
      break;
 
    case 'a':  //利用setAcceleration函数设置加速度 
      if (stepperNum == 1){
        Serial.print(F("Motor1 'setAcceleration' "));
        Serial.println(data);
        stepper1.setAcceleration(data);  
      } else if (stepperNum == 2){
        Serial.print(F("Motor2 'setAcceleration' "));
        Serial.println(data);
        stepper2.setAcceleration(data);  
      }else if (stepperNum == 0){
        Serial.print(F("Both Motors 'setAcceleration' "));
        Serial.println(data);
        stepper1.setAcceleration(data); 
        stepper2.setAcceleration(data); 
      }      
      break;   
 
    case 'x':  //利用setMaxSpeed函数设置最大速度   
      if (stepperNum == 1){
        Serial.print(F("Motor1 'setMaxSpeed' "));
        Serial.println(data);
        stepper1.setMaxSpeed(data); 
      } else if (stepperNum == 2){
        Serial.print(F("Motor2 'setMaxSpeed' "));
        Serial.println(data);
        stepper2.setMaxSpeed(data); 
      }else if (stepperNum == 0){
        Serial.print(F("Both Motors 'setMaxSpeed' "));
        Serial.println(data);
        stepper1.setMaxSpeed(data); 
        stepper2.setMaxSpeed(data); 
      } 
      break;  
 
    case 'd':  //用户通过此指令可指定哪一个电机进行工作  
      if ( data == 1 || data == 2 ){
        stepperNum = data;
        Serial.print(F("Running Motor "));  Serial.println(stepperNum); 
      } else if (data == 0 ){
        stepperNum = data;
        Serial.println(F("Running Both Motors "));  
      } else {
        Serial.print(F("Motor Number Wrong.")); 
      }
      break;
                     
    default:  // 未知指令
      Serial.println(F("Unknown Command"));
  }
}

AccelStepper库控制步进电机示例3

本示例程序旨在演示如何使用Arduino通过AccelStepper库控制28BYJ-48电机保持匀速运转

此示例电路连接与以上“AccelStepper库控制步进电机示例1”电路连接相同

/*
 * Arduino通过AccelStepper库控制28BYJ-48步进电机测试程序-3
 * by 太极创客(www.taichi-maker.com)
 * 可通过Arduino IDE 串口监视器输入电机指令
 * 本程序旨在演示如何使用Arduino通过AccelStepper库控制28BYJ-48电机保持匀速运转
 * 
 * 电机指令示例
 * '500'  - 使电机正向运行,速度为500
 * '-300' - 使电机反向运行,速度为300
 * '0'    - 使电机停止运行
 * 
 * 如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:
 * http://www.taichi-maker.com/homepage/reference-index/arduino-library-index/accelstepper-library/
*/
  
#include "AccelStepper.h"
 
// 电机步进方式定义
#define FULLSTEP 4    //全步进参数
#define HALFSTEP 8    //半步进参数
 
// 定义步进电机引脚 
 
#define motor1Pin1  8     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define motor1Pin2  9     // 一号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define motor1Pin3  10    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define motor1Pin4  11    // 一号28BYJ48连接的ULN2003电机驱动板引脚 in4
                        
                        
#define motor2Pin1  4     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1
#define motor2Pin2  5     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2
#define motor2Pin3  6     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3
#define motor2Pin4  7     // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4
 
// 定义两个步进电机对象
// 定义中ULN2003驱动板引脚顺序为 in1-in3-in2-in4
// 1号电机设置为全步进运行,2号电机设置为全步进运行
AccelStepper stepper1(FULLSTEP, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);
AccelStepper stepper2(FULLSTEP, motor2Pin1, motor2Pin3, motor2Pin2, motor2Pin4);
 
void setup()
{  
  stepper1.setMaxSpeed(500);   // 设置电机最大速度为500
  stepper1.setSpeed(300);      // 初始化电机速度为300
  
  stepper2.setMaxSpeed(500);   // 设置电机最大速度为500
  stepper2.setSpeed(300);      // 初始化电机速度为300
  
  Serial.begin(9600);
  Serial.println(F("++++++++++++++++++++++++++++++++++"));     
  Serial.println(F("+ Taichi-Maker AccelStepper Demo +"));   
  Serial.println(F("+     www.taichi-maker.com       +"));  
  Serial.println(F("++++++++++++++++++++++++++++++++++"));  
  Serial.println(F(""));  
  Serial.println(F("Please input motor command:"));   
}
 
void loop()
{  
   if (Serial.available()) {     // 检查串口缓存是否有数据等待传输 
    
    int data = Serial.parseInt();  
    
    Serial.print("Motor 'setSpeed' ");
    Serial.println(data);
    
    stepper1.setSpeed(data);  
    stepper2.setSpeed(data);    
  }
  
   stepper1.runSpeed();
   stepper2.runSpeed();
}

常用函数和操作

  • setMaxSpeed -设置步进电机最大运行速度
  • setAcceleration -设置步进电机加速度
  • setSpeed -设置步进电机运行速度
  • targetPosition -获取步进电机运行目标位置
  • currentPosition -获取步进电机运行当前位置
  • setCurrentPosition -复位步进电机初始位置
  • move – 设置步进电机运动的相对目标位置
  • moveTo -设置步进电机运动的绝对目标位置
  • run -步进电机运行(先加速后减速模式)
  • runSpeed -步进电机运行(匀速模式)
  • runToNewPosition – 电机运行到用户指定位置值,目标位置为绝对位置。此函数将“block”程序运行。即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。这一点很像Arduino官方Stepper库中的step函数。

以上为AccelStepper库常用函数介绍。AccelStepper库还有很多函数没有在这里列举出。我们相信您在掌握了以上的函数使用后,对于AccelStepper库的其他函数也会更加容易理解和掌握。如果需要获得更多的AccelStepper库使用资料,请参考AccelStepper库英文官方网站。


AccelStepper库控制42步进电机

如果您想要了解如何使用AccelStepper库控制42步进电机,请参阅本站的 Arduino CNC电机扩展板详解(A4988驱动42步进电机)