English
🤖 LateAI
首页做自己的机器人 › NeuralNexus Arm 6-DOF 机械臂
🧠

NeuralNexus Arm:从 CAD 到数字孪生的自研 6 自由度机械臂

NeuralNexus Arm — A 6-DOF Arm Built from Scratch: Firmware, Digital Twin & Vision
📶 高难 ⏱ 机械 + 固件 + 上位机全栈 🦾 6 轴步进 + AS5047P 编码器 🧠 STM32H743 @ 420 MHz

📌 本分册目标

这一台和前几册的路线都不同:不是复刻现成开源臂,而是从零手工做一台——机械结构、嵌入式固件、运动学求解、数字孪生、视觉抓取全部自研,没买套件、也没拼现成方案。它的核心命题只有一句话:一条指令,让真实机械臂与 3D 数字孪生体同步运动

作者团队(Lasan Perera 等 5 人)把整条链路打通得很完整,所以它特别适合当作「一台机械臂到底由哪些层组成」的活教材:SolidWorks 建模 → Simscape Multibody 数字孪生 → MATLAB 逆运动学求解 → USB CDC 115200 → STM32H743 实时伺服 → 6 路步进 + 舵机夹爪 → AS5047P 绝对编码器反馈。

本分册按 系统链路 → 硬件栈 → 关节传动 → 控制与协议 → 数字孪生 → 视觉 → 资料下载 → 踩坑要点 八段走。它的价值不在于「照着装一台」,而在于学习每一层之间怎么接口、怎么验收

📦 官方全部资料已镜像到本站(固件工程、最终报告 PDF、原理图、Gerber、STL/STEP 模型、MATLAB 脚本、视觉脚本),见 资料下载 一节,无需翻墙即可取。

🧭 第一段:系统链路(先理解数据怎么流)

抓住这条链路,后面每一节都能对号入座:上位机算运动学 → 串口下发关节角 → 下位机做实时伺服。中间用一条极简的文本协议解耦,两侧可以独立开发、独立调试。

SolidWorks CAD  →  Simscape Multibody 数字孪生  →  MATLAB 逆运动学求解器
                                     │
                         USB CDC @ 115200 baud(关节角文本协议)
                                     ▼
        STM32H743 @ 420 MHz  →  6 路步进电机 + 夹爪舵机(2 kHz 控制环)
                                     │
                    AS5047P 绝对编码器(SPI 反馈,14 bit)
                                     │
        浏览器 Web Serial 控制面板(Chrome / Edge,无需 MATLAB 授权)

🔧 第二段:硬件栈(选型逻辑比参数更重要)

类别配置
MCUSTM32H743VITx(Cortex-M7 @ 420 MHz,25 MHz HSE → PLL:M=5 / N=168 / P=2)
步进电机2 × NEMA 24(J2 / J3)· 1 × NEMA 23(J1)· 3 × NEMA 17(J4 / J5 / J6)
驱动器2 × CL57T 闭环(J2 / J3)· 1 × DM542 开环(J1)· 3 × TMC2209 板载 1/8 细分(J4 / J5 / J6)
编码器6 × AS5047P 磁绝对编码器,14 bit(16384 计数/圈),SPI1 mode 1
夹爪舵机 · TIM1_CH3 · 50 Hz PWM(930 µs 开 / 1100 µs 合)
外设分配TIM1_CH3 夹爪 · TIM2_CH2 蜂鸣器 · TIM6 步进 ISR @ 2 kHz · USB CDC 虚拟串口
控制环TIM6 ISR @ 2 kHz(PSC 74 / ARR 499),tick 周期 500 µs
接线拓扑M1~M3 共阳(STEP+/DIR+/ENA+ 接外部 +5V,STM32 开漏吸收)· M4~M6 推挽 3.3V 直连
⚠️ 驱动器拓扑是这一册最容易看错的地方:板载 TMC2209 用推挽 OUTPUT_PP(3.3V 直驱),外部 CL57T / DM542 用开漏 OUTPUT_OD(共阳接法,低有效)。因此固件里 Stepper_SetEnableM4M5M6(false) 恰恰是「使能」外部驱动器的动作——代码审阅时看起来像 bug,但它不是。改这一处之前先想清楚极性。

