搜索代码

使用28BYJ-48步进电机与ULN2003驱动器和Arduino

使用28BYJ-48步进电机与ULN2003驱动器和Arduino

在本教程中,我们将学习如何使用ULN2003驱动器和Arduino控制28BYJ-48步进电机。该设置允许精确控制电机的位置和速度。在本项目结束时,您将能够使电机双向旋转并有效控制其步进。

我们将使用28BYJ-48步进电机,它因其低成本和易用性而成为各种机器人和自动化项目的热门选择。ULN2003驱动板将步进电机与Arduino连接,使我们能够发送控制电机运动的步进信号。本教程将指导您完成所需的接线和代码,以使电机旋转。

如需进一步澄清,请参考与本教程相关的视频(视频时间为0:45)。

硬件解析

该项目的关键组件包括28BYJ-48步进电机和ULN2003驱动板。步进电机由多个线圈组成,可以按照特定顺序通电以产生旋转。ULN2003驱动器充当开关,使Arduino能够控制每个线圈供电。

ULN2003 驱动器使用达林顿晶体管阵列来处理步进电机所需的更高电流。当 Arduino 的一个引脚输出高电平信号时,它允许电流流向电机中相应的线圈,从而使电机移动。这使得对电机的旋转角度和速度进行精确控制成为可能。

数据表详情

制造商ULN2003
零件编号ULN2003
逻辑/IO电压5 V
供电电压5-30 V (最大)
输出电流(每通道)最大500毫安
峰值电流(每通道)2 A 最大
PWM频率指导N/A
输入逻辑阈值0.8 V(低),2.4 V(高)
电压降 / RDS(开)/ 饱和度1.5 V 最大
热限制70 °C 最高
包裹DIP-16
备注 / 变体常用于5V步进电机。

  • 确保驱动器能够满足您电机的当前要求。
  • 如有必要,请使用散热器以管理热限制。
  • 检查所有连接是否牢固,以避免浮动输入。
  • 在将电机集成到更大项目之前,通过运行简单的步进序列来测试电机。
  • 确保为电机提供足够的电源电压。

接线说明

将28BYJ-48步进电机连接到ULN2003驱动器和Arduino,请按照以下步骤操作:

首先,将电机连接到ULN2003驱动器。电机有四根线,通常颜色编码为橙色、黄色、粉色和蓝色。将这些线连接到ULN2003驱动器的相应输出引脚。连接方式如下:

  • Orange电线到OUT1
  • Yellow电线到OUT2
  • Pink电线到OUT3
  • Blue电线到OUT4

接下来,将ULN2003驱动器连接到Arduino。驱动器上的输入引脚对应于Arduino上的四个数字引脚。例如:

  • IN1Pin 10
  • IN2Pin 11
  • IN3Pin 12
  • IN4Pin 13

最后,将ULN2003驱动器的电源和接地引脚连接到Arduino。连接VCC连接到Arduino的5V输出和GND将引脚连接到Arduino的接地。确保在启动系统之前所有连接都牢固。

代码示例与演练

在Arduino代码的设置部分,我们定义了连接到ULN2003驱动器的引脚:

int Pin1 = 10; 
int Pin2 = 11; 
int Pin3 = 12; 
int Pin4 = 13; 

在这里,我们声明了四个整数变量:Pin1,Pin2,Pin3, 和Pin4,这些对应于Arduino上的数字引脚。这些引脚将控制步进电机的运动。

setup()我们将这些引脚配置为输出:

void setup() { 
 pinMode(Pin1, OUTPUT);  
 pinMode(Pin2, OUTPUT);  
 pinMode(Pin3, OUTPUT);  
 pinMode(Pin4, OUTPUT);  
} 

此设置确保Arduino可以向ULN2003驱动器发送信号以控制电机。pinMode函数将每个引脚设置为输出模式,使它们能够发送信号。

最后,在主循环中,我们创建一个开关案例,根据变量控制电机的步数。_step:

switch(_step){ 
   case 0: 
     digitalWrite(Pin1, LOW);  
     digitalWrite(Pin2, LOW); 
     digitalWrite(Pin3, LOW); 
     digitalWrite(Pin4, HIGH); 
   break;  
   // Additional cases follow
}

在这个摘录中,我们使用digitalWrite根据电流向每个引脚发送高或低信号_step这控制着哪些线圈被通电,从而使电动机旋转。整段代码将会在文章下方加载。

演示 / 期待什么

