基于MT6701方案的DIY写字机器人-开源文档

本项目是2024立创ESP32物联网征集令设计大赛参赛作品。

1. 视频链接:

B站视频–功能演示

2. 项目简要介绍

本项目是2024立创ESP32物联网征集令设计大赛参赛作品:一款基于ESP32的写字机器人,它能在各种纸质介质上进行文字、图表和手绘创作。通过集成友好的Web前端界面,用户可以在多种设备上(如PC、手机和平板电脑)进行实时预览和指令控制。

项目实际图:

写字机器人侧视图2.png

写字机器人侧视图.png

写字机器人俯视图.png
控制界面:

前端页面.png

2.1 创新点:超低成本

与传统的写字机器人相比,本项目采用了全网独有的创新方案,网上没有任何的现成资料可供参考。其创新性主要体现在以下方面:

  • 成本优化:摒弃传统的伺服和步进系统,大胆的采用更经济的直流电机,大幅降低了整体成本。使用PID算法+高精度、无接触式的MT6701磁编码器来弥补传统直流电机的精度缺陷。
  • 机械设计:采用廉价的抽屉导轨(一根只要2块钱,而专业导轨动辄上百)代替昂贵的专业导轨,进一步削减成本,同时也尽可能保证机器人的稳定性和可靠性。

MT6701介绍图.png

2.2 项目功能

该设计集成了两个普通的直流电机以及一个用于抬笔和落笔的专用电机。利用低功耗蓝牙(BLE)通信技术,实现了高效的文字、图表和手绘创作。此外,友好的Web前端界面让实时预览和指令控制变得简单直观。

2.3 项目参数

  • 主控芯片:采用ESP32,双核32位CPU,内建蓝牙模块,支持两个物理按键操作。
  • 电机控制:采用MT6701磁编码器进行非接触式测量,结合PID闭环控制算法,实现X轴和Y轴电机的精确移动,确保书写过程中的高度准确性。
  • 笔控机构:采用MG995舵机控制笔的抬起和落下动作。
  • 电机驱动:使用L298N全桥驱动芯片驱动两个普通直流电机,分别负责X轴和Y轴的运动。
  • 电源管理:采用贝岭的DCDC降压方案,搭配3.3V超低压降LDO,实现12V、5V和3.3V电源域的有效分割。
  • 电源监控:基于ADC实现智能电源管理。
  • 开发环境:采用ESP-IDF v5,所有代码用C++11编写,严格遵循OOP编程规范,对于官方的c语言API进行了对象化的封装,易于维护和扩展,降低开发者的心智负担。
  • 蓝牙库:采用nimble实现上位机与下位机之间的蓝牙通信。
  • 前端技术栈:采用现代化、工程化的前端技术栈,Vue + Ant Design + TypeScript + Vite构建现代化Web前端界面,提供跨平台支持和优秀的用户体验。

3. 原理详细解析(硬件部分)

本项目硬件部分由以下几个部分组成:电源部分、电机驱动部分、主控部分、磁编码器部分、机械导轨部分。

全板的PCB Layout如下:

全板的原理图如下:

SCH_Schematic2_1-P1_2024-08-28 (1).png

组装实物图:

PCB实物图1.png

PCB实物图2.png

3.1 电源部分

电源部分PCB Layout如下,需要注意DCDC电路的SW导线应该尽量粗而短,并对feedback进行包地,以减小纹波。

写字机器人PCB电源部分.png

写字机器人供电原理图.png

按照电源电流流向逐步讲解这个供电电路:

电源输入

  1. 电源输入:电源从“电源输入”部分的“DC01”和“DC05”输入,经过“DC01”和“DC05”连接到“VCC12V”和“GND_IN”。
  2. 防反接:电源输入后,流过一个N-MOS管进行防反接处理,确保电源的正负极正确连接。

DC-DC 12V→5V

  1. DC-DC转换器:12V电源通过贝岭的DCDC方案(BL8033CB6TR)进行DC-DC转换,将12V转换为5V。
  2. 稳压管:通过两个齐纳二极管“ZD1”(1N4734A)以及1N4729A进行5V和3.3V输出的稳压,确保后级负载的安全性。
  3. 电源开关:“SW6”(FS-5850A-6PL)负责控制DCDC模块的启停。

