peng-zhihui / ElectronBot

GNU General Public License v3.0
7.85k stars 1.82k forks source link

舵机固件和基本的调试方法 #131

Open jinsonli opened 2 years ago

jinsonli commented 2 years ago

Hello 正在复刻的朋友们,分享一点简单的经验。

1)舵机第一次调试时,会默认初始化本地I2C地址为12,并且在收到主控的Enable信号前不会有动作。 2】舵机第一次连接主控时,【需要一个个配置地址】,一次只连一个,在主控用0X00地址发送 SetId指令。 比如:头部舵机配置为0X02,断电重启,用主控测试能否用0X02连接到舵机。 然后再插第二个舵机。one by one. 3)4.3g舵机用默认PD参数,和默认50%扭矩限制,能正常控制, 但是9g舵机(底座那个),需要把扭矩限制调到0.7以上,P参数调大一点,控制效果会好一点。 4)舵机的程序,我发现偶尔会有I2C卡死收不到中断的问题。后来我把控制函数从中断中拿出来,在Main While里200hz执行会明显有提升。不知道其他朋友们有没有遇到过。我用MDK编译了两个固件,有需要的朋友可以下载试试。(F030F4P6便宜很多)

ServoDrive-f030f4p6.zip ServoDrive-f070f4p6.zip ServoDrive-fw-f030.zip ServoDrive-f70.zip 舵机调试工具.zip

https://user-images.githubusercontent.com/26651232/162994102-32392a3b-a457-4b8b-8df6-09171ec1ca41.mp4

https://user-images.githubusercontent.com/26651232/161782442-d4913d0d-0e90-4456-a408-60e7ad14adda.mp4

电机接法 电位器接法

peng-zhihui commented 2 years ago

感谢反馈,如果能够把舵机调试流程封装成工具或者代码,可以提交pr我帮你合入仓库~

jinsonli commented 2 years ago

好的。 我有空弄一下。

peng-zhihui commented 2 years ago

舵机烧完程序记得用热熔胶固定一下哦避免短路,热熔胶加热就会融化所以不是一次性的固定方式可以放心整。

FrankXu626522 commented 2 years ago

想请教一下,ServoDrive-fw文件夹中的代码是怎么运行的? 1).ioc文件应该只配置了芯片,用CubeMX生成的代码中不存在关于i2c和pid的代码,烧入芯片的时候这部分代码怎么处理? 2)有关i2c和pid等的代码在UserApp中,这一部分代码用cmake编译之后还要烧入芯片吗?两份代码会不会冲突? 本科和硕士都是做上位机开发的,对单片机编程不够了解,如果能描述一下ServoDrive-fw的处理过程那就太感谢了,还望赐教一下

peng-zhihui commented 2 years ago

所有代码都需要的,你用CubeMX生成的如果是keil工程那需要自己把其余代码文件添加进去,CubeMX是不知道你自己的代码在哪里的

wenFrankieeee commented 2 years ago

你好,也就是说,需要一个个在舵机源码里先定义配置地址,再烧录进舵机控制MCU里吗

FrankXu626522 commented 2 years ago

所有代码都需要的,你用CubeMX生成的如果是keil工程那需要自己把其余代码文件添加进去,CubeMX是不知道你自己的代码在哪里的

谢谢指点,现在发现问题主要是之前手欠cubemx保存了一次工程,没找到Main()的调用。。。所以我就纳闷我以为cubemx的main和Main都是运行入口来着

jinsonli commented 2 years ago

你好,也就是说,需要一个个在舵机源码里先定义配置地址,再烧录进舵机控制MCU里吗

两种方式: 1)是你说的可以单独给每个舵机板子定义一个地址(在代码里默认写好) 2)是舵机的代码是统一的。上电后默认I2C地址是12(或者随机一个),然后由主控通过 SetID函数来改变舵机控制板的I2C地址(掉电会存储这个地址)。 方式(1)烧写麻烦,舵机多了容易糊涂。方式(2)的好处是每个舵机烧写固件一样。

Peegandourado7 commented 2 years ago

Dude . Make a channel and me/us how to code ? Your are soo cool man i relay like your project 😍😍😍😍

