来源:https://zhuanlan.zhihu.com/p/1997088909

0 前言

在今年八月份的时候,看到了《黑神话·悟空》的发布,想起来86版西游记孙悟空扮演者六小龄童老师讲述自己在拍摄《西游记》的时候买了一只猴子在家,方便观察真实猴子的各种动作和神态,这为他的饰演提供了宝贵的灵感,于是想着自己目前也在从事相关的工作,能不能学习六小龄童老师的经验,弄一台桌面级的小型机械臂,方便自己研究和学习机械臂各种动作和形态,快速验证一些规划算法呢!

于是在网上查找了各类小型机械臂的产品,搜了一圈之后发现,发现很多是舵机驱动的机械臂,这对于3D打印0.2mm的精度要求来说是不够的,稍微好一点的成本也比较高,想到了两年前稚晖君开源了一款机械臂系统,看起来还挺帅的,于是乎找到了稚晖君开源的仓库并克隆下来研究。

接下来,通过这篇文档,我记录了学习和复现这个项目的过程。鉴于很多小伙伴对此感兴趣,我也将这些记录贴出来,供大家参考。

开源链接:https://github.com/peng-zhihui/Dummy-Robot

下面就大家关心的问题,比如成本和材料来源问题做一个摘要,列了两个摘要表,如下:

序号材料类型预计费用
1CNC金属件3360
2塑料装饰件250
3电子元器件+电机1500
4PCB硬件130
5谐波减速器4400
6工具设备300
7小结9940

工具由于自己之前攒过一些类似于螺丝刀,回流焊焊台,烙铁等工具,为了制作这个项目又添加了一些工具,包括数字电源、百分表、电动螺丝刀等,并且攒了若干电子元器件等,最终算下来我这台的Dummy手子的纯成本在9500元左右(不包括最末端电机减速器,加上末端减速器成本就超过一万了)。

部分重要物料及其购买链接也列了一个表,如下:

序号材料类型链接
1金属件、装饰件、PCB嘉立创
2同步轮 GT2 内孔5mmx2,内孔4mmx2,内孔3mmx2https://item.taobao.com/item.htm?_u=h23dkfq28a84&id=729262123840&spm=a1z09.2.0.0.67002e8d2172hh
3同步带 带宽6mm 长度 150mm 116mm 86mm 184mm各一个https://item.taobao.com/item.htm?_u=h23dkfq2008a&id=793782134585&spm=a1z09.2.0.0.67002e8d2172hh
4径向磁铁https://item.taobao.com/item.htm?_u=h23dkfq21ee7&id=625206450490&spm=a1z09.2.0.0.67002e8djwcyfO
524V电源接口https://item.taobao.com/item.htm?_u=h23dkfq2e53e&id=757880091354&spm=a1z09.2.0.0.67002e8djwcyfO
6SN65HVD232DR 丝印VP232 贴片SOP8 CAN接口https://item.taobao.com/item.htm?_u=h23dkfq26e1d&id=638824807361&spm=a1z09.2.0.0.67002e8djwcyfO
71206贴片电阻(注:必须0.1欧姆)https://item.taobao.com/item.htm?_u=h23dkfq27b07&id=597189463008&spm=a1z09.2.0.0.67002e8djwcyfO
8金属防水大电流充电接口母座子dc-099切边jack电源插座黑色[099薄切边2.0针]https://item.taobao.com/item.htm?_u=h23dkfq24563&id=537274510695&spm=a1z09.2.0.0.67002e8djwcyfO
9双槽0.5板对板连接器镀金BTB对插(买公母一对,高度4.5mm即可)https://item.taobao.com/item.htm?_u=h23dkfq23df4&id=744943082426&spm=a1z09.2.0.0.67002e8djwcyfO
10位置传感器 MT6816CT-STD(SPI通信协议)https://item.taobao.com/item.htm?_u=h23dkfq28f66&id=787183750904&spm=a1z09.2.0.0.67002e8djwcyfO
11WS2812B发光二极管5050RGB幻彩雾状LED灯珠https://item.taobao.com/item.htm?_u=h23dkfq2df06&id=675654937526&spm=a1z09.2.0.0.67002e8djwcyfO
12TVS瞬变抑制二极管SMBJ28CAhttps://detail.tmall.com/item.htm?_u=h23dkfq2b86f&id=624595809800&spm=a1z09.2.0.0.67002e8djwcyfO
13TB67H450FNGhttps://item.taobao.com/item.htm?_u=h23dkfq28390&id=762116758030&spm=a1z09.2.0.0.67002e8djwcyfO
14NRF24L01 无线模块https://item.taobao.com/item.htm?_u=h23dkfq2b447&id=40352572949&spm=a1z09.2.0.0.67002e8djwcyfO
15DET402-G-1 3*4.2*1.9MM SMD 电磁式无源贴片蜂鸣器https://detail.tmall.com/item.htm?id=14478416081&spm=a1z09.2.0.0.67002e8djwcyfO&_u=h23dkfq26020
16AO3400、AO3401https://detail.tmall.com/item.htm?id=14478416081&spm=a1z09.2.0.0.67002e8djwcyfO&_u=h23dkfq26020
17TYPE-C母座24P立贴https://item.taobao.com/item.htm?spm=a1z09.2.0.0.67002e8djwcyfO&id=758741222017&_u=h23dkfq2dd3f
18BC847BVC-7https://item.taobao.com/item.htm?_u=h23dkfq2d06f&id=745736036850&spm=a1z09.2.0.0.67002e8djwcyfO&skuId=5216335553595
19STM32F103CBT6、STM32F405RGT6https://detail.tmall.com/item.htm?id=738634809191&spm=a1z09.2.0.0.67002e8djwcyfO&_u=h23dkfq2fd70
20ABS垫高柱垫圈圆孔间隔柱https://detail.tmall.com/item.htm?_u=h23dkfq2dc70&id=631929683825&spm=a1z09.2.0.0.67002e8djwcyfO
21铜散热片纯铜芯片散热片、紫铜10x14x5mm 带导热胶纸https://item.taobao.com/item.htm?_u=h23dkfq24b6a&id=737677427613&spm=a1z09.2.0.0.67002e8djwcyfO
22阻燃尼龙编织网管套管电线蛇皮管6mm扁宽https://detail.tmall.com/item.htm?_u=h23dkfq2f525&id=577111328472&spm=a1z09.2.0.0.67002e8djwcyfO
23谐波减速器https://item.taobao.com/item.htm?_u=h23dkfq20505&id=675214253265&spm=a1z09.2.0.0.67002e8djwcyfO

