前言

我认为,学习嵌入式成长最快的方式就是做项目。单独学习 GPIO、定时器、ADC 和串口时,每个知识点都有对应的例程,但真正把它们放进同一个系统里,才会开始考虑引脚怎么分配、电源怎么供、模块之间怎么通信,以及一个动作应该在什么条件下执行。

因此,我决定制作自己的第一个综合项目:基于 STM32 与 K230 的麦轮视觉拾取机器人。希望通过这次项目,把之前学过的单片机外设、PCB 设计、电源设计和舵机控制串起来,再逐步加入无线遥控与视觉识别。

这个项目的应用背景来自物流搬运。物品从一个位置送到另一个位置,中间既有移动,也有寻找、对准和拾取。对重复的小件搬运任务来说,人工操作需要不断调整位置、判断目标、完成抓取;如果只用固定位置的机械臂,工作范围又会受到安装位置限制。

于是,我想把能够灵活移动的麦克纳姆轮底盘与机械臂结合起来:由人遥控小车接近目标,再让视觉系统提供目标位置,由机械臂完成拾取。先围绕一个明确的小场景,把“移动到附近—识别目标—执行抓取”这条流程建立起来。

项目状态:未完成版,更新于 2026 年 9 月 25 日。 目前已完成遥控器和机械臂控制板的原理图、PCB 设计,并进行了单舵机按键控制的基础实测;小车控制板尚未绘制。本文记录当前的系统方案、硬件设计与控制基础。

从应用场景确定设计目标

移动、定位和拾取分别解决什么问题

物流场景给这个项目的启发,主要落在三个方面。

首先是工作位置会变化。物品未必总在同一个位置,移动底盘可以把机械臂带到不同的工作区域。

其次是靠近目标后还需要对准。普通前进、后退和转向会让近距离调整变得反复。麦克纳姆轮底盘能够通过四个车轮的配合实现前后移动、横向平移和旋转,适合用来调整机械臂与目标之间的位置关系。

最后是拾取动作需要知道物体在哪里。仅靠手动逐个调节关节,操作步骤比较多。加入视觉后,可以把目标定位交给相机,把动作执行交给机械臂控制器,让操作者主要负责移动和发起任务。

本项目的操作流程

项目围绕红、绿、蓝色小方块开展,先在桌面完成机械臂与视觉系统的配合,再把机械臂和相机安装到小车上,拾取地面上的目标。

预期的操作流程为:

  1. 使用遥控器驾驶小车,接近目标方块。
  2. 视觉系统识别目标,判断其是否进入有效拾取区域。
  3. 目标满足拾取条件后,通过蜂鸣器提示。
  4. 操作者按下自动拾取按键,小车保持停止。
  5. 重新确认目标位置,机械臂执行接近、夹取和抬起动作。
  6. 动作结束后返回状态,等待下一次操作。

这里的自动化重点是停车后的视觉定位与机械臂拾取。底盘的移动由操作者遥控,便于先把识别、抓取和运动控制之间的关系理清楚。

第一阶段把自动化做到哪一步

确定方案时,一个重要的决定是把第一阶段的目标放在“手动接近、按键触发、停车抓取”。如果同时加入自主接近目标,视觉就要参与底盘行驶控制,系统还要处理车身姿态变化、移动中的目标定位,以及底盘与机械臂何时交接控制权。

因此,我先由操作者完成大范围移动,把自动化集中到一个静止工作区域内。这个取舍保留了视觉拾取的核心问题,同时让每一次动作的起点更容易确定。蜂鸣提示表示系统认为目标具备拾取条件,按键则表示操作者确认开始,二者在流程中承担不同职责。

系统方案与模块分工

整套系统划分为遥控器、小车、机械臂三个 STM32 控制端,另外使用庐山派 K230 承担视觉处理。