Peegandourado7 commented 2 years ago

And how do you know which controller/prosser to use ?

Peegandourado7 commented 2 years ago

Which software i should use ?

wenFrankieeee commented 2 years ago

你好,也就是说,需要一个个在舵机源码里先定义配置地址,再烧录进舵机控制MCU里吗

两种方式: 1)是你说的可以单独给每个舵机板子定义一个地址(在代码里默认写好) 2)是舵机的代码是统一的。上电后默认I2C地址是12(或者随机一个),然后由主控通过 SetID函数来改变舵机控制板的I2C地址(掉电会存储这个地址)。 方式(1)烧写麻烦,舵机多了容易糊涂。方式(2)的好处是每个舵机烧写固件一样。

兄弟,谢谢回复, 我在主程main里 调用 setid( joint[0].id=12,0x02)重新设置舵机ID,但舵机依旧不动,可否把你得具体调试流程知会一下,谢谢

wenFrankieeee commented 2 years ago

舵机ID

jinsonli commented 2 years ago

我先简单提供一点测试代码,还在抽空整理一个舵机调试小工具。

1 广播测试舵机运动

2 广播设置ID,其他地址测试运动

main.zip

mcu666 commented 2 years ago

能否分享一下舵机的F030和F070 MDK源码?感谢 @jinsonli

alloyo commented 2 years ago

介绍下怎么刷fw?

jinsonli commented 2 years ago

介绍下怎么刷fw?

用STLINK, JLINK 的 SWD模式都可以。

jinsonli commented 2 years ago

能否分享一下舵机的F030和F070 MDK源码?感谢 @jinsonli 传了,暂时没有做优化,能自己编译和做点调试。 后面优化了再合到主线去。

FrankXu626522 commented 2 years ago

大佬想请教一下,我在打开.ioc后修改了IDE为MDK-ARM,确保路径无中文后generate code,但是期间遇到了一些问题。 首先是代码生成,按理说用cubeMX生成的代码应该都是单片机的配置代码,common_inc.h的引用和Main等函数调用应该是后面写进去的,为啥一生成就有? 然后是代码的编译问题,我直接编译这个工程,keil5会报错,找不到main_1.o。 我怀疑是keil5的cpp支持没有开,加了这样一句,未果。 问题的截图我附在这一楼,还望大佬指点

jinsonli commented 2 years ago

Which software i should use ?

Code and firmware of servo driver board has been uploaded.

peng-zhihui commented 2 years ago

感谢分享~上面提到I2C卡死的问题,应该是STM32F4主设备的for循环里忘了加1ms的延时?如果指令发送不间断频率过高的话可能会引起卡死

FrankXu626522 commented 2 years ago

1 2 3

jinsonli commented 2 years ago

@FrankXu626522 你参考一下我上传的两个 MDK工程。 MDK工程用CUBE 生成后没法直接编译的, 需要将UserAPP/ 和 Ctrl 下的代码加入, 并且添加 目录,还可能需要解决一下编译环境造成的编译错误。 如果对MDK不熟悉的话, 建议使用 SW4STM32,稚晖君已经写好的 Cmake直接就可以编译。

FrankXu626522 commented 2 years ago

@FrankXu626522 你参考一下我上传的两个 MDK工程。 MDK工程用CUBE 生成后没法直接编译的, 需要将UserAPP/ 和 Ctrl 下的代码加入, 并且添加 目录,还可能需要解决一下编译环境造成的编译错误。 如果对MDK不熟悉的话, 建议使用 SW4STM32,稚晖君已经写好的 Cmake直接就可以编译。

好的,我研究一下,谢谢TAT

txp666 commented 2 years ago

单个舵机已经调试完成,这时候直接打开release的上位机就能连上了吗?

wenFrankieeee commented 2 years ago

@FrankXu626522 你参考一下我上传的两个 MDK工程。 MDK工程用CUBE 生成后没法直接编译的, 需要将UserAPP/ 和 Ctrl 下的代码加入, 并且添加 目录,还可能需要解决一下编译环境造成的编译错误。 如果对MDK不熟悉的话, 建议使用 SW4STM32,稚晖君已经写好的 Cmake直接就可以编译。

