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 塑料封装。 LN2003芯片引脚介绍 引脚1:CPU脉冲输入端,端口对应一个信号输出端。 引脚2:CPU脉冲输入端。 引脚3:CPU脉冲输入端。 引脚4:CPU脉冲输入端。 引脚5:CPU脉冲输入端。 引脚6:CPU脉冲输入端。 引脚7:CPU脉冲输入端。 引脚8:接地。 引脚9:该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。 引脚10:脉冲信号输出端,对应7脚信号输入端. 引脚11:脉冲信号输出端,对应6脚信号输入端。 引脚12:脉冲信号输出端,对应5脚信号输入端。 引脚13:脉冲信号输出端,对应4脚信号输入端。 引脚14:脉冲信号输出端,对应3脚信号输入端。 引脚15:脉冲信号输出端,对应2脚信号输入端。 引脚16:脉冲信号输出端,对应1脚信号输入端。 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 塑料封装。 达林顿管 又称复合管。他将两个三极管串联,以组成一只等效的新的三极管。这只等效三极管的放大倍数是原二者之积,因此它的特点是放大倍数非常高。达林顿管的作用一般是在高灵敏的放大电路中放大非常微小的信号,如大功率开关电路。在电子学电路设计中,达林顿接法常用于功率放大器和稳压电源中。 图示ULN2003,内部是7个达林顿管(比ULN2803少一个达林顿管),可以看出来,每个达林顿管是两个三极管组合起来了,相当于一个NPN三极管。IN端加控制电压,OUT端接负载,输出是低电平有效。 实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组 ULN2003驱动板 外形尺寸:31×35mm 使用ULN2003大功率达林顿芯片驱动步进电机; A、B、C、D发光二极管指示四相步进电机工作时的状态; 配有步进电机的标准接口,使用时可直接插拨 模块电原理图 步进电机 是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。 电机名称:减速永磁步进电机 电机型号:28BYJ-48 驱动电压:5V 驱动方式:四相八拍 齿轮减速比:1/64 采用ULN2003驱动,使用方便 优质步进电机,带齿轮减速,噪音极低,运转平稳 5V即可驱动,方便单片机开发者使用 开放性接口,也可用通过本板驱动其他步进电机 适用于51/AVR/Arduino/ARM等各种平台,机器人设计开发必备 28BYJ-48工作原理 假定电机的起始状态,逆时针方向转动,起始时是 B 相绕组的开关闭合,B 相绕组导通,那么导通电流就会在正上和正下两个定子齿上产生磁性,这两个定子齿上的磁性就会对转子上的 0 和 3 号齿产生最强的吸引力,就会如图所示的那样,转子的 0 号齿在正上、3 号齿在正下而处于平衡状态;此时我们会发现,转子的 1 号齿与右上的定子齿也就是 C 相的一个绕组呈现一个很小的夹角,2 号齿与右边的定子齿也就是 D 相绕组呈现一个稍微大一点的夹角,很明显这个夹角是 1 号齿和 C 绕组夹角的 2 倍,同理,左侧的情况也是一样的。 接下来,把 B 相绕组断开,而使 C 相绕组导通,那么很明显,右上的定子齿将对转子 1 号齿产生最大的吸引力,而左下的定子齿将对转子 4 号齿,产生最大的吸引力,在这个吸引力的作用下,转子 1、4 号齿将对齐到右上和左下的定子齿上而保持平衡,如此,转子就转过了起始状态时 1 号齿和 C 相绕组那个夹角的角度。 再接下来,断开 C 相绕组,导通 D 相绕组,过程与上述的情况完全相同,最终将使转子2、5 号齿与定子 D 相绕组对齐,转子又转过了上述同样的角度。 那么很明显,当 A 相绕组再次导通,即完成一个 B-C-D-A 的四节拍操作后,转子的 0、3 号齿将由原来的对齐到上下 2 个定子齿,而变为了对齐到左上和右下的两个定子齿上,即转子转过了一个定子齿的角度。依此类推,再来一个四节拍,转子就将再转过一个齿的角度,8 个四节拍以后转子将转过完整的一圈,而其中单个节拍使转子转过的角度就很容易计算出来了,即 360 度/(8*4)=11.25 度,这个值就叫做步进角度。而上述这种工作模式就是步进电机的单四拍模式——单相绕组通电四节拍。 具有更优性能的工作模式,那就是在单四拍的每两个节拍之间再插入一个双绕组导通的中间节拍,组成八拍模式。比如,在从 B 相导通到 C 项导通的过程中,假如一个 B 相和 C 相同时导通的节拍,这个时候,由于 B、C 两个绕组的定子齿对它们附近的转子齿同时产生相同的吸引力,这将导致这两个转子齿的中心线对比到 B、C 两个绕组的中心线上,也就是新插入的这个节拍使转子转过了上述单四拍模式中步进角度的一半,即 5.625度。这样一来,就使转动精度增加了一倍,而转子转动一圈则需要 8*8=64 拍了。另外,新增加的这个中间节拍,还会在原来单四拍的两个节拍引力之间又加了一把引力,从而可以大大增加电机的整体扭力输出,使电机更“有劲”了。 除了上述的单四拍和八拍的工作模式外,还有一个双四拍的工作模式——双绕组通电四节拍。其实就是把八拍模式中的两个绕组同时通电的那四拍单独拿出来,而舍弃掉单绕组通电的那四拍而已。其步进角度同单四拍是一样的,但由于它是两个绕组同时导通,所以扭矩会比单四拍模式大,在此就不做过多解释了。 八拍模式是这类 4 相步进电机的最佳工作模式,能最大限度的发挥电机的各项性能,也是绝大多数实际工程中所选择的模式。 实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组 实验接线示意图 实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组 项目一:逆时针旋转一圈,顺时针旋转半圈,串口监控 实验开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组 项目一:逆时针旋转一圈,顺时针旋转半圈,串口监控 连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到 Arduino Uno R3 4 6 5 7引脚 */ #include // 这里设置步进电机旋转一圈是多少步 #define STEPS 100 //设置步进电机的步数和引脚(就是注意点2里面说的驱动板上IN1~IN4连接的四个数字口)。 Stepper stepper(STEPS, 4, 6, 5, 7); void setup(){ // 设置电机的转速:每分钟为90步 stepper.setSpeed(90); // 初始化串口,用于调试输出信息 Serial.begin(9600); } void loop(){ // 逆时针旋转一周 Serial.println("Counterclockwise rotation"); stepper.step(2048); //4步模式下旋转一周用2048 步 delay(500); // 顺时针旋转半周 Serial.println("Clockwise rotation"); stepper.step(-1024); //4步模式下旋转一周用2048 步 delay(500); } 实验串口返回情况 实验开源仿真编程(Linkboy V4.5) 实验开源图形编程(Mind+、Mixly、编玩边学) 实验开源仿真编程(Linkboy V4.52) 项目四实验开源代码 /* 【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 // 这里设置步进电机旋转一圈是多少步,依据步距角计算,及走一圈需要多少脉冲 #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); } 实验串口返回情况 项目五,实验开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程) 实验八十七:步进电机+ULN2003驱动板 4相 5线 5V步进电机模组 项目三:极慢转动4步用于观察ULN2003电机驱动板LED变化, 慢速顺时针旋转一圈,快速逆时针旋转一圈,间隔0.5秒 连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到 Arduino UNO R3 8,10,9,11引脚 */ //本实验程序使用Stepper库 #include // 定义电机控制用常量 // 电机内部输出轴旋转一周步数 const int STEPS_PER_ROTOR_REV = 32; // 减速比 const int GEAR_REDUCTION = 64; /* 转子旋转一周需要走32步。转子每旋转一周,电机输出轴只旋转1/64周。 (电机内部配有多个减速齿轮,这些齿轮会的作用是让转子每旋转一周, 输出轴只旋转1/64周。) 因此电机输出轴旋转一周则需要转子走32X64=2048步,即以下常量定义。 */ // 电机外部输出轴旋转一周步数 (2048) const float STEPS_PER_OUT_REV = STEPS_PER_ROTOR_REV * GEAR_REDUCTION; // 定义电机控制用变量 // 电机旋转步数 int StepsRequired; // 建立步进电机对象 // 定义电机控制引脚以及电机基本信息。 // 电机控制引脚为 8,9,10,11 // 以上引脚依次连接在ULN2003 驱动板 In1, In2, In3, In4 Stepper steppermotor(STEPS_PER_ROTOR_REV, 8, 9, 10, 11); void setup() { //setup函数内无内容 } void loop() { // 极慢转动4步用于观察ULN2003电机驱动板LED变化 steppermotor.setSpeed(1); StepsRequired = 4; steppermotor.step(StepsRequired); delay(500); // 慢速顺时针旋转一圈 StepsRequired = STEPS_PER_OUT_REV; steppermotor.setSpeed(500); steppermotor.step(StepsRequired); delay(500); // 快速逆时针旋转一圈 StepsRequired = - STEPS_PER_OUT_REV; steppermotor.setSpeed(800); steppermotor.step(StepsRequired); delay(500); } 补充实验场景图