基于i.MX RT1060的可编程视觉模块

模块简介


i.MX RT1060可编程视觉模块


基于i.MX RT的可编程视觉模块有以下特点:

 (1)主控芯片使用NXP i.MX RT1062,600MHz Cortex-M7,1MB RAM,4MB Flash (通过QSPI扩展);

 (2)感光芯片使用OmniVision OV7725,这是一款快速 CMOS感光芯片,最高分辨率 VGA (640x480);

 (3)在尺寸、扩展引脚、使用习惯和软件开发接口上兼容著名的OpenMV3 M7 Cam。关键接口包括SPI, I2C, UART;

 (4)集成了Micropython运行环境,包括编译器、装载器和虚拟机。使用开发效率极高的Python语言做应用程序的二次开发;

 (5)应用程序(使用Python编写)和数据存储在外部扩展的TF卡中;

 (6)模块连接USB后,电脑识别出优盘。可以使用任意文本编辑器开发程序;

 (7)兼容OpenMV IDE的调试监控协议,实现一键下载、秒见效果、监控帧缓冲、虚拟串口控制台。


开发环境建立


1. 模块购买


购买的淘宝链接为:

识别图中的二维码转至淘宝网店

https://item.taobao.com/item.htm?id=585420906175&ns=1&abbucket=12#detail 



参赛选手专享优惠价

大赛组委会为选手们争取到了优惠价,原价399元,优惠价349元,包邮。购买时,向卖家说明购买目的用于智能车竞赛,以如下格式:

学校:xxx  指导老师:xxx购买数量:x  

是否需TF卡:Y/N


并拍下商品,请卖家更改价格为优惠价349元。


竞赛现场的参赛同学


注1:如果需要出具发票,需另加税点。

注2:模块需要TF卡,默认发货不包含TF卡。如需TF卡,卖家提供高质量的32G卡,另加50元。

注3:默认提供2.8mm焦距的M12镜头。也可以指定其它焦距或从网络采购其它焦距M12镜头。焦距越长放大倍数越高。注意焦距影响距离计算,并且过长的焦距有可能使定位码无法完整出现在视野中。


配置的不同焦距的镜头



2. 软件安装


(1)文本编辑器

只需能编辑Python源代码的编辑器即可,如Notepad++,Visual Studio Code等。


强烈建议安装OpenMV IDE。本模块实现了OpenMV IDE的调试监控协议。为了体验无需存盘一键下载并且监视模块帧缓冲的功能,以及启用虚拟串口功能,强烈建议使用OpenMV IDE加快开发。


OpenMV IDE 以及开发模块


OpenMV IDE的下载页面链接:

https://openmv.io/pages/download

支持多种操作系统的安装包。


注:在模块连接OpenMV IDE期间会占用虚拟串口,无法同时使用串口上的Python交互式命令环境。


3. 使用OpenMV IDE开发与测试


启动安装好的OpenMV IDE。首次上电后,系统可能花较长时间(可能超过1分钟)来安装和配置驱动,请耐心等待。若中途取消安装可导致驱动安装失败。如果是这样,建议拔下电源,重装OpenMV IDE再上电。


将智能摄像头模块加入USB插头

如果在插入的TF卡里包含main.py,本模块会在上电后自动执行main.py。

使用USB线连接电脑上的USB口和本模块的USB micro口。这会使模块上电,红灯闪烁约2秒模块开始工作。


注:本模块尚未支持OpenMV IDE的固件升级功能。


开OpenMV IDE,待左下角的连接符号带有蓝牙标记后,即可电机次按钮连接视觉模块了。

带有蓝牙标记的连接图标


将视觉模块通过USB接入电脑,OpenMVP IDE显示连接成功


模块外部结构


模块引出了10个扩展引脚,可复用为多种功能。其中管脚名与OpenMV Cam相同。


功能1除UART外与OpenMV Cam相同,但CPU名并不相同--因为MCU不同。


模块正面左边扩展接口定义


模块正面右边扩展接口定义


注:DCMC(控制直流电机)和Servo(控制舵机)虽然在底层都是把PWM进一步封装的API,但是仍然以独立功能的身份出现。


注:灰色的字体的功能,如PWM, DCMC, Servo, CAN, RPM(转速), SRPM(有向转速)暂未支持。


