##飞特STS3215舵机测试与使用记录--附带基础样例-记录笔记-第三章
前言说明
本篇分成两节来记录,由于发现与内容字数过多,于是将文章拆分,拆成两节来编写
第一节只是对于基础知识铺垫。
飞特STS3215舵机测试与使用记录–附带基础样例-记录笔记-第一章
第二节是针对具体功能的的实现等细节,以及其他注意的细节。
#飞特STS3215舵机测试与使用记录–附带基础样例-记录笔记-第二章
第三节,测试过程中的细节说明
协议与后期验证
如果使用这款舵机的话需要多次看协议,才能深刻理解之间通信发生了什么。之前说与舵机通信要尊重特定协议,格式如下图所示。为此在上章样例中我们测试代码用函数统一进行说明。
由上图可以知道,舵机通信时每帧数据都以"字头",“ID”,“有效数据长度”,“工作状态”,“参数”,"校验和"组成。
(1)控制转动>>>函数WritePosEx,如下所示,1为ID号,3048为要达到位置,500为速度,20为加速度。
// 1号 位置 速度 加速度
WritePosEx(1, 3048, 500, 20);
执行上列代码时,uart会发出什么数据内,以下为抓到实际发送数据,这张图非常纤细建议好好看看
咱们再按照协议对照下,就知道为啥起始地址时0x29了,如下图时起始地址,在0x29位置开始。
有输出有反馈,能理解很多东西。
(2)读取扭矩函数>>>函数ReadLoad,这个函数用于读取当前扭矩值,返回值有正有负,所以可以直接根据正负判断时哪个方向堵转了。
//带有少量外置结构时以500转速转动,大约200+的负载值
Load_value=ReadLoad(1);
以下为实际抓到的包,可以看到当前扭矩位为0
再对照看下,0x3C是不是负载
通过上述两个例子能很好认识到协议定义,以及如何应用在实际舵机通信中的。
细节以及遇到问题
魔鬼在细节中啊,使用与测试过程中,遇到了很多问题,这些问题值得记录下来,以便后续使用
(1)舵机可以摆动问题
舵机因为是有机械咬合部分,虽然有闭环控制等手短,但是机械部分无法做到那么精确,用手摆动,舵机有稍微的移动,这部分就是舵机死区,可以说大部分这类舵机,都有相似情况,无非好坏之分。
当时对手头舵机进行测试,测试如下图,测试结论大约摆动范围为正负0.3度左右。
(2)舵机是否能到达指定位置
这个问题其实和上述问题又想相似地方,每次控制舵机转到某个位置,其实舵机每次都会差一些,虽然请教了大佬,说可以设置死区等参数,尝试过不是很理想,当然也或许我尝试的次数不够多。
以下为对舵机测试截图,可以看到设置的目标和实际位置是由偏差的,根据舵机不同大约偏差0.2°左右。
以下为多次实验记录的表格。
(3)舵机在外力会出现移动位置现象
在实际测试中,发现如果舵机在扭矩使能的情况下,外力摆动,会使舵机的零点产生位移,下次再到零点是,会有相应的偏移。
什么事扭矩使能呢,简单说,就是舵机移动到某个位置,是否保持在当前位置,不允许掰动,如下协议。
通过下列函数,往0x28位置写值,m_nDat_data1为0时就是松开,为1时就是出力,为128时就是认为当前位置为2048,也可以说时校准,零位校准。
(4)参数异常问题
在调试舵机的时候,偶然碰见一个错误,如下图所示,舵机编号ID变成STSxx了,即使点击参数恢复,也没有任何办法,同时也无法操控以及其他操作等。
后来不断尝试,,在同事的提示下,将一个好的舵机参数先保存下来,然后载入这个有问题参数内,就修复了。
飞特官方给的解释时,多次点击恢复参数会碰到这个问题,不过自己测试了50次,还没遇到,这是一个偶发现象。
(5)运行时间计算
有时候我们让舵机运行的时候,想要知道运行一定角度,大概要多长时间,以下是飞特官方给出的计算公式
时间(单位s)=[(位置-目标)/速度]+(速度/(加速度*100))
举个例子,如下图所示,我想从2727移动到1727位置,加速度20,速度1000。那么就是[(2727-1727)/1000]+(1000/(20*100)) =1+0.5=1.5s,大约要耗时1.5秒,当你用其他速度与加速度,需要根据再次计算。
(6)角度换算
自己在测试过程中,一直在说位置,比如3048,或者其他数值什么的,其实说位置,相当于说角度。
舵机能够转一周即能转360度。而0°对应数值为0,360°对应数值为4096。
0度---180度---360度
0-----2048----4096
或者看下列说明,应该很清楚了
(7)移植过程中,参数不够报错
在尝试测试,或者说编写基础样例时代码报了一种错误,如下所示,
上网查这个错误问题,都是说少参数的问题,其实这里有点坑,其实时移植时,编译器不认识u8,自己当时移植正点原子代码,所以出现这个问题,如下该法。
(8)舵机的同步动作与立刻反应
这个和舵机指令有关系,假如我有多个舵机,我想让它们同时作出反应,同时响应,那么就需要向每个舵机发出要移动位置,最后发出指令,让它们同时运动。这时候使用两个函数,一个是发出写位置命令,另一个时发出同步运动指令,如下图所示。
而另一种时立刻作出反向,就是上图中WritePosEx函数。
// 1号 位置 速度 加速度
WritePosEx(1, 3048, 500, 20);
其实只要控制每个舵机实际时间将足够短,即使是立刻作出反应,几个舵机看起来也像同时运行的。
实际抓到数据如下。
这里再次说明工作状态示意,说明04为是异步写,03为是立刻反应,02是只读不写。
(9)堵转时,堵转力矩的设置
在尝试一段是后,发现每次堵转的响应实际都不是很理想,具体描述如下。
在堵转的情况下 判断如果, 扭矩大于某个值,就发送反方向,但是发现相应并不是那么块,舵机还是会到设定好的1000的堵住值,等了一段时间后才开始执行
将这个问题问飞特官方,大概解决思路是,要先释放扭矩,然后再发送位置就可以了,所以在代码中,也体现这一思想。
(10)零位校准不一定为0值,也可以是2048中值
说校准的问题,校准在这里不能广义的认为将舵机校准为0值,或者将当前位置定为0值,根据设计,发送校准将往0x28位置写入128,为128时就是认为当前位置为2048.这样做的校准。
(11)匀速转动
舵机因为能够转动360°,它有一项功能,就是能操控舵机,均速转动,转动速度是范围,在文档手册(去第一章协议里有)中有简绍,叫做恒速模式,如果使用此模式,需要先解锁,使用串口调试助手发送命令的话,请看下图。
一般如果要访问EPROM都需要先解锁。
以下给出反方向转动时的指令
另外实际抓取数据发现,当速度低于100的时候,比如上图中以1正转时,其实实际上,舵机时停一会,在转一个100的速度,以此来达到转动得非常慢,这也解释了当自己用飞特软件以1速度转的时候,是不是发现转速为0的原因,其实相当于分时,以达到更低速度。
(12)错误信息
返回错误值解析 00 为没有错误
(13)负载 扭矩值,返回数据实际值非常大
在实际抓取扭矩值时,发现有时候这个值非常大,但是我的扭矩才-56,后来问飞特才明白。
原来是将bit10当初判断正负的方向了。
(14)补充点:官方给的样例
如过下载官方库,其实里面驱动和我用的基本一致,对应舵机STS3215的样例已经如下图圈出来了,针对不同单片机可以自行选取,这个是适用keil的,不过自己做了简单测试,直接下载到单片机里,没能驱动起来舵机,应该是哪里配置问题,就没深入测试。
总结
有关STS3215舵机的相关问题可以告一段落了。