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

news2024/12/23 18:19:10

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,而实际运行时三种供电方式的结果是不一样的。同样程序,夸张的是有的供电方式, 步进电机只是抖动而不旋转。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百模大战:AI大模型的现状与发展

马斯克&#xff08;Elon Musk&#xff09;是一位著名的企业家和科技创新者&#xff0c;他是特斯拉汽车公司的创始人和首席执行官&#xff0c;也是SpaceX航天公司和SolarCity太阳能公司的创始人之一。他还参与了创办OpenAI人工智能研究实验室和Neuralink脑机接口公司。 马斯克以…

任务的创建与删除

Q: 什么是任务&#xff1f; A: 任务可以理解为进程/线程&#xff0c;创建一个任务&#xff0c;就会在内存开辟一个空间。 比如&#xff1a; 玩游戏&#xff0c;打篮球&#xff0c;开车&#xff0c;都可以视为任务。 Windows 系统中的 MarkText 、谷歌浏览器、记事本&#xff0…

基于ChatGPT聊天的零样本信息提取7.25

基于ChatGPT聊天的零样本信息提取 摘要介绍ChatIE用于零样本IE的多轮 QA 实验总结 摘要 零样本信息提取&#xff08;IE&#xff09;旨在从未注释的文本中构建IE系统。由于很少涉及人类干预&#xff0c;因此具有挑战性。 零样本IE减少了数据标记所需的时间和工作量。最近对大型…

TextDetMetric: 计算文本检测算法指标工具

Text Detect Metric 该库用于计算Precision、Recall和H-mean三个指标&#xff0c;用来评测文本检测算法效果。与魔搭-文本检测测试集配套使用。指标计算代码参考&#xff1a;PaddleOCR 和 DB 整体框架 #mermaid-svg-9uGq5YvkFv9Qoswh {font-family:"trebuchet ms",v…

账号列表的删除编辑提交

<template><div><plan title"账号列表"><!-- selection-change"handleSelectionChange"添加这个属性就是点击可以得到你想要的value值 --><el-tablestyle"width: 100%":data"list"selection-change"h…

Service Mesh之Istio基础入门

技术背景 分布式服务治理 所谓分布式服务治理就是对服务不断增长的复杂度的管控和管理&#xff1b;管控及管理包含网络拓扑变动、网络延时、通信安全、API网关、服务注册和发现、服务熔断容错、服务超时重试、服务部署、数据调用、分布式链路追踪等等&#xff1b; 服务治理历程…

JMeter(八):响应断言详解

响应断言 :对服务器的响应进行断言校验 (1)应用范围: main sample and sub sample, main sample only , sub-sample only , jmeter variable 关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,…

Linux6.14 Docker Compose容器编排

文章目录 计算机系统5G云计算第四章 LINUX Docker Compose容器编排一、Compose概述1.Docker Compose 的概述2.Docker Compose 三大的概念 二、部署过程1.Docker Compose 环境安装2.YAML 文件格式及编写注意事项3.Docker Compose配置常用字段4.Docker Compose 常用命令5.Docker …

【C语言】常见的内存操作函数

目录 前言&#xff1a;1.memcpymemcpy函数介绍memcpy函数的模拟实现 2.memmovememmove函数介绍memmove函数的模拟实现 3.memcmp4.memset 前言&#xff1a; 紧接字符串函数&#xff0c;接下来介绍内存函数~~ ———————————————————— 1.memcpy memcpy函数介…

索尼移动硬盘数据丢失怎么办?索尼移动硬盘如何恢复数据

咨询案例&#xff1a;“我刚买的索尼移动硬盘&#xff0c;里面存了超多我的宝贝照片和视频。突然有一天&#xff0c;我发现这些数据全都不见了&#xff01;心凉了半截&#xff0c;我该怎么办&#xff1f;” ——索尼移动硬盘是一种常用的存储设备&#xff0c;它具有大容量、便携…

微软亚研院提出模型基础架构RetNet或将成为Transformer有力继承者

作为全新的神经网络架构&#xff0c;RetNet 同时实现了良好的扩展结果、并行训练、低成本部署和高效推理。这些特性将使 RetNet 有可能成为继 Transformer 之后大语言模型基础网络架构的有力继承者。实验数据也显示&#xff0c;在语言建模任务上&#xff1a; RetNet 可以达到与…

视频内存过大如何压缩变小?这个压缩方法了解一下

在日常生活中&#xff0c;不管是日常随手拍的视频还是在工作中遇到的视频文件&#xff0c;在编辑处理的时候&#xff0c;如果视频的内存过大&#xff0c;不仅会占用很大的内存&#xff0c;在传送的时候也会花费很长时间&#xff0c;这时候将视频给压缩一下就可以很好的解决这一…

直播程序源码开发建设:洞察全局,数据统计与分析功能

在信息时代的浪潮席卷下&#xff0c;直播程序源码平台成为了信息时代下的优秀产物之一&#xff0c;通过直播程序源码平台&#xff0c;人们既可以去获取信息、收获快乐&#xff1b;又可以开启一个随时随地&#xff0c;一台智能手机就可以做的工作&#xff0c;直播工作&#xff0…

ResMLP:具有数据效率训练的图像分类前馈网络

文章目录 ResMLP: Feedforward networks for image classification with data-efficient training摘要本文方法代码实验结果 ResMLP: Feedforward networks for image classification with data-efficient training 摘要 我们提出了ResMLP&#xff0c;一个完全建立在多层感知…

Windows系统创建新用户

1、以管理员身份启动cmd 2、开启administrator管理员账户 输入命令&#xff1a; net user Administrator /active:yes 3、切换到administrator用户 点击账户头像可以看见 4、创建新用户 WinR 键打开dos窗口输入&#xff1a;control userpasswords2 在弹出的“用户账户”中点…

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…

MFC CList 类的使用

MFC提供CList 类&#xff1b; 类CList支持可按顺序或按值访问的非唯一对象的有序列表&#xff1b;CList 列表与双链接列表行为相似&#xff1b; 类型POSITION的变量是列表的关键字&#xff1b;可使用POSITION变量作为循环因子来顺序遍历列表&#xff0c;作为书签来保存位置&am…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化&#xff08;optimization&#xff09;是指调节模型以在 训练数据 上得到最佳性能&#xff08;即机器学习中的学习&#xff09;。 • 泛化&#xff08;generalization&#xff09;是指训练好的模型在 前所未…

Python 面向对象(一)(成员方法、类和对象)

初识对象 生活中数据的组织 学校开学&#xff0c;要求学生填写自己的基础信息&#xff0c;一人发一张白纸&#xff0c;让学生自己填 改为登记表&#xff0c;打印出来让学生自行填写&#xff1a; 程序中数据的组织 在程序中简单使用变量来记录学生信息 使用变量记录数据太乱了…

Python怎么将图片转换成base64编码

目录 什么是base64编码 Base64编码的特点 Base64编码的应用 Python怎么将图片转换成base64编码 什么是base64编码 Base64编码是一种将二进制数据转换为ASCII字符的编码方式。它是由MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;规范定义的&#xff0…