【花雕学编程】Arduino动手做(223)---二相四线42步进电机
2024-07-197487
AI 快速预览详细
本实验介绍了如何使用Arduino控制二相四线42步进电机。通过A4988驱动模块和设置扩展板,实现了对步进电机的精确控制。提供了详细的步骤和代码示例,适合初学者和有一定经验的创客。
|
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板 ![]() ![]() ![]() |







到 loop() 部分的代码的第一部分与前面的案例完全相同。
在循环中,将 while 循环与函数结合使用。首先,将步进电机的当前位置设置为零 currentPosition()stepper.setCurrentPosition(0)。
[code] //将位置重置为0
stepper.setCurrentPosition(0);[/code]
接下来,利用 while 循环。while 循环将连续且无限循环,直到括号内的表达式 () 变为 false。所以,在这种情况下,检查步进电机的当前位置是否不等于 400 步(!= means: 不等于)。虽然情况并非如此,但以设定的恒定速度运行步进电机 setSpeed()。
[code] //以200步/秒的速度向前运行电机,直到电机达到400步(2转)
while (stepper.currentPosition() != 400)
{
stepper.setSpeed(200);
stepper.runSpeed();
}[/code]
在循环的其余部分,做完全相同的事情,只是速度和目标位置不同。
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之九:使用AccelStepper库控制步进电机的步数或转数
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之九:使用AccelStepper库控制步进电机的步数或转数
*/
//包括AccelStepper库
#include "AccelStepper.h"
//定义步进电机连接和电机接口类型。
//使用驱动器时,电机接口类型必须设置为1
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
//创建AccelStepper类的新实例
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
//以每秒步数设置最大速度
stepper.setMaxSpeed(1000);
}
void loop() {
//将当前位置设置为0
stepper.setCurrentPosition(0);
//以200步/秒的速度向前运行电机,直到电机达到400步(2转)
while (stepper.currentPosition() != 400)
{
stepper.setSpeed(200);
stepper.runSpeed();
}
delay(1000);
//将位置重置为0
stepper.setCurrentPosition(0);
//以600步/秒的速度反向运行电机,直到电机达到-200步(1转)
while (stepper.currentPosition() != -200)
{
stepper.setSpeed(-600);
stepper.runSpeed();
}
delay(1000);
//将位置重置为0
stepper.setCurrentPosition(0);
//以400步/秒的速度向前运行电机,直到电机达到600步(3转)
while (stepper.currentPosition() != 600)
{
stepper.setSpeed(400);
stepper.runSpeed();
}
delay(1500);
}[/code]
从定义步进和方向引脚开始,这里将它们连接到Arduino引脚3和2。
该语句用于为常量值命名。编译程序时,编译器会将对此常量的任何引用替换为定义的值。所以在你提到的任何地方,编译器都会在编译程序时将其替换为值 2。
[code]#definedirPin[/code]
这里定义了一个常量。驱动器设置为全步模式,所以将其设置为每转 200 步。如果设置不同,请更改此值 stepsPerRevolution。
[code]#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200[/code]
在代码部分中,所有电机控制引脚都声明为数字输出,其功能为 setup()pinMode() 。
[code]void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}[/code]
在代码部分,让电机在 CW 方向上缓慢旋转一圈,在 CCW 方向上快速旋转一圈。接下来,我们让电机高速向每个方向旋转 5 圈。那么如何控制速度、旋转方向和转数呢?
[code]loop()
digitalWrite(dirPin, HIGH);
for(int i = 0; i < stepsPerRevolution; i++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}[/code]
控制旋转方向:
为了控制步进电机的旋转方向,我们将 DIR(方向)引脚设置为高电平或低电平。为此,我们使用函数,根据步进电机的连接方式,将 DIR 引脚设置为高电平将使电机转动 CW 或 CCW。
[code]digitalWrite()[/code]
控制步数或转数:
在此示例中,for 环路控制步进电机将采取的步数。for 循环中的代码导致步进电机的 1 步进。由于循环中的代码执行了 200 次 (stepsPerRevolution),因此会导致 1 次旋转。在最后两个循环中,for 循环中的代码执行 1000 次,这导致 1000 步或 5 转。
请注意,可以将 for 循环中的第二个项更改为所需的任何步骤数。 将导致 100 步,或半圈。
[code]for(int i = 0; i < 100; i++)[/code]
控制速度:
步进电机的速度由发送到STEP引脚的脉冲频率决定。频率越高,电机运行速度越快。可以通过更改代码来控制脉冲的频率。延迟越短,频率越高,电机运行速度越快。
[code]delayMicroseconds()[/code]
【花雕学编程】项目实验之八:驱动步进电机顺时针5圈和逆时针5圈
https://www.bilibili.com/video/BV1dD8XeCEjg/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1dD8XeCEjg/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之八:驱动步进电机顺时针5圈和逆时针5圈
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之八:驱动步进电机顺时针5圈和逆时针5圈
*/
//定义步进电机连接引脚和每转一圈的步数
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200
void setup() {
//将引脚声明为输出
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
//顺时针设置旋转方向
digitalWrite(dirPin, HIGH);
//缓慢旋转步进电机1圈
for (int i = 0; i < stepsPerRevolution; i++) {
//这四行结果为1个步骤
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000);
//逆时针设置旋转方向
digitalWrite(dirPin, LOW);
//快速旋转步进电机1圈
for (int i = 0; i < stepsPerRevolution; i++) {
//这四行结果为1个步骤
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000);
//顺时针设置旋转方向
digitalWrite(dirPin, HIGH);
//快速旋转步进电机5圈
for (int i = 0; i < 5 * stepsPerRevolution; i++) {
//这四行结果为1个步骤
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
//逆时针设置旋转方向
digitalWrite(dirPin, LOW);
//快速旋转步进电机5圈
for (int i = 0; i < 5 * stepsPerRevolution; i++) {
//这四行结果为1个步骤
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
}[/code]
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之七:步进电机速度、位置和加速度的随机变化
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之七:步进电机速度、位置和加速度的随机变化
*/
//包含AccelStepper库
#include
AccelStepper stepper(1, 5, 4);
//为双线板初始化加速踏板
void setup() {
Serial.begin(9600);
pinMode(6, OUTPUT); // 输出
digitalWrite(6, LOW); // 设置为低
}
void loop() {
digitalWrite(6, LOW); // 设置为低
if (stepper.distanceToGo() == 0)
{
//速度、位置和加速度的随机变化
//确保我们没有零速度或加速度
delay(1000);
stepper.moveTo(rand() % 400);
stepper.setMaxSpeed((rand() % 400) + 200);
stepper.setAcceleration((rand() % 200) + 100);
}
Serial.println(stepper.distanceToGo());
stepper.run(); //实际上使步进器移动
}[/code]
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之六:步进电机循环转动200步暂停一秒
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之六:步进电机循环转动200步暂停一秒
*/
int x;
void setup() {
//定义引脚,设为输出
Serial.begin(9600);
Serial.println("步进电机准备就绪");
// Enable
pinMode(6, OUTPUT);
// Step
pinMode(5, OUTPUT);
// Dir
pinMode(4, OUTPUT);
digitalWrite(6, LOW);
}
void loop() {
// Set Enable low
digitalWrite(6, LOW);
// Set Dir high
digitalWrite(4, HIGH);
Serial.println("循环200步(1转)");
for (x = 0; x < 200; x++) // //循环200次
{
digitalWrite(5, HIGH); // 输出高
delay(10); // Wait
digitalWrite(5, LOW); // 输出低
delay(100); // Wait
}
Serial.println("暂停");
delay(1000); //暂停一秒钟
}[/code]
【花雕学编程】实验之五:使用10K电位器模块控制42步进电机的速度
https://www.bilibili.com/video/BV18t81ejEyo/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV18t81ejEyo/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之五:使用10K电位器模块控制42步进电机的速度
*/
//定义引脚编号
const int stepPin = 2;
const int dirPin = 3;
int customDelay, customDelayMapped; //定义变量
void setup() {
//将两个引脚设置为输出
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
//使电机能够沿特定方向移动
digitalWrite(dirPin, HIGH);
}
void loop() {
//从自定义加速函数获取自定义延迟值
customDelayMapped = speedUp();
//根据电位器数值的不同,可以定制延迟脉冲,电机的速度取决于电位器
digitalWrite(stepPin, HIGH);
delayMicroseconds(customDelayMapped);
digitalWrite(stepPin, LOW);
delayMicroseconds(customDelayMapped);
}
//读取电位计的功能
int speedUp() {
//通过A0读取电位计
int customDelay = analogRead(A0);
//将电位计的读取值从0到1023转换为所需的延迟值(300到4000)
int newCustom = map(customDelay, 0, 1023, 300, 4000);
return newCustom;
}[/code]
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之五:使用10K电位器模块控制42步进电机的速度
10K电位器模块
【花雕学编程】实验之四:42步进电机的加速和减速控制】
https://www.bilibili.com/video/BV1Ua81eCEjo/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1Ua81eCEjo/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之四:步进电机的加速和减速控制
实验说明:步进电机的运动加速和减速,电机将以每秒 200 步的速度和每秒 30 步的加速度来回运行。
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机二相四线+A4988驱动模块+设置扩展板
项目实验之四:42步进电机的加速和减速控制
*/
//包含AccelStepper库
#include
//定义引脚连接
#define dirPin 2
#define stepPin 3
//定义电机接口类型
#define motorInterfaceType 1
//创建AccelStepper类的新实例
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup(){
//设置最大速度和加速度:
stepper.setMaxSpeed(200);
stepper.setAcceleration(30);
}
void loop() {
//设置目标位置
stepper.moveTo(600);
//以设定的速度和加速/减速运行到目标位置
stepper.runToPosition();
delay(1000);
// 移回零
stepper.moveTo(0);
stepper.runToPosition();
delay(1000);
}[/code]
代码说明
1、我们首先定义了连接到 A4988 引脚的 Arduino 引脚。然后,我们定义了内容stepsPerRevolution,它包含电机每转完成所需的整数步数。
2、在空置设置中,我们将电机的控制引脚声明为输出。
3、在空隙回路中,我们将 DIR 引脚设置为高电平以顺时针方向旋转电机(要逆时针旋转电机,可以将 DIR 设置为低电平)。由于我们发送到STEP引脚的脉冲频率决定了电机的速度,因此我们将该引脚设置为高,然后设置为低。当脉冲较高时,电机运行得更快。
实验二百二十三:42步进电机+A4988驱动器
项目实验之三:正反向控制步进电机快慢转动
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十三:42步进电机+A4988驱动器
项目实验之三:正反向控制步进电机快慢转动
*/
//定义引脚连接和电机每转的步数
const int dirPin = 3;
const int stepPin = 2;
const int stepsPerRevolution = 200;
void setup() {
//将引脚声明为输出
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
//顺时针设置电机方向
digitalWrite(dirPin, HIGH);
//缓慢旋转电机
for (int x = 0; x < stepsPerRevolution; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000); //等一下,延时1秒
//逆时针设置电机方向
digitalWrite(dirPin, LOW);
//快速旋转电机
for (int x = 0; x < stepsPerRevolution; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000); // 等一下,延时1秒
}[/code]