注:复用功能以程序最后的配置为准. 例如,若先配置引脚P8为Pin (GPIO), 后又配置UART4,则P8脚先用于GPIO, 后被UART4占用为接收数据(RXD4)。


教程资源


由于本模块高度兼容OpenMV Cam,而OpenMV Cam又包含了Micropython运行环境,在网络上大量的OpenMV教程和Micropython教程均可参考,资源非常丰富,下面列举了一些。


OpenMV Cam在中国区的代理:

https://singtown.com/openmv/

有很多优质中文教程和指南

智能车竞赛中不允许使用星通科技代理的视觉模块,

但大家可以使用它进行学习该视觉模块的编程和开发


中文快速上手指南:

http://book.openmv.cc/quick-starter.html


快速上手网站资源详细而丰富


中文Micropython语言:

https://docs.singtown.com/micropython/zh/latest/openmvcam/reference/index.html

中文翻译的资料非常全面


英文Micropython语言:

http://docs.micropython.org/en/latest/

英文资料网站


April-Tag介绍


本模块的April-Tag检测功能继承自OpenMV的算法,可以检测标签号、标签偏角,以及通过标签外接矩形判断与标签的倾角,还可根据镜头焦距与标签在视野中的大小判定与标签的距离。


利用OpenMV IDE 生成所需要的 April Tas


OpenMV IDE中包含了April-Tag的示例"find apriltags"供参考,亦可参考教程:

http://book.openmv.cc/image/apriltag.html


部分April Tags的生成图片文件


与OpenMV Cam的区别


OpenMV Cam的软件以MIT开源协议授权,本模块移植了OpenMV软件的全部算法部分,这部分是完全兼容的。


i.MX RT1062 智能视觉模块


硬件上,OpenMV使用的是STM32F7/H7,并且集成了Micropython针对STM32的移植和硬件操作模块"pyb"。本模块亦实现了pyb的主要功能(见模块扩展信号节图中的黑色字体功能)。


pyb和machine模块中并不包含和Pyboard/OpenMV Cam等板子的全部功能,但是不影响创意组比赛的使用需求。


本模块只支持TF卡上的文件系统,不支持使用内部Flash模拟,因此TF卡是必备的。


i.MX RT1062视觉模块上的TF卡


OpenMV Cam有很多扩展板,本模块支持其中的LCD Shield。


本模块还包含了可选的9轴运动传感器MPU9250,OpenMV Cam不包含。如需使用,会占用I2C扩展口,注意I2C slave地址不要与它冲突。


MPU9260运动传感器


常见问题


图像对比度差

建议使用黑色电工胶布粘上模块背面的扩展口(粘在M12底座的两个定位螺丝口中间,如上文照片所示)。


图像颜色发灰(饱和度低)

旋下M12镜头,检查背面是否粘有红外截光片。


图像中有污点

旋下M12镜头,清洁OV7725芯片表面。


OpenMV IDE中运行Hello world示例时图像刷新率低

可以适当加延时以给IDE更多机会刷新帧缓冲:

import utime


在主循环最后添加 "utime.delay_ms(10)"。具体时间可调整,一般在5-10之间。

注:在实际使用时建议去掉这个延时。


连接USB后没有识别出优盘

这应该是SD卡初始化失败导致的。在板子上按下复位按钮或重新上电一般会解决问题,亦可能TF卡质量差/损坏。


摄像头图像有(蓝色)噪点

这是因为默认的像素时钟为OV7725的上限(60MHz),当环境的电磁干扰较大时容易出现此问题。可以通过以下方法调整:

sensor.set_framerate(0<<9|N<<12) 

建议N的取值为1-7(不要设为0!)。此时,像素时钟频率为 96MHz / (N+1),分别是 48M, 36M, 24M, 19.2M, 16M, 13.7M, 12M。


注:此方法只适用于本模块。

注:若像素时钟过低,会影响图像刷新率。


摄像头图像阴暗

可在默认启用auto gain的情况下跳过帧一段时间,如以下代码所示:

    sensor.reset()

    …....

    sensor.skip_frames

(time = <时间(单位ms)越长越亮,一般在100-2000之间>)

    sensor.set_auto_gain(False)