1. 需要注意的是这只是其中一部分物料,还有例如电容电阻、晶振、电源管理芯片等等物料未一一列举,这些材料的购买渠道其实很多,就没有一一列举。
2. 另外电机电机选择3颗42型号步进电机,长度可以选择34mm、42mm、23mm,3颗20型号的,长度选择28mm,这里电机长度并不是固定的,可以根据实际情况更改!提醒一下,轴长选择相对较短的,比如10mm左右的,这样避免电机的轴太长导致塑料装饰盖板装不上去。

1 结构零件篇

结构件分为金属框架和塑料的装饰件。金属结构固件主要是要使得机械臂构型满足Pieper判据(也就是机器人的三个相邻关节轴交于一点或三轴线平行),才能得出解析解

机械臂构型需要满足Pieper判据

1.1 零件处理

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

这款谐波与哈默纳科CSF-05-xx-1U这款型号的谐波体积对比如下:

哈默纳科与鑫拓同类型号CSF-05-xx-1U谐波减速器体积对比

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

鑫拓CSF-05-xx-1u谐波减速器尺寸图
哈默纳科CSF-05-xx-01U谐波减速器尺寸图

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

  • Joint5 往内缩 0.5mm
Joint5缩短0.5mm
  • Joint5 往内缩 0.5mm
Joint5 内缩 0.5mm

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

哈默纳科与鑫拓同类型号CSF-08-xx-1U谐波减速器体积对比

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

鑫拓CSF-08-xx-1u谐波减速器尺寸图
哈默纳科CSF-08-xx-01U谐波减速器尺寸图

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

Joint1 内缩 2mm
Joint3 内缩 0.5mm

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

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
Joint2 电机与减速器之间的同步带长度
  • Joint3 电机与减速器之间的同步带之间的长度为 118mm,同步轮型号为 2GT,电机和减速器的同步轮内孔选择 5mm 的,带宽为 6
Joint3 电机与减速器之间的同步带长度

这里图片中标注的是116mm,我文字部分推荐的是118mm,是不是矛盾了呢?解释一下,在实际制作过程中,116mm和118mm都可以安装,116mm稍微有点紧,118mm又有点松,但是购买不到117mm的,如果非要选择的一个的话,推荐118mm的,大家可以都买回来自己试一下!

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

至此,结构部分全部结束,下面进入电路篇。

电路硬件篇

2.1 电机驱动器

电机驱动板子有两类,一个是42步进电机驱动板,一个是20步进电机驱动板,直接把PCB文件压缩成包或者转成Gerber文件送去嘉立创打样即可。

元器件选型这里有几个位置位置需要注意:

  • 高压端滤波电容的选择,选择50V耐压的
42步进电机高压端滤波电容的选择
20步进电机高压端滤波电容的选择
  • 接地电阻的选择

接地电阻选择 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

这个板子主要功能是提供电源、通讯功能,测试的时候主要测电源。

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开发【优雅の嵌入式开发】

  1. ST-Link 识别不到芯片

这是搞定硬件之后我们可能遇到的第一个问题,就是无法识别到芯片,大家各有各的Debug方式,这里分享一下我自己的Debug经验:

  • 检查芯片方向是否焊接错误
  • SWD连接线虚焊

检查下载程序的三根线是否是通路,是否存在虚焊,适量补补锡。

这里存在一个问题,就是核心板与底板安装上去之后,芯片在背面,无法直接测芯片引脚与JST(底板上的塑料接线端子)之间的连通性,我的方法是分段测,首先测芯片到核心板上的板间连接件之间的连通性,其次测底板上的连接件与JST接线端子之间的连通性。通过这种方式间接测芯片与接线端子之间的连通性。

