回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【雕爷学编程】Arduino动手做(87)---ULN2003步进电机模组3 中等

头像 驴友花雕 2023.07.26 25 0

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组

 

03.jpg
09.jpg

知识点:ULN2003芯片
ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行,采用DIP—16 或SOP—16 塑料封装。
 

0.jpg

ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。
ULN2003内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达350mA,9脚可以悬空。比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。

特点如下:
ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。
ULN2003 采用DIP—16 或SOP—16 塑料封装。
 

01.jpg

08.jpg

步进电机
是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
 

30.jpg

使用AccelStepper步进电机库的进阶实验

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

安装库   IDE——工具——管理库——搜索AccelStepper——安装
 

28 (1).jpg

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)

实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组

实验开源代码(使用AccelStepper库)

项目五:显示如何最简单地运行AccelStepper,无加速的定速模式(正转)


 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
   1、安装库:IDE——工具——管理库——搜索AccelStepper——安装
   2、项目五:显示如何最简单地运行AccelStepper,无加速的定速模式
   3、连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
           Arduino Uno R3的2,4,3,5引脚
*/

#include <AccelStepper.h>

// 默认为2,3,4,5引脚接入AccelStepper
AccelStepper stepper;

void setup()
{
  stepper.setMaxSpeed(1000);//设置最大速度
  stepper.setSpeed(500);//设置步进电机匀速运动的速度(正转)
}

void loop()
{
  stepper.runSpeed();
}

实验开源代码(使用AccelStepper库)
项目六:显示如何使用双向调用运行到新位置
 

 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
   1、安装库:IDE——工具——管理库——搜索AccelStepper——安装
   2、项目六:显示如何使用双向调用运行到新位置
   3、连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
           Arduino Uno R3的2,4,3,5引脚 
*/


#include <AccelStepper.h>

//定义一个步进器和它将使用的引脚
AccelStepper stepper; //默认为2、3、4、5上的4个引脚

void setup()
{  
    stepper.setMaxSpeed(200.0);
    stepper.setAcceleration(100.0);
}

void loop()
{    
    stepper.runToNewPosition(0);
    stepper.runToNewPosition(500);
    stepper.runToNewPosition(100);
    stepper.runToNewPosition(120);
}

实验开源代码(使用AccelStepper库)
项目七:使单个步进电机从一个端跳到另一个端运行
 

代码
/*
 【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
  1、安装库:IDE——工具——管理库——搜索AccelStepper——安装
  2、项目七:使单个步进电机从一个端跳到另一个端运行
  3、连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
          Arduino Uno R3的2,4,3,5引脚 
*/

#include <AccelStepper.h>

//定义一个步进电机和它将使用的引脚
AccelStepper stepper; // 默认为2、3、4、5上的4个引脚

void setup()
{  
 // 如果需要,请更改这些以适合您的步进电机
 stepper.setMaxSpeed(100);
 stepper.setAcceleration(20);
 stepper.moveTo(500);
}

void loop()
{
   // 如果在运行结束时转到另一端
   if (stepper.distanceToGo() == 0)
     stepper.moveTo(-stepper.currentPosition());

   stepper.run();
}

实验开源代码(使用AccelStepper库)
项目八:用于测试超调过冲的处理
 

代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
  1、安装库:IDE——工具——管理库——搜索AccelStepper——安装
  2、项目八:用于测试超调过冲的处理
  3、连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
          Arduino Uno R3的2,4,3,5引脚 
*/

#include <AccelStepper.h>

//定义一个步进电机和它将使用的引脚
AccelStepper stepper; // 默认为2、3、4、5上的4个引脚

void setup()
{  
  stepper.setMaxSpeed(150);
  stepper.setAcceleration(100);
}

void loop()
{    
  stepper.moveTo(500);
  while (stepper.currentPosition() != 300) // 全速可达300
    stepper.run();
  stepper.runToNewPosition(0); // 导致过冲,然后回到0
}

实验开源代码(使用AccelStepper库)
项目九:检查快速停止处理
 

代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
  1、安装库:IDE——工具——管理库——搜索AccelStepper——安装
  2、项目九:检查快速停止处理
  3、连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
          Arduino Uno R3的2,4,3,5引脚 
*/

#include <AccelStepper.h>

//定义一个步进电机和它将使用的引脚
AccelStepper stepper; // 默认为2、3、4、5上的4个引脚

void setup()
{  
  stepper.setMaxSpeed(150);
  stepper.setAcceleration(100);
}

void loop()
{    
  stepper.moveTo(500);
  while (stepper.currentPosition() != 300) // 全速可达300
    stepper.run();
  stepper.stop(); // 尽快停止:设置新目标
  stepper.runToPosition(); 
  // 现在快速停止

  // 现在倒退
  stepper.moveTo(-500);
  while (stepper.currentPosition() != 0) // 全速前进至0
    stepper.run();
  stepper.stop(); // 尽快停止:设置新目标
  stepper.runToPosition(); 
  // 现在快速停止
}

实验开源代码(使用AccelStepper库)
项目十:测试随机功能,使单个步进电机随机改变速度、位置和加速度
 

代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
  1、安装库:IDE——工具——管理库——搜索AccelStepper——安装
  2、项目九:检查快速停止处理
  3、连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
          Arduino Uno R3的2,4,3,5引脚 
*/

