docs: 添加28BYJ-48

This commit is contained in:
duruofu
2025-05-27 17:44:14 +08:00
parent 5a1ef27e8f
commit e9dace8ad0
14 changed files with 275 additions and 38 deletions

View File

@@ -3,5 +3,6 @@
"useMarkdownLinks": true,
"attachmentFolderPath": "./attachments",
"autoConvertHtml": false,
"alwaysUpdateLinks": true
"alwaysUpdateLinks": true,
"showInlineTitle": false
}

View File

@@ -3,5 +3,6 @@
"coffeebean-补充图片对齐语法",
"page-width"
],
"cssTheme": "GitHub Theme"
"cssTheme": "GitHub Theme",
"accentColor": "#37b94d"
}

View File

@@ -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,

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1,3 @@
{
"folder": "attachments"
}

View File

@@ -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"

View File

@@ -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表示四相八拍。
![](attachments/Pasted%20image%2020250527162100.png)
电机内部机构如下,中间部分是转子,由一个永磁体组成,边上的是定子绕组。
![](attachments/Pasted%20image%2020250527161829.png)
当定子的一个绕组通电时,将产生一个方向的电磁场,如果这个磁场的方向和转子磁场方向不在同一条直线上,那么定子和转子的磁场将产生一个扭力将定子扭转。依次改变绕组的磁场,就可以使步进电机正转或反转(比如通电次序为A->B->C->D正转反之则反转)。而改变磁场切换的时间间隔,就可以控制步进电机的速度了,这就是步进电机的驱动原理。
28BYJ-48 可以使用以下驱动方式:
单四相Wave Drive每次只激活一个线圈最低功耗但扭矩最小
- 双四相Full Step每次激活两个线圈扭矩较大
- 八拍细分Half Step交替激活单个和两个线圈运动最平稳精度最高推荐
### 1.2 ULN2003 驱动板介绍
ULN2003是一种新型的七路高耐压、大电流达林顿晶体管驱动IC。可用于驱动继电器、电磁阀、步进电机等。每路输出电流可达500mA。由于单片机接口信号不够大需要通过 ULN2003 放大再连接到相应的电机接口:
下面是本文使用的步进电机驱动板:
![](attachments/Pasted%20image%2020250527163637.png)
其中IN1-4引脚为ULN2003的控制端主要连接单片机引脚高电平导通低电平截止OUT1-4为ULN2003的驱动端主要连接步进电机4个相线。LED1-4为指示作用ULN2003通道导通时亮截止时灭。具体原理图如下
![](attachments/Pasted%20image%2020250527163522.png)
## 二、使用
### 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 共地。 电源电压过低可能导致电机运行无力或失步。
最终接线如下图:
![](attachments/Pasted%20image%2020250527165130.png)
### 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

View File

@@ -0,0 +1,32 @@
# ESP32驱动SG90舵机
> [!TIP] 🚀 ESP32 模块驱动案例 | 驱动SG90舵机
> - 💡 **碎碎念**😎本节将介绍使用ESP32驱动SG90舵机
> - 📺 **视频教程**:🚧 *开发中*
> - 💾 **示例代码**:🚧 *开发中*
>
## 一、介绍
### 1.1 SG90 舵机简介
### 1.2 PWM 控制原理
### 1.3 舵机角度与脉宽关系
## 二、使用
## 三、示例
# 参考链接

View File

@@ -0,0 +1,23 @@
# XXXXX
> [!TIP] 🚀 ESP32 XXXX | XXXXX
> - 💡 **碎碎念**😎本节将介绍XXXXXXXXXXXXXXXXXXX
> - 📺 **视频教程**:🚧 *开发中*
> - 💾 **示例代码**:🚧 *开发中*
>
## 一、介绍
## 二、使用
## 三、示例
# 参考链接