看了一下你的MDK,用HAL库写的?

单个舵机已经调试完成,这时候直接打开release的上位机就能连上了吗?

不行,我试过

txp666 commented 2 years ago

那release的上位机要怎么连接呢?

wenFrankieeee commented 2 years ago

感谢分享~上面提到I2C卡死的问题,应该是STM32F4主设备的for循环里忘了加1ms的延时?如果指令发送不间断频率过高的话可能会引起卡死

大佬,有一个小问题,您做得STUDIO 怎么使用呢,我舵机调好了几个,连上sensorboard,烧录好固件,启动您的studio,做好动作序列,点play舵机一点反应没有呢。是不是我少做了几步?谢谢

peng-zhihui commented 2 years ago

先单独测试每个模块没问题(屏幕显示和USB通信用Test文件夹里的工程、舵机都单独测试好了),然后需要接上所有6个舵机才行;先连接机器人,再打开studio,三档开关打到模型优先就可以动了,是实时同步的

wenFrankieeee commented 2 years ago

先单独测试每个模块没问题(屏幕显示和USB通信用Test文件夹里的工程、舵机都单独测试好了),然后需要接上所有6个舵机才行;先连接机器人,再打开studio,三档开关打到模型优先就可以动了,是实时同步的

谢谢,明白了,我并联两个舵机,互相干扰:两个一起得话结果一个也动不了,只能连接一个,奇怪了。

txp666 commented 2 years ago

先单独测试每个模块没问题(屏幕显示和USB通信用Test文件夹里的工程、舵机都单独测试好了),然后需要接上所有6个舵机才行;先连接机器人,再打开studio,三档开关打到模型优先就可以动了,是实时同步的

谢谢,明白了,我并联两个舵机,互相干扰:两个一起得话结果一个也动不了,只能连接一个,奇怪了。

你的可以了?为啥我单独测试都没问题,打开studio没反应a

txp666 commented 2 years ago

先单独测试每个模块没问题(屏幕显示和USB通信用Test文件夹里的工程、舵机都单独测试好了),然后需要接上所有6个舵机才行;先连接机器人,再打开studio,三档开关打到模型优先就可以动了,是实时同步的

大佬!在lowlevel设置角度没问题,打开release的unity没反应啊 ,请问这可能是啥问题呀?

txp666 commented 2 years ago

先单独测试每个模块没问题(屏幕显示和USB通信用Test文件夹里的工程、舵机都单独测试好了),然后需要接上所有6个舵机才行;先连接机器人,再打开studio,三档开关打到模型优先就可以动了,是实时同步的

大佬!在lowlevel设置角度没问题,打开release的unity没反应啊 ,请问这可能是啥问题呀?

image 用unity打开工程可以了!好像少个字体,是不是release的有点问题呀

peng-zhihui commented 2 years ago

字体在LargeFiles文件夹里面

txp666 commented 2 years ago

ok!

YangMing020017 commented 2 years ago

请问一下,如果可以用STLINK Utility烧写程序 是不是就说明驱动板没有问题了? 但是我用手头的f103调试却不能动可能是什么原因呢?

mcu666 commented 2 years ago

请问一下,如果可以用STLINK Utility烧写程序 是不是就说明驱动板没有问题了? 但是我用手头的f103调试却不能动可能是什么原因呢?

舵机默认是失能状态,需要先发送命令使能舵机,然后才能控制转动,你可以先用示波器或逻辑分析仪看一下i2c总线上能不能在0x00节点叫到舵机

YangMing020017 commented 2 years ago

请问一下,如果可以用STLINK Utility烧写程序 是不是就说明驱动板没有问题了? 但是我用手头的f103调试却不能动可能是什么原因呢?

舵机默认是失能状态,需要先发送命令使能舵机,然后才能控制转动,你可以先用示波器或逻辑分析仪看一下i2c总线上能不能在0x00节点叫到舵机

好的好的 十分感谢

jinsonli commented 2 years ago

