来源:https://zhuanlan.zhihu.com/p/1997088909
0 前言
在今年八月份的时候,看到了《黑神话·悟空》的发布,想起来86版西游记孙悟空扮演者六小龄童老师讲述自己在拍摄《西游记》的时候买了一只猴子在家,方便观察真实猴子的各种动作和神态,这为他的饰演提供了宝贵的灵感,于是想着自己目前也在从事相关的工作,能不能学习六小龄童老师的经验,弄一台桌面级的小型机械臂,方便自己研究和学习机械臂各种动作和形态,快速验证一些规划算法呢!
于是在网上查找了各类小型机械臂的产品,搜了一圈之后发现,发现很多是舵机驱动的机械臂,这对于3D打印0.2mm的精度要求来说是不够的,稍微好一点的成本也比较高,想到了两年前稚晖君开源了一款机械臂系统,看起来还挺帅的,于是乎找到了稚晖君开源的仓库并克隆下来研究。
接下来,通过这篇文档,我记录了学习和复现这个项目的过程。鉴于很多小伙伴对此感兴趣,我也将这些记录贴出来,供大家参考。
开源链接:https://github.com/peng-zhihui/Dummy-Robot
下面就大家关心的问题,比如成本和材料来源问题做一个摘要,列了两个摘要表,如下:
序号 | 材料类型 | 预计费用 |
---|---|---|
1 | CNC金属件 | 3360 |
2 | 塑料装饰件 | 250 |
3 | 电子元器件+电机 | 1500 |
4 | PCB硬件 | 130 |
5 | 谐波减速器 | 4400 |
6 | 工具设备 | 300 |
7 | 小结 | 9940 |
工具由于自己之前攒过一些类似于螺丝刀,回流焊焊台,烙铁等工具,为了制作这个项目又添加了一些工具,包括数字电源、百分表、电动螺丝刀等,并且攒了若干电子元器件等,最终算下来我这台的Dummy手子的纯成本在9500元左右(不包括最末端电机减速器,加上末端减速器成本就超过一万了)。
部分重要物料及其购买链接也列了一个表,如下:
1. 需要注意的是这只是其中一部分物料,还有例如电容电阻、晶振、电源管理芯片等等物料未一一列举,这些材料的购买渠道其实很多,就没有一一列举。
2. 另外电机电机选择3颗42型号步进电机,长度可以选择34mm、42mm、23mm,3颗20型号的,长度选择28mm,这里电机长度并不是固定的,可以根据实际情况更改!提醒一下,轴长选择相对较短的,比如10mm左右的,这样避免电机的轴太长导致塑料装饰盖板装不上去。
1 结构零件篇
结构件分为金属框架和塑料的装饰件。金属结构固件主要是要使得机械臂构型满足Pieper判据(也就是机器人的三个相邻关节轴交于一点或三轴线平行),才能得出解析解。

1.1 零件处理
如果我们能够以比较合理的价格买到原版的哈默纳科谐波减速器,那么结构件是不用修改的,但是由于目前二手难找,且咸鱼二手98新的要一千八甚至更贵,六颗加起来成本太高了,不划算。那么是否有国产替代呢?答案是有的,比如鑫拓智能。
这款谐波与哈默纳科CSF-05-xx-1U这款型号的谐波体积对比如下:

从这个对比图可以看出,目前(2024年10月)CSF-05-xx-1U这款型号的谐波,鑫拓的比哈默纳科要长一些!而且输出端固定盘与法兰盘,鑫拓也比哈默纳科的要厚一些。那厚多少呢?


哈默纳科减速器的固定盘与法兰之间的距离为3mm,鑫拓减速器的固定盘与法兰之间的距离为3.5mm,也就是说鑫拓比哈默那科厚0.5mm。所以在 Joint5 和 Joint6 两个关节上,我们需要缩 0.5mm。因此,我的修改如下:
- Joint5 往内缩 0.5mm

- Joint5 往内缩 0.5mm

然后看CSF-08-xx-1U谐波,两个品牌的尺寸对比:

一对比大概就能看出尺寸大小,同样地,具体尺寸为:


鑫拓减速器的螺丝固定盘与法兰盘之间的距离为5mm,哈默那科为3.0mm,所以鑫拓的比哈默纳科厚了2.0mm,因此按照这种分析,Joint1和Joint3要内缩2mm左右。


另外有些装饰件也需要修改,在Joint5上塑料装饰件装不上,这里需要修改一下:

由于这里个关节安装槽本身比较浅,国产鑫拓减速器又稍微长一些,导致这里的盖板安装不上,大家可以将这里的盖板拉厚 2.0mm ~ 3.0mm 就足够了。
另外,我还修改了垫片的厚度。

第三处修改是底部固定板,我将原来的大底板修改为小底板,如下:

加工厂商找的嘉立创,注意自己简单截个图标记一下每个地方的螺孔型号即可。

1.2 减速器器型号选择
减速器型号:
- 关节1减速器:CSF-11-30-1U-CC-SP (电机直连)
- 关节2减速器:CSF-08-30-1U-U (轴输出)
- 关节3减速器:CSF-08-30-1U-U(轴输出)
- 关节4减速器:CSF-05-30-1U(轴输出)
- 关节5减速器:CSF-05-30-1U(轴输出)
- 关节6减速器:CSF-05-30-1U-C (电机直连)
关于谐波减速器命名规则如下:

备注:减速器这一块我把Joint2和Joint3处购买的是 CSF-08-xx-1U-U 50减速比,原版是30减速比的。原因在于前者在整个机械臂的关节中负载是最大的,由于担心30减速比的不足以支撑住,故采用了50减速比的,但是实际上不影响。
1.3 同步轮与同步带
同步带的长短选择很关键,太长会有冗余,传动运行不流畅,太短则会卡住,动不了。
同步轮:
参考购买连接:https://item.taobao.com/item.htm?_u=f23dkfq29451&id=729262123840&spm=a1z09.2.0.0.698a2e8dWkxPEY
同步带:
参考同步带购买连接:https://item.taobao.com/item.htm?_u=f23dkfq221ed&id=793782134585&spm=a1z09.2.0.0.67002e8d1JksOK
具体细节:
- Joint2 电机与减速器之间的同步带长度为 150mm,同步轮型号为 2GT,电机和减速器的同步轮内孔选择 5mm 的,带宽为 6。

- Joint3 电机与减速器之间的同步带之间的长度为 118mm,同步轮型号为 2GT,电机和减速器的同步轮内孔选择 5mm 的,带宽为 6。

这里图片中标注的是116mm,我文字部分推荐的是118mm,是不是矛盾了呢?解释一下,在实际制作过程中,116mm和118mm都可以安装,116mm稍微有点紧,118mm又有点松,但是购买不到117mm的,如果非要选择的一个的话,推荐118mm的,大家可以都买回来自己试一下!
- Joint4 关节电机与减速器之间的同步带长度为 86mm,同步轮型号选择 2GT,20电机同步轮内孔选择 4mm,CSF-05-xx-1U 减速器同步轮内孔选择 3mm 的。

- Joint5 电机与减速器之间的同步带长度为 184mm,同步轮型号选择 2GT,20电机同步轮内孔选择 4mm,CSF-05-xx-1U 减速器同步轮内孔选择 3mm 的

至此,结构部分全部结束,下面进入电路篇。
2 电路硬件篇
2.1 电机驱动器
电机驱动板子有两类,一个是42步进电机驱动板,一个是20步进电机驱动板,直接把PCB文件压缩成包或者转成Gerber文件送去嘉立创打样即可。
元器件选型这里有几个位置位置需要注意:
- 高压端滤波电容的选择,选择50V耐压的


- 接地电阻的选择
接地电阻选择 1206,0.1欧姆

- MT6816 选择具备SPI通讯功能的
MT6816具有多个型号,如MT6816CT-STD、MT6816CT-AKD、MT6816CT-ACD等,这里选择MT6816CT-STD(SPI通讯的),这个型号测试可行。
- CAN通讯要串上120Ω电阻
注意,驱动电路上要将CAN通讯的120Ω电阻接入,也就是电路板上的跳线要通过飞线连通,例如20步进电机驱动板上的跳线处连接如下:

42步进电机也是同样的,注意将跳线连通。
小Tips:20步进电机驱动器很小,最好在开始进行回流焊的时候就要注意将飞线放上去,因为空间很狭小,等焊接好了再去焊接这里的跳线难度就比较大了。
另外如果是自己焊接的电路,可能需要对硬件进行Debug,硬件Debug的方法比软件要多很多,大家熟能生巧,我总结了这么几点技巧,分别是:
- 对于驱动,焊接好之后第一个要做的事情是测电源是否短路。
- 注意虚焊,注意短路,虚焊问题用电表打到连通挡,逐个连接点去测试,短路问题首先就是要注意观察,有没有连锡问题,其次就是注意用钢网,上焊台,这样可以减少短路问题。
- 上电之后,注意电源3V3,5V供电是否正常,芯片的VCC和GND电压是否正常,SWD引脚连接是否正常,这确保了电脑是否能够正常连接并识别驱动板
关于下载器与芯片之间连通性测试方法,可用通过Keil软件来查看,如下:

- 测试连通性,几个比较重要的点,分别是:按键、TB67H450、MT6816、CAN,对着PCB文件一点一点测。
2.2 控制板 – Base
这个板子主要功能是提供电源、通讯功能,测试的时候主要测电源。

这里电路测试的技巧如下:
- 测试电源电压是否正常
- 对着PCB图逐个测试是否存在虚焊,短路
2.3 核心板 – Core
核心板子测试也是如此,没有太多技巧,就是认真焊接。
2.4 常见问题
2.4.1 虚焊和短路
虚焊问题非常常见,多拿电表去测,调试过程中我遇到的一些问题如下:
- 电源滤波电容击穿
对于上电后板子冒过烟的要尤其注意,板子冒烟的可能是电源滤波电容被击穿了,造成电容短路。
- 3.3V电源和GND短路
这个遇到过好几次,怎么都找不出问题,后来把STM32芯片换掉之后,就好了。
2.4.4 检查芯片方向是否焊接错误
F405芯片和F103芯片封装标识是不一样的,F405芯片上有两个点,一个大点,一个小点,注意芯片上的小点与PCB丝印上的点对应。

检查芯片几个VCC和GND引脚电压是否正确,核心板上的灯亮不亮。

2.4.3 程序下载
下面是几个重要电路的之间的连接顺序:
工具:ST-Link :ST-LINK V2 STM8/STM32仿真器编程stlink下载器线烧录调试单片机-tmall.com天猫


备注:原版42步进电机这里的丝印标记GND和DIO和实际是反过来的,在调试程序的时候要留意一下。


驱动板与电机之间的连接
提醒一下:电机的连接看购买电机的说明文档。


至此,硬件电路篇结束,下面进入软件调试篇!
3 软件调试篇
3.1 集成开发环境
结构设计:Fusion360
硬件设计:Altium Designer
软件开发:VSCode、Keil v5、CLion、STM32 ST-Link Utility
3.2 软件调试篇
3.2.1 LED Ring
开发环境:VSCode + PlatformIO
搭建教程:使用VSCode进行Arduino与ESP32开发配置指南 – 小牧同学 – 博客园
ESP32的开发方式很多,网上的教程也很多,可以选择自己喜欢的方式。
板子选择ESP32 Pico