#include <AccelStepper.h>

//定义一个步进电机和它将使用的引脚
AccelStepper stepper; // 默认为2、3、4、5上的4个引脚

void setup()
{  
}

void loop()
{
    if (stepper.distanceToGo() == 0)
    {
        // 随机改变速度,位置和加速度
        // 确保我们没有得到0速度或加速度
        delay(1000);
        stepper.moveTo(rand() % 200);
        stepper.setMaxSpeed((rand() % 200) + 1);
        stepper.setAcceleration((rand() % 200) + 1);
    }
    stepper.run();
}

AccelStepper库部分函数

setMaxSpeed() -设置步进电机最大运行速度

setAcceleration() -设置步进电机加速度

setSpeed() -设置步进电机运行速度

targetPosition -获取步进电机运行目标位置

currentPosition -获取步进电机运行当前位置

setCurrentPosition -复位步进电机初始位置//设置当前位置为用户指定位置值。

move(+400/-400) – 设置步进电机运动的相对目标位置

moveTo -设置步进电机运动的绝对目标位置

run -步进电机运行(先加速后减速模式)

runSpeed -步进电机运行(匀速模式)

runToNewPosition – 电机运行到用户指定位置值,目标位置为绝对位置。此函数将“block”程序运行。即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。这一点很像Arduino官方Stepper库中的step函数。
 

AccelStepper库使用示例
1.例:获取当前位置:
int xcurrentposition=setpper1.currentPosition();
int ycurrentposition=setpper2.currentPosition();



 

2.例:设置当前位置为用户指定位置值:
setpper1.setcurrentPosition();;//先获取,再设定,



 

3.例:运动到绝对位置:
setpper1.moveTo(xdata);
setpper2.moveTo(ydata);



 

4.例:运动了多少圈:
setpper1.move(xdata);//data为0时,电机停止运动 +/-决定正反转
setpper2.move(ydata);



 

5.例:设置加速度:
setpper1.setAcceleration(data);
setpper2.setAcceleration(data);



 

6.例:设置最大速度:
setpper1.setMaxSpeed(data);
setpper2.setMaxSpeed(data);



 

7.例:设置步进电机匀速运动的速度:
setpper1.setSpeed(data);



 

8.例:步进电机运行(先加速后减速模式):
stepper1.run();
stepper2.run();



 

9.例:步进电机运行(匀速模式):
stepper1.runSpeed(data);//data为0时,电机停止运动,+/-决定正反转
stepper2.runSpeed();

附录:AccelStepper 官网
http://www.airspayce.com/mikem/arduino/AccelStepper/functions.html

 

29.jpg

控制步进电机步数的简单程序

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验九十:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
   项目二:顺时针旋转1圈,逆时针旋转1/4圈,串口监控
   连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
           Arduino UNO R3 8,9,10,11引脚
*/

//使用arduino IDE自带的Stepper.h库文件
#include <Stepper.h>

// 这里设置步进电机旋转一圈是多少步,依据步距角计算,及走一圈需要多少脉冲
#define STEPS 64

//设置步进电机的步数和引脚(就是驱动板上IN1~IN4连接的四个数字口)。
Stepper stepper(STEPS, 8, 9, 10, 11);

void setup()
{
  // 设置电机的转速:每分钟为90步
  stepper.setSpeed(290);
  // 初始化串口,用于调试输出信息
  Serial.begin(9600);
}

void loop()
{
  // 顺时针旋转
  Serial.println("顺时针旋转1圈");
  stepper.step(2048);
  delay(500);

  // 逆时针旋转
  Serial.println("逆时针旋转1/4圈");
  stepper.step(-512);
  delay(500);
}

相关函数是step
 

step(steps),这个函数是使电机转过固定的步数,只有当电机转过指定步数之后才会执行该语句的下一条语句。参数应该是整数,正负号控制旋转方向。


 

 


 

说明


 

通过step函数您可以让步进电机旋转相应的步数。具体旋转的步数由stepper函数的参数决定。旋转速度则由 setSpeed函数决定。


 

 


 

注意:此函为“blocking”类型函数,即Arduino在运行此函数时,将会等待电机执行完运行要求以后才会执行下一条语句。举例说明,假如您通过setSpped函数设置电机的运行速度为1。然后通过调用step(100)指令让电机运转100步。这一操作的执行时间可能要一分多钟才能完成。为了让程序可以更好的运行,建议每一次调用step函数时尽量让电机少执行步数,同时提高电机的运行速度。


 

 


 

参数


 

steps: 电机运行的步数(整数型)


 

 


 

返回值


 


 

步进电机的控制比较特殊,而硬件本身,由于制造厂商与品牌的不同,也不太可能完全一致,总会有些差异的;另外一个不可忽视的因素就是所使用的5V电源,确实是不同的.。在实验中,Arduino开发板和步进电机,我是使用各自独立的二套USB电源(5V)。在不断尝试中发现一个问题,步进电机的5V电源,由于是使用电脑USB供电、电源接线板上自带USB插口供电,或是使用手机USB充电器供电,同样都是5V,而实际运行时三种供电方式的结果是不一样的。同样程序,夸张的是有的供电方式, 步进电机只是抖动而不旋转。

硬件差异和不同供电方式,跳出了程序控制的范畴,带来了不确定性。

评论

user-avatar
icon 他的勋章
    展开更多