odrivetool入门指南
odrivetool是和ODrive配套的PC程序。 它的主要目的是提供一个类似命令行终端的工具软件来配置和调试ODrive,以及一些类似固件升级的其它附加功能。
文章目录
安装
参考 ODrive入门指南进行安装。
输入 odrivetool --help
来查看可用的功能。
连接多个ODrive
默认情况下,odrivetool
将连接到它找到的任意一个ODrive。 如果这不是您想要的,则可以选择特定的ODrive。
要查找ODrive的序列号,请运行odrivetool
,然后连接ODrive并打开电源。 您应该看到以下内容:
Connected to ODrive 306A396A3235 as odrv0
In [1]:
306A396A3235
就是此ODrive的序列号。 如果您只想对这个序列号的ODrive进行操作可以关闭然后执行odrivetool --serial-number 306A396A3235
来启动odrivetool。
我的ODrive进入DFU模式是否仍然可以查看它的序列号?
可以的,序列号可以通过查看USB描述符来查看。
假设您在Linux系统下,您可以输入以下命令来查看:
$ (sudo lsusb -d 1209:0d32 -v; sudo lsusb -d 0483:df11 -v) 2>/dev/null | grep iSerial
iSerial 3 385F324D3037
iSerial 3 306A396A3235
在此,连接了两个ODrive。
将ODrive配置参数备份
您可以使用odrivetool来备份和还原设备配置,也可以将一个ODrive的配置转移到另一ODrive。
- 要将配置以文件的形式保存到PC上,执行
odrivetool backup-config my_config.json
. - 要从配置文件还原到配置到ODrive,执行
odrivetool restore-config my_config.json
.
DFU固件烧录
ODrive v3.4 或更低版本不支持使用odrivetool进行固件升级,您需要使用STLink编程器进行固件烧录。
要将ODrive更新到最新固件版本,只需打开终端并运行以下命令:
~ $ odrivetool dfu
ODrive control utility v0.3.7.dev
Waiting for ODrive...
Found ODrive 308039673235 (v3.5-24V) with firmware v0.3.7-dev
Checking online for newest firmware... found v0.3.7
Downloading firmware...
Putting device 308039673235 into DFU mode...
Erasing... done
Flashing... done
Verifying... done
请注意,此命令将连接到GitHub服务器以检索最新固件。
ODrive Tool整个固件更新中将保留您先前对ODrive的配置。 但是如果任何设置被删除或重命名,您将收到警告消息。
如何烧录自定义固件?
如果您要烧录一个特定的固件文件而不是自动下载一个固件文件,则可以运行odrivetool dfu path / to / firmware / file.hex
。
您可以从这里下载正式发布的固件文件。 您将需要hex文件(而不是elf文件)。 确保您选择的固件版本和您的ODrive版本相匹配。
如果您想要从源代码编译固件,请参考ODrive固件开发指南。
常见问题
-
Windows: 在固件更新过程中,将出现一个名为
STM32 BOOTLOADER
的新设备。 打开Zadig,并将STM32 BOOTLOADER
的驱动程序设置为libusb-win32。 之后就可以继续固件更新。 -
在某些计算机上,您需要拔出并重新插入USB,以使PC理解我们已从运行模式切换到DFU模式。
-
如果DFU脚本找不到设备,请尝试将其强制为DFU模式。
怎样使ODrive v3.5强制进入DFU模式?
将ODrive电路板上丝印有
RUN DFU
的拨码开关从RUN
拨到DFU
,然后重新启动ODrive。 完成固件升级后,请不要忘记调回RUN
位置,然后再次对ODrive进行重启。怎么使ODrive v3.1, v3.2强制进入DFU模式?
将
BOOT0
引脚连接到3.3V
,然后对电路板重新通电。 如不起作用,请同时将引脚GPIO1
连接到GND
。 完成后,移除电线,然后重新启动电路板。
使用其他DFU工具升级固件
有些人在使用python dfu工具时遇到了问题,因此以下是有关如何使用其他工具的指南。
在开始以下步骤之前,您需要获取固件二进制文件。 您可以从这里下载正式发布的固件文件。 确保选择与您的ODrive版本相匹配的文件,并下载。接下来将会使用到.hex后缀的文件。
如果您想要从源代码编译固件,请参考ODrive固件开发指南。
Windows
您可以使用ST的DfuSe应用程序。
- 在此处下载该工具。 想要完成下载您需要登录ST帐号。
- 安装该工具后,启动
DfuFileMgr.exe
,可以在您的开始菜单中找到名为Dfu file manager
来启动。 - 选择 "I want to GENERATE a DFU file from S19, HEX or BIN files"然后点击OK。
- 点击 “S19 or Hex…”,选择到
ODriveFirmware.hex
。 - 将所有其它设置保持默认,然后单击"Generate…" 按钮。
- 将输出文件另存为
ODriveFirmware.dfu
。 请注意,由于某些原因,保存时会产生警告,直接忽略即可。 - 启动
DfuSeDemo.exe
,可以在您的开始菜单中找到名为DfuSeDemo
来启动。 - 按照上面如何强制进入DFU模式中的说明将ODrive强制进入DFU模式。
- 此时在界面左上角应该显示出了处于DFU模式的STM设备。
- 如果未出现,则可能是因为Zadig将驱动程序设置为libusb。 我们需要将其设置回原始驱动程序。参考Zadig如何恢复为原始驱动.
- 如果完成上述步骤后,ODrive仍被识别为libusb设备,则可以尝试删除libusb驱动程序(当我们完成固件升级后可以再次使用Zadig重新安装驱动)。 您可以简单地删除文件
C:\ Windows \ System32 \ drivers \ libusb0.sys
。
- 在界面右下角 “Upgrade or Verify Action” 点击 "Choose…"按钮。
- 选择到我们生成好的
ODriveFirmware.dfu
文件。 - 点击 “Upgrade”.
- 如果收到警告,提示您无法检查设备类型是否正确,请单击“yes”以继续。
- 恭喜,您的ODrive固件已经被更新了; 您现在可以退出DfuSeDemo。
- 关闭ODrive的电源,然后将ODrive设置回RUN模式。
Linux
安装 dfu-util
:
sudo apt install dfu-util
按照上述说明进入DFU模式。
完成固件构建后,在固件所在目录下执行:
sudo dfu-util -a 0 -s 0x08000000 -D build/ODriveFirmware.bin
macOS
首先,您需要安装arm开发工具以将hex格式文件转换为bin文件。
$ brew cask install gcc-arm-embedded
然后将二进制文件转换为.bin格式
$ arm-none-eabi-objcopy -O binary ODriveFirmware_v3.5-48V.elf ODriveFirmware_v3.5-48V.bin
安装 dfu-util
:
$ sudo port install dfu-util # via MacPorts; for HomeBrew use "brew install dfu-util"
找到要升级设备的序列号:
$ dfu-util --list # list the DFU capable devices
[...]
Found DFU: [0483:df11] ver=2200, devnum=5, cfg=1, intf=0, path="20-2", alt=0,
name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg", serial="388237123123"
最后,使用找到的序列号刷新固件:
$ sudo dfu-util -S 388237123123 -a 0 -s 0x08000000 -D ODriveFirmware_v3.5-48V.bin
ST Link固件烧录
仅对于ODrive v3.4或更早版本,才需要使用STLink烧录。 您将需要STLink / v2或与之兼容的编程器。
- 安装 OpenOCD
- Windows: 安装说明 (同时依照指示安装 ST-LINK/V2 的驱动)
- Linux:
sudo apt-get install openocd
- macOS:
brew install openocd
- 从这里下载最新的固件。您将会使用 .elf 文件进行烧录。同时请确保您选择的固件版本和您的ODrive版本相匹配。
- 如下图所示连接ODrive和STLink/v2编程器:
打开ODrive的电源。 - 打开一个终端,然后导航到固件所在的目录。
- 运行以下命令(将ODriveFirmware_v3.4-24V.elf替换为您所使用的固件文件名称):
openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c init -c "reset halt" -c "flash write_image erase ODriveFirmware_v3.4-24V.elf" -c "reset run" -c exit
如果一切正常,您应该会看到类似的内容:
wrote 262144 bytes from file ODriveFirmware_v3.4-24V.elf in 10.194110s (25.113 KiB/s)
如果以上操作出现错误,请确保您系统的PATH
变量中包含openocd
,检查电线是否正确连接,然后再次尝试。
实时绘图
实时绘图用于实时绘制ODrive内部的参数(如位置)。 要启动实时绘图,在新的命令窗口中运行odrivetool liveplotter
。 默认情况下,在启动时会绘制两个参数。 轴1和轴2的编码器位置。在下面的示例中,电机在closed_loop_control
模式下手动扭动电机轴施加外力。
要更改绘制的参数,请使用文本编辑器打开odrivetool(位于Anaconda3\Scripts或ODrive-master\tools中)并修改以下部分代码。
# If you want to plot different values, change them here.
# You can plot any number of values concurrently.
cancellation_token = start_liveplotter(lambda: [
my_odrive.axis0.encoder.pos_estimate,
my_odrive.axis1.encoder.pos_estimate,
])
例如,要绘制150KV电机,电机的转速[RPM]和电机转矩[N.cm],可以将代码修改为:
# If you want to plot different values, change them here.
# You can plot any number of values concurrently.
cancellation_token = start_liveplotter(lambda: [
(((my_odrive.axis0.encoder.pll_vel)/8192)*60), # 8192 CPR encoder
((8.27*my_odrive.axis0.motor.current_control.Iq_setpoint/150) * 100), # Torque [N.cm] = (8.27 * Current [A] / KV) * 100
])
在这个示例中,手动旋转电机轴并保持在那里。 作为响应,电动机控制器增加转矩(橙色线)以抵消这种干扰,直至达到500 N.cm的峰值,此时达到电机电流极限。 松开电机后,电机会迅速选择(蓝线),很快返回到原来设定的位置。
要更改绘图的比例和采样率,请修改utils.py文件内的以下参数(位于Anaconda3\Lib\site-packages\odrive中):
data_rate = 100
plot_rate = 10
num_samples = 1000
有关如何和实时和绘图界面交互的示例,请参考Matplotlib示例。
使用odrivetool操作实时绘图
您可以通过 start_liveplotter(...)
来从odrivetool启动实时绘图。如果要在实时绘制时同时要发出命令或以其他方式与odrive保持交互,这将很有用。
例如,您可以在odrivetool中直接输入以下内容:start_liveplotter(lambda:[odrv0.axis0.encoder.pos_estimate])
。 就像上面的示例一样,您可以在方括号中同时添加几个参数,以逗号分隔。
通常,您可以像在odrivetool中正常读取一样绘制任何能够读取的变量。
如果您有任何问题或疑问,欢迎您加入ODrive社区或QQ群 851421965 进行交流。