模块 主要职责 与其他模块的连接
遥控器 采集摇杆和按键,选择控制对象,发送指令并显示状态 通过 nRF24L01 分别联系小车和机械臂
小车控制端 接收移动指令,控制四轮麦克纳姆底盘 与遥控器进行无线通信
机械臂控制端 接收操作指令和视觉结果,控制五路舵机,管理动作流程 无线连接遥控器,串口连接 K230
庐山派 K230 采集图像,识别颜色目标,输出定位信息 通过串口与机械臂 STM32 交换数据

通信关系可以概括为:

1
2
3
4
5
6
7
                    ┌─ 无线 ─ 小车 STM32 ─ 四轮底盘
遥控器 STM32 ─ nRF24L01
└─ 无线 ─ 机械臂 STM32 ─ 五路舵机
│
串口
│
庐山派 K230

三块主控的划分依据

小车和机械臂分别与遥控器通信,协调指令由遥控器发起。底盘控制围绕四轮运动展开,机械臂控制围绕关节和抓取动作展开,遥控器则围绕人的操作展开。按这些任务划分,机械臂可以脱离底盘先做桌面调试,小车也可以单独验证遥控行驶。

这种划分增加了主控数量,也需要维护两条无线通信链路。相应地,每块板的任务、接线和调试入口比较明确,修改机械臂动作时可以集中在机械臂端。对于这个逐步搭建的项目,我更看重各部分能够独立推进。

机械臂和小车之间没有直接通信,因此停车确认、抓取请求和动作状态需要经过遥控器协调。这也决定了后续协议需要传递双向状态:除了“发出指令”,还要知道指令是否被接收、当前是否允许执行下一步。

视觉处理与运动控制分开

图像识别和舵机控制需要的资源不同。相机侧需要采集、处理图像,运动侧则需要持续管理 PWM、关节目标与动作顺序。本版让 K230 处理图像,通过串口发送目标结果;STM32 接收结果并管理执行过程。

这样划分后,板间传递的内容可以集中在目标位置、有效性和任务状态上。联调时也可以先向 STM32 输入一个已知位置,检查机械动作,再接入视觉定位结果,便于判断偏差来自识别、坐标换算还是执行过程。

机械臂端沿用已有的 STM32F103C8T6 最小系统板。它提供定时器、ADC、SPI 和 USART 等外设,能够分别对应舵机 PWM、电池检测、无线通信和视觉串口。STM32F103C8 官方资料列出了这些外设资源,设计扩展板时再根据实际引脚复用关系进行分配。

遥控器原理图设计

遥控器是整套系统的人机交互入口。这一版采用双摇杆、十二个独立按键、OLED 显示和三路指示灯,并将电池供电与无线通信一起集成到手柄形状的 PCB 上。

遥控器外围原理图,包含电源、摇杆、按键、无线通信与显示接口

电池供电与电压检测

遥控器按单节锂电池供电设计,电池经过电源开关,再由 XC6206P332MR-G 稳压至 3.3 V,提供给控制与外围电路。

电池检测使用电阻分压后接入 PA0。上臂电阻为 10 kΩ,下臂电阻为 22 kΩ,采样节点并联 100 nF 电容。

VADC=VBAT×2210+22V_{\mathrm{ADC}}=V_{\mathrm{BAT}}\times\frac{22}{10+22}

按常规单节锂电池满电 4.2 V 代入,采样电压约为 2.89 V。软件可以根据 ADC 采样值换算电池电压,再用于屏幕显示和低电量提示。

双摇杆与独立按键

两个摇杆分别提供 X、Y 两个模拟量以及按压开关。四个模拟量接入 PA1~PA4,两个摇杆按压信号接入 PB0 和 PB1。

摇杆适合表达连续的方向和速度变化;独立按键适合发出模式切换、动作触发等离散指令。本版保留十二个独立按键,其中 U10 用作模式键,用来切换小车与机械臂的操作模式;顶部的 SW1 则负责电源通断。

按键通过上拉电阻保持默认高电平,按下时拉低。每个按键独立接入 GPIO,程序可以直接读取按键状态,再进行消抖和事件处理。

