【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网

2023-11-09


0 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目,大家可用于 课程设计 或 毕业设计

基于stm32的智能扫地机器人设计与实现


单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


1 课题背景

随着人口老龄化的到来和人民对提升生活品质的需要, 人们对在现实生活场景中取代人力的服务机器人有着迫切的需要。 同时, 机电、 自动控制、 计算机、 传感器等技术的发展也为制造服务机器人提供了技术支持。 扫地机器人是服务机器人中技术最成熟和最为广泛使用的机器人。 它可以自动的在室内行走, 通过刷扫和吸尘将地面上的碎屑吸收进垃圾收集装置中, 完成清洁地面的任务,有效的减少了人们清洁地面这种简单重复的家务劳动, 节约了劳动力, 提高了生活品质。 对于许多忙于工作和生的人来说,扫地机器人已经成为家庭必备的产品。

2 硬件系统总体框架

在这里插入图片描述

学长设计的是一个传统的扫地机器人,它使用红外传感器和超声波传感器来检测障碍物,以及一个MPU6050运动传感器来计算旋转角度。使用两个直流减速电机驱动车轮实现行走,两边的编码器可以通过计算编码器产生的脉冲数量来计算车轮的速度和距离。为了方便实验过程及时获取传感器数据和向扫地机器人发送开机、关机命令,连接了一个ATK-ESP8266WIFI模块,使用笔记本电脑安装网络调试助手软件实现和WIFI模块的通讯。该平台的动力单元为一个电压为12V、容量为9000mAh电池包,为电机驱动提供电力,并经过稳压后为控制单元提供动力。主控制单元用于控制整个机器人,STM32F103ZET6被用作控制芯片,主控单元执行机械驱动、运动控制和传感器数据采集等任务。

2.1 电机驱动

由于单片机输出的电流不足以驱动电机,所以必须通过电机驱动模块驱动电机。对于直流电机通常使用H桥驱动芯片进行驱动,本课题采用了两块L298N驱动模块。L298N是专用驱动集成电路,属于H桥集成电路。使用了ST公司的原装全新芯片L298N,采用稳定性高的SMT工艺,使用了高质量的铝电解电容,使电路工作稳定。作为直流电机驱动时,可以同时驱动两路3-16V的直流电机。同时驱动板还提供了5V电源输出接口,可以用于5V单片机的电路系统供电。支持3.3VMCUARM控制,可以通过单片机方便的控制直流电机的功率和转动方向,也可以用于控制2相步进电机,5线4相步进电机。

在这里插入图片描述

虽然L298N驱动板可以个同时驱动两个直流电机,但长时间工作在大功率条件下,驱动板可能出现过热、烧板等问题。为了提高硬件系统稳定性,本课题中使用两块L298N驱动板,一块驱动板控制一个电机。L298N驱动板的IN3IN4EN2OUT3OUT4直接浮空,VCC输入12V电机驱动电源正极,负极接GND,VCC5V接5V电源正极,负极接地,EN1IN1连接STM32控制电机正反转和启停,IN2输入PWM波。OUT1OUT2连接电机。

在这里插入图片描述

2.2 红外线传感器

这次的项目中, 学长设计通过红外传感器检测扫地机器人运动方向是否有障碍物, 从而实现扫地机器人的自动避障的功能。 选用的E18-D80NK 型红外传感器电路如图所示。

在这里插入图片描述

红外传感器使用 5V 电源供电, STM32 通过读取黄色信号线的高低电平确定是否存在障碍物, 感应距离可以通过红外传感器上的旋钮在 3-77cm 的范围内进行调整。 在电路设计中在输出端黄线加上拉电阻 10K 到 5V 电源, 再接入单片机检测, 会比较稳定。

在这里插入图片描述

2.3 超声波传感器

在这里插入图片描述

学长选用US-100 超声波测距模块, US-100 超声波测距模块能够通过自带的温度传感器测量温度并对测量结果进行校正。 可以通过GPIO或串口与单片机通信, 性能稳定。

US-100 超声波测距模块具有1个模式选择跳线和5Pin接口, 本课题使用串口模式, 必须插上跳线帽, 5个接口1号Pin接VCC 5V电源, 2号Pin接外部电路UART 的 TX 端, 3号Pin接外部电路UART的 RX 端, 4号Pin接外部电路的地。5 号Pin接外部电路的地。

在这里插入图片描述

2.4 MPU6050