⚙️ 第三段:关节传动与脉冲当量(写控制器前先抄下来)

关节角色 / 电机 / 减速比 / 脉冲每圈
J1底座旋转 · NEMA 23(DM542)· 1:7 · 2800
J2肩 · NEMA 24(CL57T 闭环)· 1:30 · 5000
J3肘 · NEMA 24(CL57T 闭环)· 1:30 · 5000
J4腕俯仰 · NEMA 17(TMC2209 1/8)· 1:1 · 设计值 1600
J5腕滚转 · NEMA 17(TMC2209 1/8)· 1:1 · 设计值 1600
J6末端旋转 · NEMA 17(TMC2209 1/8)· 1:1 · 设计值 1600实测 3200
关节限位J1 ±180° · J2 −70°~70° · J3 120°~240° · J4 ±180° · J5 60°~300° · J6 ±180°
索引映射jointToMotor[6]——逻辑关节编号 ≠ 电机接线顺序,映射表集中在固件里,改接线必须同步改这张表
💡 脉冲当量必须实测:项目状态表里明确写着 J6 实测为 3200 脉冲/圈(而非设计的 1600),其余轴仍在标定中。控制器里的 pulsesPerJointRev 填错,整机角度会等比偏移——这也是「绝对定位目前只在 1:1 腕关节可行」的直接原因。

🖥️ 第四段:通信协议与控制方式

指令格式与含义
关节移动6 个逗号分隔的角度值(度)→ 0,-50,60,-80,-90,50;固件换算成脉冲并回显 steps: ...
夹爪G,1 闭合 / G,0 打开(TIM1_CH3 舵机 PWM)
归零HOME——编码器零点标定
测试TEST——30° 编码器标定流程
工作模式相对模式:每条指令都是相对当前位置的增量;绝对定位与 J3/J5 的 180° 偏移已写好但暂时禁用,等编码器归零完成后再启用

上位机侧有两种用法:MATLAB 会话(算 IK + 驱动仿真 + 串口下发)或浏览器控制面板(Chrome / Edge 打开 HTML,点 Connect 选串口即可操控,不需要 MATLAB 授权)。MATLAB 会话的标准开场如下,第一步必须先建 jointData——Simscape 的 From Workspace 模块依赖它:

% 每次开新会话都先跑这一段
jointData = zeros(2,7);            % 必须最先执行
load_system('Assem1');
robot = importrobot('Assem1');
robot.DataFormat = 'row';
limitsDeg = [-180 180; -70 70; 120 240; -180 180; 60 300; -180 180];
for i = 1:6
    robot.Bodies{i}.Joint.PositionLimits = deg2rad(limitsDeg(i,:));
end
ik = inverseKinematics('RigidBodyTree', robot);
weights = [1 1 1 1 1 1];
q0 = homeConfiguration(robot);
s  = serialport("COM9", 115200);   % 实际端口以设备管理器为准

% 常用动作
armIK(robot, ik, weights, q0)                         % 交互式 IK 滑块工具
goToXYZ(robot, ik, weights, q0, [-0.15 0.30 0.10], s) % XYZ → 真机 + 同步孪生
moveBoth(s, [0 10 0 0 0 0])                           % 真机与仿真同时相对移动
armWave(s)                                            % 挥手动作
writeline(s, "HOME")                                  % 编码器归零
⚠️ 遥测流与命令握手不能共用一条总线:固件周期性打印的 enc | ... 会淹没串口,导致 MATLAB 的 readline() == "END" 永久等待,仿真与真机一起冻住。同一时间只能选一种模式,或给读取方加超时。
⚠️ 单次移动不要超过 10°:60° 的移动在 400 steps/s 下实际要跑约 4 秒,而演示脚本 1 秒后就发下一条指令,会把上一条打断。实用解法是把 60° 拆成 6 个 10° 分块发送——不用改固件、不用加握手

🧪 第五段:数字孪生与演示(这台机器的招牌)

