[原创] 再续Openmv4,填挖坑路之一:从源头流程开始说起

RCSN   2018-11-18 18:55 楼主
嗯,终于挤出了点时间,还欠女神和队长几个帖子,我想着,那就以此作为连载贴,吹吹水. 去年我也自己DIY了openmv3,今年官方出了openmv4,我也顺着源码的理解,也同样DIY了openmv4,并且摄像头可拆卸,支持了四款摄像头,MT9V034,0V9650,OV2640,OV7725.由于官方至今还在众筹当中,而且等到3月份才发货,期间没有放出原理图
  在这个连载中,去年free叔叔说,之前的讲了太多硬件的东西,没什么大用处.所以在往后的帖子,并不多去介绍硬件上的那些坑.我更多想分享的是源码的理解,以及mricropython这个脚本语言最底层的理解.算法上的理解.
  mircropython有很多bsp支持,在这里我只是单纯用openmv4的bsp作为例子来说明,其他的Board其实流程也大致差不多.如果有其他坛友mpy的流程也有理解的,我如果有说得不对的地方,望给予纠正,一起进步.
  openmv包括两个部分,一个为openmv模块,另外一个为PC端的上位机,也就是openmvIDE.通信方式为USB的CDC虚拟串口.有自己的一个简单的通信协议,那么此贴我就是以通信作为开头,同样以通信作为结束.
Openmv的usb设备是虚拟串口和大存储设备复合.包括pyb等板子,支持mpy的板子都带此复合设备.USB设备这个玩意实在复杂,我也是对此对USB的底层驱动绕晕了头.openmv的初始化代码如下:
TIM截图20181118182243.png
    TIM截图20181118182400.png
    那我们再来看下USB设备的初始化代码,这个附属在mpy的Port文件夹的STM32的USB.C文件中,所有的STM32系列通用初始化的接口.
    TIM截图20181118183830.png
    TIM截图20181118183916.png
   那么我们来看下USBD_CDC_MSC_HID这个CDC/MSC接口的回调结构体.
    TIM截图20181118184753.png



此内容由EEWORLD论坛网友RCSN原创,如需转载或用于商业用途需征得作者同意并注明出处



1084534438 欢迎交流  [加油,一切皆有可能]

回复评论 (19)

那么我们知道了读写接口,就以读接口来作为说明,也就是USBD_CDC_MSC_HID_DataOut这个接口,注意我说的读接口,是指上位机openmvIde下发配置,写接口是发送数据给上位机.这个接口需要判断USB复合设备下是哪个设备所发的数据,是CDC设备还是MSC设备还是HID.我们这里讨论的是虚拟串口下与上位机IDE的交互,所以我们进而进入另外一个读写接口usbd_cdc_receive
TIM截图20181118190310.png
    我们可以看出,接受部分,首先判断波特率是否满足条件,再者判断帧头是不是0x30,再判断第二个字节是否为指令码,之后为数据长度大小.这就是openmv的简单通信协议.
    TIM截图20181118191154.png
   上图的dbg_mode_enabled成立条件就是CDC波特率是否满足条件
    TIM截图20181118191536.png

    TIM截图20181118191636.png

1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 19:16
如果波特率成立,那么就是协议的解析上,openmv上,协议很简单.比如我要读取软件版本号,那么先发帧头指令0x30,再发版本号指令码,再发对应的长度;再比如我要执行Py文件,先发帧头指令0x30,再发执行指令码,再发对应的长度,最后再发文件.对应的指令在usbdbg_cmd枚举当中.
    TIM截图20181118200749.png

    TIM截图20181118201013.png

1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 20:12
如果不是源码分析那就太细了。
点赞  2018-11-18 20:23
好吧,可能我说了那么多,却没有实际验证起来.那么我们就跟踪着这思路,不使用官方IDE,单纯使用串口助手,来实现数据交互,看通信是否正常.那么最简单的方式,就是常用的读取其中的软件版本号.按照上述的表达以此来验证.
验证之前我们需要跟踪下源码,当收到第一个字节为0x30,也就是指令头,就进入到usbdbg_control函数当中,这个函数主要是判断哪个指令码,并把字节长度记录下来.这个长度很重要,比如记录py文件的长度,执行解析此文件的时候也是按照这个长度来解析.
TIM截图20181118205931.png
    发送完指令后.发现如果长度不为0,并且指令码大于0x80,上述枚举中大小大于0x80的都要收到指令后要进行回应,固件版本号刚好为0x80,则必须上报.
    TIM截图20181118210612.png
    跳进这个函数之后,最底层的函数接口就为usbdbg_data_in,这个写接口.
    TIM图片20181118210930.png

1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 21:09
来点更激动人心的,比如在DIY一个?几个好玩的图像分析?
点赞  2018-11-18 21:11
或者一起试试最新的K210板 openmv,这个看起来比较有前途的
点赞  2018-11-18 21:12
接下来我们就是来验证下,在OpenmvIDE下,软件版本号的获取直接点击连接控件就可以看到版本号了,如下  
    TIM截图20181118211640.png
   那么我们用协议来发送,通过串口助手
   TIM截图20181118212138.png

1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 21:21
引用: dcexpert 发表于 2018-11-18 21:11
来点更激动人心的,比如在DIY一个?几个好玩的图像分析?

D大晚上好.
  我在淘宝上有预售,支持四款摄像头.后面我会放点gif图,效果是比openm3好.
1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 21:26
很有钱图啊
点赞  2018-11-18 21:35
引用: RCSN 发表于 2018-11-18 21:26
D大晚上好.
  我在淘宝上有预售,支持四款摄像头.后面我会放点gif图,效果是比openm3好.

H7和K210相比,那个性能更好?K210应该成本会有优势,但是软件和硬件可能还有坑
点赞  2018-11-18 22:01
好像说的是有点单调无聊.还有一种方式就是使用官方的py文件进行验证.这个我可以留下下个帖子.
以下是部分git图了.清晰度上比openmv3好太多,openmvIDE里的demo例子都可以运行.
IMG_1005.JPG

P81118-215356.gif

P81118-215232.gif

P81118-215039.gif

P81118-214820.gif

P81118-214656.gif

P81118-214459.gif

1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 22:07
引用: dcexpert 发表于 2018-11-18 22:01
H7和K210相比,那个性能更好?K210应该成本会有优势,但是软件和硬件可能还有坑

  RISCV架构不了解.不过内置加速器,可以快速CNN计算,这是H7没法比的.其他资源不太清楚.
  Openmv4也有太多坑,开源的东西都是这样的,但K210开源多少,我也不太清楚.
1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-18 22:24
  由于openmv4的内存受限,大分辨率的RGB565显示不了,但是灰度的最大分辨率可以达到752*480
       P81119-002343.gif
1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-19 00:26
给力,给力。
点赞  2018-11-19 09:02
引用: RCSN 发表于 2018-11-19 00:26
由于openmv4的内存受限,大分辨率的RGB565显示不了,但是灰度的最大分辨率可以达到752*480

这个效果不错。

你签名中小店的链接好像出问题了,打不开。
点赞  2018-11-19 09:25
如果不是源码分析那就太细了
点赞  2018-11-19 13:52
PY城牛逼,我的板子还在吃灰呢
Hello astroturfers
点赞  2018-11-20 09:00
引用: y909334873 发表于 2018-11-20 09:00
PY城牛逼,我的板子还在吃灰呢

玩起来啊
1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-11-20 09:21
引用: RCSN 发表于 2018-11-20 09:21
玩起来啊

不是点过灯就算玩过了吗?
Hello astroturfers
点赞  2018-11-20 10:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复