MPU6050 是全球首例 9 轴运动处理传感器, 它集成了 3 轴 MEMS 陀螺仪, 3 轴 MEMS 加速度计, 以及一个可扩展的数字运动处理器 DMP。

MPU6050 电路连接图

在这里插入图片描述

2.5 ATK-ESP8266 WI FI 模块

ATK-ESP8266是ALIENTEK推出的一款高性能的UART-WiFi(串口-无线)模块, ATK-ESP8266板载ai-thinker公司的ESP8266模块。

ATK_ESP8266 模块电路连接图
在这里插入图片描述

2.6 电源管理模块

电源管理模块用于给控制系统个电路模块供电, 由于电池电压为 12V, 主控芯片供电电压为 3. 3V, 不能直接为主控芯片供电, 同时部分外部功能模块需要 5V 电压供电, 因此本课题设计有降压电路、 电压选择电路和 3. 3V/5V 输出电路, 可以满足控制系统的供电需要。 DC_IN 用于外部直流电源输入, 范围是DC6~24V, 输入电压经过 MP2359 芯片转换为 5V 电源输出, 其中 D4 是防反接二极管, 避免外部直流电源极性搞错的时候, 烧坏控制系统电路。

在这里插入图片描述

3 软件系统设计

学长设计的整体软件架构如下:

在这里插入图片描述

3.1 MPU6050 数据读取

MPU6050 传感器内部包含陀螺仪和加速度计, 而且自带了数字运动处理器,即 DMP通过 InvenSense 提供的 MPU6050 嵌入式运动驱动库, 可以将陀螺仪和加速度计的原始数据直接转换成四元数输出, 通过四元数转换可以直接计算出欧拉角从而得到: 航向角(yaw) 、 横滚角(roll) 和俯仰角(pitch)。

学长这里选定了以 I2C 通信对 MPU6050 的 DMP 输出的四元数进行读取。

初始化 I2C 接口, 编程代码下

1 void HmcIICInit(void)
2.{
3. /*GPIO 初始化*/
4. GPIO_InitTypeDef GPIO_InitStructure;
5. /* 配置硬件 IIC 需要的变量 */
6. I2C_InitTypeDef I2C_InitStructure;
7.
8. /* 使能与 I2C1 有关的时钟 */
9. RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
11.
12. /* PB6-I2C1_SCL、 PB7-I2C1_SDA*/
13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
16. GPIO_Init(GPIOB, &GPIO_InitStructure);
17.
18. /*IIC 外设初始化*/
19.
20. /* I2C 配置 */
21. I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //配置为普通 IIC 模式
22. //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
23.//I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;
24. I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能自动应答
25. I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
26. I2C_InitStructure.I2C_ClockSpeed = 50000; //5K 的速度
27.
28.
29. /* I2C1 初始化 */
30. I2C_Init(I2C1, &I2C_InitStructure);
31.
32. /* 使能 I2C1 */
33. I2C_Cmd (I2C1,ENABLE);
34. /*允许应答模式*/
35. I2C_AcknowledgeConfig(I2C1, ENABLE);

配置系统时钟源并使能角速度传感器和加速度传感器, 代码实现如下:

1. u8 MPU_Init(void)
2. {
3. u8 res;
4. IIC_Init();//初始化 IIC 总线
5. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位 MPU6050
6. delay_ms(100);
7. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒 MPU6050
8. MPU_Set_Gyro_Fsr(3); //陀螺仪传感器, ±2000dps
9. MPU_Set_Accel_Fsr(0); //加速度传感器,±2g
10. MPU_Set_Rate(50); //设置采样率 50Hz
11. MPU_Write_Byte(MPU_INT_EN_REG, 0X00); //关闭所有中断
12. MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C 主模式关闭
13. MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭 FIFO
14. MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT 引脚低电平有效
15. res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
16. if(res==MPU_ADDR)//器件 ID 正确
17. {
18. MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X01); //设置 CLKSEL, PLL X 轴为参考
19. MPU_Write_Byte(MPU_PWR_MGMT2_REG, 0X00); //加速度与陀螺仪都工作
20. MPU_Set_Rate(50); //设置采样率为 50Hz
21. }else return 1;
22. return 0;
23. }
24. //设置 MPU6050 陀螺仪传感器满量程范围
25. //fsr: 0,±250dps;1,±500dps;2, ±1000dps;3,±2000dps
26.//返回值:0, 设置成功

在这里插入图片描述

3.2 超声波传感器数据读取

