简 介: 本文给出了应用OpenMV IDE 开发 福来全向视觉车模的软件编程的基础知识。 此外,还给出了对于视觉模块进行固件更新的方法。
关键词
: 视觉智能车,OpenMV,MicroPython
01 开发环境搭建
一、了解LQ_MV开发
LQ_MV是一款可用MicroPython Python脚本编程的图像处理开发板,它可以很轻松的完成机器视觉应用,矩形识别,圆形识别,车牌识别,色块识别,Aprtag标记追踪等等。
- 硬件型号:
- STM32H743IIT6芯片
- ARM Cortex M7处理器
- 480MHz主频
- 1MB RAM
- 2MB Flash
全速 USB (12Mbs) 接口,连接到电脑。当插入OpenMV摄像头后,你的电脑会出现一个虚拟COM端口和一个“U盘”。
SD卡槽拥有100Mbs读写,这允许你的OpenMV摄像头录制视频,和把机器视觉的素材从SD卡提取出来。
34个引出引脚包括以下外设:
- 全部可作为I/O口(I/O即为input/output意思是普通输入输出)
- 1路SPI总线
- 1路IIC总线
- 1路DAC转换
- 11路ADC转换
- 10个PWM引脚,可分为4组不同的频率输出
- 2路UART串口
二、安装 OpenMV IDE 软件
在软件开发环境文件夹中提供了苹果电脑MAC安装包、Windows环境下的安装文件以及免安装文件,使用前可以先看Readme.txt中关于该文件夹中文件的说明。
安装时对应自己的电脑环境选择即可,以windows环境为例安装步骤如下:
1、 选择安装文件直接安装:
右击资料中OpenMV IDE安装包,选择以管理员身份运行,弹出提示选择是或允许,单击“下一步”。
2、安装路路径选择:
这里建议安装在C盘系统盘以外的路径,且路径名不包含中文字符。当然,如果你C盘空间足够也可以选择默认安装路径。
3、 选择完路径后一路默认允许,然后等待软件自动,最后选择接受许可。
然后一直点下一步,直至安装完成。OpenMV IDE进入安装程序后,它将自动安装IDE以及OpenMV Cam和MicroPython pyboard的驱动程序。只需按照默认的安装程序提示即可,mac版本的参考以上windows基本步骤。
4、压缩文件免安装方式:
这种方式针对个别同学因系统环境问题无法使用安装包进行软件安装的情况。首先选择一个软件存放位置,以D盘为例:新建文件夹并命名为“OpenMVIDE_V415”或其他英文名,然后将资料文件夹中的免安装文件解压缩到刚刚新建的文件夹中。
解压完成后,一定 一定 一定 要注意看README.txt !!!,也就是在解压完成后需要双击“setup.cmd”这个文件来安装OpenMV IDE的驱动程序,双击并等待安装完成后在“OpenMVIDE_V415>bin”文件夹中找到“openmvide.exe”,双击文件即可打开IDE,为方便后续打开,可以选中该文件右键 > 发送到 > 桌面快捷方式。以后打开软件只需要在在卓面点击图标即可。
需要注意的是,在软件的使用过程中如果有提示升级软件的选择忽略或取消,尤其是提示固件版本升级的是时候一定不要升级,因LQMV4底层固件为扩展功能接口后自编译,其与IDE默认固件不同,在IDE中升级后将会导致拓展板上大部分外设无法使用,如果不小心升级了,就需要使用资料中的固件重新进行烧录。重新烧写固件的步骤请参考下文第五节LQMV4固件说明。
02 开发环境测试
一、准备文件
上面只是将软件安装在本地电脑里,下面具体测试一下它是否可以正常工作,将资料中的独立测试例程文件夹中“LQ_MV”文件复制到或解压到“此电脑>文档>OpenMV”下,“OpenMV”文件夹会在安装软件的时候自动创建。
二、连接模块
将LQMV4视觉模块通过Type-C数据线接入电脑的USB端口。接着打开此电脑(我的电脑、文件资源管理器),可以看到该设备的内存磁盘,接入模块后也会自动弹出窗口提示。如果安装SD卡后即显示SD卡的空间自动屏蔽芯片提供的存储空间,且上电固件初始化后也会自动从SD卡或TF卡中寻找boo.py执行,若无该文件则继续寻找main.py执行,若没有安装SD卡则显示芯片中111K的缓存,上电运行步骤一样。
将资料中“LQ_Module.py”文件复制到上面的U盘中,为后续测试提供库支持。
复制文件到视觉模块中时,模块会亮起红色LED表示正在写入文件,当写入完成后红色LED灯熄灭。完成后接着打开OpenMV IDE软件,单击左下角连接按钮连接LQ_MV核心板(快捷键Ctrl+E),连接过程中可能会有弹窗,一直点 否 即可。成功连接后“连接”按钮图标中的插头消失,同时下面的按钮会变成绿色。
三、运行测试例程
首次打开软件后会自动打开镜头测试例程。单击运行按钮运行该测试代码,再次点击停止运行(快捷键Ctrl+R)。
若可以正常显示图片,则表示开发环境搭建完成,如果发现右边没有图像显示区域,可能是该部分窗口被折叠了,只需要在右边缘找到小三角按钮,然后点击展开,若图像显示不全,可能是窗口大小不合适,此时用鼠标拖动图像窗口边缘,调整窗口大小即可。
成功运行后IDE显示效果如下图所示,如果出现未找到谁摄像头传感器或报错,请检查镜头是否安装正常。特别注意,如果长时间运行图像识别程序,芯片功耗将会增加,发热也会更大,芯片上有些许烫手感,关闭运行的程序后等待一一两分钟温度下降,属于正常现象。虽然运行测试例程不会使得芯片功耗较大增加,但后续图像识别可能出现,故在此先做说明。
03 OpenMV IDE概述
OpenMV IDE它是由QtCreator支持的功能强大的文本编辑器,软件包含一个帧缓冲器查看器,直方图显示器,以及一个用于OpenMV调试输出的集成串行终端,可以将OpenMV模块的运行信息一一显示在IDE中,便于观察数据和调试。
一、文件菜单和示例代码
在OpenMV IDE的文件菜单下,可以使用所有的标准文本编辑器选项。新建,打开,保存,另存为,打印等。可以打开多个文件,可以通过单击显示当前文件名称的组合框进行选择。OpenMV IDE实际上支持在多个窗口中打开多个文件但是都隐藏了起来,以便明确哪些脚本将在单击运行按钮时运行。
注意:一次只能在您的计算机上使用OpenMV IDE的一个实例。如果您尝试通过文件资源管理器打开文件,OpenMV IDE的一个实例将打开该文件或使用拖放功能打开文件不会造成冲突。
在文件菜单下,您会看到示例菜单,其中有大量的脚本展示了如何使用OpenMV Cam的不同功能。
对于个人脚本存储,OpenMV IDE会在您的文档文件夹中查找“OpenMV”目录。 OpenMV IDE将在 文档->文件夹中显示“OpenMV”文件夹的内容。我们可以把测试例程库放入其中方便调用,这也就是前面说的将资料中独立测试例程中“LQ_MV”解压到该文件夹的目的。
最后,无论何时在OpenMV IDE中创建一个新文件或打开示例脚本,OpenMV IDE都会创建一个不需要存储在磁盘上的文件副本,就像在Arduino IDE中一样。这让您快速测试出创意,而无需创建文件,即无需保存就可以直接运行新创建的脚本代码,也就是在调试程序时可以不用将程序下载到模块脱机运行,而是程序脚本在OpenMV IDE中而调用在模块中在线运行。
二、文本编辑
OpenMV IDE可以对所有打开的文件进行无限撤消和重做,空格可视化(对于MicroPython非常重要),字体大小的控制以及查找和替换等。此外,它也可以在更换时保存大小写。最后,查找和替换功能不仅在当前文件上起作用,而且还可以在文件夹中的所有文件或OpenMV IDE中的所有打开的文件上起作用。
OpenMV IDE提供关于关键字的自动完成支持悬停工具提示。例如在OpenMV IDE中用python语言输入“.”后,将会检测到您即将编写函数或方法名称,并会显示一个自动完成文本框。一旦你写了函数/方法的名字,它也将引导你写入参数。最后,如果将鼠标光标悬停在任何关键字上,OpenMV IDE将在工具提示中显示该关键字的文档。
三、帧缓冲区显示
OpenMV IDE集成了帧缓冲区查看器。可以在处理代码的时候可以很容易地看到你的OpenMV Cam采集到的图片。
OpenMV IDE顶部右上角的“录制”按钮记录帧缓存器中的内容。使用它来快速制作您的OpenMV Cam所看到的视频。注意,录制工帧率取决于应用程序。录制完成后,OpenMV IDE将使用FFMPEG把录制代码转换为任何想要共享的文件格式。
OpenMV IDE顶部右上角的“缩放”按钮控制帧缓存器的缩放。根据您的需要启用或禁用该功能。
OpenMV IDE顶部右上角的“禁用”按钮控制你的OpenMV是否会发送图像到OpenMV IDE。 不禁用时会降低性能。所以,如果想知道脚本在OpenMV Cam没有连接到你的电脑的情况下运行得有多快,只需点击“禁用”按钮即可。当帧缓冲区被禁用时,将无法看到OpenMV Cam正在查看的内容,但仍然可以在串行终端中看到来自OpenMV Cam的调试输出。
最后,可以右键单击在帧缓冲区查看器中看到的任何图像,以将该图像保存到磁盘。此外,如果通过单击并拖动来选择帧缓冲区中的区域,则可以将该区域保存到磁盘。注意,在尝试将帧缓冲区保存到磁盘之前, 应该停止脚本。否则,可能得不到想要的确切图像。
要取消选择帧缓冲区中的某个区域,只需单击任意位置,而无需拖动即可删除选择。但是,取消选择时可能创建一个像素选择区域,所以尽可能单击帧缓冲区中的空白区域。
四、直方图显示
OpenMV IDE中的集成直方图显示主要是为了填充帧缓冲区查看器下的空白空间,并提供一些视觉效果。然而,像是对于得到关于房间中照明质量的反馈,确定颜色跟踪设置,以及关于OpenMV Cam所查看的图像质量,这个功能也是非常有用的。
可以在直方图中选择四个不同的颜色空间。RGB,灰度,LAB和YUV。只有灰度和LAB在以编程方式控制您的OpenMV时是有用的。RGB很直观。因为我们使用JPEG进行JPEG压缩,所以我们会加上YUV。
默认情况下直方图显示整个图像的信息。但是,如果通过单击并拖动帧缓冲区来选择一个区域,那么直方图将只显示该区域中的颜色分布。这种特性使得直方图显示在你需要在 image.find_blobs() 和 image.binary() 脚本中使用正确的灰度和LAB颜色通道设置时是很有用的。最后,图像分辨率和你在图像上选择的边界框ROI(x,y,w,h)将显示在直方图的上方。这在判断距离时是很有用的。
五、串行终端
要显示串行终端,单击位于OpenMV IDE底部的串行终端按钮。串行终端内置在主窗口中,OpenMV Cam运行中的所有调试文本“print”都将显示在串行终端中。
注意,串行终端将在RAM中保留最后一百万行的文本。所以,可以使用它来缓冲大量的调试输出。此外,如果按“ctrl+F”快捷键,则可以搜索调试输出。最后,如果想查看以前的调试输出,串行终端不会自动滚动。如果滚动到文本输出的底部,自动滚动将再次打开。
六、程序脱机运行
脱机运行是指将IDE中编辑的当前代码文件保存到OpenMV cam模块中,独立运行而不依赖IDE。在OpenMV硬件接入电脑后会自动弹出一个U盘存储器,通过电脑的资源管理器进入该U盘,默认会有一下几个文件:
第一个是一个空白的文件系统文件,第二个“main.py”文件为上电底层固件准备好后自动执行的脚本文件,默认的该文件中包含一个LED灯因USB连接状态改变的程序;第三个,“README.txt”内则为一些固件信息和OpenMV相关的内容。
脱机运行有两种方式实现,第一个是在该文件目录下创建boot.py,第二个方法是直接将程序保存到main.py中。这两种方式都是基于OpenMV上电模式执行的文件,首先会在根目录下寻找boot.py脚本文件执行,如果没有这个文件则会转而执行main.py。所以将用户程序直接保存到main.py方可,在模块脱离OpenMV后上电自动执行该文件,其中的用户功能程序也就会被执行。同样,在OpenMV IDE中也提供了将当前窗口的脚本文件作为main.py保存到模块内部存储空间中。
点击>工具>在弹出菜单栏中选择将打开的脚本保存到 OpenMV Cam(作为main.py)单击选择后,弹出对话框提示是否,这里根据自己情况选择是否提出注释符将空格转化为制表符,如果选择是,则保存到模块内的程序将没有任务注释和多余的空格,整体是非常紧凑的标准格式,选择否则将IDE中的文件不做修改拷贝到模块中。
当然,除了保存到模块中脱机运行外,IDE还可以打开模块中的文件做修改,修改后的文件有三种种保存回模块的方式,上述方式为其中之一,在模块连接状态下最简单的方法是快捷键”Ctrl+S”,此时会发现模块红色的LED亮起了,这说明文件正在写入模块存储空间,写完后红色LED熄灭,第三种方式为将当前编辑的文件另存为,然后选择文件路径为视觉模块U盘,第三种方式也适用于模块接入电脑但未连接IDE的情况。
04 学习Python语言
在OpenMV IDE中学习Python语言的基本语法还是有必要的。一方面可以熟悉Python编程,另一方面可以快速的了解LQ_MV开发板,为理解智能车示例程序打下基础。需要说明一点,如果同学已经学习过Python语言了这部分可以省略不看。
打开软件后首先关闭当前文件,并新建文件(快捷键Ctrl+N)。同时打开串口终端,如下图,我们将在此文件上学习Python基本语法,并通过串口终端查看程序运行结果。
特别重要的一点,在学习过程中不要光看不练,对于首次接触机器语言的同学来说尤其如此。下面示例仅提供代码图片,不提供测试文件,目的是防止同学们复制粘贴。同学们需要按照图片上的代码动手敲击键盘加深记忆(最好可以举一反三)。
一、输出指令
基本输出指令“print”是程序开发中最常用到的指令,它可以将程序结果通过窗口交互窗口输出。这里给出了三个print指令的举例。
第一个是输出一个字符串常量,“hello world!”。
第二个是输出13乘以14的计算结果,等于182。
第三个也是输出字符串常量,不过大家注意到,这里使用单引号给出的字符串常量。 在Python中实际上有三种定义字符串的方式。
二、变量与类型
在Python语言中,通过变量来表示数据。变量有许多类型,这里定义了一个整型变量,输出该变量。Python语言中的变量类型不需要提前进行声明。应用起来非常灵活。
Python中还包括浮点数。给变量赋值带有小数点的数字就是浮点数,也可以通过float函数把整数改成浮点数。这两种方式对应的输出是相同的。浮点数和整数进行算术运算,结果就变成了浮点数。
第三种变量类型就是字符串。前面使用print命令的时候,就了解到Python中可以使用双引号和单引号将字符串括起来。它们对应的结果是相同的。除了这两种方式,也可以使用一对三个单引号来定义字符串。这样做的目的,实际上可以定义复杂的字符串。
比如这里的字符串里面带有单引号,它就必须使用双引号来定义该字符串。输出的结果中就带有双引号内部的所有字符。反过来也可以,也就是利用单引号来定义带有双引号的字符串。最后说明一个Python有趣的特点,那就是它的运算符号加号,对于数字就执行正常的算术运算,比如这里1加2,结果输出为3,如果对于字符串使用加号,它就对字符串进行串接起来,形成更长的字符串。这种用法非常直观方便。
最后,我们了解一下Python中灵活的赋值语句。这里使用一句话,同时给a,b,两个变量进行赋值。它们按照前后顺序分别赋值为1,2。这样的语句还可以进一步扩展到更多的变量同时赋值。最后,举一个例子是一个错误的程序。它将两个整数和一个字符串进行相加,可以看到运行结果给出错误,在Python中不支持数字和字符串进行相加。至此我们了解了Python语言中最基本的变量类型和加法运算。
三、列表
列表是Python语言中最具特色,用途广泛的数据组织方式。形式类似于数组,但所能容纳的数据类型非常广泛。利用方括号定义一个空的列表,使用append函数动态增加三个整型元素,实际上,也可以直接在定义的时候就将1,2,3放在方括号里面形成列表的元素。 利用列表下标访问列表中的元素,使用print进行显示,右边前三个元素是输出内容。需要注意的是列表下标是从“0”开始的,也就是说下标为“0”的元素为第一个元素。
展示访问列表可能会出现的错误。这里定义了三个元素的列表,接下来输出该列表的第6个元素[5], 由于这个元素不存在,所以程序至此运行出错,并终止运行。 这是在访问列表元素的时候需要注意的情况。
以下是一些关于列表的基础操作,仅作了解,需要用到的时候来查看。
四、运算
Python中的基本运算。基本运算包括算术四则运算,比如这里的加法,乘法,除法运算,按照先乘除,后加减的顺序执行运算,右边对应着计算结果。这里给出了取余数和幂乘运算,百分号表示取整数相除之后的余数,两个连续的乘号,表示计算幂乘运算。
运算符注解:
在Python中的逻辑运算则使用&、|、and、or、not等表示。需要注意的是&与and是相似但不同的。|与or是相似但不同的,下面通过举例来学习逻辑运算符。
1、and运算:
- 语法:x and y
- 注意:x与y是两个表达式,也可以是两个值,如果不是布尔类型(布尔类型就是值域为“True”或“False”两个值的变量)的值则自动转换为布尔类型,除了0之外的值都为“True”。
- 作用:将x和y做并列运算,
如果x和y的结果都为True,那么整个结果则为True。如果x和y有任意一个结果是False,那么整个结果则为False。
解释:
-
and两端的操作数,如果左侧已知为False的话,则不判断右侧,并以左侧操作数的值作为整体表达式的值。
-
and两端的操作数,如果左侧判断为True的话,则继续判断右侧,并以右侧操作数的值作为整体表达式的值。
示例:
(0 and 0) = 0
(0 and 5) = 0
(5 and 8) = 8
2、or运算:
- 语法:x or y
- 注意:x与y是两个表达式,也可以是两个值,如果不是布尔类型(布尔类型就是值域为“True”或“False”两个值的变量)的值则自动转换为布尔类型,除了0之外的值都为“True”。
- 作用:x,y两个条件只要有一个为True,那么整体结果就为True
解释:
当x为True时,则以x的值作为整体表达式的结果。 否则,则以y的值作为整体表达式的结果
示例:
(0 or 0.0) = 0.0
(5 or 8) = 5
(“来了” or “老弟”) = “来了”
3、not运算:
- 语法:not x
- 作用:对x进行布尔取反/取非,非真即假,非假即真。
如bool(x)为True,not x 则为False。
如bool(x)为False,not x 则为True。
示例:
(not 15) = False
(not 0) = True
4、&(与)运算:
- 语法:x & y
- 注意:x与y是两个值,转换成二进制后按位and运算。
- 作用:精确控制二进制数据中的每一位数据。
示例:
5、|(或)运算:
- 语法:x | y
- 注意:x与y是两个值,转换成二进制后按位or运算。
- 作用:精确控制二进制数据中的每一位数据。
示例:
五、字符串格式化
字符串格式化是用来将特定对象转换成字符串中特定的格式,比如这里是将name字符串嵌入前面的说明字符串中。%s,表示将name对应的John进行替换。 最终输出的结果 就是Hello John。这里有一个字符串和一个整数变量,这里是将它们分别以字符串和数字的形式,替换前面的%s,%d两部分,这是最终的输出结果。%s,%d是最常用到的1个格式化符号。
这里给出了更多不同的格式化符号,在用到的时候可以进行查阅。对于%s格式化符号来讲,它还可以用于输出任何类型的变量,比如对于列表,它是调用了列表的表达函数生成对应的字符串,最后形成字符串格式话后的内容。
六、字符串
字符串可以看成是字符类型的列表,它的很多操作可以利用Python列表的操作进行。
比如使用len可以返回字符串的长度,也就是所有字符的个数。
可以使用index函数返回某一个元素第一次出现时对应的下标,比如在“Hello world!”中,第一个字符“o”对应的下标为4。 也可以使用count返回每一个元素的个数,比如“l”在字符中的个数,等于3。
对于列表最为强大的操作方式就是所谓的切片操作,也就是通过下标获取列表中某一部分元素。这种操作也适用于字符串,比如这里通过下标3,7获取字符的内容,对应字符串的一个片段。对于切片三元组的最后一个数字,仅支持等于1的情况。
最后,再介绍一个非常有用的函数,就是split函数,它可以把字符串按照某种分隔符进行切分,这样就形成了切分后的列表。这个功能在平时编程的时候用处非常大。
七、判断语句与比较运算符
Python中的判断语句是程序流程控制的重要部分,它允许程序根据特定条件执行不同的代码块。Python中的判断语句主要有if、elif和else三种。
对于上面语句同学们可以这样解读:如果表达式1是真的,那么就执行语句1,否则判断表达式2是不是真的,如果表达式2是真的那么执行语句2,否则执行语句3。
请看下面的实例:
八、循环语句
循环是编程中最为强大的功能,它可以通过少量的语句成批次的完成大量的工作。 for循环是最常用到的循环语句。 这个例子中,numbers列表包含有前八个质数, 这个for循环是将列表中的数, 通过print输出。
利用for循环对列表元素进行遍历。 可以使用range形成数字列表, 比如range(5)表示从0到4的五个整数, 对应的0,1,2,3,4。range还可以生成从任意两个数字之间的整数, 比如range(3,6)表示了3,4,5。利用for和range可以构成编程中常见到的循环操作。
使用while语句可以构成另外一种循环结构。它是先判断条件是否满足,如果条件满足则重复进行。比如这里对count是否小于5进行判断,如果满足则重复执行下面的程序块。最终输出0,1,2,3,4。
当判断条件(count<5)一直为真时,除非遇到可以种植循环的语句,否则会一直循环下去,我们一般称之为“死循环”。
在循环中,通常是用break和continue来控制循环走向。break语句是终止循环,continue则是结束当前循环,开启下一次循环。比如在这里的两个循环例子,第一个while循环中,当count大于等于5之后结束循环,所以最终输出从0到4的整数。第二个for循环中,对于x除以2的余数等0,也就是x为偶数的时候,开启新的循环,所以最终只输出x等于奇数的数值。合理应用for,while,break,continue,可以形成灵活多变的程序功能。
在Python语言中,还可以把else语句和while,for配合使用, 也就是当while,for语句条件不满足的时候, 执行else语句后面的程序块。 这里给出了while,for两个循环的例子, 大家可以自行分析一下它们执行的结果。 由于这种语法区别于C语言,所以平时我也不敢使用这种结构。如果循环是被break打断的,则不会执行else中的语句。
九、函数
编程语言中的函数和数学中的函数概念不同,它是用来实现模块化编程,复用编程代码,提高编程效率的重要手段。这里给出了函数定义的三个例子。
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号(注意是英文输入法下的符号),然后在缩进块中编写函数体(这个函数所要做的事情),函数用return语句返回的返回函数结果,可以是对传入参数的一个操作结果,也可以是自定义返回的一个值。
首先来看没有返回值的函数(这里以点亮LED为例):
可以看见,当我们点击运行按钮后,在串行中断打印出了函数内print的内容,同时也可以在视觉模块上看到LED3,蓝色LED亮起。
有参数但没有返回值的函数:
这个函数定义,传入一个数字,然后点亮对应的LED,执行完操作程序进入空循环,最后在那个的结果就是LED3,LED2,LED1间隔500ms被依次点亮。
对于带参数和返回值的函数,我们以求绝对值的my_abs函数为例:
在这个文件中,我们定义了一个 my_abs() 函数,对传入的参数x进行判断,如果x大于0,则返回x,如果x小于0则返回x的负的x,只要将需要进行绝对值处理的数或表达式传入这个函数就会得到传入数或表达式最后的绝对值。
在 Python中通过def定义的函数,当在程序中调用该函数的是,就会执行函数中的语句。第二个例子是带有参数的函数定义,可以在调用时加上不同的参数,可以改变函数执行的结果。最后,函数还可以返回一个结果,比如这里的函数,就是返回对这个参数的处理的结果。
05 LQ_MV4固件
一、LQMV4固件说明
LQMV固件是基于开源工程代码修改编译而来,与OpenMV IDE软件中自带的固件不同,基于LQMV4拓展板做了许多外设拓展,引出更多可编程I/O,同时适配MicroPython在OpenMV IDE环境中开发,在编写用户应用程序上相对其他市面上的OpenMV而言可实现更多功能,连接更多的外设。
二、安装固件刷写软件
注意,如果不小心在IDE中更新了固件或者意外导致模块变砖(固件损坏不能运行或硬件损坏),固件损坏可以通过以下方法来重新烧写固件。
- 安装软件STM32CubeProgram,资料中有下载连接和下载好的软件安装包,可从官网下载最新版或直接使用资料中固件文件夹中提供的该软件。
下滑到底部,下载软件,选择windows系统,获取最新版。安装过程保持默认安装即可。
下面以资料中的软件安装包为例看一下重新刷写底层固件过程:
依次运行下图两个程序,第一个为第二个烧录软件的环境准备,如果电脑没有安装过程序编译软件的建议安装一下第一个jdk,安装选项默认即可,以免后续软件使用过程中出现未知错误,第二个为ST工具软件,用来给STM32芯片烧录程序刷写底层固件使用。
三、刷写固件
- 将模块的BOOT和RST引脚用跳线帽或杜邦线连接起来或仅将BOOT与GND相连,再用数据线连接模块与电脑,此时模块将进入DUF模式,可以通过USB接口连接STM32CubeProgram软件,进行内数据擦除和刷写操作。
- 打开上面安装好的STM32CubeProgram软件
按下图步骤进行操作(1)选择USB连接模式(2)刷新(3)选择固件。
-
将LQMV4_firmware_v1.0.bin复制到桌面,注意文件路径不可存在中文。
-
选择桌面上的二进制文件,勾选校验选项,单击连接然后开始编译,等待编译下载完成(完成后会有两次提示,点击确认即可)。
- 下载完成,点击断开连接,去掉跳线帽,断电重连或按模块上的复位按键重启模块稍微等待即可重新连接上电脑。
如果你的模块无法进入DFU模式,也就是无法连接STM32CubeProgram软件,接入电脑也不是别,或模块一直亮白灯,那么很有可能模块硬件有损坏(这里的硬件损坏是指运行固件的最小系统 环境),建议更换模块或模块上的主控芯片再试。
※ 总 结 ※
本文给出了应用OpenMV IDE 开发 福来全向视觉车模的软件编程的基础知识。 此外,还给出了对于视觉模块进行固件更新的方法。