图片采集存储终端【赵洋】

发布于 2020-04-14 11:00:24
方案描述
stm32用485图像采集传感器进行拍照,随后将图片数据传输至外部flash使用文件系统存储,可通过shell使用串口YModem协议传输到电脑。
功能.png
功能列表
* 命令设置和获取图片质量

* 命令获取电源电压

* 命令重启mcu

* 命令获取5min计数I/O低电平有效

* 命令格式化flash

* 命令读取文件

* 命令扫描flash所以文件和文件夹

* 命令获取flash储存空间信息

* 命令将flash文件传输出

内部API实现功能
* 支持报文存储为txt文档

* 支持日志(类似printf)存储为txt文档

* 呼吸灯

* 摄像头拍照读数据等一系列api

演示
呼吸灯.gif
设置图片质量.gif
传输图片.gif


下载附件[STM32F205V1 (NANO).7z]

查看更多

关注者
0
被浏览
1.4k
6 个回答
aozima
aozima 2020-04-14
拒绝白嫖,拒绝键盘侠!
这拍个照不容易啊,楼主传个样片看看。
赵撵猪
赵撵猪 2020-04-14
aozima 发表于 2020-4-14 11:45
这拍个照不容易啊,楼主传个样片看看。


用的摄像头成品,拍完照片数据485传输到mcu的
赵撵猪
赵撵猪 2020-04-28
重新用markdown整理了一下




[md]## 图片采集存储终端【赵洋】



### 方案描述

