big_uncle

Results 105 issues of big_uncle

# 写在最前 本网页将我这一年(2018年)的电控经历积累下来的知识和经验,以及下半年进行的两次培训的内容和要点做了一个综合总结。 上半年我一直用的是标准库进行编程,但自从国庆期间用上**HAL库**之后,我被HAL库的便捷深深打动,自此基本放弃了标准库,所以本总结的内容是基于HAL库的,并结合**STM32CubeMX**软件(因为过程有些繁琐,截图很麻烦,所以本总结并不会贴出STM32CubeMX上的相关配置过程)。 # GPIO GPIO外设一共有八种模式,我比较熟悉的是这三种:**上拉输入**、**下拉输入**、**推挽输出**。上拉输入和下拉输入一般都和**外部中断**联系在一起,最典型的的应用就是读取按键的输入。推挽输出的功能是控制IO口的输出电平的高低,最常见的应用就是控制LED灯的亮灭。GPIO涉及的基本函数有以三个: ## GPIO简介 ```c HAL_GPIO_WritePin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //直接指定引脚的电平输出,用于推挽输出 HAL_GPIO_TogglePin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin); //直接翻转引脚的电平输出,无需指定输出电平,用于推挽输出 HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin); //读取指定引脚当前的电平高低...

RM

# 资源简介 对于Microsoft Windows程序来说,图标、光标、菜单等都是Windows“资源”的类型。资源是数据,它们通常被保存在一个程序的`.exe`文件中,但它们不在可执行程序的数据区,换句话说,资源不能再程序代码中用变量直接寻址,相反,Windows提供了函数来显示或隐式地把程序资源加载到内存中以供使用。 使用资源的一个好处是可以把程序的很多组建都绑定到程序的`.exe`文件中,如果没有资源的概念,一个诸如图标图像的二进制文件将不得不作为一个单独的文件来保存,`.exe`文件需要将该文件读入内存再能使用。或者,图标需要在程序中定义为一个字节的数组(这会使得我们难以将实际图标图像可视化),而作为一种资源,图标在开发者的机器上被存为一个单独的可编辑文件,然后在程序编译的过程中被绑定到`.exe`文件内。 # 遇到的问题 不管是什么教程,基本都是通过IDE来添加资源,并且教程中都强烈建议不要修改IDE自动生成的`resource.h`和`resource.rc`文件,编译也是通过IDE自动将资源和代码文件链接起来,目前的教程里基本都是基于Visual Studio的,更老一点的教程可能基于Visual C++ Developer Studio,而我追求的是去IDE化,想使用命令行直接编译。 我的工程文件有: * menudemo.c * menudemo.rc * resource.h 代码里实现的是一个顶部菜单栏,具体的菜单选项在`menudemo.rc`里面。我按照之前的编译方法编译: ```bash gcc -mwindows menudemo.c -o menudemo.exe ``` 然而生成出来的可执行文件里并没有顶部菜单,说明编译时并没有将资源文件包含进来,这让我一度很困惑。 # 编译资源文件...

other
Win32