一旦所有连接正确并且代码上传,步进电机应该会根据来自Arduino的信号旋转。您可以通过修改循环中的延迟或更改步数来测试电机,以查看其反应。请注意,如果电机未正确供电,它可能不会移动或表现出不稳定的行为。

章节

  • 介绍 - 0:00
  • 硬件解释 - 1:30
  • 接线说明 - 3:15
  • 代码示例与演练 - 5:00
  • 演示 / 期待什么 - 7:45
6-The source code for stepper motor 28BYJ-48 with ULN2003 for Arduino
语言: C++
/*
 * 需要从此代码获取接线图:https://youtu.be/0glBk917HPg  
 * 在Udemy.com上购买我的Arduino课程 http://robojax.com/L/?id=62  
 * 
 * 从RoboJax.com获取此代码及其他Arduino代码  
 * 在一个结构化的课程中逐步学习Arduino,所有材料、接线图和库都在一个地方。  
 * 在Udemy.com上购买我的课程 http://robojax.com/L/?id=62  
 * 
 * 如果你觉得这个教程对你有帮助,请支持我,以便我能继续制作像这样的内容。  
 * 
 * 或者使用PayPal捐款 http://robojax.com/L/?id=64  
 * 
 * 此代码为“按原样”提供,不提供任何担保或责任。  
 * 只要您保持此声明完整,即可自由使用此代码。  
 * 此代码已从RoboJax.com下载  
 * 此程序是自由软件:您可以在GNU通用公共许可证的条款下重新发布和/或修改它,许可证由自由软件基金会发布,版本为3,或(可选)任何更高版本。  
 * 
 * 此程序的分发是希望它会有用,但不提供任何担保;甚至没有适销性或特定用途适用性的默示担保。有关更多详细信息,请参见GNU通用公共许可证。  
 * 
 * 您应该已经收到与此程序一起提供的GNU通用公共许可证的副本。如果没有,请参见<https://www.gnu.org/licenses/>。
 */
int Pin1 = 10;
int Pin2 = 11;
int Pin3 = 12;
int Pin4 = 13;
int _step = 0;
boolean dir = true; // 假=顺时针,真=逆时针
int count=0;
void setup()
{
 pinMode(Pin1, OUTPUT);
 pinMode(Pin2, OUTPUT);
 pinMode(Pin3, OUTPUT);
 pinMode(Pin4, OUTPUT);
}
 void loop()
{
 switch(_step){
   case 0:
     digitalWrite(Pin1, LOW);
     digitalWrite(Pin2, LOW);
     digitalWrite(Pin3, LOW);
     digitalWrite(Pin4, HIGH);
   break;
   case 1:
     digitalWrite(Pin1, LOW);
     digitalWrite(Pin2, LOW);
     digitalWrite(Pin3, HIGH);
     digitalWrite(Pin4, HIGH);
   break;
   case 2:
     digitalWrite(Pin1, LOW);
     digitalWrite(Pin2, LOW);
     digitalWrite(Pin3, HIGH);
     digitalWrite(Pin4, LOW);
   break;
   case 3:
     digitalWrite(Pin1, LOW);
     digitalWrite(Pin2, HIGH);
     digitalWrite(Pin3, HIGH);
     digitalWrite(Pin4, LOW);
   break;
   case 4:
     digitalWrite(Pin1, LOW);
     digitalWrite(Pin2, HIGH);
     digitalWrite(Pin3, LOW);
     digitalWrite(Pin4, LOW);
   break;
   case 5:
     digitalWrite(Pin1, HIGH);
     digitalWrite(Pin2, HIGH);
     digitalWrite(Pin3, LOW);
     digitalWrite(Pin4, LOW);
   break;
     case 6:
     digitalWrite(Pin1, HIGH);
     digitalWrite(Pin2, LOW);
     digitalWrite(Pin3, LOW);
     digitalWrite(Pin4, LOW);
   break;
   case 7:
     digitalWrite(Pin1, HIGH);
     digitalWrite(Pin2, LOW);
     digitalWrite(Pin3, LOW);
     digitalWrite(Pin4, HIGH);
   break;
   default:
     digitalWrite(Pin1, LOW);
     digitalWrite(Pin2, LOW);
     digitalWrite(Pin3, LOW);
     digitalWrite(Pin4, LOW);
   break;
 }
 if(dir){
   _step++;
 }else{
   _step--;
 }
 if(_step>7){
   _step=0;
 }
 if(_step<0){
   _step=7;
 }
 delay(1);

}

文件📁

没有可用的文件。