编写超声波发送函数, 串口发送0X55到超声波模块。相关代码如下;

1. void uart_init(u32 bound) {
2. //GPIO端口设置
3. GPIO_InitTypeDef GPIO_InitStructure;
4. USART_InitTypeDef USART_InitStructure;
5. NVIC_InitTypeDef NVIC_InitStructure;
6.
7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA,  ENABLE) ;
//使能USART1, GPIOA时钟
8. //USART1_TX PA. 9
9. GPIO_InitStructure. GPIO_Pin = GPIO_Pin_9; //PA. 9
10. GPIO_InitStructure. GPIO_Speed = GPIO_Speed_50MHz;
11. GPIO_InitStructure. GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
12. GPIO_Init(GPIOA, &GPIO_InitStructure) ;
13.
14.//USART1_RX PA. 10
15. GPIO_InitStructure. GPIO_Pin = GPIO_Pin_10;
16. GPIO_InitStructure. GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
17. GPIO_Init(GPIOA, &GPIO_InitStructure) ;
18.
19. //Usart1 NVIC 配置
20.
21. NVIC_InitStructure. NVIC_IRQChannel = USART1_IRQn;
22. NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3
23. NVIC_InitStructure. NVIC_IRQChannelSubPriority = 3; //子优先级3
24. NVIC_InitStructure. NVIC_IRQChannelCmd = ENABLE; //IRQ 通
道使能
25. NVIC_Init(&NVIC_InitStructure) ; //根据指定的参数初始化VIC寄存器
26.
27. //USART 初始化设置
28.
29. USART_InitStructure. USART_BaudRate = bound; //一般设置为9600;
30. USART_InitStructure. USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
31. USART_InitStructure. USART_StopBits = USART_StopBits_1; //一个停止位
32. USART_InitStructure. USART_Parity = USART_Parity_No; //无奇偶校验位
33. USART_InitStructure. USART_HardwareFlowControl  =
USART_HardwareFlowControl_None; //无硬件数据流控制
34. USART_InitStructure. USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模35.
36.USART_Init(USART1, &USART_InitStructure) ; //初始化串口
37. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE) ; //开启中断
38. USART_Cmd(USART1, ENABLE) ; //使能串口
39.
40. }

3.3 电机控制

3.3.1 PID控制

扫地机器人在二维平面内运动, 主要对航向角进行控制, 在运动过程中受到地面阻力、 碰撞等各种因数的影响, 无法建立精确的数学模型来编写算法对扫地机器人进行精确的控制, 所以本课题中使用 PID 控制算法对扫地机器人进行控制。

PID(比例(proportion) 、 积分(integral) 、 导数(derivative) ) 控制器作为最早实用化的控制器已有近百年历史, 现在仍然是应用最广泛的工业控制器。 PID 控制器简单易懂, 使用中不需精确的系统模型等先决条件, 因而成为应用最为广泛的控制器。

PID流程

在这里插入图片描述

PID实现

struct _pid{
    float SetSpeed;            //定义设定值
    float ActualSpeed;        //定义实际值
    float err;                //定义偏差值
    float err_last;            //定义上一个偏差值
    float Kp,Ki,Kd;            //定义比例、积分、微分系数
    float voltage;            //定义电压值(控制执行器的变量)
    float integral;            //定义积分值
    float umax;
    float umin;
}pid;

void PID_init(){
    printf("PID_init begin \n");
    pid.SetSpeed=0.0;
    pid.ActualSpeed=0.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.voltage=0.0;
    pid.integral=0.0;
    pid.Kp=0.2;
   pid.Ki=0.1;       //注意,和上几次相比,这里加大了积分环节的值
    pid.Kd=0.2;
    pid.umax=400;
    pid.umin=-200;
    printf("PID_init end \n");
}
float PID_realize(float speed){
    int index;
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;

   if(pid.ActualSpeed>pid.umax)  //灰色底色表示抗积分饱和的实现
    {

       if(abs(pid.err)>200)      //蓝色标注为积分分离过程
        {
            index=0;
        }else{
            index=1;
            if(pid.err<0)
            {
              pid.integral+=pid.err;
            }
        }
    }else if(pid.ActualSpeed<pid.umin){
        if(abs(pid.err)>200)      //积分分离过程
        {
            index=0;
        }else{
            index=1;
            if(pid.err>0)
            {
            pid.integral+=pid.err;
            }
        }
    }else{
        if(abs(pid.err)>200)                    //积分分离过程
        {
            index=0;
        }else{
            index=1;
            pid.integral+=pid.err;
        }
    }

    pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);

    pid.err_last=pid.err;
    pid.ActualSpeed=pid.voltage*1.0;
    return pid.ActualSpeed;
}