要实现嵌入式视觉开发,首先得把最强大最经典的OpenCV学会。 我参考的是毛星云主编的《OpenCV3编程入门》,过了一遍,记录了我比较关注的内容。学习时编写的源码如下: ```cpp #include using namespace cv; using namespace std; const int g_nMaxAlphaValue = 100; //Alpha值的最大值 int g_nAlphaValueSlider; //滑动条对应的变量 double g_dAlphaValue; double g_bBetaValue; Mat g_srcImage1; Mat g_srcImage2; Mat g_srcImage; Rect...

other

好几周没写文章了,主要是因为保研了嘛,又被学弟叫回战队去了,前段时间在忙着搞培训,制定规章制度之类的,当然最主要的还是因为我想搞一个大的。 今年的RoboMaster多了很多元素,据说今天出规则,不过现在我写文章的这个时刻还没出,估计再过几个小时就出了吧。今年主要多了导弹和雷达站元素,其中导弹需要嵌入式视觉的参与,于是我就参与了嵌入式视觉的研发。而我最熟悉的还是MCU的开发,所以希望能直接在MCU上运行视觉代码。 # openmv 目前市面上最火爆的,运行在MCU上的视觉识别产品是[openmv](https://openmv.io/),它是完全开源的,github地址在[这里](https://github.com/openmv/openmv),目前国内的官方代理商是[星瞳科技](https://singtown.com/openmv/)。 星瞳科技做的比较好的一点是把官方的openmv英文文档翻译成了中文,不过有些地方翻译的还不是太好。英文文档点[这里](http://docs.openmv.io/),翻译的中文文档点[这里](https://docs.singtown.com/micropython/zh/latest/openmvcam/index.html)。 openmv内嵌了[micropython](https://github.com/micropython/micropython),实现了在单片机上运行python,支持最新的python 3.X,还是非常不错的。回想起来前几年在MakerFair上看到的可以用python编程的单片机,估计就是内嵌了micropython,亏我当时还以为是那些公司自己写的中间层,没想到是直接用的开源的东西。 正是因为有了micropython,openmv留给用户的接口是python的接口,且基于Qt开发了一个挺舒服的IDE,用户直接在里面用python调用API就行了,上手非常快,效果看得见。目前主要是各种电子设计大赛中会见到它的身影。 那么既然已经有了openmv为什么还要自己另外做嵌入式视觉呢?原因主要有以下几点: * openmv留出来的接口都是固定的,虽说已经很多了,但是可能在一些很特殊的环境下无法很好完成工作 * openmv内部是封装好的,优化是没法优化的 * 用户代码用python写,写好之后是以字符串的形式传给单片机的,单片机还得挨个解析,然后调用相应的函数,资源再怎么也耗费了一些,感觉不爽 * 要不是openmv用的 F7和H7系列,性能绝对不行 * 最重要的一点,直接用openmv多无趣啊,RM比赛本就是挑战自我的,正好趁这次机会学点新东西 综上,我选择了自己研发。 # OpenOV 先给自己的东西取个名字。其他两搞视觉的一个是`opencv`,一个是`openmv`,而我的打算用OmniVision公司的OV系列摄像头(其实openmv用的也是这个),所以我的就叫做`OpenOV`吧。 先列一下我所计划有的资源: * 摄像头×1 * LCD×1...

RM
Project

记得高一的时候第一次接触三维立体图,非常震惊,热情地推荐给身边的同学,结果到目前为止,没有一个同学和我一样能看出其中的三维信息,十分沮丧。 最开始接触的三维立体图是刘红石大大制作的,他的官网点[这里](http://www.liuhs.com/),里面有他的三维立体图,有立体摄影,有文本立体图,还有图片程序下载以及实现的代码,我把他的代码用JavaScript重写了一遍,将文本立体图和三维立体图整合起来,可以使用浏览器直接生成。 代码放在最后说。以下是转载刘红石老师的**三维立体画原理和观看方法**。 --- 三维立体画是利用人眼立体视觉现象制作的绘画作品。普通绘画和摄影作品,包括电脑制作的三维动画,只是运用了人眼对光影、明暗、虚实的感觉得到立体的感觉,而没有利用双眼的立体视觉,一只眼看和两只眼看都是一样的。充分利用双眼立体视觉的立体画,将使你看到一个精彩的世界。 # 一、立体视觉和立体画原理 人有两只眼,两只眼有一定距离,这就造成物体的影象在两眼中有一些差异,见右图,由图可见,由于物体与眼的距离不同,两眼的视角会有所不同,由于视角的不同所看到是影象也会有一些差异,大脑会根据这种差异感觉到立体的景象。 ![image](https://user-images.githubusercontent.com/35989223/67154444-78f75b80-f32f-11e9-9f53-a73ffe356f0c.png) 三维立体画就是利用这个原理,在水平方向生成一系列重复的图案,当这些图案在两只眼中重合时,就看到了立体的影象。参见下图,这是一幅不能再简单的立体画了。图中最上一行圆最远,最下一行圆最近,请注意:最上一行圆之间距离最大,最下一行圆之间距离最小。  ![image](https://user-images.githubusercontent.com/35989223/67154445-844a8700-f32f-11e9-84b2-f26cae509486.png) 这是怎么发生是呢?让我们再看下图,从图中我们可以看到,重复图案的距离决定了立体影象的远近,生成三维立体画的程序就是根据这个原理,依据三维影象的远近,生成不同距离的重复图案。 ![image](https://user-images.githubusercontent.com/35989223/67154601-ca084f00-f331-11e9-8960-2f9613cf1337.png) # 二、立体画的观看 如果你现在还不会看立体画,是不是已经很着急了,下面我将介绍怎样看立体画。 立体画有两种形式:第一种是由相同的图案在水平方向以不同间隔排列而成,看起来是远近不同的物体,请看下图。这样的立体画可用任意一种图象处理软件制作,如Photoshop、Windows画笔等,你也可以一试。 ![image](https://user-images.githubusercontent.com/35989223/67154476-cf649a00-f32f-11e9-8727-7a31c353334a.png) 另一种立体画较复杂,在这种立体画上你不能直接看到物体的形象,画面上只有杂乱的图案,制作这样的立体画只有使用程序了,我为此编写了一些程序,有C和QBASIC的源程序,请看自制立体画和程序下载。两种作品看法是一样的,原理都是使左眼看到左眼的影象,让右眼看到右眼的影象,(有人说了:你这不是废话吗?)听我说具体的方法:当你看立体画时,你要想象你在欣赏玻璃橱窗中的艺术品,也就是说你不要看屏幕上的立体画,而要把屏幕看成是玻璃橱窗的玻璃,你要看的是玻璃之内的影象。 ![image](https://user-images.githubusercontent.com/35989223/67154494-1a7ead00-f330-11e9-8632-5b0db080d1a0.png) # 三、两点练习法 请把下图上方的两点作为目标,先使眼睛休息片刻,然后象眺望远方那样,用稍模糊的视线瞄准两点,就会看从两点各自分离出另外两个点,然后调整视线,试图将里面两个点合成一点,当四点变为三点时,你便会看到立体图象。 ![image](https://user-images.githubusercontent.com/35989223/67154496-1fdbf780-f330-11e9-8576-d529c3a8fc0a.png) # 四、另一种观看方法 从电脑上看费劲的话,可以这样,如果画面上标有两点(如没有,可以通过仔细观看,在横向上,相隔约3-5厘米,就有相同的图案,如两个相同颜色和大小的点等),那么可以用两个颜色深点的线垂直粘在显示器屏幕的上面(可以进入屏幕少许),使两条线垂直并分别与两点相连。然后,在显示器后面上方放个小东西做参照物,沿显示器上边沿来看参照物,前后移动眼睛的焦点,使左眼、左线、参照物成一直线,右眼、右线、参照物成一直线,可以挡上一只眼调整,然后两眼看参照物,此时两条线就变成了三条,让视线沿中间的线爬进立体画面就看到了立体效果。 --- 刘老师的主页里有示例代码,然而最关键的部分却没有注释: ```c...

