发作品签到
专业版

微型物联网直流电机&步进电机伺服驱动器

工程标签

765
0
0
12

简介

长30mm宽30mm的驱动器,支持wifi、蓝牙遥控,兼容MQTT协议。可驱动一路步进电机、一路直流有刷电机。 直流电机支持最大电压11V、最大电流1.8A。步进电机支持最大电压35v,最大电流2A

简介:长30mm宽30mm的驱动器,支持wifi、蓝牙遥控,兼容MQTT协议。可驱动一路步进电机、一路直流有刷电机。 直流电机支持最大电压11V、最大电流1.8A。步进电机支持最大电压35v,最大电流2A
星火计划2024

开源协议

GPL 3.0

(未经作者授权,禁止转载)
创建时间:2024-10-22 09:32:29更新时间:2024-10-24 06:08:37

描述

项目简介

本项目是基于ESP32S3的电机控制器,长30mm宽30mm,支持wifi、蓝牙遥控,兼容MQTT协议。可驱动一路步进电机、一路直流有刷电机。

项目功能

电机驱动:直流电机支持最大电压11V、最大电流1.8A。步进电机支持最大电压35v,最大电流2A。
外部接口:type-C、ESP32引脚触点引出
软件设计:局域网内web页面遥控、指令控制;广域网MQTT话题指令遥控;type-C接口串口指令控制
硬件设计:ESP32 S3,步进电机驱动电路、直流电机驱动电路,串口通信电路,5v-3v3 LDO电路

项目参数

  • 本设计采用ESP32S3 支持WIFI 蓝牙,需要外接天线;

  • 直流电机驱动DRV8837:
    • H 桥电机驱动器
    – 驱动直流电机或其他负载
    – 低 MOSFET 导通电阻:HS + LS 280mΩ
    • 1.8A 最大驱动电流
    • 独立的电机和逻辑电源引脚:
    – 电机 VM:0 至 11 V
    – 逻辑 VCC:1.8 至 7 V
    • 低功耗休眠模式,休眠电流最大值仅为 120nA
    – nSLEEP 引脚
    • 保护特性
    – VCC 欠压闭锁 (UVLO)
    – 过流保护 (OCP)
    – 热关断 (TSD)

  • 步进电机驱动A4988
    ▪ 低 RDS(ON) 输出
    ▪ 自动电流衰减模式检测/选择
    ▪ 混合和慢速电流衰减模式
    ▪ 同步整流,实现低功耗
    ▪ 内部 UVLO
    ▪ 交叉电流保护
    ▪ 3.3 和 5 V 兼容逻辑电源
    ▪ 热关断电路
    ▪ 对地短路保护
    ▪ 短路负载保护
    ▪ 五种可选步进模式:全、1/2、1/4、1/8 和 1/16

原理解析(硬件说明)

此处使用0欧电阻来选择逻辑供电从5v引入或是直流电机、步进电机电源供电
image.png
......

软件代码

实现了通过web控制步进电机的例程


#include 
#include 

// 定义A4988驱动器的引脚
#define REST_PIN 16
#define MS1_PIN 18
#define MS2_PIN 19
#define MS3_PIN 20
#define STEP_PIN 8
#define DIR_PIN 9
#define EN_PIN 15
#define SLEEP_PIN 17

// 步进控制相关参数
int stepsPerRevolution = 200; // 设定每一转所需的步数

// Wi-Fi 相关参数
const char* ssid = "yj_lab";
const char* password = "809809809";

// 创建WebServer对象
WebServer server(80);

void setup() {
  // 初始化串口通信
  Serial.begin(115200);

  // 配置引脚模式
  pinMode(REST_PIN, OUTPUT);
  pinMode(EN_PIN, OUTPUT);
  pinMode(SLEEP_PIN, OUTPUT);
  pinMode(MS1_PIN, OUTPUT);
  pinMode(MS2_PIN, OUTPUT);
  pinMode(MS3_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);

  // 设置初始状态
  digitalWrite(REST_PIN, HIGH); // 禁用复位
  digitalWrite(EN_PIN, LOW); 
  digitalWrite(SLEEP_PIN, HIGH); 
  digitalWrite(MS1_PIN, LOW); // 全步进
  digitalWrite(MS2_PIN, LOW); // 全步进
  digitalWrite(MS3_PIN, LOW); // 全步进

  // 连接到Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
  Serial.println(WiFi.localIP());

  // 设置处理根路径("/")的函数
  server.on("/", handleRoot);
  
  // 设置处理提交指令的函数
  server.on("/submit", handleSubmit);

  // 启动WebServer
  server.begin();
}

void loop() {
  // 处理客户端请求
  server.handleClient();
}

// 处理根路径的函数,显示输入表单
void handleRoot() {
  String html = ""
                "Command: <input type="\" name="\" /><br />"
                "<input type="\" value="\" />"
                "";
  server.send(200, "text/html", html);
}

// 处理提交指令的函数
void handleSubmit() {
  if (server.hasArg("command")) {
    String command = server.arg("command");
    command.trim(); // 去除前后的空格和换行符

    // 解析指令
    if (command.startsWith("MOVE ")) {
      int spaceIndex = command.indexOf(' ');
      if (spaceIndex != -1) {
        String stepsStr = command.substring(spaceIndex + 1);
        int steps = stepsStr.toInt();
        moveStepper(steps);
      }
    } else if (command.startsWith("DIR ")) {
      int spaceIndex = command.indexOf(' ');
      if (spaceIndex != -1) {
        String dirStr = command.substring(spaceIndex + 1);
        int dir = dirStr.toInt();
        setDirection(dir);
      }
    } else if (command.startsWith("test ")) {
      int spaceIndex = command.indexOf(' ');
      if (spaceIndex != -1) {
        String stepsStr1 = command.substring(spaceIndex + 1);
        int test1 = stepsStr1.toInt();
        test(test1);
      }
    } else {
      server.send(200, "text/plain", "Invalid command");
      return;
    }
    
    // 重定向回根路径
    server.sendHeader("Location", "/", true);
    server.send(302, "text/plain", "");
  } else {
    server.send(400, "text/plain", "Command not found");
  }
}

void moveStepper(int steps) {
  for (int i = 0; i < abs(steps); i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(500); // 控制步进电机的速度
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(500);
  }
}

void test(int i) {
  for (i; i > 0; i--) {
    digitalWrite(DIR_PIN, LOW);
    moveStepper(400);
    digitalWrite(DIR_PIN, HIGH);
    moveStepper(800);
    digitalWrite(DIR_PIN, LOW);
    moveStepper(400);
  }
}

void setDirection(int dir) {
  if (dir == 1) {
    digitalWrite(DIR_PIN, HIGH); // 顺时针方向
    Serial.println("Direction: Clockwise");
  } else if (dir == 0) {
    digitalWrite(DIR_PIN, LOW); // 逆时针方向
    Serial.println("Direction: Counterclockwise");
  } else {
    Serial.println("Invalid direction value");
  }
}

注意事项

注意供电方面不要把5v和电机电源同时接入LDO(不然会冒魔法烟雾)

注意烧录电路存在部分没有一键烧录,烧录时需要先按下IO0的按键,再按下EN按键进入烧录模式

实物图

a0c0b999e4c2e6b8be88692dbcb617d.jpg

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
aec7b093f70bc38d6a19d64d7db27073.mp4
1
2
156e89fc7b3893f4f22c900d50d0167f.mp4
1
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航