双摇杆的考虑来自麦轮的操作需求:前后移动、横向移动和旋转需要三个连续控制量,两个双轴摇杆提供四个模拟输入,便于安排驾驶操作,也为机械臂模式保留输入空间。

按键部分最终采用十二路独立 GPIO。与矩阵扫描相比,这种接法占用更多引脚,但各键的电平和布线可以直接对应,单键检查、消抖以及组合操作的处理也更直观。这一版优先采用这种便于逐个调试的连接方式,并在分配时一起核对 JTAG、串口等复用功能。

无线、显示与状态提示

nRF24L01 接入 STM32 的 SPI2:PB13、PB14、PB15 分别承担时钟、接收和发送信号,PB12 为片选,PB10 控制 CE,PB11 接 IRQ。无线模块的供电处设置了 100 nF 与 10 μF 电容。

OLED 使用 PB8、PB9 两根信号线,三路 LED 分别用于低电量、小车通信和机械臂通信状态提示。这样在操作时,既可以通过屏幕读取详细信息,也能通过指示灯快速判断连接状态。

遥控器功能 接口或引脚
电池电压检测 PA0
左摇杆 X / Y、按压 PA1 / PA2、PB0
右摇杆 X / Y、按压 PA3 / PA4、PB1
OLED PB8 / PB9
nRF24L01 SPI2,以及 CE、CSN、IRQ 控制信号
低电量、小车通信、机械臂通信指示 PB5、PA8、PA11

部分独立按键使用了 PA15、PB3、PB4。对应固件需要关闭 JTAG、保留 SWD,释放这几个引脚作为普通 GPIO 使用。

机械臂控制板原理图设计

机械臂控制板将五路舵机、视觉接口、无线模块、OLED、电池检测和本地操作接口集中起来。STM32 最小系统板通过排针接入扩展板,外围接线则统一从板边引出。

机械臂控制板外围原理图,包含五路舵机、K230、无线与分路供电

逻辑电源与舵机电源分路

这一版以 12 V 电源输入为基础,电源经过开关后分成逻辑和舵机两条支路。

  • 逻辑支路: 通过 MP1584EN 降压模块得到 5 V,供最小系统板及 K230 等逻辑侧设备使用;3.3 V 外设由相应的 3.3 V 电源网络供电。
  • 舵机支路: 通过接线端子引出电源,连接外置舵机降压模块,再将稳压后的 5 V 接回 +5V_SERVO,分配到五个舵机接口。

两条支路共地,但 +5V 与 +5V_SERVO 分开布置。舵机启动和关节负载变化时,电流也会随之变化;将其供电路径单独安排,可以让大电流走专用配电路径,避免经过最小系统板的供电排针。

这里的关键考虑是五只舵机在真实动作中的供电需求。机械臂伸出、抬升和夹持时,各关节的负载并不相同,同时动作时电源还要承担叠加的电流变化。因此,单只舵机能转动,只能作为单路控制的基础;整臂电源需要结合关节负载与并发动作安排。

本版将逻辑降压留在板上,把舵机降压做成外置模块接口。这样在确定实际供电能力时,可以调整舵机电源模块,同时保留已经安排好的主控和信号接口。代价是增加一组外部模块与接线,收益则是电源选择更加灵活。

分路供电仍然共享信号参考地。布线时需要让舵机电流沿电源入口与舵机接口之间的路径流动,并减少与主控、无线模块共用的回流路径,才能让这项电源划分在 PCB 上发挥作用。

这也是之前制作两级降压电源板之后,在实际项目中进一步考虑的问题:除了输出电压,还要根据负载特性安排电源支路与连接方式。

五路舵机 PWM

机械臂共使用五只舵机,包含夹爪。扩展板为每一路提供 PWM、5 V 舵机电源和 GND 三根连接。

接口 STM32 引脚 定时器通道
H1 PA1 TIM2_CH2
H2 PA6 TIM3_CH1
H3 PA7 TIM3_CH2
H4 PB0 TIM3_CH3
H5 PB1 TIM3_CH4