3.4 扫地机器人路径规划

3.4.1 弓字型行走

在没有障碍物或房间结构变化不大的情况下, 扫地机器人可应用巡航路径规划算法。

步骤 1

扫地机器人从 MPU6050 模块获得偏航角, 并将此偏航角设定为参考角。然后扫地机器人在基于参考角调整偏航角的同时开始向前移动。 距离 D 由编码器记录, D 的值将被分配给一个名为 pre_Walkingcount 的变量。 当超声波传感器检测到障碍物的存在时, 机器人会降低速度以避免碰撞发生。 如果红外传感器返回低电平, 则该算法切换到步骤 2。

在这里插入图片描述

步骤 2

机器人向左旋转 90 度。 然后 机器人用编码器记录向前移动的距离 d。如果 d= Ic ,代表扫地机器人的清洁端口的宽度, 机器人再向左旋转 90 度。 之后, 算法切换到步骤 3。 步骤 2 的编程实现中, 编写了实现扫地机器人左转 90°函数 Left_turn()和直行 的函数 Straight_go()。

在这里插入图片描述

步骤 3

步骤 3 类似于步骤 1, 但方向相反。 当机器人遇到障碍物时, 将距离 D与变量 pre_Walkingcount 进行比较。 比较的结果将决定重新覆盖算法是否工作。如 果 D= pre_Walkingcount, 算 法切 换 到 步 骤 4, D 值将 被 分 配 给变 量
pre_Walkingcount。 通过与前面的距离进行比较, 机器人可以决定要运行哪种算法。

步骤 4

机器人向右转 90 度。 然后机器人用编码器记录向前移动的距离 d。 如果 d= Ic , 机器人向右转动 90 度。 之后, 算法切换到步骤 1, 并开始另一个新的循环

在这里插入图片描述

4 测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

机器人路径主要基于弓字形路径, 利用重复覆盖算法对障碍物后方的区域进行清洗。 与具有随机避障算法的扫地机器人相比, 新算法的机器人能够覆盖94. 61%的地面, 提高了扫地机器人的效率。

展示视频

毕业设计:基于stm32的扫地机器人


单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


5 最后

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网 的相关文章

  • vs2019下内存泄漏检测工具VLD(Visual Leak Detector)的使用

    前言 我们在c 程序开发中经常在使用指针时 会出现内存泄漏的情况 但是很多时候很难定位到是哪个指针出问题了 这时候就需要内存泄漏检查工具 其中比较好用的就是 VLD Visual Leak Detector 下载 VLD下载地址 安装完成后
  • 【华为OD机试c++/java/python】称砝码【 2023 Q1 A卷

    题目描述 现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 数据范围 每组输入数据满足 1

