数码之家

 找回密码
 立即注册
搜索
查看: 28589|回复: 95

[综合] 优必选CAN总线舵机改造过程,自制固件、控制器、协议和上位机软件

    [复制链接]
发表于 2021-2-16 11:31:33 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2021.02.17更新:
1、上传全部数据手册和源代码。在文章末尾。
2、固件源代码已经加入惯性修正和PID控制,精度大大提高,小于0.6度。
3、12V电压供电,舵机待机电流30ma,空载全速电流60ma。


以前在淘宝上买了几个国产某型(优*选)CAN总线舵机,做工还是不错的,不过没有协议,无法驱动,理论上等一段时间,网上会放出协议,但是等了好久也没有人做这事,倒是有人破解出协议,不过都要收钱才肯给,有点不够大方啊。那么只能自己动手啦。


第一步:拆机,目的:看看能不能改造。

先发个电路部分的图片
448484733947356259.jpg
503388687216172647.jpg

其实电路不复杂,主控是Atmel的ATSAMC21E17,32位的ARM内核MCU,自带CAN接口,电机驱动芯片是Allegro的A4959,角度传感器是MPS的磁感应数字传感器,这个比电位计的好,可以实现连续转动。电源芯片也是MPS的,型号MPM3506,CAN收发器是Microchip的ATA6561。总体来说,用的芯片都不错,成本应该不低。理论上这个可玩性是很高的。初步设想是使用Arduino控制CAN模块与舵机通讯,就可以驱动它了。因为这两个东西我手头上都有。那么开始第二步。


第二步:分析电路。
方法是使用万用表探测各芯片引脚,确定连接走线。这个比较费眼,具体不讲了。这里给我的万用表个照片,表扬一下。因为芯片封装太小,自己做了两个探针。
906785750413952754.jpg

根据网上的信息(后来发现居然有单独卖舵机的驱动板的),一度以为角度传感器芯片是MA730,后来在编程过程中发现不对,按照对应的数据手册得不到结果,后来专门给MPS公司发了邮件,但是MPS中国官网只是一顿套话,没有具体解答我,倒是美国官网给我了具体型号,还提供了数据手册,在此表示感谢!注:MPS是Monolithic Power Systems的缩写,中文名字芯源系统,这个中文名字起的不错。
最后得出连线图,懒得画电路图了,直接标注在MCU的芯片脚上了。
359184598598783549.jpg

接下来是接口电路图。这个比较重要。一个是通讯接口,一个是编程下载接口。
通讯接口是5264端子4P的。不过我没有这种端子线,我是用杜邦线改造的,接起来方便。
无标题.png

下载端口,SWD接口。
无标题1.png

这样的话,使用ARM仿真器就可以编程了。为了控制舵机,专门买了个Jlink。不要买JlinkOB下载器,没有RESET,用不了,我试过了。
舵机电路板上还有几个测试触点,TP7连接的是A4959的PHASE,TP8连接的A4959的ENABLE,TP9对应的是A4959的AIOUT,其他几个触点是canrx、cantx、24v、5v、3.3v和gnd。


第三步:制作下载器。
不过这个下载接口不好接,间距1.27的,一开始我焊了五根线,但是焊的不结实,动动就掉了,于是又自己做了个探针式接头。这种探针在网上买很便宜的,我买了10根,才花了2块多钱,因为用了券,商家还包邮,返现等。真不知道他们靠啥赚钱。其实这种探针下载器网上也有卖的,但是很贵,还是无法固定,于是还是自己做个专用的。见图:
476542635372397926.jpg
289397442451575350.jpg

728863915633092260.jpg
制作方法:先用在舵机上用亚克力板做出形状,使板的边缘与触点平齐,在触点对应的位置刻出凹槽,探针在亚克力板上是用的哥俩好粘的,再焊上杜邦线,用热熔胶绝缘。

装在舵机上效果如下:
651236095843433287.jpg

还是不错的。:lol:我对这个特别得意。


第四步:读取固件。
将Jlink连好,给舵机供电,经试验,12伏即可运行,不需要24V。
这里介绍下开发工具。我使用的是ATMEL STUDIO 7.0,这个IDE使用的是宇宙第一IDE Visual Studio的壳,用起来很方便。
首先尝试一下能不能读取舵机固件。工具在atmel studio的Tools菜单里的Device Programming里面。
捕获.PNG

结果当然是读不出来的,因为MCU被设置了安全位,只能擦除才能访问。
捕获1.PNG


第五步:擦除芯片。
读不出是意料之中的事,即使读出来也没用。我又不会反向编译。
第一次使用AtmelStudio的Device Programming工具擦除芯片时,提示:Verifying Flash...Failed! address=0x0000expected=0x00 actual=0xff,失败了。
后来分析了好久,才找到原因:The SAMD21 has a BOOTPROT fuse protecting the flash area of the bootloader.You'll want to clear the BOOTPROT fusebefore flashing the bootloader.同理,SAMC21也一样,都是一家的单片机。需要将保险丝寄存器设置NVMCTRL_BOOTPROT = 0x7(默认值0byte)。同时将NVMCTRL_EEPROM_SIZE=0x7(默认值0byte),得到最大的ROM空间。
fuse.jpg
图中的这两个地方要改才能够擦除或者刷固件。