若仍然偏暗,可以同样通过降低像素时钟来解决,参考"摄像头图像有(蓝色)噪点"的解决方法。


在暗室中即使打开红外LED (LED4)仍无法显示图像

需要旋下M12镜头,拆除背面的红外截光片。注意,这是破坏性的操作。


购买时缺货

万一缺货并且急用,可以先购买官方的OpenMV Cam M7/H7临时救急,不影响机器视觉算法的使用,但性能会比本模块低。


刷新模块的固件


模块正常使用时不需要这部分内容,仅当模块变砖或的确需要新固件的功能时才会用到。您需要安装KEIL uVison5.20以上版本 (MDK)软件,并在软件中安装i.MX RT1060的Pack,以及J-Link调试器来执行这部分操作。


本模块的固件基于C语言的KEIL工程,开放源代码,并引出了适用于Cortex-M7核的SWD调试接口。可通过KEIL生成固件并通过J-Link烧写固件。


模块源代码位于github: 

https://github.com/RockySong/micropython-rocky/tree/omv_initial_integrate


注意:务必选定分支"omv_initial_integrate",不要使用默认的"master"分支!


(1)克隆或下载一个压缩包。然后使用KEIL打开源码树中的:


\ports\prj_keil_rt1060\mpyrt1060.uvprojx


编译(约2-4分钟),编译前确保选中"debug_flexspi" Target  

 

(2)使用杜邦线连接J-Link和本模块的调试接口,分别是

  • J-Link.Pin6 (GND) -> GND (J1.6)

  • J-Link.Pin1 (VCC) -> 3.3V (J1.5) 

  • (可选,若使用USB供电可不连接)

  • J-Link.Pin7 (SWCLK) -> SWC (J1.2)

  • J-Link.Pin9 (SWDIO) -> SWD (J1.3)


 (3)在KEIL里点击菜单栏上的 "load" 按钮,等候1-2分钟即可擦除和下载完毕

 (4)下载完毕后需重启本模块方使新固件生效


注意:若烧写中途失败,可导致模块无法再启动,烧写前务必确保J-Link与模块的连接是稳定可靠的。


刷固件中途失败或其它原因导致模块无法启动的补救

1. 用电烙铁先去掉电阻R4(正面,镜头底座左下),R2(背面与R4接近的位置);

2. 短接R1(在R4旁边)和R5(在R2旁边)

3. 重新连接J-Link,在KEIL中重新下载程序固件;

4. 断开R1, R5,

5. 重焊R2和R4,或者直接短接。


具体原理可参考原理图(omvrt1_sch.pdf)中的"BOOT"部分介绍,截图如下:


模块启动复位相关电路


默认的启动方式是"Internal Boot(NormalBoot)", 补救时改用"Serial Download(Bootloader)",请勿尝试其它启动方式! 


若补救后仍然无法启动或无法刷固件,则很可能硬件已经损坏。




提问与回答


提问:卓大大 你好 我想问一下室内创意组的赛道是和你之前的推文内的一样的吗 我发现推文内的码识别出来的结果如下 和你之前回复的0-31并不一致。

回复:你们很仔细。我推文中是手工摆放,是一个示意图。实际上还是按照从左到右,从上到下,从0到31摆放。


提问:卓大这三个轮胎,哪个需要下岗啊?

回复:第一个。


提问:卓老师,你好,这个车模节能组能用吗?

回复:可以的。挺好的。但需要保证皮带着地,塑料轮不不着地。这应该是我见到的有可能最节能的了。如果增加些机械储能则估计不需要消耗什么电能驱动就能够跑完全程。


提问:卓大大,请问我可以把这里的铜柱改短一点吗?

回复:可以的。


提问:请问这种光强有吗?大概比赛场地的光会是什么样的?

回复:有,恰到好处。


提问:卓大大,关于F车类别的两个电机的车,两个电机是给同样的pid输出同样pwm可输出的转速不一样,可是如果用两个pid控制两个轮子,两个轮子达到相同转速的时间也会有偏差,这个怎么取舍呢?

回复:1. 你叙述的问题整体上的原因来自于两个轮子在电机性能、机械传动和轴承阻力等方面有差异; 2.如果使用独立的PID控制,发现两个轮子响应速度不同,则说明PID参数需要进一步调整,以缩短控制的过渡过程。