这样可以使用硬件定时器产生五路 PWM。程序更新各通道的比较值,就能分别设置舵机的目标位置。接口编号用于组织接线,实际关节与通道的对应关系再按装配位置统一管理。

K230 视觉接口与调试串口

视觉端选用庐山派 K230,机械臂板上的 H6 引出 5 V、PA9、PA10 和 GND。PA9、PA10 分别作为 USART1 的发送与接收信号,与 K230 的接收、发送信号交叉连接。

本项目把图像采集与识别安排在 K230 上,STM32 侧接收目标信息并执行动作。两块板之间的串口连接与配置,可结合庐山派官方的UART 开发文档进行实现。

板上另外引出了 PA2、PA3 对应的 USART2 调试口。视觉通信与调试输出各用一组串口,便于联调时同时查看识别数据和机械臂状态。

电池采样与本地操作

机械臂板同样使用 PA0 检测输入电压,分压电阻采用上臂 10 kΩ、下臂 3 kΩ,并在采样节点并联 100 nF 电容。

VADC=VBAT×310+3V_{\mathrm{ADC}}=V_{\mathrm{BAT}}\times\frac{3}{10+3}

12 V 输入时,采样电压约为 2.77 V;按 12.6 V 计算时,约为 2.91 V。软件读取 ADC 后,可以用对应的分压比例还原输入电压。

此外,板上还设置了 OLED 接口、四个本地按键、指示灯和蜂鸣器接口。本地按键用于单板操作,OLED 用于查看运行信息,蜂鸣器则承担目标进入拾取区域等事件提示。

PCB 布局与接口安排

遥控器:按握持方式安排器件

遥控器采用手柄轮廓,上方布置两个摇杆,左右握持区域及中间位置布置独立按键,电源开关位于顶部。这样的布局围绕双手操作展开,让连续控制和动作按键各有位置。

遥控器 PCB 布局布线

无线模块接口朝向板外,显示与主控连接区域布置在中部。设计中同时预留了四个安装孔,便于后续安装支撑件或外壳。

遥控器 PCB 三维预览,展示手柄外形与按键位置

机械臂板:按接线方向划分区域

机械臂控制板约为 100 mm × 78 mm。电源输入和开关位于左上方,五路舵机接口沿左侧排列,K230 和 OLED 接口位于左下区域,nRF24L01 接口位于右上方,STM32 最小系统板插座位于右侧。

机械臂控制板 PCB 布局布线

布局时重点考虑了三件事:

  • 舵机电源就近分配。 舵机接线端子与五路接口放在相邻区域,使用较宽的电源走线连接。
  • 信号按功能集中。 视觉、显示、无线与调试接口分别安排,降低接线时相互穿插的程度。
  • 保留插拔与安装空间。 最小系统板的 USB 一侧朝向板边,安装孔分布在四角。

本版将舵机电源主干按 60 mil、逻辑 5 V 主干按 30 mil、一般信号线按 10 mil 进行布线,并使用顶底层地铜连接地网络。宽线用于降低配电路径的电阻,实际承载能力仍与铜厚、长度、连接器和温升共同相关。

机械臂控制板 PCB 三维预览,展示舵机接口、主控插座与外围连接位置

以上图片为本版 PCB 布线与三维预览,便于对照原理图查看各模块在板上的位置。

从单舵机控制建立软件基础

机械臂的动作最终要落实到各路舵机控制,因此我先使用 STM32F103C8T6 做了单舵机按键控制实验。通过按键改变舵机指令,已经完成基础转动测试。

现有测试工程将 PWM、舵机角度换算、按键和 OLED 显示分别封装。主程序读取按键事件,更新目标角度,再调用舵机接口输出,并在 OLED 上显示当前指令值。

定时器怎样产生舵机信号

测试程序使用 PA1 对应的 TIM2_CH2,定时器时钟按 72 MHz 配置,预分频器设置为 71,自动重装值设置为 19999:

fPWM=72 000 000(71+1)(19999+1)=50 Hzf_{\mathrm{PWM}}=\frac{72\,000\,000}{(71+1)(19999+1)}=50\ \mathrm{Hz}

这样每次计数对应 1 μs,一个 PWM 周期为 20 ms。改变比较寄存器的值,就能改变每个周期内的高电平时间。

测试工程采用 500~2500 μs 对应 0~180° 的换算设置,角度到脉宽的关系为:

tpulse=500+θ180×2000(μs)t_{\mathrm{pulse}}=500+\frac{\theta}{180}\times 2000\quad(\mu\mathrm{s})

这组数值是当前测试工程的设置。整臂使用多种舵机,软件中会分别管理各关节的脉宽范围、转动方向和机械限位。

从一个通道扩展到动作流程

单舵机程序解决的是“给定角度,输出对应 PWM”。五路机械臂还需要在这个基础上组织多个关节的动作顺序。

因此,后续程序按三层展开:底层产生各路 PWM,中间层管理关节目标与限位,上层管理观察、接近、夹取和抬起等动作。这样调整某个关节的参数时,不必同时改写整套抓取流程。

OLED 上显示的是发送给舵机的目标角度。当前普通 PWM 接口提供位置指令,关节实际运动情况则结合机械结构和调试观察来确认。

视觉定位与自动拾取方案

相机装在车体上,还是跟着夹爪运动

相机安装位置是这个项目中影响较大的一个选择。考虑过的两种方向,一种是固定在车体或机械臂底座附近,另一种是安装在夹爪后方,随腕部一起运动。

安装方向 有利之处 需要处理的问题
相对车体固定 相机与机械臂底座之间的安装关系保持固定,便于组织坐标换算 需要安排可用视野,处理机械臂遮挡和支架避碰
随腕部运动 可以随夹爪接近目标,便于观察局部区域 相机相对底座的位置随关节变化,还会增加腕部负载与活动线缆

对当前方案而言,优先考虑车体固定、斜向下观察。普通 PWM 舵机接口没有向 STM32 返回实际关节角度,如果让相机跟随腕部运动,再根据指令角度推算它的位置,关节间隙和负载引起的偏差也会进入定位过程。固定相机可以减少这部分随动作变化的关系。

从几何上看,腕部相机需要结合相机与夹爪的安装关系,以及当前机械臂姿态,才能把观测转换到底座坐标;固定相机则可以建立相机到底座的固定转换关系。OpenCV 的手眼标定说明介绍了这两类安装关系。本文据此优先采用较适合当前控制基础的固定相机方案。

支架从一开始就考虑装车

桌面调试时,高架俯拍很容易获得较完整的画面,但最终机械臂和相机都要安装到小车上,支架高度、底盘空间以及运动时的晃动都要一起考虑。因此,目前优先评估紧凑的固定支架,让相机斜向下观察车前区域。

相机只需覆盖计划使用的拾取区,安装位置则要避开机械臂伸展和回转时扫过的空间。这里的“固定”是相对车体和机械臂底座固定;车体姿态、相机安装关系或工作面高度变化时,仍要重新核对标定关系。

先建立一个明确的拾取区域

本项目先面向静止的彩色方块。相机方案优先考虑相对底盘和机械臂底座固定,斜向下观察车前区域;小车把目标送入视野与机械臂都能覆盖的范围,再停车拾取。

有效拾取区域需要同时满足:目标能被相机看清、机械臂能够到达、运动路径有足够空间。这样“发现目标”与“可以开始抓取”就有了明确的判断条件。

从图像位置到机械臂目标位置

视觉部分按以下流程组织:

  1. K230 获取图像,识别目标颜色和位置。
  2. 根据标定关系,将图像中的位置换算到机械臂使用的坐标系。
  3. 判断目标是否处于设定的有效拾取区域。
  4. 将目标信息发送给机械臂 STM32。
  5. 操作者触发任务后,更新目标位置,再执行抓取动作。