第六步:找芯片的数据手册。
大部分都能在网上找到,除了A4959电机驱动芯片,这个官网上没有,后来给官网发了邮件,才提供pdf,不知道为啥不放出来。前面提到过角度传感器芯片的型号,不是MA730,其实是MP9960,这个你在官网上也找不到数据手册,好不容易才搞到pdf。
所有数据手册我会打包放到论坛。
没有数据手册,是没法编程的。


第七步:开始SAMC21编程。
以前没有用过Atmel的MCU开发,虽然Arduino是用的atmel的单片机,直接编程没用过,也算是要从零开始。
首先确定开发环境。IDE使用的atmel studio 7,基于ASF4.0开发。这个ASF4.0是Advanced Software Framework Version 4 的意思,是一个开发框架,必须配合Ateml Start在浏览器中使用,但是比直接操作寄存器要容易多了,图形化操作,效率很高,文档也很详细,推荐使用atmel单片机的同学学习这个,再说,我也没有精力研究ATSAMC21的寄存器了。
首先试试点亮电路板上的led吧,都先使用内部晶振。
。。。。。。(编程过程省略,反正成功了)

依次把要用到的几个功能都试了一遍,CAN通讯成功,电机驱动成功,PWM驱动成功,最后角度传感器(即SPI通讯)也成功。再使用外部24M晶振,也成功。看来可以把这一切都整合到一起了。
其实这里面还是探索了好长时间的,一边对着数据手册一边对着ASF手册,还要熟悉AtmelStart,Atmel Studio,打发了不少休息时光。
但是收获最大的就是成功之后的喜悦。
如果在使用AtmelStart,Atmel Studio方面有问题可以问我,我还是积累了一些经验。


第八步:制作舵机控制器和上位机软件。
这个比较容易,使用现成的CAN模块和Arduino UNO开发板做一个就行了,CAN模块是MCP2515  CAN模块,淘宝上一堆,很便宜,和Arduino UNO使用SPI通讯,网上现成的库也很多,我用的是github上的SeeedStudio的,地址https://github.com/Seeed-Studio/CAN_BUS_Shield.git。CAN波特率设定的是1M。
这个控制器需要使用上位机控制,就是一个转发的作用,Arduino与上位机使用串口通讯。

有图片:
772768810736669208.jpg

写上位机主要是为了方便调试,使用VisualStudio2019社区版,C#开发,也不复杂。不过随着改造舵机协议,这个上位机软件改写了好多次,最后的样子是这样的。
批注 2021-02-16 150315.png
所有的源代码都会上传到论坛。


第九步:编写通讯协议。
参考这个舵机同门的串口舵机通讯协议和其他型号的,根据自己的编程水平,搞了简单协议出来。
一、查询类
1.读取角度传感器当前的位置值
2.查询舵机 ID
3.查询版本(没啥意义,纯属随大流)
4.查询最大角速度

二、动作类5.设置舵机 ID
6.立即刹车,位置保持
7.按照指定的速度和方向连续转动,即减速电机模式
8.按照指定的速度运转到指定的角度处,即顺序转动模式
9.按照指定的速度从当前位置继续转动指定角度,即增量模式
10.按照指定的速度运转到指定的角度处,即最近转动模式
11.按照指定的速度从当前位置继续转动指定圈数
12.停止一切运行,舵机卸力

三、回令
立即执行完毕的立即回令,如查询类和部分动作。
开始执行后也立即回令。
执行当前动作完毕后,也回令。
执行过程中出错,也要回令。
所有协议具体内容详见源代码,这里就不重复了。


第十步:编写我的固件。
这一步就是把协议和之前学习探索出来的各部分整合到一个程序里。
有了第七步的基础,这个过程就比较简单了。
重点提一下,Ateml Studio确实好用。
在编写固件过程中,atmel studio 改名叫做Microchip Studio了,因为Atmel早就被Microchip收购了,虽然Microchip Studio还没有彻底改完,还有好多Atmel的痕迹。
我的固件没有使用热门的PID控制电机,感觉没啥必要,因为电机是空心杯电机,惯性很小,舵机需要快速反应,意义不大,而且调试也太麻烦。当前不足之处:
1.精度有点差,误差在1.5度左右,惯性小但还是有,刹车后还会冲一点,因为我一直使用12伏电压,所以没有进行惯性修正,如果根据方向提前刹车就好了,但总归是有点误差。下一步计划进行惯性修正。
2.没有用到电机驱动芯片A4959的AIOUT功能,按照数据手册,这个是监测峰值电流的,我测了几次,都没有测出电流值出来,如果有这个电流,进行惯性修正,控制精度会更好。不清楚啥原因测不出来,我的固件中没有利用它。
3.固件编写水平比较烂,使用了大量的全局变量,最好是使用状态机,因为还没学通,就这样吧。4.没有使用CAN ID过滤器,应该只接受上位机发给自己的指令,下一步计划加入。


