37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组
知识点:ULN2003芯片
ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行,采用DIP—16 或SOP—16 塑料封装。
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 塑料封装。
步进电机
是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
使用AccelStepper步进电机库的进阶实验
AccelStepper 是一款功能强大,简单易用的控制步进电机的Arduino第三方库。 目前Arduino内置的stepper库只能控制一台步进电机,如果您需要控制两台及以上的的步进电机,那么AccelStepper库是一个非常好的选择。同时在使用Arduino官方stepper库时,Arduino开发板在控制步进电机的过程中是无法进行其它工作的。在这一点上,使用AccelStepper库可以让Arduino在控制步进电机的同时完成其它工作。实现步进电机控制的Arduino库有很多,这里认为AccelStepper库无论在功能还是在易用性上都远远超过了Arduino官方Stepper库。
安装库 IDE——工具——管理库——搜索AccelStepper——安装
【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
控制步进电机步数的简单程序
/*
【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,而实际运行时三种供电方式的结果是不一样的。同样程序,夸张的是有的供电方式, 步进电机只是抖动而不旋转。
硬件差异和不同供电方式,跳出了程序控制的范畴,带来了不确定性。