mirror of
https://github.com/DuRuofu/ESP32-Guide.git
synced 2026-02-05 22:52:22 +08:00
docs: 添加28BYJ-48
This commit is contained in:
3
docs/docs/guide/.obsidian/app.json
vendored
3
docs/docs/guide/.obsidian/app.json
vendored
@@ -3,5 +3,6 @@
|
||||
"useMarkdownLinks": true,
|
||||
"attachmentFolderPath": "./attachments",
|
||||
"autoConvertHtml": false,
|
||||
"alwaysUpdateLinks": true
|
||||
"alwaysUpdateLinks": true,
|
||||
"showInlineTitle": false
|
||||
}
|
||||
3
docs/docs/guide/.obsidian/appearance.json
vendored
3
docs/docs/guide/.obsidian/appearance.json
vendored
@@ -3,5 +3,6 @@
|
||||
"coffeebean-补充图片对齐语法",
|
||||
"page-width"
|
||||
],
|
||||
"cssTheme": "GitHub Theme"
|
||||
"cssTheme": "GitHub Theme",
|
||||
"accentColor": "#37b94d"
|
||||
}
|
||||
2
docs/docs/guide/.obsidian/core-plugins.json
vendored
2
docs/docs/guide/.obsidian/core-plugins.json
vendored
@@ -10,7 +10,7 @@
|
||||
"properties": false,
|
||||
"page-preview": true,
|
||||
"daily-notes": false,
|
||||
"templates": false,
|
||||
"templates": true,
|
||||
"note-composer": false,
|
||||
"command-palette": true,
|
||||
"slash-command": false,
|
||||
|
||||
1
docs/docs/guide/.obsidian/hotkeys.json
vendored
Normal file
1
docs/docs/guide/.obsidian/hotkeys.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
3
docs/docs/guide/.obsidian/templates.json
vendored
Normal file
3
docs/docs/guide/.obsidian/templates.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"folder": "attachments"
|
||||
}
|
||||
68
docs/docs/guide/.obsidian/workspace.json
vendored
68
docs/docs/guide/.obsidian/workspace.json
vendored
@@ -4,40 +4,25 @@
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "baea414ad68ff841",
|
||||
"id": "dbcfd28f34b2a13b",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "537a489d291df1f9",
|
||||
"id": "ba89e06e4ba5dcbd",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "目录.md",
|
||||
"file": "10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/28BYJ-48步进电机.md",
|
||||
"mode": "source",
|
||||
"source": false,
|
||||
"backlinks": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "目录"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "9715d22d1fb44f9e",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "00.常见问题及解决方案/常见问题及解决方案.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "常见问题及解决方案"
|
||||
"title": "28BYJ-48步进电机"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 1
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
@@ -100,41 +85,54 @@
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "00.常见问题及解决方案/常见问题及解决方案.md",
|
||||
"file": "10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/28BYJ-48步进电机.md",
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "常见问题及解决方案 的大纲"
|
||||
"title": "28BYJ-48步进电机 的大纲"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300,
|
||||
"collapsed": true
|
||||
"width": 300
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"switcher:打开快速切换": false,
|
||||
"graph:查看关系图谱": false,
|
||||
"canvas:新建白板": false,
|
||||
"daily-notes:打开/创建今天的日记": false,
|
||||
"templates:插入模板": false,
|
||||
"command-palette:打开命令面板": false,
|
||||
"oz-clear-unused-images:Clear Unused Images": false
|
||||
"oz-clear-unused-images:Clear Unused Images": false,
|
||||
"templates:插入模板": false
|
||||
}
|
||||
},
|
||||
"active": "9715d22d1fb44f9e",
|
||||
"active": "ba89e06e4ba5dcbd",
|
||||
"lastOpenFiles": [
|
||||
"00.常见问题及解决方案/attachments/20250210094506.png",
|
||||
"00.常见问题及解决方案/常见问题及解决方案.md",
|
||||
"attachments/20250202192226.png",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.2-SG90舵机/SG90舵机.md",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/28BYJ-48步进电机.md",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/attachments/Pasted image 20250527165130.png",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/attachments/Pasted image 20250527163637.png",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/attachments/Pasted image 20250527163522.png",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/attachments/Pasted image 20250527162100.png",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/attachments/Pasted image 20250527161829.png",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机/attachments",
|
||||
"目录.md",
|
||||
"01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md",
|
||||
"04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md",
|
||||
"04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md",
|
||||
"attachments/Templates.md",
|
||||
"04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md",
|
||||
"01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md",
|
||||
"00.常见问题及解决方案/常见问题及解决方案.md",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.2-SG90舵机",
|
||||
"10.项目实战/10.1-模块驱动案例/未命名.md",
|
||||
"10.项目实战/10.1-模块驱动案例/10.1.1-28BYJ-48步进电机",
|
||||
"04.外设学习/4.4-外设使用案例/未命名.md",
|
||||
"04.外设学习/4.4-外设使用案例/未命名",
|
||||
"10.项目实战/10.1-模块驱动案例",
|
||||
"00.常见问题及解决方案/attachments/20250210094506.png",
|
||||
"attachments/20250202192226.png",
|
||||
"01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md",
|
||||
"03.FreeRTOS基础/3.4-FreeRTOS软件定时器/FreeRTOS软件定时器.md",
|
||||
"00.常见问题及解决方案/attachments/20250506154522.png",
|
||||
"00.常见问题及解决方案/attachments/Pasted image 20250506154437.png"
|
||||
|
||||
@@ -0,0 +1,178 @@
|
||||
|
||||
# ESP32驱动28BYJ-48步进电机
|
||||
|
||||
> [!TIP] 🚀 ESP32 模块驱动案例 | 轻松驱动28BYJ-48步进电机
|
||||
> - 💡 **碎碎念**😎:本节将介绍ESP-IDF环境下驱动28BYJ-48步进电机的原理和相关代码编写。
|
||||
> - 📺 **视频教程**:🚧 *开发中*
|
||||
> - 💾 **示例代码**:🚧 *开发中*
|
||||
>
|
||||
|
||||
## 一、介绍
|
||||
|
||||
### 1.1 28BYJ-48 简介
|
||||
|
||||
28BYJ-48 是一款非常常见的四相五线式单极性步进电机,广泛应用于自动化、DIY、玩具和仪器中,因其 结构简单、价格低廉、控制方便而被广大电子爱好者喜爱。它的型号含义如下:28表示电机直径28毫米,B表示步进电机,Y表示永磁,J表示带减速箱,48表示四相八拍。
|
||||

|
||||
电机内部机构如下,中间部分是转子,由一个永磁体组成,边上的是定子绕组。
|
||||

|
||||
|
||||
当定子的一个绕组通电时,将产生一个方向的电磁场,如果这个磁场的方向和转子磁场方向不在同一条直线上,那么定子和转子的磁场将产生一个扭力将定子扭转。依次改变绕组的磁场,就可以使步进电机正转或反转(比如通电次序为A->B->C->D正转,反之则反转)。而改变磁场切换的时间间隔,就可以控制步进电机的速度了,这就是步进电机的驱动原理。
|
||||
|
||||
28BYJ-48 可以使用以下驱动方式:
|
||||
|
||||
单四相(Wave Drive):每次只激活一个线圈,最低功耗,但扭矩最小
|
||||
|
||||
|
||||
|
||||
- 双四相(Full Step):每次激活两个线圈,扭矩较大
|
||||
- 八拍细分(Half Step):交替激活单个和两个线圈,运动最平稳,精度最高(推荐)
|
||||
|
||||
### 1.2 ULN2003 驱动板介绍
|
||||
|
||||
ULN2003是一种新型的七路高耐压、大电流达林顿晶体管驱动IC。可用于驱动继电器、电磁阀、步进电机等。每路输出电流可达500mA。由于单片机接口信号不够大需要通过 ULN2003 放大再连接到相应的电机接口:
|
||||
|
||||
下面是本文使用的步进电机驱动板:
|
||||
|
||||

|
||||
|
||||
其中IN1-4引脚为ULN2003的控制端,主要连接单片机引脚,高电平导通,低电平截止;OUT1-4为ULN2003的驱动端,主要连接步进电机4个相线。LED1-4为指示作用,ULN2003通道导通时亮,截止时灭。具体原理图如下:
|
||||
|
||||

|
||||
|
||||
## 二、使用
|
||||
|
||||
### 2.1 接线方式
|
||||
|
||||
| ESP32 GPIO | ULN2003 INx | 说明 |
|
||||
| ---------- | ----------- | ------ |
|
||||
| GPIO 16 | IN1 | 电机A相控制 |
|
||||
| GPIO 17 | IN2 | 电机B相控制 |
|
||||
| GPIO 18 | IN3 | 电机C相控制 |
|
||||
| GPIO 19 | IN4 | 电机D相控制 |
|
||||
|
||||
> 注意:VCC/GND:虽然 ESP32 提供 5V 电源输出,但不推荐直接用 ESP32 板载 5V 给电机供电,建议使用外部 5V 电源,电流 ≥500mA,避免烧毁 USB 供电部分。但是GND 必须与 ESP32 共地。 电源电压过低可能导致电机运行无力或失步。
|
||||
|
||||
最终接线如下图:
|
||||
|
||||

|
||||
|
||||
### 2.2 具体驱动
|
||||
|
||||
无论使用哪种控制模式(单四相、双四相、八拍),本质上都是控制四个线圈依次或组合通电,让电机产生磁场推动转子旋转。在本案例中,借助 ULN2003 驱动模块,我们无需直接驱动电流,只需要用 ESP32 控制 4 个 GPIO 输出高低电平,驱动 ULN2003 使其导通相应线圈,即可实现步进电机的转动。
|
||||
|
||||
> ✅ ESP32 控制 GPIO → ULN2003 放大 → 步进电机线圈通电 → 转子旋转
|
||||
|
||||
## 三、示例
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
// 定义 GPIO 引脚
|
||||
#define PIN1 GPIO_NUM_16
|
||||
#define PIN2 GPIO_NUM_17
|
||||
#define PIN3 GPIO_NUM_18
|
||||
#define PIN4 GPIO_NUM_19
|
||||
|
||||
// 电机步数和旋转延迟(越小越快)
|
||||
#define STEPS_PER_REVOLUTION 4096
|
||||
int rotation_speed_ms = 10; // 全局速度变量,单位ms
|
||||
|
||||
// 初始化 GPIO
|
||||
void stepper_gpio_init(void) {
|
||||
gpio_config_t io_conf = {
|
||||
.pin_bit_mask = (1ULL << PIN1) | (1ULL << PIN2) | (1ULL << PIN3) | (1ULL << PIN4),
|
||||
.mode = GPIO_MODE_OUTPUT,
|
||||
.pull_up_en = 0,
|
||||
.pull_down_en = 0,
|
||||
.intr_type = GPIO_INTR_DISABLE
|
||||
};
|
||||
gpio_config(&io_conf);
|
||||
printf("步进电机 GPIO 初始化完成\n");
|
||||
}
|
||||
|
||||
// 八步半步激励序列(半步驱动),共8步
|
||||
// 顺序依次是单相激励与双相激励交替,提升平滑度
|
||||
const int step_sequence[8][4] = {
|
||||
{1, 0, 0, 0}, // 1
|
||||
{1, 1, 0, 0}, // 1+2
|
||||
{0, 1, 0, 0}, // 2
|
||||
{0, 1, 1, 0}, // 2+3
|
||||
{0, 0, 1, 0}, // 3
|
||||
{0, 0, 1, 1}, // 3+4
|
||||
{0, 0, 0, 1}, // 4
|
||||
{1, 0, 0, 1} // 4+1
|
||||
};
|
||||
|
||||
int current_step_index = 0; // 全局步进索引
|
||||
|
||||
// 输出对应步进序列的电平
|
||||
void step_motor(int step) {
|
||||
int idx = step % 8;
|
||||
gpio_set_level(PIN1, step_sequence[idx][0]);
|
||||
gpio_set_level(PIN2, step_sequence[idx][1]);
|
||||
gpio_set_level(PIN3, step_sequence[idx][2]);
|
||||
gpio_set_level(PIN4, step_sequence[idx][3]);
|
||||
}
|
||||
|
||||
// 顺时针旋转指定步数
|
||||
void rotate_clockwise(int steps) {
|
||||
for (int i = 0; i < steps; i++) {
|
||||
current_step_index = (current_step_index + 1) % 8;
|
||||
step_motor(current_step_index);
|
||||
vTaskDelay(pdMS_TO_TICKS(rotation_speed_ms));
|
||||
}
|
||||
}
|
||||
|
||||
// 逆时针旋转指定步数
|
||||
void rotate_counterclockwise(int steps) {
|
||||
for (int i = 0; i < steps; i++) {
|
||||
current_step_index = (current_step_index - 1 + 8) % 8;
|
||||
step_motor(current_step_index);
|
||||
vTaskDelay(pdMS_TO_TICKS(rotation_speed_ms));
|
||||
}
|
||||
}
|
||||
|
||||
// 旋转指定角度(正数顺时针,负数逆时针)
|
||||
void rotate_angle(float degrees) {
|
||||
// 细分了,步数要乘以8/4=2倍
|
||||
int steps = (int)(STEPS_PER_REVOLUTION * 2 * degrees / 360.0f);
|
||||
if (steps > 0) {
|
||||
rotate_clockwise(steps);
|
||||
} else if (steps < 0) {
|
||||
rotate_counterclockwise(-steps);
|
||||
}
|
||||
}
|
||||
|
||||
// 主任务
|
||||
void stepper_task(void *arg) {
|
||||
while (1) {
|
||||
printf("顺时针旋转一整圈...\n");
|
||||
rotate_clockwise(STEPS_PER_REVOLUTION * 2); // 注意步数乘2
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
|
||||
printf("逆时针旋转一整圈...\n");
|
||||
rotate_counterclockwise(STEPS_PER_REVOLUTION * 2);
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
|
||||
printf("顺时针旋转25度...\n");
|
||||
rotate_angle(25);
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
}
|
||||
}
|
||||
|
||||
// app_main 入口
|
||||
void app_main(void) {
|
||||
stepper_gpio_init();
|
||||
xTaskCreate(stepper_task, "stepper_task", 2048, NULL, 5, NULL);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
# 参考链接
|
||||
|
||||
1. https://www.yiboard.com/thread-1800-1-1.html
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 424 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 426 KiB |
32
docs/docs/guide/10.项目实战/10.1-模块驱动案例/10.1.2-SG90舵机/SG90舵机.md
Normal file
32
docs/docs/guide/10.项目实战/10.1-模块驱动案例/10.1.2-SG90舵机/SG90舵机.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# ESP32驱动SG90舵机
|
||||
|
||||
> [!TIP] 🚀 ESP32 模块驱动案例 | 驱动SG90舵机
|
||||
> - 💡 **碎碎念**😎:本节将介绍使用ESP32驱动SG90舵机
|
||||
> - 📺 **视频教程**:🚧 *开发中*
|
||||
> - 💾 **示例代码**:🚧 *开发中*
|
||||
>
|
||||
|
||||
## 一、介绍
|
||||
|
||||
### 1.1 SG90 舵机简介
|
||||
|
||||
|
||||
### 1.2 PWM 控制原理
|
||||
|
||||
|
||||
|
||||
### 1.3 舵机角度与脉宽关系
|
||||
|
||||
|
||||
|
||||
## 二、使用
|
||||
|
||||
|
||||
|
||||
## 三、示例
|
||||
|
||||
|
||||
|
||||
|
||||
# 参考链接
|
||||
|
||||
23
docs/docs/guide/attachments/Templates.md
Normal file
23
docs/docs/guide/attachments/Templates.md
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
# XXXXX
|
||||
|
||||
> [!TIP] 🚀 ESP32 XXXX | XXXXX
|
||||
> - 💡 **碎碎念**😎:本节将介绍XXXXXXXXXXXXXXXXXXX
|
||||
> - 📺 **视频教程**:🚧 *开发中*
|
||||
> - 💾 **示例代码**:🚧 *开发中*
|
||||
>
|
||||
|
||||
## 一、介绍
|
||||
|
||||
|
||||
## 二、使用
|
||||
|
||||
|
||||
|
||||
## 三、示例
|
||||
|
||||
|
||||
|
||||
|
||||
# 参考链接
|
||||
|
||||
Reference in New Issue
Block a user