内容介绍
内容介绍
四自由度机械臂控制系统 项目总结报告
参赛方向:工业控制(电机控制 / 工业控制器)
核心:ESP32-S3 驱动 4 个 MG995 舵机,双摇杆控制带吸盘的桌面机械臂
一、项目介绍 & 创意介绍
项目介绍
本项目基于 ESP32-S3 单片机,设计一款四自由度桌面机械臂控制系统。系统搭载 4 个 MG995 金属齿轮舵机,分别控制底座旋转、大臂抬降、小臂抬降及末端关节动作,末端配备真空吸盘,可实现小型物品的抓取与搬运。系统通过双摇杆电位器实现手动控制,1.69 寸彩屏实时显示舵机状态与控制参数,是工业搬运机械臂的小型验证平台。
创意介绍
- 采用四自由度舵机驱动,还原工业机械臂基础运动逻辑;
- 双摇杆控制方案,操作直观,可精准控制每个关节的运动;
- 末端真空吸盘实现抓取功能,具备实际搬运应用价值;
- 彩屏实时反馈系统状态,提升人机交互体验。
二、使用到的硬件介绍
- 主控:ESP32-S3 开发板
- 动力单元:4 个 MG995 金属齿轮舵机(底座旋转、大臂、小臂、末端关节)
- 控制单元:双摇杆电位器(X/Y 轴模拟量输入)
- 执行单元:真空吸盘组件
- 显示单元:1.69 寸 24 位彩色 TFT 屏幕
- 供电与结构:舵机电源模块、机械臂支架
三、方案框图和项目设计思路介绍
方案框图

设计思路
- 硬件:ESP32-S3 读取双摇杆电位器的模拟量,输出 PWM 信号控制舵机角度;
- 控制逻辑:左摇杆控制底座旋转 + 大臂抬降,右摇杆控制小臂抬降 + 末端关节动作;
- 反馈:彩屏实时显示各舵机角度、控制指令与系统状态;
- 功能:通过摇杆控制机械臂运动,配合吸盘实现物品抓取与放置。
四、原理图和 PCB 介绍
本项目基于 ESP32-S3 主控平台,采用了完整的原理图设计与模块化 PCB 实现,电路设计如下:
- 主控与电源部分
- 采用 ESP32-S3 单片机作为控制核心,集成 USB 供电与外部 5V 双路供电接口,保证系统稳定运行。
- 板载多路电源滤波电容,分别为 3.3V 与 5V 电源网络进行去耦处理,抑制纹波,提升系统抗干扰能力。
- 外设接口预留了完整的电源网络,为舵机、屏幕、按键等模块提供稳定供电。
- 信号采集部分
- 为双摇杆电位器设计了 ADC 信号调理电路,通过 RC 滤波网络对四路模拟输入进行滤波处理,减少干扰,保证摇杆控制的稳定性。
- 预留了多路 ADC 通道接口,可直接连接电位器信号,实现模拟量采集。
- 驱动与接口部分
- 引出了 四路 PWM 舵机控制接口,可同时驱动 4 路 MG995 舵机,为机械臂四自由度控制提供信号输出。
- 预留了 TFT 彩屏、蓝牙模块、I2C 传感器等外设接口,通过排针形式引出,方便模块化扩展与调试。
- 板载独立按键电路,可直接连接按键模块,实现吸盘控制、模式切换等功能。
- 结构与布局
- PCB 采用分区域布局,将主控、电源、信号接口分区布置,走线清晰规范,避免信号串扰。
- 所有外设均通过标准排针引出,既支持模块化接线,也便于后期功能扩展与故障检修。


五、软件流程图和关键代码介绍
1. 软件整体流程图

