宇树A1电机折腾笔记
文章目录电脑SDK控制变态的硬件接线环境配置下位机直接控制上图就是笨笨的宇树A1这是我目前为止转过的最难转的电机。电机的说明书、SDK链接都来自MATH-286-Pro的视频提供宇树A1相关资料、宇树官方SDK仓库。这篇笔记分两部分先使用SDK驱动电机再迁移到STM32下位机上。电脑SDK控制变态的硬件接线首先驱动宇树A1需要的是RS-485格式的信号这是一种类似CAN的差分信号但和CAN不同的是并不采用总线方式而是直接把TTL串口信号的方波复制一遍并镜像因此一条线的串口信号就需要两条A/B线来传输下图是我用示波器测出来的完美RS-485方波我们的大致思路是电脑接一个USB转TTL模块下游再接一个TTL转RS-485模块下游再接电机这是我这次选择的硬件队里也只有这一套USB转TTL模块FT232HTTL转RS-485模块MAX13488由于宇树A1需要的波特率极高4.8MBd一般常用的CH340、CH341都不支持FT232H是少有支持高波特率的USB转TTL/GPIO/I2C/SPI多功能芯片最高支持12MBd非常适合这一场景MAX13488则最高支持16MBd分别是下面两张图然后就是具体的接线FT232HMAX13488AD0TXTXAD1RXRX5V5VGNDGND默认状态下AD0就是FT232H的TX脚AD1就是FT232H的RX脚。这里非常容易搞错的是RX对RXTX对TX而不是交叉相接可以这样理解因为MAX13488并不是“对面的目标”而是“我方的中转站”接线正常情况下MAX13488上的TX灯会亮起这个灯是红灯红灯并不代表出错反而是成功。下面是宇树A1的接口线序上图方向插线的3pin口从左至右分别是GND、A、B左右两个3pin口线序完全一致可以用于串联多个电机。直接B接BA接AGND接GND连到MAX13488另一端即可。最早提到过对于差分信号一根线的数据应该需要一组A/B线才能传输按照这样的逻辑RX/TX应该需要两组A/B线一共四条线但我们看到MAX13488和电机侧只有一组A/B线。这是因为宇树A1仅支持半双工而RX/TX TTL通信是全双工MAX13488进行了转换原先是发送接收可以同时进行两条线互不干扰但现在只有一条线一组A/B只能表示一条线的信号因此无法同时传输这里MAX13488芯片自动处理了阻塞的逻辑。环境配置建议在Linux系统下使用SDK更快捷方便。我在Ubuntu 22.04 LTS环境中测试通过其他发行版可能出现各种版本问题无法编译我使用的ArchLinux由于gcc太新就报错其他发行版可以使用Distrobox不需要重装系统这里不多赘述。gitclone https://github.com/unitreerobotics/unitree_actuator_sdkcdunitree_actuator_sdkmkdirbuildcdbuild cmake..makesudo./changeID七行命令就可以编译运行更改ID的程序。其中会要求你输入USB设备路径一般情况下都是/dev/ttyUSB0如果你不确认是不是这个设备可以做一个简单的测试ls/dev|grepttyUSB运行这个命令只有一个ttyUSB0那就不用想了如果有好几个可以尝试拔掉FT232H再运行看看哪个设备消失了消失的就是FT232H。changeID运行后会输出[WARNING] SerialPort::recv, unblock version, wait time out [WARNING] motor id187 does not reply Please turn the motor. One time: id0; Two times: id1, Three times: id2 ID can only be 0, 1, 2 Once finished, press a看到wait time out和does not reply不需要慌张因为接收电机信息的线路一直比较抽风我们只要保证能给电机发送信息就能正常驱动电机包括速控和位控。如果运行changeID后电机突然锁死内部发出声音再按a回车声音消失就是接收到了信息。如果一切正常就可以开始设置ID宇树A1的ID只有0、1、2。这里的ID设置方式极度硬核人为外力把电机完整的转一圈再按a就是0两圈就是1三圈就是2由于电机设置ID时会有很大的位控阻力转动会有强烈的棘轮感建议像本文第一张图那样加两个螺丝这样外力更好拧说明书也是这么建议的。ID设置完需要在example/example_a1_motor.cpp中修改serial()和cmd.id分别是USB设备路径和电机ID再编译运行example_a1_motor电机应该就能以默认参数速控开转。这里给一组位控的参数n在这里是圈数cmd.kp0.1;cmd.kd2;cmd.qn*6.28*queryGearRatio(MotorType::A1);cmd.dq-3.14*queryGearRatio(MotorType::A1);cmd.tau0.0;下位机直接控制这里使用STM32F405RGT6为例直接控制宇树A1电机。对于接线和上面电脑连接的逻辑相同现在不过变成MCU上的RX脚接MAX13488的RXMCU上的TX脚接MAX13488的TX。这里需要注意的是需要使用F4主控的USART1或USART6因为这两个串口挂在APB2上支持84MHz的时钟频率在默认采样模式OverSampling16下是5.25MBd的最高波特率而另外几个挂在APB1上最高2.625MBd不满足我们4.8MBd的条件。将完整通信协议迁移到下位机的详细代码构建流程不多赘述这里我可以给出两个资料参考一个是电机接收报文格式也摘取自之前开头的宇树A1相关资料~~这里的markdown格式喂给AI更方便~~字节偏移变量名数据类型说明物理量换算公式 (发送前)0start[0]uint8帧头固定0xFE-1start[1]uint8帧头固定0xEE-2motorIDuint8目标电机ID (0~2)0xBB为广播-3reserveduint8预留固定 0-4modeuint8控制模式 0: 停转 5: 开环缓转 10: 闭环伺服-5ModifyBituint8参数修改位 (通常 0)-6ReadBituint8读取参数位 (通常 0)-7reserveduint8预留 (通常全 0)-8-11Modifyuint32参数修改位 (通常全 0)-12-13Tint16前馈力矩 (Nm)Target_T * 25614-15Wint16目标角速度 (rad/s)Target_W * 12816-19Posint32目标位置 (rad)Target_Pos * 16384/(2*PI)20-21K_Pint16位置刚度 (系数)Target_Kp * 204822-23K_Wint16速度刚度 (系数)Target_Kw * 102424LowHzuint8低频控制索引-25LowHzuint8低频控制值-26-29Resuint8[4]预留-30-33CRCuint32CRC32 校验码校验前 30 个字节另外一个是我根据这个格式写vibe coding的下位机驱动代码测试通过已经推送到GitHub。