这里给一些参考的控制代码:
- 彩虹循环流动效果
#include <Adafruit_NeoPixel.h>
#define PIN 13
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
}
void loop() {
rainbowCycle(20);
}
void rainbowCycle(int wait) {
for (int j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, Wheel(((i * 256 / NUMPIXELS) + j) & 255));
}
pixels.show();
delay(wait);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
- 呼吸灯效果
#include <Adafruit_NeoPixel.h>
#define PIN 13
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
}
void loop() {
breathEffect(255, 0, 0, 10); // 红色呼吸
breathEffect(0, 255, 0, 10); // 绿色呼吸
breathEffect(0, 0, 255, 10); // 蓝色呼吸
}
void breathEffect(byte red, byte green, byte blue, int wait) {
for (int i = 0; i < 256; i++) {
int brightness = (exp(sin(i / 128.0 * PI)) - 0.36787944) * 108.0;
pixels.fill(pixels.Color(red * brightness / 255, green * brightness / 255, blue * brightness / 255));
pixels.show();
delay(wait);
}
for (int i = 255; i >= 0; i--) {
int brightness = (exp(sin(i / 128.0 * PI)) - 0.36787944) * 108.0;
pixels.fill(pixels.Color(red * brightness / 255, green * brightness / 255, blue * brightness / 255));
pixels.show();
delay(wait);
}
}
- 流动彩虹效果
#include <Adafruit_NeoPixel.h>
#define PIN 13
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
}
void loop() {
colorWipe(pixels.Color(255, 0, 0), 50); // 红色流动
colorWipe(pixels.Color(0, 255, 0), 50); // 绿色流动
colorWipe(pixels.Color(0, 0, 255), 50); // 蓝色流动
}
void colorWipe(uint32_t color, int wait) {
for(int i=0; i<NUMPIXELS; i++) {
pixels.setPixelColor(i, color);
pixels.show();
delay(wait);
}
}
- 彩虹渐变效果
#include <Adafruit_NeoPixel.h>
#define PIN 13
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int rainbowSpeed = 20; // 调整彩虹渐变的速度
int rainbowOffset = 0;
void setup() {
pixels.begin();
}
void loop() {
rainbow(rainbowSpeed);
}
void rainbow(int wait) {
for (int j = 0; j < 256; j++) {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, Wheel((i + j) & 255));
}
pixels.show();
delay(wait);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
常见问题
- 识别不到串口:USB线插反了或者存在虚焊
- 程序下载不进去:存在虚焊或者ESP32芯片损坏了
3.2.2 REF Core
1.程序下载
开发环境搭建:稚晖:配置CLion用于STM32开发【优雅の嵌入式开发】
- ST-Link 识别不到芯片
这是搞定硬件之后我们可能遇到的第一个问题,就是无法识别到芯片,大家各有各的Debug方式,这里分享一下我自己的Debug经验:
- 检查芯片方向是否焊接错误
- SWD连接线虚焊
检查下载程序的三根线是否是通路,是否存在虚焊,适量补补锡。
这里存在一个问题,就是核心板与底板安装上去之后,芯片在背面,无法直接测芯片引脚与JST(底板上的塑料接线端子)之间的连通性,我的方法是分段测,首先测芯片到核心板上的板间连接件之间的连通性,其次测底板上的连接件与JST接线端子之间的连通性。通过这种方式间接测芯片与接线端子之间的连通性。
2. 无法识别USB设备驱动
通过USB将机械臂连接计算机,设备管理器中不显示设备驱动。
- 检查驱动是否安装,是否安装正确

- 虚焊问题
- USB线的问题
普通的手机充电线就可以,这个存在问题的概率很小,但是如果什么问题都排除了都找不到问题,可以考虑是否是USB线的问题。注意,USB线正反接功能不同,一个是串口功能,一个USB功能,要连接到USB功能方可。
3. 屏幕不亮
Ref板连接电机之后,上电发现屏幕不亮
- 检查OLED引脚与芯片对应引脚之间的连通问题,检查是否存在虚焊。
- 检查电源电压是否正常,OLED电源引脚电压,电机电压等。
- 注释掉代码中通讯相关代码,再次下载调试,注释内容如下。

这样做的目的是暂时先避免掉CAN通讯问题造成的显示异常问题,REF板测试没问题后在取消这里的注释。
4. 减速比配置
如果更改了减速器的减速比,在DummyRobot类的构造函数中修改减速比,如下所示:

3.3.3 Motor Driver
1. 只用CLion打开项目文件,注意,第一次打开选用Debug模式,因为我们需要通过Debug获取设备ID

2. 设置 OpenOCD

3. 设置 stlink.cfg 配置文件

4. 然后编译程序

这里提示找不到这些类的函数实现,这些属于基类的虚函数,这个时候将提示的虚函数设置为 = 0
5. 将提示的虚函数设置为 = 0


6. 修改完成后,继续编译并烧录,没有错误提示的话就可以烧录程序了。

7. 打断点并进入调试模式

注意将这里的参数填写到对应电机节点位置,比如这里是Joint1号电机,那么此时就可以将这里的参数填写到对应case后面。
8. 将模式修改为Release模式
接下来重点,注意看上面程序编译完之后Flash占用率为86%,驱动程序中编码器的位置参考数据用32Kb,这说明要占用芯片Flash末尾25%的空间,也就是说代码占用空间必须低于75%。所以这里的86%明显不行,怎么解决这个问题?办法之一是将Debug模式切换为Release模式。

注意:修改完成之后要Reload一下CMake文件

注释掉下面这段函数。

如果这样做完之后占用的Flash还是超过75%,可以考虑把没用的功能删掉,比如串口!
9. 编译程序
接下来发现编译完Flash占用率为66.07%,满足要求。

如果发现修改为Release之后,占用的Flash和Debug模式差不多甚至更大,可以考虑换一个新的代码,打开的时候直接选择Release,然后修改ID号。
如果不想调试,那么更简单的办法是直接把代码中判断的过程删掉,根据电机使用于哪一个关节定义defaultNodeID,就省的调试了。如下:

程序下载完成之后就是测试,测试就是将两个按键同时按下,然后上电,一切正常会出现电机旋转一圈,然后减速正向旋转一圈,然后反转一圈。
用STM32 ST-LINK Utility软件来进行检查是否校正成功。
软件下载链接:https://www.st.com/en/development-tools/stsw-link004.html

拉到0x08017C00地址处,正常情况下是这样的:

异常情况是这样的:

这表明编码器校正失败了,这种情况下可能如下:
- 纯粹写入失败,这种情况下,多校正几遍。
- 多校正几遍还是没有写进去,看一下芯片是不是被锁住了,是不是还能下载程序?
- 硬件问题,比如MT6816与MCU之间的连接问题,是否存在短路、虚焊等,造成SPI通讯失败。
当然,还有一些可能情况,这里也一并记录下来了:
1. STM32 ST-LINK Utility软件连接不上芯片。
这种情况下一般是硬件还没有调稳定,其实up自己在调试的时候碰到过很多这种问题,但多下载几次程序,调节一下电路,上电工作一段时间,前面碰到的问题就慢慢消失了。
2. 按键上电后电机没反应
上述工作还是比较顺利的,实际上也存在不顺利的情况,情况之一是按下两个按键上电后,电机没有任何反应。这种情况下需要去检查电路是否存在虚焊和短路问题,特别是TB67H450的电压是否正常,与MCU之间的连接是否正常。具体为:
- 按键与芯片之间的连接问题,存在虚焊
- TB67H450的电压异常

- TB67H450几个引脚与MCU之间的连接是否正常
基本也就上面几个问题,上面问题解决也就没什么问题了。
调试完成按Key1,电机进入闭环模式,也就是说电机这个时候你用手去掰是需要使点劲的,并且松手后会立马返回原来的位置。
3.2.5 与Ref板子联合调试
上述问题解决完成之后就可以进行电机与Ref板的联合通讯调试。
- 安装 libusb-win32 驱动程序
稚晖君开源仓库的Software中提供了两个工具,一个是CLI工具,一个是他自己写的上位机软件Dummy Studio,在Windows系统下,要使用这个CLI工具,需要先安装几个软件,分别是:
- ipython
参考安装教程:IPython的安装及使用技巧整理_ipython安装-CSDN博客
安装好 ipython 后,打开 CMD DOS 窗口。
# 进入 ipython
ipython
# 安装 pyusb
pip install pyusb
- windows系统下面还需要安装libusb,下载libusb驱动:libusb。
- 将 libusb-1.0.dll 文件的路径添加到环境变量中去

这里提供了run.bat的快捷键,双击即可

一切都没问题的话,效果如下:

调式到此,机械臂就已经能够动起来了。
4 总结
至此,桌面机械臂的基础制作介绍就全部结束了。总结一下,整个项目主要分为三大部分:结构、硬件和软件。
结构方面,机械臂的设计满足Pieper判据。由于哈默纳科谐波减速器难以购买且成本高,我们选用了国产鑫拓的同型号谐波减速器,并对结构进行了微调以适应尺寸差异。
硬件部分无需特别调整,重点是元器件选择,并且焊接和测试时保持耐心,避免虚焊、短路若干等问题。
软件和固件则要关注异常中断和Flash内存的占用。对于电机驱动,使用STM32F103CBT6芯片时,需预留32KB用来存储位置校正数据,固件占用的Flash不应超过75%。特别是在Debug模式下,可能出现内存占用过大的情况,导致校正数据被覆盖,从而引发程序异常。同时要注意利用Debug的方式获取关节电机的ID,并填写到对应的代码中。如果不想通过Debug的方式获取defaultNodeID,可根据电机使用于哪一个关节直接定义defaultNodeID,然后再下载程序调试。
目前市面上很多学习用的机械臂项目存在质量和资料不完善的问题,这对机器人入门者不够友好。而本项目无论在结构设计、开源资料量还是技术深度上,都具有较好的参考价值,感谢稚晖君的分享。
最后分享一段在《肖申克的救赎》这部电影中的看到的台词,“我小时候只见过一辆汽车,现在满大街都是”。


或许几十年后,一位老者会在回忆录中写下:“我小时候只在展览会上见过机器人给我倒了一杯果汁,而如今,机器人已无处不在”。
以上就是本文的全部内容,见识浅薄,仅供参考,希望本文对大家有帮助。
2024年10月
评论0