随机推荐

  • [机缘参悟-65]:《兵者,诡道也》-7-三十六计解读-败战计

    目录 前言 第1章 三十六计 概述 第六套 败战计 第三十一计 美人计 第三十二计 空城计 第三十三计 反间计 第三十四计 苦肉计 第三十五计 连环计 第三十六计 走为上计 前言 兵者 诡道也 兵者 道 的部分 是 道 的另一面 如果 天道
  • Box2D射线和AABB碰撞检测

    box2d使用了一种叫做slab的碰撞检测算法 所谓slab是指两个平行平面之间的空间 由此我们可以把3D空间中的AABB盒子看做是由AABB的3组平行面形成的3个方向的slab的交集 根据这个定义 我们可以得到以下两个结论 1 如果一个点
  • mysql启动报错:Starting MySQL... ERROR! The server quit without updating PID file

    mysql启动时报错 Starting MySQL ERROR The server quit without updating PID file opt mysql data mysql pid 的解决方法 1 可能是 opt mysql
  • [MySQL]一文带你学明白数据库控制语言——DCL

    前言 嗨咯 小伙伴大家好呀 好几天没见了 周末过得怎么样啊 之前学过的SQL语句不会都忘了吧 如果忘了的话大家可以看一下前几期的文章 本期要学习的是SQL语句中的数据库控制语句 DCL 学习完毕之后MySQL中的SQL语句也就结束了 数据库
  • [388]码云使用说明

    码云如何上传项目 码云上传项目 需要3个步骤 在码云网站建立一个空项目 把这个空项目拉到本地 把自己的项目放到这个空项目里面并提交 1 在码云的页面 点击右上角的加号 2 选择新建项目 3 在跳转的页面简要填写项目信息 除了名称和路径 其它
  • 使用HttpClient下载网页

    Httpclient是一个非常好用的第三方库 用于网络编程 可以用来做个爬虫程序什么之类的 安卓中内置的网络编程库就是httpclient 下面就可大家介绍介绍怎么使用httpclient下载新浪首页的源代码 其过程就是首先构建一个http
  • python怎么调用文件_Python如何调用m文件

    Python如何调用m文件 一 安装Python 并正确配置环境变量 matlab2016a只支持python2 7 python3 3 python3 4 python3 4以上版本不支持 推荐学习 Python教程 二 安装Matlab
  • CSS中如何实现一个自适应正方形(宽高相等)的元素?

    聚沙成塔 每天进步一点点 专栏简介 利用 padding 百分比 2 利用 before 伪元素 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅
  • cocos2dx中的内存加载PLIST

    今天 加载图片时有问题 myButtonPList loadTextures jineng 02103 png jineng 02103 light png jineng 03101 png UI TEX TYPE PLIST myButt
  • 时间趋势可视化-柱形图

    第1关 大胃王 比赛数据柱形图绘制 绘制柱形图的基本步骤 本关任务 根据实训提供的 大胃王 比赛数据绘制柱形图 熟悉柱形图绘制的基本步骤 coding utf 8 import pandas as pd from matplotlib im
  • 利用CIBERSORT免疫细胞类群分析详细教程

    利用CIBERSORT免疫细胞类群分析详细教程 现在最火的组学技术是什么 无疑便是单细胞测序了 通过单细胞测序 科研人员可以获得比原来更为精细的细胞图谱 但是单细胞测序诸多限制条件 也是不能让大家很好地利用这项技术解决自己的科学问题 除了较
  • 【Qt】通过QtCreator源码学习Qt(十二):Q_D和Q_Q指针(简称“d指针”)详解

    1 Q D和Q Q指针 简称 d指针 简介 参考博客 https www devbean net 2016 11 qt creator source study 07 https blog csdn net rabinsong articl
  • SpringBoot项目中统计所有Controller中的方法

    对接口方法进行抽象 Data public class ControllerMethodItem public String controllerName public String methodName public String req
  • vscode中preLaunchTask“g++”已终止,退出代码为1的解决方案

    问题背景 楼主原来做的项目 电脑中装了MinGW64 还有MinGW的32位版在用vscode时发现出现了 preLaunchTask g 已终止 退出代码为1的问题 找了好久 解决了问题 launch json 注释的位置 这里修改GDB
  • Vue中实现放大镜效果

    先来看一下我们需要实现的效果是怎样的 这里我们没有使用原生的 js 方法去实现 而是使用的 Vue3 官方推荐的一个工具库 vueuse cor 中的 useMouseInElement 方法来实现放大镜的效果 首先来看一下 useMous
  • 如何安装和配置树莓派

    如何安装和配置树莓派 如果你有一块树莓派的板子 还有一个没安装系统的SD卡 怎么能把系统装上 配置好跑起来 这篇文章主要就讲这个事 这是一块Raspberry Pi Zero W板 以及一个空SD卡 当然 我们需要一个SD卡读卡器 还需要一
  • Flink Native Kubernetes (一)

    目录 文章目录 目录 概述 Linux 集群描述 版本 部署K8S环境 配置Yum 安装docker 安装Rancher 安装K8s 工作集群 添加KubeCtl命令上下文 运行FlinkDemo FlinkSession关于K8s的基础环
  • 三:Sensor SLPI层代码分析---

    三 Sensor SLPI层代码分析 在学习SLPI侧代码前我们先了解下SEE的registry config registry 放在 persist sensors registry registry中 它是通过config生成的 是给S
  • 循环遍历本地的图片使用BASE64编码,并在ajax也遍历图片

    前端调用ajax到后端去图片的方法 并返回 public void search HttpServletRequest request HttpServletResponse response throws Exception String
  • 【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2 1 电机驱动 2 2 红外线传感器 2 3 超声波传感器 2 4 MPU6050 2 5 ATK ESP8266 WI FI 模块 2 6 电源管理模块 3 软件系统设计 3 1