关键代码说明
(1)主程序入口 app_main ()
主程序先调用 my_app_main_init() 完成所有外设初始化,然后进入死循环。
循环内依次执行:
- 按键处理(吸盘开关、屏幕切换)
- 摇杆读取与舵机控制
- 短延时保证系统稳定
plaintext
void app_main(void)
{
my_app_main_init();
while (1)
{
key_xp();
motor_test();
vTaskDelay(pdMS_TO_TICKS(10));
}
}
(2)系统初始化 my_app_main_init ()
完成以下硬件初始化:
- TFTLCD 彩屏初始化并清屏
- ADC 四路摇杆初始化
- MG995 四路舵机初始化
- 吸盘 GPIO 初始化
- 按键及定时器初始化
- 舵机复位到初始姿态
这是系统正常运行的基础。
void my_app_main_init(void)
{
TFTLCD_Init();
TFTLCD_Fill(0,0,TFTLCD_W,TFTLCD_H,WHITE);
TFTLCD_Fill(0,0,TFTLCD_W,TFTLCD_H,WHITE);
if (adc_init() != 0)
{
printf("ADC initialization failed!\n");
return;
}
mg995_init_all();
absorb_gpio_init();
key_gpio_init();
key_timer_init();
motor_rest();
TFTLCD_ShowString(50,50,GREEN,WHITE,"jnkcsdazc");
}
(3)ADC 读取模块 my_adc.c
通过 ESP32-S3 的 ADC1 读取四路摇杆电位器值:
- GPIO2、GPIO4、GPIO5、GPIO6 对应四路摇杆
- 使用 12 位精度、11dB 衰减,支持 0~3.6V 输入
- 支持软件校准,提高读取稳定性
- 提供
adc_print_all()统一读取四通道值并保存到全局变量
代码通过 raw_adc0 ~ raw_adc3 传递摇杆值给控制函数。
int adc_read_raw(int gpio_num, int *raw_value) {
if (adc_handle == NULL) {
printf("ADC not initialized, call adc_init first\n");
return -1;
}
adc_channel_t ch;
if (!get_adc_channel(gpio_num, &ch)) {
printf("Invalid GPIO %d (supported: 1,2,4,5)\n", gpio_num);
return -1;
}
int raw = 0;
esp_err_t ret = adc_oneshot_read(adc_handle, ch, &raw);
if (ret != ESP_OK) {
printf("ADC read failed on GPIO%d: %s\n", gpio_num, esp_err_to_name(ret));
return -1;
}
*raw_value = raw;
return 0;
}
// 读取并打印所有通道的ADC数值
void adc_print_all(void) {
int raw = 0;
adc_read_raw(2, &raw);
//printf("GPIO 2: raw = %4d\n", raw);
raw_adc0=raw;
adc_read_raw(4, &raw);
//printf("GPIO 4: raw = %4d\n", raw);
raw_adc1=raw;
adc_read_raw(5, &raw);
//printf("GPIO 5: raw = %4d\n", raw);
raw_adc2=raw;
adc_read_raw(6, &raw);
//printf("GPIO 6: raw = %4d\n", raw);
raw_adc3=raw;
//printf("--------------------\n");
}
(4)舵机控制核心 motor_test ()
这是机械臂的核心控制函数:
- 读取四路 ADC 值
- 减去中位偏移量,实现摇杆回中归零
- 设置 ±10 死区,防止摇杆漂移导致舵机抖动
- 根据摇杆方向,递增 / 递减舵机角度
- 加入角度限幅保护,防止舵机过载
- 调用
mg995_single()驱动对应舵机 - 在 TFTLCD 上实时显示角度信息
控制逻辑:
raw_adc0→ 底座旋转舵机(通道 3)raw_adc1→ 大臂舵机(通道 0)raw_adc2→ 小臂舵机(通道 1)raw_adc3→ 末端关节舵机(通道 2)
void motor_test(void)
{
int16_t xxxx=0;
adc_print_all(); //读取电位器的adc值
raw_adc0-=1946;
raw_adc1-=1963;
raw_adc2-=1879;
raw_adc3-=1930;
if(raw_adc0>10||raw_adc0<-10)
{
xxxx=x0;
x0+=raw_adc0/50;
if(x0>240&&x0<950)
{
mg995_single(3,x0);
if(!tp_xs)
{
sprintf(shuzhu,"x:%d,a:%d ",x0,raw_adc0);
TFTLCD_ShowString(50,130,GREEN,WHITE,shuzhu);
}
}
else
{
x0=xxxx;
}
}
if(raw_adc1>10||raw_adc1<-10)
{
xxxx=x1;
x1-=raw_adc1/50;
if(x1>200&&x1<1020)
{
mg995_single(0,x1);
if(!tp_xs)
{
sprintf(shuzhu,"x:%d,a:%d ",x1,raw_adc1);
TFTLCD_ShowString(50,70,GREEN,WHITE,shuzhu);
}
}
else
{
x1=xxxx;
}
}
if(raw_adc2>10||raw_adc2<-10)
{
xxxx=x2;
x2+=raw_adc2/50;
if(x2>230&&x2<800)
{
mg995_single(1,x2);
if(!tp_xs)
{
sprintf(shuzhu,"x:%d,a:%d ",x2,raw_adc2);
TFTLCD_ShowString(50,90,GREEN,WHITE,shuzhu);
}
}
else
{
x2=xxxx;
}
}
if(raw_adc3>10||raw_adc3<-10)
{
xxxx=x3;
x3+=raw_adc3/50;
if(x3>200&&x3<1011)
{
mg995_single(2,x3);
if(!tp_xs)
{
sprintf(shuzhu,"x:%d,a:%d ",x3,raw_adc3);
TFTLCD_ShowString(50,110,GREEN,WHITE,shuzhu);
}
}
else
{
x3=xxxx;
}
}
}
(5)按键控制 key_xp ()
实现两个功能按键:
- KEY4:切换吸盘吸合 / 断开
- KEY3:切换 TFTLCD 显示模式(数据界面 / 图片界面)
通过标志位控制吸盘使能,并切换屏幕显示内容。
(6)TFTLCD 实时显示
屏幕实时刷新:
- 各关节舵机占空比
- 摇杆原始 ADC 值
- 系统运行状态
让操作者直观看到机械臂当前姿态。