web
other

​ 目前市场上USB设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID)。这里介绍如何实现HID类设备,以及如何在应用程序中对HID类设备进行访问。从Windows98操作系统开始,为HID类设备提供了通用的驱动程序,所以只要按照HID设备类的规范编写设备的固件程序,就能够让Windows系统自动识别设备,省去了复杂的驱动程序编写过程。 # HID 协议简介 ​ 人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID设备级定义规范要求的都可以认为是HID设备。HID设备有以下主要特点: * 交换的数据存储在报告的结构内,设备必须支持HID报告格式。 * 每笔事务可以携带小量或中量的数据。低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节; * 有最大传输速度的限制。低速设备最快10 ms一笔事务,最高速度为800 B/s;全速设备最快1 ms一笔事务,最高速度为64 KB/s;高速设备最快125 μs一笔事务,最高速度为24.576 MB/s。 * 没有传输速度的保证。 ​ 当插入USB设备后,主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。图1显示了HID各种描述符之间的关系。事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符 。 ![1](https://user-images.githubusercontent.com/35989223/67153763-e3a19a80-f321-11e9-8391-8cafdf5be30b.jpg) ​ 从图中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。 ​ USB设备有4种传输方式与主机进行通信:...

other

今天已经18号了,距离出车的deadline已经不远了,留给电控的时间不多了。 昨天和前天已经有好几波人轮流调了英雄车的云台,但都无功而返,眼看死期将至,决定自己还是亲自拼一把。 我想起了上一年比赛第一次接触PID的时候,连PID是啥都不知道,结果上手就是一个串级PID,六个参数直接玄学调参,调了一个月左右,最后发现反馈数据给错了!修正之后立马就调好了。 今天的情况其实也很类似,也算是反馈数据不准确吧。 今天我才知道串级PID的调试方法,之前我一直是六个参数同时变,然后波形也不看,就各种自闭,虽然我熬了很多次夜来调试,逃了好几节来调试,都无济于事,说白了就是没掌握方案,没有完全理解PID的含义。 串级PID先调内环的参数。我这里的串级PID分别是外环位置环和内环速度环,使用的是带输出上限和积分饱和上限的普通位置式PID函数。 首先只调速度环,我使用的是陀螺仪反馈的角速度信息,单位是`°/s`,输出的是电机的电流大小,也就是扭矩的大小。 但是自闭了一个早上之后一点进度都没有,调出来的yaw轴云台要么没有力,要么就是疯狂振荡,后来我使用J-Scope在线查看PID设定值和反馈值,以及电机的角度值的曲线才发现,陀螺仪的角速度反馈值存在两个问题。 1. 角速度数据反馈频率低,在J-Scope中显示的曲线呈很明显的阶梯状 2. 陀螺仪的角速度是根据加速度积分得到的,计算需要时间,所以反馈的数据在图像上显示存在相位差 上面两个特点就决定了陀螺仪的反馈数据不可用,因为角速度无法得到快速的反馈。速度环是属于内环的,内环是整个串级PID的基础,内环调不好,那整个系统就崩溃了。 在自闭了一会儿之后,我决定使用电机编码器的反馈的机械角度位置进行微分计算电机的转速。 在这里介绍一下电机的参数: > 机械角度反馈范围为0~8191 反馈频率为1000Hz 从上面的信息可以算出,如果只采集相邻两次的编码器数据,那么对应的角速度大约为 ![](https://latex.codecogs.com/gif.latex?$$\frac{1000\times&space;360}{8192}=43.94^\circ&space;/s$$) 这显然是不行的,所以我连续采集了24次编码器数据计算平均速度,这样子精度可以在上面的精度基础上再二四分之。 ![](https://latex.codecogs.com/gif.latex?$$\frac{43.94}{24}=1.83^\circ&space;/s$$) 实现的代码如下: ```c /** * @brief CAN通信电机的反馈数据具体解析函数 * @param...

RM

先把读卡器功能实现,相对于真正核心的嵌入式视觉代码来说,这种如同外设一般的存在就应该尽早被攻克掉。 # SDIO协议及SD卡简介 这里推荐看正点原子的教程,讲的很详细。这里真心给正点原子点个赞!暑假的时候突然发现正点原子入驻B站了,可以直接在线观看高清的视频教程了!去他妈的限速百度云,保存到网盘在线看也没法高清,还时不时卡顿,入驻B站这一操作简直感动到哭! * [【正点原子】 手把手教你学STM32 系列视频之 STM32F4-基于探索者F407-SDIO简介](https://www.bilibili.com/video/av56936776/?p=72) * [【正点原子】 手把手教你学STM32 系列视频之 STM32F4-基于探索者F407-SD卡简介](https://www.bilibili.com/video/av56936776/?p=73) * [【正点原子】 手把手教你学STM32 系列视频之 STM32F4-基于探索者F407-SD卡实验源码讲解](https://www.bilibili.com/video/av56936776/?p=74) # SD卡驱动 不得不说,STM32CubeMX帮我们省去了很多很多外设的操作步骤。按照正点原子的教程,我们需要首先把SD卡的时钟降下来,发送指令初始化SD卡,初始化成功之后再把时钟升上去,每次发送命令操作寄存器,处理SD卡长短响应之类的,完全不用我们去管,只管调用函数就行。 STM32CubeMX里面的配置也非常简单,直接使能,一步到位: ![image](https://user-images.githubusercontent.com/35989223/66803276-bf287580-ef51-11e9-8d57-e5bf064ef3a1.png) 之后读写SD卡什么的直接调用函数就行了。 # USB接口模拟大容量存储设备 USB接口真的有好多用处啊,基本上是可以模拟出所有USB接口的设备了,之前有写过一篇[USB实现虚拟串口CDC](https://imuncle.github.io/content.html?id=59)的文章,这次实现模拟大容量存储设备,前几天还模拟了一下HID人体学输入设备,后面把HID的文章补上。说一句,HID比CDC好用多了! 限于篇幅,这里直接贴上cubemx的配置过程,在后面HID的文章中再稍微讲讲USB是怎么让电脑识别为大容量存储设备的。 ![image](https://user-images.githubusercontent.com/35989223/66802504-37da0280-ef4f-11e9-8239-12b8628ba63b.png)...

RM
Project

> 版权声明:本文为CSDN博主「FEWY」的原创文章,遵循 [CC 4.0 BY-SA](http://creativecommons.org/licenses/by-sa/4.0/) 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/FE_dev/article/details/82586698 # 说明 > canvas元素标签强大之处在于可以直接在HTML上进行图形操作,具有极大的应用价值。 canvas 可以实现对图像的[像素操作](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas),这就要说到 [getImageData()](https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/getImageData) 方法了。 # 解释 `CanvasRenderingContext2D.getImageData()` 返回一个 [ImageData](https://developer.mozilla.org/zh-CN/docs/Web/API/ImageData) 对象,用来描述 canvas 区域隐含的像素数据,这个区域通过矩形表示,起始点为(sx, sy)、宽为sw、高为sh。 ## 语法 `ctx.getImageData(sx, sy, sw, sh);`...

web

快预推免面试了,最近疯狂补专业知识(没办法,跨专业跨系),又遇到要外出比赛,便想着把B站上的教学视频下载下来离线观看,没想到连“缓存”按钮都没找到。经过简单查询之后发现了以下三个方法: 拿我正在学习的“复变函数与积分变换”为例: ![image](https://user-images.githubusercontent.com/35989223/62871879-da5ae700-bd4e-11e9-9629-88bafd6d56e6.png) 链接为 ```txt https://www.bilibili.com/video/av11923599/?p=56 ``` # 方法一 在`bilibili`前面添加字母`i`,如下: ```txt https://www.ibilibili.com/video/av11923599/?p=56 ``` 这会打开一个名为“爱哔哩”的网站,右击鼠标即可选择下载视频。 ![image](https://user-images.githubusercontent.com/35989223/62872088-4dfcf400-bd4f-11e9-9c91-29228511ccf4.png) # 方法二 在`bilibili`前面添加`kan`,如下: ```txt https://www.kanbilibili.com/video/av11923599/?p=56 ``` 这会打开一个名为“看哔哩哔哩”的网站,这里展示的信息数据更加丰富。 ![image](https://user-images.githubusercontent.com/35989223/62872177-7d136580-bd4f-11e9-9c9e-220f4e0ad4d7.png) # 方法三 在`bilibili`后面添加`jj`,如下: ```txt https://www.bilibilijj.com/video/av11923599/?p=56 ``` ![image](https://user-images.githubusercontent.com/35989223/62872273-b8159900-bd4f-11e9-9a5d-09d3026b8cd8.png)

tools