问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用ESP32控制28BYJ-48步进电机进行多种操作

创作时间:
作者:
@小白创作中心

使用ESP32控制28BYJ-48步进电机进行多种操作

引用
CSDN
1.
https://m.blog.csdn.net/Y_xianlin/article/details/141679578

本文将介绍如何使用Arduino ESP32-S开发板控制28BYJ-48步进电机,实现多种操作。通过详细讲解硬件接线和软件编程,帮助读者掌握步进电机的控制方法。

硬件准备

  • Arduino ESP32-S开发板
  • 28BYJ-48步进电机
  • ULN2003驱动板

硬件连接

模块引脚
Arduino ESP32 引脚
IN1
GPIO 18
IN2
GPIO 19
IN3
GPIO 21
IN4
GPIO 22
VCC
5V
GND
GND

软件实现

代码说明

本项目不使用额外库,代码虽然多,但是实现简单,可以封装成一个自用库进行外部调用。电机速度为全局变量,可以改写成局部变量并写进函数,这样调用更灵活。28BYJ-48 电机旋转一圈是2048步。

主要功能函数

  • rotateClockwise(int steps):顺时针旋转指定步数。
  • rotateCounterClockwise(int steps):逆时针旋转指定步数(注意步进顺序的反向)。
  • rotateAngle(float degrees):旋转指定角度(正数表示顺时针,负数表示逆时针)。

完整代码

// 定义连接到ULN2003的ESP32引脚
const int pin1 = 18;  // IN1接ESP32的GPIO18
const int pin2 = 19;  // IN2接ESP32的GPIO19
const int pin3 = 21;  // IN3接ESP32的GPIO21
const int pin4 = 22;  // IN4接ESP32的GPIO22
// 步进电机的步数
const int stepsPerRevolution = 2048;  // 28BYJ-48步进电机通常为2048步
// 旋转速度(延迟时间,单位:毫秒)
int rotationSpeed = 2;  // 设置全局变量旋转速度
// 初始化电机控制引脚
void setup() {
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
  Serial.begin(115200);
  Serial.println("步进电机控制初始化完成");
}
// 步进电机控制函数
void stepMotor(int step) {
  switch (step) {
    case 0:  // 0011
      digitalWrite(pin1, LOW);
      digitalWrite(pin2, LOW);
      digitalWrite(pin3, HIGH);
      digitalWrite(pin4, HIGH);
      break;
    case 1:  // 0110
      digitalWrite(pin1, LOW);
      digitalWrite(pin2, HIGH);
      digitalWrite(pin3, HIGH);
      digitalWrite(pin4, LOW);
      break;
    case 2:  // 1100
      digitalWrite(pin1, HIGH);
      digitalWrite(pin2, HIGH);
      digitalWrite(pin3, LOW);
      digitalWrite(pin4, LOW);
      break;
    case 3:  // 1001
      digitalWrite(pin1, HIGH);
      digitalWrite(pin2, LOW);
      digitalWrite(pin3, LOW);
      digitalWrite(pin4, HIGH);
      break;
  }
}
// 顺时针旋转指定步数
void rotateClockwise(int steps) {
  for (int i = 0; i < steps; i++) {
    stepMotor(i % 4);
    delay(rotationSpeed);  // 使用全局变量控制旋转速度
  }
}
// 逆时针旋转指定步数
void rotateCounterClockwise(int steps) {
  for (int i = 0; i < steps; i++) {
    stepMotor((3 - (i % 4)));  // 反向控制顺序
    delay(rotationSpeed);  // 使用全局变量控制旋转速度
  }
}
// 旋转指定角度(正数表示顺时针,负数表示逆时针)
void rotateAngle(float degrees) {
  int steps = (int)(stepsPerRevolution * degrees / 360.0);
  if (steps > 0) {
    rotateClockwise(steps);
  } else if (steps < 0) {
    rotateCounterClockwise(-steps);
  }
}
// 主循环
void loop() {
  Serial.println("步进电机顺时针旋转一整圈...");
  rotateClockwise(stepsPerRevolution);
  delay(1000);
  Serial.println("步进电机逆时针旋转一整圈...");
  rotateCounterClockwise(stepsPerRevolution);
  delay(1000);
  Serial.println("步进电机旋转25度...");
  rotateAngle(25);
  delay(1000);
}

开发环境

  • Arduino IDE
  • ESP32 Dev Module

代码辅助

  • ChatGPT-4o

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号