第十一步:整理一下改造过程,发到数码之家论坛。
过年这段时间没啥事,就干这个吧。
还是看看大家反应在发源代码吧。



附件:
1、文中涉及的芯片数据手册:角度传感器的pdf里MPS加入个人信息,故只提供图片版。ATSAMC21芯片的数据手册太大了,就不传了,可以到官网去下载。

A4958_59.pdf (472.67 KB, 下载次数: 80)

ASF4 API Reference Manual50002633B.pdf (2.15 MB, 下载次数: 64)

ATA6561.pdf (712.74 KB, 下载次数: 41)

Atmel-START-User-Guide-DS50002793B.pdf (5.36 MB, 下载次数: 56)

MPM3506AGQV.pdf (931.19 KB, 下载次数: 57)

YJ33.pdf (381.13 KB, 下载次数: 40)

MP9960.pdf (1.26 MB, 下载次数: 121)

2、舵机控制器固件:
控制器源码.zip (806 Bytes, 下载次数: 81, 售价: 6 家元)

3、上位机源代码:
上位机代码.zip (51.18 KB, 下载次数: 90, 售价: 6 家元)

4、舵机固件源代码:
固件源码.zip (1.68 MB, 下载次数: 133, 售价: 6 家元)


打赏

参与人数 23家元 +509 收起 理由
flishmen + 60 優秀文章
小白大白 + 50 谢大佬,正愁找不到那个磁角度传感器的资料.
rallyezhang + 20 優秀文章
rasingsun + 25 優秀文章
hongo + 20 優秀文章
msold5 + 8 優秀文章
xvandfan + 3 優秀文章
zdpa11 + 12 優秀文章
风信子玉 + 10 優秀文章
fantion + 20 優秀文章

查看全部打赏

本帖被以下淘专辑推荐:

发表于 2021-2-16 20:34:05 | 显示全部楼层
这个比较深了
回复 支持 反对

使用道具 举报

发表于 2021-2-16 21:32:26 来自手机浏览器 | 显示全部楼层
666,楼主研究的高级
回复 支持 反对

使用道具 举报

发表于 2021-2-16 21:52:57 | 显示全部楼层
:praise:高、实在是高
回复 支持 反对

使用道具 举报

发表于 2021-2-17 11:43:04 | 显示全部楼层
高手,看见编程头都大了
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-18 07:51:37 | 显示全部楼层
高手,太复杂了:mad::mad:
回复 支持 反对

使用道具 举报

发表于 2021-2-18 08:18:18 | 显示全部楼层
舵机是干啥的啊,:doubt:
回复 支持 反对

使用道具 举报

发表于 2021-2-18 08:57:09 | 显示全部楼层
楼主研究精神可嘉
回复 支持 反对

使用道具 举报

发表于 2021-2-18 09:10:36 | 显示全部楼层
太高级了,太难了。敬佩。
回复 支持 反对

使用道具 举报

发表于 2021-2-18 10:20:24 | 显示全部楼层
不懂,支持一下!
回复 支持 反对

使用道具 举报

发表于 2021-2-18 10:44:41 | 显示全部楼层
自己重新写固件的都是高手
回复 支持 反对

使用道具 举报

发表于 2021-2-18 10:52:48 | 显示全部楼层
不玩航模,但这种技术贴,一定支持!
回复 支持 反对

使用道具 举报

发表于 2021-2-18 11:02:01 | 显示全部楼层
感觉可以利用来做挖掘机!!:lol::lol:
回复 支持 反对

使用道具 举报

发表于 2021-2-18 11:17:32 | 显示全部楼层
其实MP9960就是MA750,也可以直接参考官网的MA750资料
image.png
回复 支持 反对

使用道具 举报

发表于 2021-2-18 11:40:49 | 显示全部楼层
高手!                                   
回复 支持 反对

使用道具 举报

发表于 2021-2-18 12:06:17 | 显示全部楼层
学习了,原来不知道通讯协议,要自己重新编程才行,不过也太麻烦了。
回复 支持 反对

使用道具 举报

发表于 2021-2-18 13:44:17 | 显示全部楼层
楼主好强
向楼主学习
回复 支持 反对

使用道具 举报

发表于 2021-2-18 13:55:51 来自手机浏览器 | 显示全部楼层
这个过于高深了,看不懂
回复 支持 反对

使用道具 举报

发表于 2021-2-18 14:28:51 | 显示全部楼层
很深奥,长见识了,谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2021-2-18 16:36:52 | 显示全部楼层
固件编程小能手。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 21:42 , Processed in 0.280800 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表