Hello 我用QT做了一个舵机调试工具,自己用了还可以。给有需要的朋友试试看好不好用。 前提: 1.USB驱动是OK的。 2.主控刷入我提供的舵机设置固件 3.不要用广播地址给多个舵机通讯。 资料和视频放到 最上面去了, 有一个压缩包。 后面我合入仓库里去。视频10M限制,压缩的比较厉害。 软件简单介绍

peng-zhihui commented 2 years ago

很棒,可以提交到Software/Tools里面。(最好在同目录下加上README使用说明哈)

jinsonli commented 2 years ago

很棒,可以提交到Software/Tools里面。(最好在同目录下加上README使用说明哈)

好嘞,我整下一起提交

peng-zhihui commented 2 years ago

很棒,可以提交到Software/Tools里面。(最好在同目录下加上README使用说明哈)

好嘞,我整下一起提交

另外提个建议,可以把舵机最大最小值的标定也加上(也就是ADC和机械角度的关系)

jinsonli commented 2 years ago

很棒,可以提交到Software/Tools里面。(最好在同目录下加上README使用说明哈)

好嘞,我整下一起提交

另外提个建议,可以把舵机最大最小值的标定也加上(也就是ADC和机械角度的关系)

是哦,现在舵机这块还不够细腻。 我到时候把舵机固件也加几个接口,还有舵机的 自动负反馈功能也可以一起弄下。

wenFrankieeee commented 2 years ago

Hello 我用QT做了一个舵机调试工具,自己用了还可以。给有需要的朋友试试看好不好用。 前提: 1.USB驱动是OK的。 2.主控刷入我提供的舵机设置固件 3.不要用广播地址给多个舵机通讯。 资料放到 最上面去了, 有一个压缩包。 后面我合入仓库里去。 软件简单介绍

这个不错,学习 一下

wenFrankieeee commented 2 years ago

Hello 正在复刻的朋友们,分享一点简单的经验。

1)舵机第一次调试时,会默认初始化本地I2C地址为12,并且在收到主控的Enable信号前不会有动作。 2】舵机第一次连接主控时,【需要一个个配置地址】,一次只连一个,在主控用0X00地址发送 SetId指令。 比如:头部舵机配置为0X02,断电重启,用主控测试能否用0X02连接到舵机。 然后再插第二个舵机。one by one. 3)4.3g舵机用默认PD参数,和默认50%扭矩限制,能正常控制, 但是9g舵机(底座那个),需要把扭矩限制调到0.7以上,P参数调大一点,控制效果会好一点。 4)舵机的程序,我发现偶尔会有I2C卡死收不到中断的问题。后来我把控制函数从中断中拿出来,在Main While里200hz执行会明显有提升。不知道其他朋友们有没有遇到过。我用MDK编译了两个固件,有需要的朋友可以下载试试。(F030F4P6便宜很多)

ServoDrive-f030f4p6.zip ServoDrive-f070f4p6.zip ServoDrive-fw-f030.zip ServoDrive-f70.zip 舵机调试工具.zip

ce7852a7f6c44d335e95db5f3323c53b.1.mp4 default.mp4 电机接法 电位器接法 请问底盘那个 9G舵机 内部结构与 4.3G的不同,没有电位器,大佬你是如何改造的? 谢谢

jinsonli commented 2 years ago

0138d8df512716aea06e4b9f6d0fb52 c3b536914f85f459ee65a4df8778ee6 @wenFrankieeee 差不多的。 黄色的这个就是电位器。

energykidchen commented 2 years ago

大佬,软件一直是disconnect连接不上为什么啊

wenFrankieeee commented 2 years ago

我们这边得问题是, Unity 上位机 无法操作舵机(unity所有功能均失效),用SDK 调用舵机角度设置也失效,但是单独调试舵机,包括6机联调 (90度往复旋转)可以6舵机同步往复运动。

ssc7618 commented 2 years ago

042芯片可以刷030的驱动吗?

jinsonli commented 2 years ago

我们这边得问题是, Unity 上位机 无法操作舵机(unity所有功能均失效),用SDK 调用舵机角度设置也失效,但是单独调试舵机,包括6机联调 (90度往复旋转)可以6舵机同步往复运动。

还没解决么。。。