![功能](https://i.loli.net/2020/04/28/Blir6dMqAbhYEQJ.png)

使用图片传感器进行拍照,通过485传输到mcu,mcu使用文件系统操作flash进行存储,shell可对文件系统进行操作。

**功能分解**

- flash驱动
- 文件系统和flash接口实现
- 图片传感器数据获取实现
- ymodem实现
- shell与文件系统以及ymodem对接实现

RT-Thread相关内容:RT-Thread Nano 、线程 、互斥量 、软件定时器。

**[论坛原帖](https://www.rt-thread.org/qa/thread-424178-1-1.html)**

### 硬件

使用STMF205RET6,带有485和外部w25q128 flash,图像传感器是SXH-V1/V2系列串口摄像头

### 软件

#### 1、MCU配置

使用cube mx生成代码

- ###### shell和485串口配置(略)

- ###### spi配置

![spi配置](https://i.loli.net/2020/04/28/artQeTxIOS4sUmp.png)

- ###### 文件系统配置

![文件系统配置](https://i.loli.net/2020/04/28/MpTS9wnNuCEPzYW.png)

​ 其中有个配置长文件名推荐使用动态,所以我们需要将系统的设置的调大才能正确运行文件系统 ,也可将 syscall.c文件中的ff_memalloc和ff_memfree和操作系统对接。

- ###### RT-Thread Nano 配置

![nano配置](https://i.loli.net/2020/04/28/E2gFPMmUxLniItG.png)

#### 2、外部flash驱动实现

外部FLASH产品型号为W25Q128,容量:16Mbytes,一页为256个字节,一个扇区为4K个字节,一块有12个扇区,共有256个块。

我们需要完成的是读取数据和写数据

###### 1) 读取数据

首先需要进行测试FLASH是否是存在的,可以通过FLASH型号进行对比,步骤是,先将设备上电操作,发送读取Device ID指令(90H),FLASH返回Device ID值。

读取内部数据时,步骤是,发送一个字节读指令(03H)接着发送三个字节地址,FLASH就返回所需要的数据,可以一直读完整个FLASH。

###### 2) 写数据

FLASH有一个保护机制叫作写保护,需要进行允许写入使能指令(06H)之后并且数据区域擦除过才可以开始进行写数据,写数据可以一次性写256个字节最多,也就是一页的数据,如果超过一页数据那么会出现以设定地址为头页数据为尾形成环形,页编程时地址需要对齐,一页256个字节,所以页编程的地址末字节为0。

**总结**:写数据步骤为,先进行写使能,擦除扇区,写使能,写入数据。

#### 3、文件系统与FLASH驱动对接

文件系统移植部分软件已经生成,文件系统的意义是用户实现底层驱动,也就是对存储设备的读写状态等驱动,用户就可以使用文件系统的方式进行抽象存储数据管理了,比如打开一个文本文件,创建个文件夹。

所需实现的文件系统底层驱动函数均在user_diskio.c文件中。

**需要实现函数**

###### 1) USER_initialize函数

USER_initialize函数是初始化的作用,比如开启外部FLASH电压,获取DI看外部FLASH是否工作正常。我们使用读取ID函数,成功返回FR_OK代表成功

###### 2) USER_status函数

USER_status用来查看外部FLASH工作状态,比如写大量数据的时候会出现忙状态,此时就不可以进行数据的写入,比如写保护状态,就不可以写入数据。这里我们使用FLASH寄存器只看BUSY状态,就是写多个数据时等处理完,BUSY状态取消返回正确值。

###### 3) USER_read函数

USER_read用来读取数据,只需要将我们写好的读取数据函数封装起来就可以了。

###### 4) USER_write函数

写数据函数,因为我们的FLASH写是一次性写256字节最多,这里参数是以扇区的方式,就需要将写函数多次写入,写完一页将地址变为下一页写入,直到完成全部写入。

###### 5) USER_ioctl函数

这里是文件系统的一些控制命令,比如对设备的扇区大小,扇区数量,擦除块大小值的获取。

> 在开始疑惑配置文件系统的 sector 最大和最小参数,实际上在这个函数中进行指定,对于flash就是写成固定4k,因为数据擦除最小是4k。

基本的功能已经实现后,MX_FATFS_Init()函数是文件系统的初始化,在此函数添加部分代码,进行测试文件系统。文件系统步骤,进行f_mount挂载,如果没有文件系统就进行格式化,再重新挂载。 文件系统操作时候建议加上互斥量,避免多个文件同时操作有影响,需要一个一个操作。



#### 4、图片传感器数据获取实现

实际上不同的传感器协议是不同的,我们只需要了解想法,图片操作顺序,拍照,读取数据(比如每次1K数据)。这里都抽象成一个就好了,拍照,获取总数据大小,读取指定地址多少数据。使用软件定时器定时拍照存储。

#### 5、ymodem实现

这里有很多开源的,我看nano没有所以才采用的开源,使用的是Free YModem implementation.使用也简单,使用xshell可支持YModem 协议

需要对接的接口函数:

- __ym_getchar
- __ym_putchar
- __ym_sleep_ms
- __ym_flush

主要使用发送函数,具体可见工程代码。

#### 6、shell与文件系统以及ymodem对接实现

shell和文件系统实现就比较简单,因为输入参数直接可以和文件系统函数对接起来,这里我实现了一个扫描函数,扫描全部文件,保留最后一个文件名,用ymodem协议可以将这个文件传出到电脑。

### 效果

![传输图片](https://i.loli.net/2020/04/28/ZnyxtphYBqvfro7.gif)

![呼吸灯](http://upload.ouliu.net/i/20200428141227706bk.gif)

![控制存储图片](https://i.loli.net/2020/04/28/6VHc4q1fCPuLMiX.gif)

![设置图片质量](https://i.loli.net/2020/04/28/cTgtX6ky8n51pfZ.gif)

![设置图片质量](https://i.loli.net/2020/04/28/cTgtX6ky8n51pfZ.gif)[/md]
seaguxx
seaguxx 2020-04-30
有没有硬件图?可以弄到GIT仓库上吗
赵撵猪
赵撵猪 2020-05-06
seaguxx 发表于 2020-4-30 19:30
有没有硬件图?可以弄到GIT仓库上吗


git 还不会弄,硬件 没什么东西,看工程文件就能看出来的,就一个外部flash+485,传感器是单独的,你选选哪家的了

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览