3V3 线性稳压器

  1. 线性稳压器:电源经过buck电路降压处理后,通过“U1”(HT7833)进行线性稳压,将5V电源稳压为3.3V。
  2. 稳压与滤波电容:稳压后的3.3V电源通过钽电容“C1”和电解电容“C32”进行滤波和稳压,确保输出电压的稳定性,提升电源模块的动态响应性能。

供电电压检测

  1. 电压检测:5V电源通过“R21”和“R22”进行分压,将电源电压降为1/10,并通过滤波电容,连接到ESP32的ADC输入端,用于检测供电电压。

USB接口

  1. USB接口:电路中有一个TYPE-C-6P接口“USB1”,用于特殊状态下的5V供电,不可传输数据。

3.2 电机驱动部分

写字机器人电机驱动.png

写字机器人电机驱动PCB.png

采用L298N全桥驱动芯片,将两个普通直流电机驱动,分别负责X轴和Y轴的运动。

这是一个四路L298N H桥驱动电路的设计图,以下是该电路的主要组成部分和设计说明。电路中使用了两个L298N芯片(U24和U25),每个芯片可以驱动两路电机。L298N芯片的引脚功能如下:

  • IN1-IN4: 输入信号,用于控制电机的正反转。
  • OUT1-OUT4: 输出信号,连接到电机的两端。
  • EN1/EN2: 使能信号,输入PWM波。
  • VS: 电源电压输入,为5V。
  • VCC: 电机电源电压输入,为12V。
  • GND: 地线。
  • VCC5V: 5V电源,用于L298N芯片的逻辑部分。
  • VCC12V: 12V电源,用于电机的驱动部分。
  • C16, C18, C17: 电容,用于滤波和稳定电源电压。

每个电机输出端(OUT1-OUT8)都连接了一个二极管(D3-D18),这些二极管用于保护L298N芯片免受电机反电动势的影响。当电机突然停止或反向时,会产生反电动势,这些二极管可以吸收这部分能量,保护芯片。

电路中使用了多个接线端子(P3-P6, P7),用于连接外部电源和电机。每个接线端子都有两个引脚,分别连接到L298N芯片的输出端和地线。

  • C26, C25: 0.1uF电容,用于滤波和稳定5V电源。
  • C14, C18, C17: 220uF电容,用于滤波和稳定12V电源。

3.3 主控部分

写字机器人控制部分PCB.png

写字机器人控制部分.png

  1. ESP32核心电路

    • ESP32芯片(ESP32-WROOM-32E)是电路的核心,提供了多种接口和功能。
    • 电源部分包括VCC3V3和VCC_ADC,通过电容C6、C13和C7进行滤波。
    • 控制信号(如EN、SD_CS、SD_SCLK、SD_MISO、SD_MOSI等)连接到ESP32的相应引脚。
  2. 单点接地EMI隔离

    • 通过电阻R31和R32进行EMI隔离,确保电路的稳定性。
  3. TF卡槽

    • TF卡槽通过SD_CS、SD_SCLK、SD_MISO、SD_MOSI等信号线连接到ESP32,实现数据传输。
  4. LED指示灯

    • 通过电阻R30、R7、R8、R39、R40等控制LED灯的亮灭,指示电路的工作状态。
  5. 下载/复位

    • 通过开关SW3和SW4进行下载和复位操作,确保电路的正常启动和调试。
  6. 下载PIN

    • 通过电阻和电容网络连接到ESP32的GPIO引脚,用于下载和调试。

3.4 磁编码器部分

3.4.1 MT6701磁编码器简介

MT6701磁编码器是一种非接触式的位置传感器,它通过检测磁场的变化来确定旋转角度或直线位置。这种类型的编码器具有高分辨率、长寿命和较强的抗干扰能力,非常适合用于需要高精度定位的应用场景。

MT6701介绍图.png

MT6701介绍图2.png

