文章目录
- 设计任务及要求
- 一、需求分析
- 1.1 硬件图
- 1.1.1 GEC6818开发板模块介绍
- 1.1.2 低频RFID模块
- 1.2 软件图
- 二、概要设计
- 2.1 功能流程图
- 2.1.1 模块层次关系
- 2.1.2 防碰撞
- 2.1.3 步骤流程图
- 三、详细设计
- 3.1 摄像头模块代码
- 3.2 串口初始化模块代码分析
- 3.3 报警模块代码分析
- 3.4 光照强度获取模块
- 3.5 卡号读取模块代码分析
- 3.6 LCD坐标模块代码分析
- 四、调试分析
- 五、测试结果分析
- 六、视频演示
- 七、总结
- 八、项目源码
设计任务及要求
该项目应具有以下功能:
1)物料入库、出库功能:把每个货物添加一个标签,通过射频识别的方式在货物入库和出库时对系统数据进行更改,如:货物名称、入库数量、出库数量、库存等信息。
2)环境温湿度数据监测功能:开发板屏幕实时显示仓库环境的温湿度数据。
3)仓库消防报警功能。
4)摄像头捕捉模块,如了解仓储的实时情况
5)通过蓝牙连接到安卓手机端,如快捷了解仓储相关信息。
一、需求分析
信息化是企业推动业务快速成长与完善的关键因素。当前,信息化的落后与缺失意味着企业整体的缺失,反之亦然。企业对业务的信息化的需求是十分迫切的,仓库管理就是其中一个很重要的环节。关于库存和库存管理的定义颇多。有人认为 库存是指企业所有资源的储备,库存系统是指用来控制库存水平、决定不从时间及订购量大小的整套制度和控制手段。但无论怎样定义,如果没有高效的仓库管理业务处理(如出库、入库、盘点等日常工作),没有准确及时的处理信息,企业的库存业务运营将付出很高的人力、物力、时间成本,造成各方面资源的浪费。传统的仓库管理存在的普遍问题:
a)没有使用条码和RFID管理手段的情况下,库房管理难以做到帐面数量和实物数量相符。
b)库房管理人员工作量大,工作强度高,速度慢、效率低;
c)如果采用手工数据记录,出差错的概率高;
d)各类库房操作数据记录在各种不同的账本中,查询统计很不方便;
e)没有准确的实时数据,采购计划管理准确性预见性不强。
射频识别技术(RFID)是从20世纪80年代起走向成熟的一种自动识别方式。它具有很多突出的优点:RFID技术不需要人工干预,不需要直接接触、不需要光学可视即可完成信息输入和处理,可工作于各种恶劣环境,可识别高速运动物体并可同时识别多个标签,操作快捷方便。基于射频识别这一优秀技术所衍生的这次智能停车收费管理系统,将大大的向我们展示了其对于实际应用的便利性。项目通过RFID技术实现智能物料仓库管理系统,该系统能根据货物类型分类,获取每一批次出入仓库的货物的时间、出入库数量、该类型货物在仓库中的库存等信息存储在后台并显示在LCD屏幕上,项目通过RFID技术实现智能物料仓库管理系统,该系统能根据货物类型分类,获取每一批次出入仓库的货物的时间、出入库数量、该类型货物在仓库中的库存等信息存储在后台并显示在LCD屏幕上,这样就不用有专门的人来记录货物的信息,节省人力的同时也更方便快捷、可靠。
其次,因为该项目是应用于物料仓库管理中,物料的质量受到环境的影响较大,所以对仓库内温湿度等信息的实时监测并显示至关重要。此项目对仓库货物出入库等各个作业环节的数据进行自动化的数据采集,数据更新。保证仓库管理各个环节数据输入的速度和准确性,确保企业及时准确地掌握库存的真实数据,合理保持和控制企业库存。通过科学的编码,还可方便地对物品的批次、保质期等进行管理。利用系统的库位管理功能,更可以及时掌握所有库存物资当前所在位置,有利于提高仓库管理的工作效率。为方便管理员随时获取到仓库内环境数据,我们使用安卓端APP可通过蓝牙模块实时获取仓库内温湿度数据。
这次我们课程设计所用到的软件模块为:VMware虚拟机和Ubuntu18.04以及CodeBlocks;VMWare虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,本次项目的开发平台主要是GEC6818开发板,在该开发板上连接了GY-39模块和高频RFID阅读器。GY-39是一款低成本,气压,温湿度,光强度传感器模块,工作电压3-5V,功耗小,安装方便。
其工作原理是,MCU收集各种传感器数据,统一处理,直接输出计算后的结果,该模块有两种方式读取数据,即串口UART(TTL电平)或者IIC(2 线),本次项目中使用的是串口读取方式,串口的波特率有9600bps与115200bps,均可配置,有连续,询问输出两种方式,可掉电保存设置。可适应不同的工作环境,与单片机或电脑连接。高频RFID阅读器获取RFID卡信息前需要发送请求命令和防碰撞命令,每次发送指定命令后都需要等待RFID卡发返回正确的数据帧,也就是开发板需要读取到相应数据才能正确读取到卡号。如果需要读写RFID卡或进行密钥验证,那么除了前面提到的两个步骤外,还需要额外发送选择命令,本次项目中不需要读写RFID卡或者密钥验证,故不需要发送选择命令。除以上介绍的硬件模块外,项目中还用到了一些软件用以辅助项目调试和运行,其中SecureCRT软件则用来传输可执行文件或者BMP图像文件到开发板中,VMware虚拟机 + Ubuntu用来编译代码生成可在开发板上运行的程序,前提是Ubuntu中配置了编译工具。同时使用到了高频RFID模块,它是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。常用的有低频(125K~134.2Khz)、高频(13.56Mhz)、超高频,微波等技术。
1.1 硬件图
1.1.1 GEC6818开发板模块介绍
GEC6818开发平台,核心板采用10层板工艺设计,确保稳定可靠,可以批量用于平板电脑,车机,学习机,POS机,游戏机,行业监控等多种领域。该平台搭载三星Cortex-A53系列高性能八核处理器S5P6818,最高主频高达1.4GHz,可应用于嵌入式Linux和Android等操作系统的驱动、应用开发。开发板留有丰富的外设,支持千兆以太网、板载LVDS接口、MIPI接口、USB接口等。
1.1.2 低频RFID模块
RFID读写器的类型有哪些:低频、高频、超高频,RFID读写器的分类有很多,按通讯方式来分类的话可以分为读写器优先和标签优先两类。读写器优先(RTF)是指读写器首先向标签发送射频能量和命令,标签只有在被激活且收到完整的读写器命令后,才对读写器发送的命令作出响应,返回相应的数据信息。
标签优先(TTF)是指对于无源标签系统,读写器只发送等幅的、不带信息的射频能量。标签被激活后,反向散射标签数据信息
1.2 软件图
VMWare虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMware采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。
VMware的主要功能有:1.不需要分区或重开机就能在同一台PC上使用两种以上的操作系统;2.完全隔离并且保护不同OS的操作环境以及所有安装在OS上面的应用软件和资料;3.不同的OS之间还能互动操作,包括网络、周边、文件分享以及复制贴上功能;4.有复原(Undo)功能;5.能够设定并且随时修改操作系统的操作环境,如:内存、磁碟空间、周边设备等等。
相比于基于Delphi的Dev-C++共享 C++IDE,Code::Blocks是开放源码软件。Code::Blocks由纯粹的C++语言开发完成,它使用了蓍名的图形界面库 wxWidgets(2.6.2 unicode)版。虽然Code::Blocks从一开始就追求跨平台目标,但是最初的开发重点是Windows 系统下的版本,从06年3月21日版本:1.0 revision 2220开始,Code::Blocks在它的每日构建中正式提供Linux版本。这样Code::Blocks在1.0发布时就会是跨越平台的C/C++IDE,它将支持Windows和Linux的主要版本。长期以来C++开发员在 Linux没有好用、通用的C++ IDE的局面就要结束。而这个IDE对于Windows下的用户同样重要,由于它开放源码的特点,Windows用户可以不依赖于VS.NET,编写跨平台C++应用。
应用、wxSmith工程,另外它还支持用户自定义工程模板。在wxWidgets应用中选择UNICODE支持中文。
二、概要设计
程序主界面:界面左边显示出入库物料的基本信息和时间,左边实时显示仓库内温湿度信息,屏幕正上方有一个退出按钮,管理员可触摸退出程序,当温湿度超出阈值范围时,屏幕右下方闪烁报警标志。
在项目调试过程中使用的是随机数,因为现实模拟货物出入库过程中,阅读器能真正读取到的只有卡号,并没有货物的数量,所以货物数量是在程序中使用特定函数生成的随机数,该值会赋给相应变量以便对其进行后续的操作。随机数只能通过调用相应函数生成,并不能在终端手动输入,阅读器每获取一次卡号,会调用一次函数生成随机数,随机数范围为1~100。
项目具体实现用到的自定义结构体:
struct info_t
{
unsigned int id;
int sum;
int sum;
struct info_t *next;
};
各个成员变量的含义:
ID:卡号(在项目中不同卡号代表不同种类的货物)
num:本次出库或入库的货物的数量
sum:该种类货物在仓库中的库存
next:该数据类型指针,指向下一个结点
2.1 功能流程图
2.1.1 模块层次关系
- 物料入库、出库功能:把每个货物添加一个标签,通过射频识别的方式在货物入库和出库时对系统数据进行更改,如:货物名称、入库数量、出库数量、库存等信息。
- 环境温湿度数据监测功能:开发板屏幕实时显示仓库环境的温湿度数据。
仓库消防报警功能。 - 摄像头捕捉模块,如了解仓储的实时情况。通过蓝牙连接到安卓手机端,如快捷了解仓储相关信息。
2.1.2 防碰撞
通常,RFID系统存在两种类型的碰撞问题:
- 一种叫做多个标签同时与同一读写器进行通信时发生碰撞,另一种称为多读写器碰撞问题,也就是相邻的读写器在信号重叠区域内产生干扰,造成阅读范围缩,小,甚至无法阅读标签。
- 当相邻读写器的作用范围重叠时,多个读写器同时读取相同的标签可能会造成多个读写器和标签之间的干扰。所以根据流程图,在请求命令时,利用防碰撞机制对标签进行读写。
2.1.3 步骤流程图
- 温度模块:获取通过GY-39获取温度并保存,如果温度超过阈值就保存温度值,最后判断温度值与阈值,如果未超过阈值则显示温度,如果未超过阈值则报警。
- 获取屏幕模块:获取触摸点坐标如果坐标在指定区域内,回收资源。
- 蓝牙模块:通过串口写入温度数据到蓝牙,延迟一定时间,再通过串口写入到蓝牙里。
三、详细设计
这次课程设计中我们各个模块的实现的方法是通过编写相应的函数,最后在主函数中调用它们,这样做的好处是代码清晰易懂,逻辑明了,且如果出现错误,可以快速准确的找到出错的地方以便有效的修改。
3.1 摄像头模块代码
摄像头的模块思路在于,打开摄像头,获取功能参数,并确定该模块的摄像头可以使用,并获取获取摄像头支持的格式,设置采集通道,设置摄像头采集格式,并申请缓存空间,分配映射入队,并申请临时缓冲区,启动摄像头,利用队列的方式保存摄像头采集到的信息,最后关闭摄像头,解除映射。
重点在于调用摄像头函数,并且获取摄像头的采集格式,并将格式转化为RGB格式显示到LCD屏幕上。
通过/dev/video7"启动摄像头模式,并选择打开摄像头的模式,并通过结构体的方式获取摄像头的功能参数:
设置了采取通过,通过通道0的方式采取摄像头对应的YUYV格式,并申请缓存空间存储相应的数据。利用存储空间存放YUYV格式的摄像头数据:
分配相应的映射入队,存放YUYV的摄像头格式的数据,当启动摄像头时,将数据出队,从而可以使得数据无损伤的转化为我们所需要的图片格式。
最后启动摄像头总功能函数,实现相片摄像功能。
3.2 串口初始化模块代码分析
该程序是串口基本配置的函数,打开串口1设备文件,设置控制模式状态,本地连接。并设置合适的波特率。用队列的方式获取串口数据。这个函数有两个参数:file,baudrate。其中,file参数是串口文件名,比如,要使用COM2时,则"/dev/ttySAC1"。baudrate参数是波特率的意思,接给数值就可以了,比如9600,115200等等。
3.3 报警模块代码分析
报警模块的实现基于上述代码成功获取温湿度,当仓库中温度超出某个值的同时,湿度低于某个值,可以判定仓库处于火灾易发状况,需要管理员采取一定措施,项目代码中的阈值只是暂时用来测试的数据,后期可以根据实际情况更改。
每获取一次温湿度数据,就将数据与提前设定好的温湿度阈值相比较:
lcd_draw_bmp(490,240,"warn.bmp");
usleep(250000);
lcd_clear(490,240,150+490,113+240,color[1]);
usleep(250000);
continue;
若环境数据在设定的安全范围内,则跳过上述代码,否则执行上述代码进行报警。
3.4 光照强度获取模块
将气压获取的值存入recvbuf中,并对存入缓存区的进行取整,从而得到光照强度的数值。
3.5 卡号读取模块代码分析
读取卡号的实现从主函数开始,低频RFID卡号获取有两个关键步骤,请求和防碰撞,在函数read_cardid中实现如下:
cardid=0;
while(cardid==0)
{
PiccRequest(usart_fd)
PiccAnticoll(usart_fd)
}
return cardid;
cardid是一个全局变量,初始值为0,对该变量赋值的操作发生在两个函数中,第一个是read_cardid中,在进入while循环之前,先给cardid赋值0,确保能进入while循环。第二个有给cardid赋值操作的函数是防碰撞函数PiccAnticoll,在该函数中,开发板会接收到阅读器读取到的RFID卡卡号,并改变cardid的值,当cardid的值不为0时,程序不会再进入read_cardid函数中的while循环而回到主函数。请求和防碰撞的过程类似,都是发送带有特定信号的数据帧给RFID卡,然后等待从机应答,阅读器接收到RFID卡应答的数据帧后判断数据帧是否正确,再决定后续动作。主机发送给RFID卡或者RFID卡应答的数据帧包括以下部分:
数据帧长度(FrameLen),包括它自己,长度1字节;包序号(SEQ)/命令类型(CmdType):长度1字节,包序号占该字节的4-7位,可以用来作为通信间的错误检查,从机接收到主机发来的信息,在应答信息中发出一个同样的SEQ信息,主机可通过检查此信息检查是否发生“包丢失”的错误;命令类型占字节的0-3位,有协议控制类、设备控制类命令和ISO14443A命令三种,其他值保留。防碰撞的流程和请求一样,只不过防碰撞发送的数据帧和接收到的应答数据帧都和请求有不同,防碰撞发送的数据帧总长度为8字节,命令为’B’,数据信息长度为2,分别表示防碰撞过程中使用的是一级防碰撞和已知序列号的长度。
3.6 LCD坐标模块代码分析
对LCD左边进行划分,根据开发板的大小进行左边匹配。对ABS_X和ABS_Y进行坐标赋值。启动dev/fb0对其进行触摸坐标显示数据的功能。
在这个模块中,它的函数主要功能是获取一个范围内的最大ID,它的参数同样是fd,如果返回0,表示防碰撞成功,如果返回其他,表示防碰撞失败。
四、调试分析
调试过程中,首先是针对相对基础功能进行调试的,首先是获取卡号,因为这个模块几乎贯穿整个课程实验的过程,所以基本没有问题,直接拿来用就好了,遇到的第一个问题就是将卡号和其他数据绑定在一起并进行数据操作,项目中的数据操作都是基于链表操作,但是在进行链表功能调试时,发现一直无法对链表进行插入操作,不论刷了多少张不一样的卡,最后链表中都只有一个头结点和第一个数据结点,一开始我只是把目光集中在数据操作相关的文件中(data_opt.c),但是后来发现该文件中的函数并没有问题,最后才在主函数调用中发现主函数有一段代码对链表的第一个数据结点(也就是第二个结点)的next属性赋了空值NULL。也就是说在正确添加完结点后,又将链表从第二个结点处断开了,这才导致遍历链表时,只能输出第一个数据结点的数据。
五、测试结果分析
程序开始时,还没有读取到卡号,所以只是显示温湿度,如下图18,同时将温湿度数据通过蓝牙发送到安卓端,安卓端显示界面见下图19。
刷了卡后,代表一批货物入库,界面左边显示货物入库时间、货物编号(即种类)、货物是出库还是入库、该批货物数量以及该种类货物在仓库中的库存,如下图20。
当温湿度超出阈值范围时,开发板屏幕显示报警图片,并不断刷新,同时安卓端不在接收到温度信息,而是显示字符串“warning!!!”,用于提醒管理员。
最后,点击屏幕正上方的“退出”按钮,安全退出程序。
六、视频演示
RFID智能物料仓库管理系统
七、总结
该项设计的主要技术是RFID射频识别技术,相对于课堂的理论学习而言,该次课程设计让我们更好的理解了RFID技术的具体实现过程,我们了解到:RFID的基本工作原理:读写器通过发射天线发送特定频率的射频信号,当电子标签进入射频信号所处的工作区域时,会产生感应电流,从而获得能量、电子标签被激活,这使得电子标签会将自身编号信息通过内置射频天线发送出去。读写器的接收天线,接收到从标签发送来的调制信号,经天线调节器传送到读写器信号处理模块,解调和解码后的有效信息被送至后台主机系统进行相关的处理。主机系统根据逻辑运算识别该标签的身份,针对不同的设定作出相应的处理和控制,最终发出指令信号控制读写器完成相应的读写操作。对于实验过程中出现的诸多问题,我们通过激烈的讨论从而加以解决并且在这过程中更好的学会了团队合作的重要性,也增强了自我的沟通和表达能力,受益匪浅。
八、项目源码
若需项目源码联系下方wx即可 👇👇👇