
六自由度机械臂做到第二期重点就不是“转不转得动”了而是“能不能按你的动作干活”。这篇教程的主角是一台基于 STM32F103 单片机的小型六轴机械臂核心玩法是拖动示教和轨迹复现你可以用手把机械臂摆成想要的姿态让单片机把这段轨迹记下来然后机械臂自己把动作重复出来。这个思路非常接近工业现场里的示教编程但门槛低得多用一块 STM32F103 加几个舵机就能跑。做这类 DIY 机械臂大家关心的通常不是控制理论有多深而是三件事第一硬件怎么装、线怎么接第二拖动示教到底怎么实现是硬拖还是用传感器读角度第三轨迹记录与复现怎么做停电能不掉、回放顺不顺。这篇文章会把这几条主线拆开讲包括 STM32F103 的 PWM 输出、串口调试、角度采样、轨迹存储和复现流程也会给出一套面向初学者的排错思路。如果你想拿单片机做毕业设计或者想理解机械臂最核心的“示教-回放”闭环这篇文章可以直接当操作笔记看。需要先说明的是机械臂的具体结构件、舵机型号和驱动板不是每家都一样文中涉及接线和代码的地方会给通用思路和模板实际使用时请以你手上的材料包和电路原理图为准。下面进入正式内容。1. 核心能力速览项目能力说明机械臂结构六自由度关节型机械臂适合完成简单空间轨迹复现主控芯片STM32F103 系列单片机Cortex-M3 内核72MHz 主频核心功能拖动示教、轨迹记录、自动复现示教方式手动拖动关节或使用电位器/编码器采集角度记录后回放执行机构常见 PWM 舵机或总线舵机具体以材料包为准需要外设多路 PWM 输出、ADC 模拟量采集、串口、按键/拨码开关启动方式上电自检后进入待机通过按键切换“示教/记录/复现”模式是否支持批量任务常规固件以单条轨迹为主可扩展多段轨迹存储是否支持接口 API通过串口可与上位机通信适合二次开发典型应用场景单片机课程设计、机械臂入门、示教复现演示、小型自动化测试这里最值得关注的功能就是“拖动示教”。它把复杂的轨迹规划问题简化成了“把动作录下来再播出去”。对于 STM32F103 这种 MCU 来说不需要跑什么逆解算法只要处理好角度采样、时间序列存储和 PWM 输出就能实现一台低成本机械臂的示教复现。2. 适用场景与使用边界这类 STM32F103 六轴机械臂适合的人群很明确学过单片机基础、想接触机械臂控制、需要做课设或毕业设计的人。它能帮你理解几个工程问题多路舵机怎么同时控制、关节角度怎么测量、非实时系统和实时系统在轨迹复现上的差异、夹爪和关节的运动顺序怎么编排。但它也有很明显的能力边界。第一如果你要求机械臂进行复杂路径规划比如在三维空间里避障、自动插补直线和圆弧STM32F103 裸机方案会非常吃力应该优先考虑 ROS 配合上位机或者用带 FPU 和更多资源的芯片。第二低成本 PWM 舵机的精度通常有限回放时会出现微小抖动不能和工业伺服机械臂比重复定位精度。第三拖动示教依赖角度反馈传感器如果你的机械臂只是由普通 PWM 舵机组成且没有安装任何位置反馈直接“拖”舵机轴并不能让单片机读到角度这一点必须提前搞清楚。使用边界方面还要提醒合规问题如果机械臂上安装了夹爪、摄像头或其他执行器请确保操作对象是合法测试物料不要用来夹取或搬运任何可能造成人身伤害、财产损失的物品如果后续把拖动示教技术用于仿生动作采集、远程操作等场景要确认使用对象已获得合法授权避免采集到他人肖像、隐私信息或受版权保护的运动内容。整个项目应在安全的桌面环境下进行测试机械臂运动速度不宜过高。3. STM32F103 机械臂硬件组成与选型思路六自由度机械臂听起来复杂拆开看就是六个关节电机加上底座和臂杆。对 STM32F103 而言硬件设计最需要考虑的是三个部分主控板、舵机驱动、角度反馈。主控板可以直接用 STM32F103 最小系统板也可以用集成度更高的开发板。关键不是板子本身而是需要引出足够的定时器通道和 ADC 引脚。以常见的 STM32F103C8T6 为例它有三个通用定时器 TIM2、TIM3、TIM4每个定时器有 4 个通道理论上最多可以输出 12 路 PWM覆盖六个自由度没有问题。需要注意的是如果六路舵机都是 PWM 舵机每个舵机都需要独立的信号引脚并且要求 50Hz 左右的更新频率配置时要保证同一组关节的 PWM 周期一致。舵机选择上有两条路线第一种是普通 PWM 舵机。它价格低、资料多适合入门控制方式简单给一个 20ms 周期的脉冲信号高电平宽度从 0.5ms 到 2.5ms 对应不同转角。但普通的模拟舵机或低端数字舵机没有角度反馈堵转时电流大长期使用容易发热机械臂六个关节同时受力时如果电源跟不上还会造成单片机复位。第二种是串行总线舵机。总线舵机内部集成了驱动、控制、反馈电路可以返回当前位置、温度和电压也能通过总线协议控制多台舵机只需要一根信号线连成菊花链布线比 PWM 舵机省非常多。总线舵机通常还支持“松脱”或“力矩模式”可以让关节在外力作用下被拖动同时通过总线把位置变化读回来这对拖动示教方案非常有利。如果你的材料包采用的是普通 PWM 舵机那么实现拖动示教需要额外安装角度传感器常见方案包括在每个关节处安装电位器或磁编码器把机械角度转换为电压信号再送入 STM32F103 的 ADC 引脚。除了电机和控制信号机械臂还需要一块可靠的电源。STM32F103 的逻辑部分可以用 USB 或 3.3V LDO 供电但六个舵机千万不要全部从单片机的 5V 引脚取电。一个标准做法是使用独立的 5V/6V 舵机电源比如 2S 锂电池、带降压模块的外置电源或至少是额定电流充足的开关电源并且把舵机电源地和控制板地单点相连。舵机瞬时启动电流可能很高如果出现屏幕闪烁、舵机抽搐、单片机反复重启优先怀疑电源功率不足。4. 项目环境准备与开发工具链软件层面的环境准备相对标准。如果你从零开始写 STM32F103 机械臂固件推荐下面的工具组合代码生成工具STM32CubeMX用于初始化时钟、GPIO、定时器、ADC、串口。编译调试环境Keil MDK 或者 STM32CubeIDE两者都可以编译 STM32F103 工程。烧录方式ST-Link / J-Link 下载器或者使用串口 ISP 烧录。串口工具USB 转 TTL用于调试输出和上位机通信。上位机如果你希望把记录的轨迹导出到电脑分析可以用串口助手或自定义 Qt/Python 上位机。在使用 STM32CubeMX 做初始化时需要特别核对下面的几个配置点。时钟部分STM32F103 外部晶振通常为 8MHzPLL 倍频后系统时钟为 72MHzAPB1 外设时钟为 36MHzAPB2 外设时钟为 72MHz。定时器如使用内部时钟要确保舵机 PWM 的周期正确。PWM 全周期为 20ms 时如果定时器时钟是 72MHz预分频器和自动重装值的设置要满足PWM_Frequency Timer_Clock / ((PSC 1) * (ARR 1))要让 PWM_Frequency 接近 50Hz可以把 PSC 设为 71这样定时器计数频率为 1MHz再让 ARR 等于 19999就得到 20ms 周期。然后通过修改比较寄存器 CCR 的值输出不同脉宽。GPIO 部分每个舵机 PWM 输出引脚要配置为复用推挽输出ADC 角度采样引脚配置为模拟输入按键引脚配置为上拉输入或下拉输入根据硬件决定。串口部分建议预留一路 UART 作为调试口输出机械臂当前模式、关节角度和错误码。这样在拖动示教时你不用一直盯着物理臂的位置通过串口就能确认角度是否被读到。开发环境不复杂但第一次做的人经常忽略一件事下载器、串口模块和舵机电源的“地”必须共地。ST-Link 通过 SWD 接口下载如果下载器和目标板、舵机电源各用各的电源烧录和通信都可能失败。正确做法是把所有电源的负极接到同一个参考点。5. 安装组装与电气接线要点进入第二期教程机械结构通常已经基本成型这里重点讲电控这一侧的组装检查。接线前先画一张接线表把每个关节的 PWM 引脚、ADC 采样引脚、舵机电源正负极标清楚避免通电后把线插错。如果机械臂使用 6 个 PWM 舵机主控板和舵机之间需要传输 6 路信号线。STM32F103 的 GPIO 输出电压是 3.3V而部分舵机工作在 5V 或 6V 电压下对信号高电平的要求不完全一致。更稳妥的方案是使用电平转换模块或选择明确支持 3.3V 逻辑电平的舵机。如果你直接用 3.3V 单片机驱动 5V 舵机距离短、舵机少时常能工作但抗干扰能力差长线传输时可能出现抖动不建议在正式项目里长期这样接。ADC 角度反馈部分的接线要特别注意。常见电位器两端接电源和地中间抽头输出到 STM32F103 的 ADC 引脚。如果电位器供电是 3.3V抽头电压范围就是 0V 到 3.3V可以直接接 ADC如果供电是 5V抽头电压可能超过 STM32F103 的模拟输入上限必须串联分压电阻或使用电压跟随器把电压缩放到 3.3V 以内。很多 STM32F103 芯片的 GPIO 并不耐 5V不是“能插就能用”的。强电和弱电要分开布线。舵机的电源线比较粗如果与角度采样线、串口线绑在一起舵机转动时产生的大电流变化会干扰 ADC 采样值表现为拖动时角度数值跳变。建议舵机电源线和信号采样线分开走必要时在 ADC 引脚前加一个 100nF 电容滤波在软件里也可以做多次采样求平均。组装完成后先不要急着写复杂固件做一次“最小通电检查”只给主控板供电确认下载器能识别芯片再单独给一个舵机供电用一个简单的测试程序让舵机回中。确认单路舵机工作正常后再逐步扩展到六个自由度。这样可以大大降低排错难度。6. 拖动示教功能实现原理拖动示教在工业机器人里叫“直接示教”操作者抓住机械臂末端带着它走一遍期望路径机器人实时记录关节角度变化之后回放路径。这个功能落到 STM32F103 方案上核心不是“拖”这个动作而是“单片机怎么知道每个关节被拖到了哪里”。如果你的机械臂使用带位置反馈的总线舵机拖动示教会比较直接。让舵机进入松脱或力矩模式舵机输出轴可以被外力转动同时内部反馈角度不断改变主控通过总线周期读取每个舵机的角度就完成了关节角度采集。回放时把记录的角度写入舵机让它跟随目标位置即可。如果你的机械臂使用普通 PWM 舵机实现拖动示教要复杂一些常见做法是加装角度传感器。每个关节安装一个与舵机轴同步旋转的电位器舵机轴转动时电位器阻值变化输出电压也变化STM32F103 用 ADC 读取电压并换算为角度。拖动时舵机是否真的能被自由拖动取决于减速齿轮结构和舵机驱动器的状态。如果是未通电状态下硬掰很多舵机因为齿轮减速比大会很吃力甚至可能损坏齿轮。比较稳妥的做法是让舵机处于通电但处于“无力矩”状态或在机械结构上设计离合器让关节可以脱开驱动。动手前先看一下材料包里舵机的结构和安装方式。一个更容易实现的变通方案是“主从示教”另外搭建一台结构相同但关节数量相同的小型机械臂每个关节只装电位器不装舵机作为操作手柄。主臂和从臂的关节角度一一对应。用手摆动主臂STM32F103 采集主臂各关节角度换算后输出 PWM 控制从臂复现同样动作。这样既做到了“拖动示教”又避免了大扭矩舵机被反向硬拖的问题是目前 DIY 项目里比较推荐的做法。不管采用哪种方案拖动示教都需要定义好角度单位。你可以把每个关节的原始 ADC 值直接保存为 0 到 4095 的整数也可以先标定将 ADC 值转换为真实的物理角度。直接保存原始值实现简单后续如果想在回放路径中间插入插补或修改某个点就会比较麻烦转换为角度后再存储数据处理更友好。但对于一个以演示为主的六轴机械臂项目直接从 ADC 原始值起步没有太大问题。轨迹记录部分的核心是一个周期性采样任务。可以设置采样周期为 20ms 或 50ms也就是每 20ms 读一次六个关节的角度并把它们作为一组数据写入存储区。拖动得越快相邻两组数据之间的角度变化越大采样周期越短记录越细腻占用的存储空间也越多。建议用按键切换模式空闲状态按下“示教模式”按键后开始实时采样再按一次或等串口指令结束记录。6.1 角度采集标定在开始记录轨迹之前先做一些标定。把每个关节都手动转到机械零位记录下该位置的 ADC 读数再把关节转到最大角度位置记录另一个读数。这样就能计算出 ADC 读数与关节角度的线性关系。如果只是在关节范围内摆动也可以不做全范围标定直接按下式的比例映射angle (adc_value - adc_min) * angle_max / (adc_max - adc_min);实际标定时要注意电位器旋转范围小于 360 度安装位置必须和关节转轴机械限位对齐。装反了或没对准拖动时数据会到极限然后跳变导致复现轨迹错误。这里值得花时间多看几次串口输出的原始值。6.2 状态机设计拖动示教虽然功能不复杂但状态很清晰适合用一个简单状态机管理待机、示教记录中、回放中、暂停。不同状态对应不同按键功能避免用户误触。状态说明进入方式IDLE机械臂待机舵机保持零位或松脱上电默认TEACH正在读取关节角度并按周期存储空闲时按下示教按键PLAY按存储轨迹自动输出关节角度空闲或示教结束后按下回放按键HOLD停止在某个轨迹点不继续输出任意状态触发暂停状态机不需要跑操作系统在主循环里用一个 switch 结构就能完成。如果后续还要同时处理串口指令、按键扫描和舵机刷新才需要考虑定时器中断或者 FreeRTOS。7. 轨迹记录与复现的存储策略轨迹复现效果好不好很大程度上取决于记录的数据格式和回放方式。最简单的做法是把轨迹点按时间顺序存在一个数组里。每个轨迹点包含 6 个关节角度值如果角度用 uint16_t 表示一个点就是 12 字节。采样 500 个点需要 6000 字节这个容量对于 STM32F103 内部 RAM 来说偏大因为常见的 STM32F103C8T6 只有 20KB RAM如果数组开太大会影响运行稳定性。更稳妥的做法是把轨迹存入外部 Flash 芯片或者用串口发送到上位机保存。如果只是短时间演示在 RAM 中放一个几百点的环形缓冲区也够用但要注意数组越界。项目中如果有多段轨迹需求可以设计成下面这样的结构体#define JOINT_NUM 6 #define MAX_TRACK_POINTS 300 typedef struct { uint16_t joint_angle[JOINT_NUM]; } TrajectoryPoint; TrajectoryPoint g_track_buffer[MAX_TRACK_POINTS]; uint16_t g_track_len 0;记录轨迹时把实时采样到的点位写入 g_track_buffer[g_track_len]然后 g_track_len 自增。回放时用 for 循环按顺序取出每个轨迹点换算成 PWM 比较寄存器值并输出。这种直接回放方式有一个明显问题如果记录时拖动速度不稳定或者你只采样了 30 个点复现时机械臂的动作会一顿一顿不够平滑。解决办法是提高采样频率或者在回放时对相邻轨迹点做线性插值。例如记录周期是 50ms回放时细分为每 5ms 向前推进一个中间角度的 1/10这样机械臂运动更平顺。回放时也不能只输出角度就完事还要考虑舵机的物理响应速度。六个舵机从当前角度转到目标角度需要时间如果代码连续飞快地更新目标值舵机跟不上也会导致动作变形。在轨迹回放任务里加一个延时或者定时器等待让每个轨迹点之间有稳定的时间间隔是一个容易被忽视但非常重要的小细节。如果要做“断电保持轨迹”的版本可以把轨迹数据通过串口写到上位机保存或者接外部 SPI Flash。用内部 Flash 保存轨迹虽然可行但要处理擦写均衡和写入次数问题不建议作为主要方案。更简单的实用方案是在演示时把轨迹缓存到 RAM 中断电后重新录一遍即可对于学习演示项目已经足够。8. 固件开发框架与代码骨架下面给出一套固件逻辑骨架不依赖具体硬件库重点说明控制流程。如果你使用 STM32CubeMX HAL 库可以把对应部分替换成自己的外设句柄。8.1 主循环框架int main(void) { // 初始化时钟、GPIO、定时器PWM、ADC、串口 system_init(); // 使能六个舵机信号输出默认回中 servo_reset_all(); while (1) { key_scan(); switch (system_state) { case STATE_IDLE: // 舵机保持零位等待开始示教 break; case STATE_TEACH: // 读取6个ADC采样值换算角度写入轨迹缓冲 record_track_point(); delay_ms(20); break; case STATE_PLAY: // 根据当前轨迹点输出对应PWM脉宽 replay_track_point(); delay_ms(10); break; default: break; } } }8.2 PWM 舵机角度输出函数假设每个自由度对应一路定时器通道输入 0 到 180 的角度值输出对应占空比。以定时器周期 20ms、中心位置算法为例void servo_set_angle(TIM_HandleTypeDef *htim, uint32_t channel, float angle) { // 将0~180度映射到500us~2500us // 具体脉宽范围需要根据舵机手册和机械安装调整 float pulse_width_us 500.0f angle / 180.0f * 2000.0f; float compare pulse_width_us / 20000.0f * 20000.0f; __HAL_TIM_SET_COMPARE(htim, channel, (uint32_t)compare); }这段代码里的脉宽范围和定时器周期都是示意值。不同舵机的脉宽范围差异很大比如有些舵机是 500us 到 2500us有些是 1000us 到 2000us。务必对照舵机手册修改。8.3 轨迹记录与回放函数void record_track_point(void) { if (g_track_len MAX_TRACK_POINTS) { // 轨迹缓冲区已满停止记录 system_state STATE_IDLE; return; } TrajectoryPoint *point g_track_buffer[g_track_len]; for (int i 0; i JOINT_NUM; i) { uint16_t adc read_adc(i); point-joint_angle[i] adc_to_angle(adc, i); } g_track_len; } void replay_track_point(void) { static uint16_t replay_index 0; if (replay_index g_track_len) { replay_index 0; system_state STATE_IDLE; return; } TrajectoryPoint *point g_track_buffer[replay_index]; for (int i 0; i JOINT_NUM; i) { servo_set_angle(htim[i], pwm_channel[i], point-joint_angle[i]); } replay_index; }这里展示的是最直接的点到点回放逻辑。如果你希望轨迹更平滑可以在 replay_track_point 里加入对当前值和目标值的插值每 5ms 移动一小步。回放结束后让机械臂回到初始零位也是一个很实用的设计。9. 功能测试与效果验证固件写好并且机械臂组装完成后不要直接进入完整轨迹复现而是按下面的顺序分层测试。9.1 单关节角度回读测试在示教模式下手动缓慢转动第一个关节在串口调试助手里观察对应 ADC 值和角度值是否连续变化没有跳变。如果数据忽大忽小检查电位器接线是否松动、ADC 采样是否悬空或者在软件里增加滤波。这步通过后再逐个检查其余五个关节。9.2 单路舵机输出测试把某一自由度的目标角度固定为 0 度、90 度、180 度观察舵机是否能准确到达对应位置。如果到了位置仍然“嗡嗡”响说明 PWM 脉宽对应的角度可能超出机械限位或舵机在死角位置堵转需要减小角度范围。9.3 六轴联动测试让六个自由度依次从零位偏转到最大角度再回中确认机械上不存在干涉、抖动、异响。这一步很重要因为六轴机械臂在空间运动时可能发生相邻关节碰撞。如果出现明显干涉需要缩小软件角度限位。9.4 短轨迹示教复现测试手动拖动或通过主臂操作机械臂走一条简单路径比如从零位抬起到前方再放回记录 5 秒钟轨迹然后按下回放键。观察机械臂能否按顺序完成同样动作。如果回放时动作速度比示教时快很多说明回放时每个轨迹点的延时不够需要把延时时间调整为和记录时一致。9.5 长轨迹复现与稳定性测试逐步增加拖动过程的复杂度和时长例如加入圆弧动作或夹爪开合动作重点观察三个问题轨迹缓冲区是否溢出、回放末尾是否出现卡顿、多次连续回放后是否产生位置偏移。位置偏移主要由舵机精度和机械间隙造成如果偏移量在可接受范围内就可以不需要追求工业级重复定位。10. 接口调试与上位机联动思路除了按键控制串口是这套系统最值得扩展的接口。你可以把 STM32F103 的串口连接到上位机用 Python 或串口工具发送简单指令例如串口指令功能MODE_IDLE进入待机MODE_TEACH开始示教记录MODE_PLAY开始回放GET_ANGLE读取当前六个关节角度SET_ANGLE设置某个关节目标角度下面是一个用 Python 调用串口控制机械臂的通用模板需要根据实际串口号和命令格式调整import serial import time ser serial.Serial( portCOM3, baudrate115200, timeout1 ) def send_command(cmd: str): ser.write((cmd \n).encode(utf-8)) time.sleep(0.1) res ser.read_all().decode(utf-8, errorsignore) print(res) send_command(MODE_TEACH) time.sleep(5) send_command(MODE_PLAY)串口功能如果不做上位机也可以只用来打印调试信息。在实际项目里最好的调试习惯是每 100ms 打印一次当前状态、采样点数、当前正在执行的轨迹点索引这样一帧一帧地检查能很快定位问题。11. 资源占用与性能观察STM32F103 做六自由度机械臂示教核心瓶颈通常不是 CPU 算力而是 RAM、定时器资源和 PWM 更新逻辑。如果你用的是裸机主循环六个自由度只是每周期更新 6 个定时器的比较寄存器CPU 占用并不高。大部分时间其实花在了延时和等待舵机动作完成上。因此除非要同时处理复杂视觉算法、云端通信、多自由度实时轨迹插补否则没必要一上来就用 FreeRTOS。但如果项目后期要同时管理按键扫描、OLED 屏幕显示、串口通信、多段轨迹调度再用 RTOS 会让任务边界更清晰。RAM 占用方面轨迹缓冲区是最大消耗项。上面一个点 12 字节如果开 1000 个点就需要 12KB这对于 20KB RAM 的芯片来说已经非常紧张。更合理的做法是限制记录时长比如采样周期 20ms、记录 10 秒只需要 500 个点也就是 6KB 左右相对安全。如果你希望记录几分钟的动作建议把轨迹数据放到外部 Flash 或 SD 卡中。串口输出也会占用时间。调试时如果每 50ms 输出一条完整角度信息可能会影响主循环的采样节奏。建议在正式录轨迹时关闭日志输出或者只在按键切换状态时打印一次状态摘要。12. 常见问题与排查方法问题现象可能原因排查方式解决方案舵机完全不动电源未接 / 信号线接错 / PWM未初始化检查舵机供电电压确认信号线接到对应定时器通道按接线表逐一核对用示波器或逻辑分析仪看 PWM 波形舵机上电后抖动电源电流不足 / PWM周期不对测量舵机电源电压是否被拉低换大电流电源分清舵机电源和逻辑电源记录的角度值跳变电位器接线不良 / ADC采样悬空 / 参考电压抖动串口打印原始 ADC 值观察变化规律检查接线增加滤波电容多次采样取平均拖动关节很费力舵机齿轮自锁 / 减速比太大检查机械结构确认舵机是否断电增加离合器结构或改用总线舵机松脱模式回放速度比示教快轨迹点之间延时太短对比记录周期和回放周期在回放循环里加与记录周期一致的延时回放动作一顿一顿轨迹点太少 / 插值不够查看轨迹缓冲区点数提高采样频率或在回放时做线性插值六轴运动时相互碰撞软件角度限位没设置逐个自由度检查最大最小角度为每个关节设置单独的角度上下限单片机反复重启舵机堵转导致电源跌落观察舵机卡死位置和大电流减小角度范围增加电源电容或换大功率电源串口乱码波特率不一致 / 电平不匹配确认上位机波特率和代码一致使用 115200 8-N-1检查共地Flash 存储轨迹失败写入擦除不规范先单独测试 Flash 读写使用外部 Flash 时按页擦除避免跨页写13. 最佳实践与安全使用建议从这套六自由度机械臂项目中可以总结出几条比较通用的经验。第一次跑通功能之前不要把目标算法和机械结构都做到最复杂。先固定一个关节用最简 PWM 输出程序确认舵机方向正确、脉宽范围和机械限位一致然后固定两个关节测试让两个轴同时运动是否存在干涉最后再扩展到六个自由度。这样每增加一个变量出问题时都能快速定位。角度限位一定要在每个关节单独设置。六个自由度的机械结构里每个关节的机械零位、运动方向、最大角度都不完全相同。用一个全局 MAX_ANGLE 限制所有关节并不安全。更合理的方式是给每个关节定义一个结构体里面存最小角度、最大角度、舵机脉宽零点、方向标志。轨迹数据的管理也值得一开始就规范化。示教记录文件、回放代码、角度标定参数不要散落各处。如果使用串口把轨迹上传到电脑建议用带时间戳的 CSV 文件保存方便后期用 Python 分析或绘制角度曲线。安全方面机械臂属于运动设备通电调试时不要把手伸到关节运动范围内特别是要小心夹爪和底座旋转关节。舵机力矩虽然不大但被夹到手指依然会痛六轴运动时末端的线速度也不低。不要让机械臂在无人看管状态下长时间自动运行防止舵机发热或结构松动后发生意外。对使用总线舵机、带角度传感器的方案调试时尽量先让机械臂处在低速状态确认轨迹无误后再提高回放速度。如果项目后续用于毕业设计可以考虑在现有“示教-回放”基础上增加视觉识别、串口远程控制、多段轨迹自动拼接等功能。如果用总线舵机还可以读取电压、温度、堵转状态直接把机械臂做成一个小型实验平台。14. 总结与下一步这台 STM32F103 六自由度机械臂最值得试的点就是把“拖动示教”这样听起来偏工业的功能用单片机加舵机实现了闭环。你不需要先搞懂复杂的机械臂运动学就能实际操作一遍“记录动作、回放动作”的完整流程这对理解机器人控制的基础非常有帮助。拿到手之后建议先做第 9 节里的单关节测试确认每个自由度的 ADC 采样和 PWM 输出都稳定再进入完整六轴轨迹复现。最容易踩的坑集中在三个地方电源功率不足导致单片机复位、ADC 角度读数跳动、回放速度和记录速度不一致。这三个问题解决了项目基本就稳了。下一步可以继续往两个方向扩展一是从固定轨迹回放走向实时轨迹规划加入插补算法让机械臂走直线或圆弧二是通过串口接上位机把轨迹文件、参数标定和记录/回放状态全部可视化。这套体系跑通之后你对单片机外设的理解和机械臂的整体认知会比单纯看教程提升一个台阶。建议把整套工程文件、接线图和标定参数一起整理好留档后面做毕设或二次开发都会用到。