Simscape Multibody 的 Mechanics Explorer 里放着一台与真机同尺寸的实体臂,MATLAB 每次解完 IK 就把关节角写进 jointData,From Workspace 模块读这个两列时间表驱动 6 个转动副——点 Run,屏幕上的仿真臂与桌面上的真机会走同一个动作。

🧠 一个值得记住的运动学结论:6 自由度机械臂在连杆重构时无法同时锁定末端位置与工具姿态——那需要第 7 个自由度。所以上面所有「锁定」演示都只能锁一个约束、让另一个变化。理解了这一点,就不会指望一台 6 轴臂在任意姿态下都保持工具朝向不变。
⚠️ Simscape 过约束是仿真跑不动的头号原因:SolidWorks 里多余的平行 / 垂直配合会把旋转关节焊成刚性连接(自由度归零)。规则是——每个关节恰好一个同心配合 + 一个重合或距离配合,多一个都会锁死。

👁️ 第六段:视觉子系统(像素 → 世界坐标 → IK)

环节做法与指标
相机内参20 张棋盘格标定图 → 重投影误差 0.6863 pxcalibrate.py / calibrate picam.py
相机安装刚性固定,高度 41 cm(外参标定以该位姿为前提)
外参映射3×3 单应矩阵(homography)把像素坐标换成毫米级世界坐标(homography.py
目标识别颜色分割(segmentation.py)与 YOLO 检测(自定义训练模型:纸箱、糖果等)
闭环识别结果 → 世界坐标 → 送进逆运动学求解器 → 关节角下发 → 夹爪抓取
⚠️ 单应标定只在当前相机高度与位姿下有效:一旦挪动相机就必须重新标外参(内参标定仍然有效)。这是视觉抓取类项目最容易忽略的约束——「昨天还能抓准、今天差几厘米」基本都是这个原因。

📥 资料下载(官方全量镜像 · 免翻墙)

下列文件均为官方仓库原文件的本站镜像,按用途分目录存放,可直接右键另存。全部资源共 248 个文件 / 约 27.7 MB

docs · 报告与演示(EDR Documentation)

文件大小说明
Neural_Nexus_Final_Report.pdf3.8 MB最终技术报告,机械 / 电气 / 固件 / 运动学 / 视觉全链路文字说明,最值得先读的一份
Neural_Nexus_Final_Presentation.pdf6.9 MB最终答辩演示,含整机照片、结构爆炸图与结果截图
Neural_Nexus_Project_Pitch.pdf0.4 MB立项方案(Project Pitch),讲清设计目标与选型思路

schematics · 电气原理图

文件大小说明
MCU_Schematic.pdf0.3 MB主控板原理图(STM32H743 最小系统、驱动器接口、电源)
Encoder_Schematic.pdf0.12 MBAS5047P 编码器板原理图(SPI 菊花链 / 磁铁安装位置)

gerber · PCB 制造文件

文件大小说明
MCU.rar0.24 MB主控板 Gerber 包,可直接送厂打样
nema17.rar21 KBNEMA 17 电机安装 / 转接板
nema17pancake.rar20 KBNEMA 17 扁电机(pancake)转接板
nema23.rar22 KBNEMA 23(J1)安装板
nema24.rar22 KBNEMA 24(J2 / J3)安装板
📦 Gerber 以 .rar 打包,Windows 需用 WinRAR / 7-Zip 解压;解压后即可整体上传嘉立创等平台下单。

eda · 嘉立创 EDA 工程(本站补充 · 可编辑源文件)

文件大小说明
NeuralNexus_Arm.eprj21.3 MB嘉立创 EDA 专业版工程包:含 1 张原理图(Schematic1 / P1)与 1 块 PCB(PCB1),下载后「文件 → 打开 → 本地工程」即可继续修改并直接下单打样
preview_schematic.webp · preview_pcb.webp23 KB / 112 KB工程内置的原理图与 PCB 缩略图,下载前可先预览
💡 .eprj2嘉立创 EDA 专业版(EasyEDA Pro)的工程格式(本质是一个 SQLite 数据库),标准版无法打开。
⚠️ 该工程为本站自制补充资料,不属于官方仓库内容,与官方原理图可能存在差异,实际打样请以 gerber/ 官方文件为准。

ik-matlab · MATLAB / Simscape 工程与模型

文件大小说明
GUIDE.txt6 KB命令速查卡:会话初始化、IK 求解、滑块工具、真机下发、两个演示的完整调用顺序
REQUIREMENTS.txt0.6 KBMATLAB 版本与工具箱要求(Robotics System Toolbox 等)
Assem1.slx0.24 MBSimscape Multibody 数字孪生模型,含 6 个转动副与 From Workspace 数据入口
Assem1_DataFile.m10 KB模型自动生成的参数文件(连杆尺寸 / 质量 / 惯量),改结构后由 Simscape 重新导出
Part1.STL ~ Part6.STLendeff.STL共 0.9 MB7 个连杆 / 末端 STL 网格,仿真可视化用
Part1~Part6 / endeff · STEP共 0.58 MB同上的 STEP 实体,可用于改结构或转其他格式(本站的 在线 STL→STP 转换工具也能处理这类模型)
armIK.m · goToXYZ.m · moveBoth.m1~2 KB交互式 IK 工具、XYZ 目标点下发、真机 + 仿真同步相对移动
drawSquare.m · armWave.m · objectPicking.m1~3 KB动作库:垂直方形、挥手、抓取放置序列
demoPositionLock.m · demoOrientationLock_XYZsweep.m1.5~1.7 KB两个锁定演示:位置锁定与姿态锁定 + XYZ 扫掠
nullspaceDemo.m · findDemoPoint.m1.4~1.8 KB零空间冗余演示与可达点搜索

vision · 视觉脚本与标定数据

文件大小说明
calibrate.py · calibrate picam.py5.6~6.2 KB棋盘格内参标定(普通相机 / 树莓派 PiCam 两版)
homography.py3.7 KB单应矩阵求解:像素坐标 → 世界坐标
segmentation.py · detect_picam.py4.6~4.8 KB颜色分割与目标检测主程序(含 YOLO 调用)
camera_matrix.npy · dist_coeffs.npy200 / 168 B标定结果:3×3 内参矩阵与畸变系数
candy.yaml183 B颜色阈值参数(糖果检测示例)
calib_photos/(20 张)共 1.4 MB用于复现标定的棋盘格照片

firmware · STM32H743 固件工程(170 文件 / 11.8 MB)

路径说明
REQUIREMENTS.txt构建与硬件说明:工具链、引脚映射表、脉冲当量、USB CDC 三个必要条件、串口协议全文
Test1.0.iocSTM32CubeMX 配置(时钟树、TIM6 2 kHz、USB CDC、SPI1 等)
Core/Src/main.c主程序:步进推进、夹爪 PWM、协议解析、编码器读取都在这里
Core/Inc/main.h · stm32h7xx_it.c引脚定义与中断服务函数
NeuralNexusArm1.0 Debug.launchSTM32CubeIDE 烧录 / 调试配置,导入后可直接编译下载
STM32H743VITX_FLASH.ld · Drivers/ + Middlewares/ + USB_DEVICE/链接脚本与 ST HAL / CMSIS / USB 中间件(工程开箱可编译,无需另装固件包)
💡 想直接看代码重点:先读 firmware/REQUIREMENTS.txt(一页讲清全部分配),再看 Core/Src/main.c 里的步进推进与协议解析,最后对照 ik-matlab/GUIDE.txt 理解上位机怎么调它。

🚀 第七段:快速开始(三步跑通)

  1. 固件:STM32CubeIDE 导入 firmware/ 工程(含 .launch 配置)→ 编译 → ST-Link 烧录 → 确认板子枚举出 USB 虚拟串口。若从 CubeMX 重新生成代码,必须重新注释掉 MX_SDMMC1_SD_Init()——没插 SD 卡时它会直接陷进 Error_Handler() 导致开机死机。
  2. 上位机:MATLAB 打开 ik-matlab/,按 GUIDE.txt 第 0 节初始化(jointDataimportrobot → 关节限位 → IK 求解器 → 串口),再跑 goToXYZarmIK
  3. 免 MATLAB 路径:用 Chrome / Edge 打开官方控制面板 HTML → Connect arm → 选串口 → 直接下发角度。接管前先 clear s 释放 MATLAB 占用的串口,否则打不开。
⚠️ USB 不枚举时按顺序查三件事:① HSI48 是否已路由为 USB 时钟源(RCC_USBCLKSOURCE_HSI48);② HAL_PWREx_EnableUSBVoltageDetector() 是否在 MX_USB_DEVICE_Init() 之前调用;③ 用的是板载 USB-C(PA11 / PA12)而不是 ST-Link 的 USB 口、且线材支持数据。COM 号乱跳就去设备管理器卸载隐藏设备后重插。

🐛 第八段:踩坑要点(这一节最省时间)

📊 项目当前状态(官方自评)

子系统状态
6 轴步进控制 / USB CDC / 关节映射 /方向符号✅ 完成
MATLAB IK 流水线 / 同步数字孪生 / 夹爪舵机✅ 完成
编码器读取(AS5047P,重复精度 ±0.01°)✅ 完成
动作库(5 个序列 + 挥手 + 方形)与浏览器控制面板✅ 完成
归零 J4 / J5 / J6🟡 可用,标度验证中
归零 J1 / J2 / J3🔴 受阻(编码器安装比例导致多义性)
pulsesPerJointRev 标定🟡 J6 实测 3200(非设计 1600),其余待测
绝对定位🟡 目前仅 1:1 腕关节可行
3.3 V LDO 更换🔴 需先测 LDO 焊盘处实际 VIN
闭环步进修正 / 视觉抓取联调⚪ 计划中
📌 这套状态表本身就是很好的学习材料:它清楚标出了「哪一层已经可用、哪一层还差什么条件」——自己做机械臂时,先打通相对模式 + 仿真同步,再攻绝对定位,是比一上来就追求闭环更现实的路。

⚖️ 许可与使用提示

🔗 官方资料直达

❓ 常见问题

这台臂适合照着复刻吗?

它更适合当作全栈学习范本而不是「照抄即可」的复刻项目:固件、仿真与视觉都在活跃开发中,绝对定位尚未完成。如果你想要一台资料成熟、装完就能稳定用的六轴臂,可以先看本站的 Faze4 / PAROL6 分册;想学「一台机械臂每一层怎么写」,NeuralNexus 的链路完整度很高。

没有 MATLAB 授权能玩吗?

能操作真机——官方提供基于 Web Serial API 的浏览器控制面板,Chrome / Edge 打开 HTML 就能连串口下发角度。但数字孪生与逆运动学部分依赖 MATLAB(Robotics System Toolbox + Simscape Multibody);想绕开可以用 Python 自己实现 IK,成本在于模型参数要自己量。

为什么运动是「相对」的?

绝对定位需要可靠的零位,而零位依赖 AS5047P 编码器的归零标定;J1~J3 因为编码器安装比例带来的多义性问题尚未完成归零,所以固件目前只开放相对增量模式。J4~J6 的归零已经可用。

编码器读数乱跳,是传感器坏了吗?

按官方经验,先怀疑软件而不是硬件:读函数失败时返回的 -1 哨兵值被计入采样均值,会让静止关节显示 60~70° 的漂移。过滤掉这些值后再平均,重复精度可达 ±0.01°。

能把这套代码用到别的机械臂上吗?

架构可以直接借鉴:2 kHz 统一步进 ISR + 文本协议 + 上位机求解 IK 的分层设计比较通用。但要改的参数不少——关节↔电机映射、每轴脉冲当量、关节限位与连杆尺寸,还要把 Simscape 模型换掉或重新标定。Apache-2.0 允许这么做,保留许可声明即可。

✅ 下一步

建议顺序:先读 docs/Neural_Nexus_Final_Report.pdf 建立整体印象 → 用 ik-matlab/GUIDE.txt 在 MATLAB 里跑通仿真与 IK → 再刷固件连串口试相对移动 → 最后才碰视觉标定。每一步只动一层,出了问题容易定位。