3.4.2 工作原理

  1. 磁场检测

    • MT6701内部包含一组磁敏感元件(是霍尔效应传感器),它们被布置在一个圆形路径上,以检测由磁铁产生的磁场变化。
    • 当磁铁相对于编码器旋转时,磁敏感元件会检测到磁场强度的变化,并将这些变化转换为电信号输出。
  2. 信号处理

    • 输出的电信号会被内部电路处理,转换为数字信号。
    • 这些数字信号代表了磁铁相对于编码器的角度位置。
  3. 接口输出

    • MT6701提供SPI和I2C接口来与微控制器通信。
    • 通过读取I2C数据,主控芯片(ESP32)可以得到精确的角度位置信息。

3.4.3 硬件实现

MT6701安装图.png

  1. 连接方式

    • MT6701遵循标准I2C接口,具备VCC、GND、SCL、SDA四个引脚。
    • 将这些引脚通过杜邦线连接至ESP32的I2C总线上。
  2. 安装结构

    • 磁铁固定于电机轴端,随着电机旋转。
    • 编码器固定于PCB基座上,保持相对静止。
    • 确保磁铁与编码器之间的距离适当,避免过近导致磁铁与编码器碰撞,同时也要避免过远导致检测不到磁场。

3.5 机械导轨部分

导轨结构图.png

连接性PCB.webp

写字机器人俯视图.png

4 原理详细解析(软件部分)

4.1 软件仓库

github项目地址(下位机 ESP32):https://github.com/g122622/3-DIM-Motion-Platform-ESP32

github项目地址(上位机 Web界面):https://github.com/g122622/3-DIM-Motion-Platform

5 遇到的一些问题记录

5.1 蓝牙GATT MTU大小问题

我发现在传送G代码指令的时候,有时候会出现连接断开的情况。这时控制台的显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
I (339087) NimBLE: subscribe event; conn_handle=0 attr_handle=8 reason=2 prevn=0 curn=0 previ=1 curi=0

I (339087) NimBLE: disconnect; reason=531
I (339087) NimBLE: handle=0 our_ota_addr_type=0 our_ota_addr=
I (339097) NimBLE: c8:2e:18:51:f3:e6
I (339107) NimBLE: our_id_addr_type=0 our_id_addr=
I (339107) NimBLE: c8:2e:18:51:f3:e6
I (339117) NimBLE: peer_ota_addr_type=0 peer_ota_addr=
I (339117) NimBLE: f8:34:41:e5:d3:fe
I (339127) NimBLE: peer_id_addr_type=0 peer_id_addr=
I (339127) NimBLE: f8:34:41:e5:d3:fe
I (339137) NimBLE: conn_itvl=48 conn_latency=0 supervision_timeout=960 encrypted=0 authenticated=0 bonded=0

I (339147) NimBLE:

I (339147) NimBLE: GAP procedure initiated: advertise;
I (339147) NimBLE: disc_mode=2
I (339157) NimBLE: adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0
I (339167) NimBLE:

I (339577) NimBLE: connection established; status=0
I (339577) NimBLE: handle=0 our_ota_addr_type=0 our_ota_addr=
I (339577) NimBLE: c8:2e:18:51:f3:e6
I (339577) NimBLE: our_id_addr_type=0 our_id_addr=
I (339587) NimBLE: c8:2e:18:51:f3:e6
I (339587) NimBLE: peer_ota_addr_type=0 peer_ota_addr=
I (339587) NimBLE: peer_ota_addr_type=0 peer_ota_addr=
I (339597) NimBLE: f8:34:41:e5:d3:fe
I (339587) NimBLE: peer_ota_addr_type=0 peer_ota_addr=
I (339597) NimBLE: f8:34:41:e5:d3:fe
I (339597) NimBLE: peer_id_addr_type=0 peer_id_addr=
I (339607) NimBLE: f8:34:41:e5:d3:fe
I (339607) NimBLE: conn_itvl=48 conn_latency=0 supervision_timeout=960 encrypted=0 authenticated=0 bonded=0

I (339617) NimBLE:

I (339687) NimBLE: mtu update event; conn_handle=0 cid=4 mtu=256

经排查发现是GATT数据包超过MTU大小,导致连接稳定性下降,进而容易出现master设备断连的情况。所以我缩减了G代码指令的长度和batch大小,顺利解决了这个问题。