2026 M-Design设计竞赛——四自由度桌面机械臂控制系统
该项目使用了ESP32-S3 单片机、4 路 MG995 舵机、双摇杆电位器、真空吸盘及 1.69 寸彩屏,实现了四自由度桌面机械臂控制系统的设计,它的主要功能为:双摇杆控制机械臂旋转、大臂 / 小臂抬降及末端关节动作,配合吸盘实现物品抓取与放置。
标签
嵌入式系统
ADC
如风
更新2026-06-09
11

四自由度机械臂控制系统 项目总结报告

参赛方向:工业控制(电机控制 / 工业控制器)
核心:ESP32-S3 驱动 4 个 MG995 舵机,双摇杆控制带吸盘的桌面机械臂


一、项目介绍 & 创意介绍

项目介绍

本项目基于 ESP32-S3 单片机,设计一款四自由度桌面机械臂控制系统。系统搭载 4 个 MG995 金属齿轮舵机,分别控制底座旋转、大臂抬降、小臂抬降及末端关节动作,末端配备真空吸盘,可实现小型物品的抓取与搬运。系统通过双摇杆电位器实现手动控制,1.69 寸彩屏实时显示舵机状态与控制参数,是工业搬运机械臂的小型验证平台。

创意介绍

  1. 采用四自由度舵机驱动,还原工业机械臂基础运动逻辑;
  2. 双摇杆控制方案,操作直观,可精准控制每个关节的运动;
  3. 末端真空吸盘实现抓取功能,具备实际搬运应用价值;
  4. 彩屏实时反馈系统状态,提升人机交互体验。

二、使用到的硬件介绍

  1. 主控:ESP32-S3 开发板
  2. 动力单元:4 个 MG995 金属齿轮舵机(底座旋转、大臂、小臂、末端关节)
  3. 控制单元:双摇杆电位器(X/Y 轴模拟量输入)
  4. 执行单元:真空吸盘组件
  5. 显示单元:1.69 寸 24 位彩色 TFT 屏幕
  6. 供电与结构:舵机电源模块、机械臂支架

三、方案框图和项目设计思路介绍

方案框图

image.png

设计思路

  1. 硬件:ESP32-S3 读取双摇杆电位器的模拟量,输出 PWM 信号控制舵机角度;
  2. 控制逻辑:左摇杆控制底座旋转 + 大臂抬降,右摇杆控制小臂抬降 + 末端关节动作;
  3. 反馈:彩屏实时显示各舵机角度、控制指令与系统状态;
  4. 功能:通过摇杆控制机械臂运动,配合吸盘实现物品抓取与放置。

四、原理图和 PCB 介绍

本项目基于 ESP32-S3 主控平台,采用了完整的原理图设计与模块化 PCB 实现,电路设计如下:

  1. 主控与电源部分
    • 采用 ESP32-S3 单片机作为控制核心,集成 USB 供电与外部 5V 双路供电接口,保证系统稳定运行。
    • 板载多路电源滤波电容,分别为 3.3V 与 5V 电源网络进行去耦处理,抑制纹波,提升系统抗干扰能力。
    • 外设接口预留了完整的电源网络,为舵机、屏幕、按键等模块提供稳定供电。
  2. 信号采集部分
    • 为双摇杆电位器设计了 ADC 信号调理电路,通过 RC 滤波网络对四路模拟输入进行滤波处理,减少干扰,保证摇杆控制的稳定性。
    • 预留了多路 ADC 通道接口,可直接连接电位器信号,实现模拟量采集。
  3. 驱动与接口部分
    • 引出了 四路 PWM 舵机控制接口,可同时驱动 4 路 MG995 舵机,为机械臂四自由度控制提供信号输出。
    • 预留了 TFT 彩屏、蓝牙模块、I2C 传感器等外设接口,通过排针形式引出,方便模块化扩展与调试。
    • 板载独立按键电路,可直接连接按键模块,实现吸盘控制、模式切换等功能。
  4. 结构与布局
    • PCB 采用分区域布局,将主控、电源、信号接口分区布置,走线清晰规范,避免信号串扰。
    • 所有外设均通过标准排针引出,既支持模块化接线,也便于后期功能扩展与故障检修。

image.png


五、软件流程图和关键代码介绍

1. 软件整体流程图

image.png

关键代码说明

(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 ()

这是机械臂的核心控制函数

  1. 读取四路 ADC 值
  2. 减去中位偏移量,实现摇杆回中归零
  3. 设置 ±10 死区,防止摇杆漂移导致舵机抖动
  4. 根据摇杆方向,递增 / 递减舵机角度
  5. 加入角度限幅保护,防止舵机过载
  6. 调用 mg995_single() 驱动对应舵机
  7. 在 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 值
  • 系统运行状态

让操作者直观看到机械臂当前姿态。

image.png


六、功能展示及实物说明

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

image.png

image.png

image.png


七、设计中遇到的难题和解决方法

  1. 问题:舵机抖动、角度控制不稳定
    解决:优化 PWM 输出时序,增加软件滤波处理 ADC 数据,避免摇杆信号波动导致的舵机抖动。
  2. 问题:机械臂运动卡顿、关节动作不协调
    解决:调整控制逻辑的角度变化步长,优化舵机运动速度,使动作更平滑。
  3. 问题:吸盘吸力不足,无法稳定抓取物品
    解决:优化吸盘安装角度,调整机械臂末端姿态,确保吸盘与物品贴合紧密。

八、对本次竞赛的心得体会

通过本次竞赛,我掌握了 ESP32-S3 的 ADC 读取、PWM 舵机控制、多自由度机械臂控制逻辑及人机交互设计。项目从硬件搭建到软件调试,完整还原了工业搬运机械臂的基础功能,让我理解了工业控制中多轴协同控制的核心逻辑。感谢大赛提供实践平台,后续可拓展电控吸盘、自动轨迹规划、蓝牙远程控制等功能,进一步提升项目的实用性与创新性。

软硬件
电路图
附件下载
ProPrj_机械臂_2026-05-25.epro2
嘉立创电路板
机械臂.zip
代码
团队介绍
我们是一支专注于嵌入式系统开发与硬件创新的专业队伍,在单片机应用、PCB 设计、数字信号处理等领域。以 NS800RT5095 esp32 stm32 芯片为核心,成功完成自主开发板设计及多任务功能实现,涵盖高频 PWM 控制、高精度 ADC 采集、音频频谱分析等方向,具备从硬件设计到软件调试的全流程落地能力,致力于在工业控制与消费电子领域探索芯片应用新场景。
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号