六、功能展示及实物说明
- 双摇杆控制:左侧摇杆控制底座旋转与大臂运动,右侧摇杆控制小臂与末端关节运动。
- 四路 MG995 舵机:分别控制旋转、大臂、小臂、末端执行器,实现四自由度运动。
- 末端吸盘:按键控制吸合与释放,可完成小型物品抓取与搬运。
- 舵机角度保护:软件设置角度范围,防止机械臂超程损坏。
- 摇杆死区与滤波:避免漂移,控制更稳定、精准。



七、设计中遇到的难题和解决方法
- 问题:舵机抖动、角度控制不稳定
解决:优化 PWM 输出时序,增加软件滤波处理 ADC 数据,避免摇杆信号波动导致的舵机抖动。 - 问题:机械臂运动卡顿、关节动作不协调
解决:调整控制逻辑的角度变化步长,优化舵机运动速度,使动作更平滑。 - 问题:吸盘吸力不足,无法稳定抓取物品
解决:优化吸盘安装角度,调整机械臂末端姿态,确保吸盘与物品贴合紧密。
八、对本次竞赛的心得体会
通过本次竞赛,我掌握了 ESP32-S3 的 ADC 读取、PWM 舵机控制、多自由度机械臂控制逻辑及人机交互设计。项目从硬件搭建到软件调试,完整还原了工业搬运机械臂的基础功能,让我理解了工业控制中多轴协同控制的核心逻辑。感谢大赛提供实践平台,后续可拓展电控吸盘、自动轨迹规划、蓝牙远程控制等功能,进一步提升项目的实用性与创新性。
软硬件
电路图
附件下载
ProPrj_机械臂_2026-05-25.epro2
嘉立创电路板
机械臂.zip
代码
团队介绍
我们是一支专注于嵌入式系统开发与硬件创新的专业队伍,在单片机应用、PCB 设计、数字信号处理等领域。以 NS800RT5095 esp32 stm32 芯片为核心,成功完成自主开发板设计及多任务功能实现,涵盖高频 PWM 控制、高精度 ADC 采集、音频频谱分析等方向,具备从硬件设计到软件调试的全流程落地能力,致力于在工业控制与消费电子领域探索芯片应用新场景。
评论
0 / 100
查看更多
猜你喜欢
制作FPGA电子琴1. 存储一段音乐,并可以进行音乐播放,
2. 可以自己通过板上的按键进行弹奏,支持两个按键同时按下(和弦)并且声音不能失真,板上的按键只有13个,可以通过有上方的“上“、”下”两个按键对音程进行扩展
john
2589
FastBond4挑战部分-基于GD32F310K8U6设计的机械臂控制系统该项目使用了GD32F310K8U6、CH340N,实现了机械臂控制板的设计,它的主要功能为:基于PWM控制4路舵机,并利用本地电脑部署的AI模型使机械臂能够通过自然语言指令进行控制。
fyjh2023
88
2026 M-Design设计竞赛 - 基于GD32嵌入式终端与Genesis具身智能仿真平台实现全链路机械臂仿真控制系统该项目使用了GD32嵌入式终端与Genesis具身智能仿真平台,实现了机械臂仿真控制系统的设计,它的主要功能为:构建了一套"嵌入式人机交互终端—跨平台协议转换—物理仿真执行"的三层架构机械臂仿真控制系统。
fyjh2023
22