2. 无法识别USB设备驱动

通过USB将机械臂连接计算机,设备管理器中不显示设备驱动。

  • 检查驱动是否安装,是否安装正确
检查驱动是否安装
  • 虚焊问题
  • USB线的问题

普通的手机充电线就可以,这个存在问题的概率很小,但是如果什么问题都排除了都找不到问题,可以考虑是否是USB线的问题。注意,USB线正反接功能不同,一个是串口功能,一个USB功能,要连接到USB功能方可。

3. 屏幕不亮

Ref板连接电机之后,上电发现屏幕不亮

  • 检查OLED引脚与芯片对应引脚之间的连通问题,检查是否存在虚焊。
  • 检查电源电压是否正常,OLED电源引脚电压,电机电压等。
  • 注释掉代码中通讯相关代码,再次下载调试,注释内容如下。
如何暂时屏蔽CAN通讯问题

这样做的目的是暂时先避免掉CAN通讯问题造成的显示异常问题,REF板测试没问题后在取消这里的注释。

4. 减速比配置

如果更改了减速器的减速比,在DummyRobot类的构造函数中修改减速比,如下所示:

减速器的减速器配置

3.3.3 Motor Driver

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

选用Debug模式

2. 设置 OpenOCD

设置 OpenOCD

3. 设置 stlink.cfg 配置文件

设置 stlink.cfg 配置文件

4. 然后编译程序

编译程序

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

5. 将提示的虚函数设置为 = 0

虚函数设置为 = 0
虚函数设置为 = 0

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

编译并烧录程序

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

打断点并进入调试模式

注意将这里的参数填写到对应电机节点位置,比如这里是Joint1号电机,那么此时就可以将这里的参数填写到对应case后面。

8. 将模式修改为Release模式

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

将模式修改为Release模式

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

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

STM32 ST-LINK Utility

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

查看位置数据是否校正成功

异常情况是这样的:

查看位置数据是否校正成功

这表明编码器校正失败了,这种情况下可能如下:

  • 纯粹写入失败,这种情况下,多校正几遍。
  • 多校正几遍还是没有写进去,看一下芯片是不是被锁住了,是不是还能下载程序?
  • 硬件问题,比如MT6816与MCU之间的连接问题,是否存在短路、虚焊等,造成SPI通讯失败。

当然,还有一些可能情况,这里也一并记录下来了:

1. STM32 ST-LINK Utility软件连接不上芯片。

这种情况下一般是硬件还没有调稳定,其实up自己在调试的时候碰到过很多这种问题,但多下载几次程序,调节一下电路,上电工作一段时间,前面碰到的问题就慢慢消失了。

2. 按键上电后电机没反应

上述工作还是比较顺利的,实际上也存在不顺利的情况,情况之一是按下两个按键上电后,电机没有任何反应。这种情况下需要去检查电路是否存在虚焊和短路问题,特别是TB67H450的电压是否正常,与MCU之间的连接是否正常。具体为:

  • 按键与芯片之间的连接问题,存在虚焊
  • TB67H450的电压异常
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 文件的路径添加到环境变量中去
将 libusb-1.0.dll 文件的路径添加到环境变量中

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

运行run.bat文件

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

CLI测试效果

调式到此,机械臂就已经能够动起来了。

4 总结

至此,桌面机械臂的基础制作介绍就全部结束了。总结一下,整个项目主要分为三大部分:结构、硬件和软件。

结构方面,机械臂的设计满足Pieper判据。由于哈默纳科谐波减速器难以购买且成本高,我们选用了国产鑫拓的同型号谐波减速器,并对结构进行了微调以适应尺寸差异。

硬件部分无需特别调整,重点是元器件选择,并且焊接和测试时保持耐心,避免虚焊、短路若干等问题。

软件和固件则要关注异常中断和Flash内存的占用。对于电机驱动,使用STM32F103CBT6芯片时,需预留32KB用来存储位置校正数据,固件占用的Flash不应超过75%。特别是在Debug模式下,可能出现内存占用过大的情况,导致校正数据被覆盖,从而引发程序异常。同时要注意利用Debug的方式获取关节电机的ID,并填写到对应的代码中。如果不想通过Debug的方式获取defaultNodeID,可根据电机使用于哪一个关节直接定义defaultNodeID,然后再下载程序调试。

目前市面上很多学习用的机械臂项目存在质量和资料不完善的问题,这对机器人入门者不够友好。而本项目无论在结构设计、开源资料量还是技术深度上,都具有较好的参考价值,感谢稚晖君的分享。

最后分享一段在《肖申克的救赎》这部电影中的看到的台词,“我小时候只见过一辆汽车,现在满大街都是”。

或许几十年后,一位老者会在回忆录中写下:“我小时候只在展览会上见过机器人给我倒了一杯果汁,而如今,机器人已无处不在”。

以上就是本文的全部内容,见识浅薄,仅供参考,希望本文对大家有帮助。

2024年10月

0

评论0

没有账号?注册  忘记密码?