相机得到的是图像坐标,机械臂需要的是相对自身底座的位置。两者之间通过标定建立联系;由于相机采用斜视方案,标定时还需要考虑透视关系与目标所在平面。

这里还有一个容易被忽略的考虑:识别参考点所在的高度要与标定一致。 如果检测的是方块顶面中心,它与地面之间有一个方块高度。斜视条件下,将顶面上的点直接套用地面映射,会引入位置偏差。因此,标定方案要先说明定位的是哪个面、哪个点,再把它转换成夹爪需要到达的位置。

用状态组织一次拾取

一次自动拾取可以按“等待指令 → 确认目标 → 接近 → 夹取 → 抬起 → 结束”划分状态。每个状态负责一段动作,并规定进入下一状态的条件。

遥控器在发起抓取时协调底盘停止与机械臂动作,抓取期间保持停车;机械臂端返回执行状态,遥控器据此显示任务进度。这个分工让移动操作和拾取操作能够衔接起来。

动作配合的重点是明确“什么时候允许开始”。软件设计中将停车确认放在伸臂之前,并在停车后使用新的视觉观测复核目标位置,避免直接沿用行驶过程中取得的位置。

无线指令也需要区分持续控制和单次任务:摇杆可以持续更新速度请求,拾取按键则对应一次任务。为此,计划给动作请求分配序号,重复收到同一个请求时返回状态,避免因长按或无线重发重复启动抓取。通信恢复后也要等待新的操作请求,保持任务起点明确。

当前进度与小车控制板规划

截至本次记录,项目已形成以下基础:

项目部分 当前进度
系统总体方案 确定三个 STM32 控制端、无线通信关系与 K230 视觉分工
遥控器 原理图与 PCB 设计完成,包含双摇杆、十二个独立按键、显示及无线接口
机械臂控制板 原理图与 PCB 设计完成,包含五路舵机、分路供电与 K230 接口
舵机控制基础 已进行单舵机按键控制实测,建立 PWM、按键与显示测试工程
视觉自动拾取 已确定流程与接口方案,后续进行识别、标定和动作联调
小车控制板 尚未绘制,按四轮麦克纳姆底盘规划

小车板将承担四路电机驱动、无线接收和底盘运动控制,并结合超声波测距、灯光等功能安排接口。绘制时需要同时考虑电机供电路径、驱动电流和 STM32 外设资源,使它能够与遥控器、机械臂端配合。

项目推进顺序是先把桌面上的机械臂与视觉流程建立起来,再完成小车板和底盘控制,最后进行装车与整机联调。相机与机械臂的安装关系从桌面阶段就一并考虑,方便后续迁移到移动底盘。

为什么先做桌面验证

抓取位置出现偏差时,原因可能在图像定位、坐标换算、关节参数,也可能来自底盘移动。如果把所有部分一次装到车上,这些影响会叠在一起。桌面阶段固定底座,可以先围绕视觉与机械臂检查问题,把底盘运动的影响放到后续阶段处理。

桌面验证按“单关节动作 → 给定位置的机械动作 → 视觉提供位置 → 整车配合”的顺序推进。前一步建立可用基础后,再接入下一部分,更容易解释每次测试的结果。

同时,相机与机械臂尽量安装在同一套可迁移的底板上,提前考虑车上安装面与地面之间的高度关系。这样桌面阶段得到的机械结构和接线安排可以继续使用,装车时再围绕实际视野、工作面和底盘姿态核对标定。

总结

从之前的降压电源板,到这次遥控器和机械臂控制板,设计中需要同时考虑的事情明显增加了:引脚既要满足连接数量,也要对应合适的外设;供电既要提供正确电压,也要照顾执行器的电流变化;各个模块还要围绕同一次操作配合起来。

这个项目让我开始把“会用某个外设”进一步落实到“用这些外设完成一件事”。目前完成的两块 PCB,将摇杆、无线、视觉接口和五路舵机控制放进了明确的系统分工中。接下来继续沿着这套结构,把小车控制板和视觉拾取流程逐步实现,让设计真正落实到机器人动作上。

参考资料