lihui710884923
认证:VIP会员
所在专题目录 查看专题
STM32F767ZI 之人工智能(AI) 应用
STM32 HAL库中断(绕来绕去)——剖析回调函数机制
stm32如何用虚拟地址存储数据
500A功率采集电路原理和源码分析
开源之RFID自动分拣系统
实例分析stm32F103逆变器(源码+硬件)
作者动态 更多
物联网专题之NB-IoT项目框架(二)
07-25 11:53
物联网专题之介绍(一)
07-11 18:37
单片机RTC的中断剖析
03-09 15:28
串口通讯的来龙去脉
02-14 17:32
stm32单片机的USB烧录程序
2023-09-08 22:48

开源之RFID自动分拣系统

       自动化物流系统可以对库存的入库、出库、移库、盘点等操作进行全面的控制和管理,对物品进行实时分析与控制,为企业管理者作出正确决策提供依据,将库存量减至最优存储量,大幅提高资金流转速度与利用率,降低库存成本;从物流效率和管理水平、空间利用率、人工成本、等方面可以看出,自动化物流系统与传统物流系统相比,具有更加明显的优势。 

       今天简单分享一下物流自动化仓储分拣系统的自动识别原理,下面是基本的原理图:

具体工作原理如下:

主控MCU采用stm32F103C8T6,是目前非常常用的一个单片机型号,采用M3内核,72M主频,采用射频模块主要是用来获取RFID标签中的数据信息,当系统处于主菜单时,按下键盘中的OK键,启动射频模块(拉低SHD引脚)。单片机通过捕获EM4095的DEMOD_OUT引脚输出的曼切斯特码波形,利用解码算法获取当前读入标签的信息。如果读取到标签的信息,则在屏幕上显示标签ID号;并通过单片机TTL串口将数据通过wifi模块发送给服务器

一、一键启动电路

图中KEY_COND和EN_A分别与单片机的IO口相连。其工作原理为:

  • 当系统处于关闭时,EN_A通过R26处于低电平,SP6205稳压器不工作,此时系统没有上电。当按下电源键(KEY_POWER),EN_A为高电平,系统启动。又由于EN_A与IO脚相连,启动后立即将EN_A拉高,这时抬起电源按键,实现自锁,系统正常工作。
  • 当系统处于运行状态时(电源键没有按下),此时EN_A为高电平,但由于分压电阻R24,R25的存在,KEY_COND上的电压只有50mV可以认为是低电平,当按下电源按键,此时KEY_COND拉高并能被单片机读取,当抬起电源按键后KL25将与EN_A相连的IO脚电平拉低,这时SP6205停止工作,系统关闭。

 二、射频模块识别原理

射频模块这块是采用识别近距离RFID标签并为节省能源降低功耗,因此选用低频段RFID技术,选用EM5095芯片作为射频模块的主芯片。EM4095是EM MICROELECTRONIC公司开发的一款CMOS集成的应用于100kHz~150kHz频率的RFID系统的收发前端芯片,其工作电压为5V,主要完成的工作是:

EM4095与单片机连接的信号有三个引脚,用于数据和时钟的传输以及系统对EM4095的驱动和控制:

  • DEMOD_OUT:输出信号,为EM4095感应到线圈上的AM信号后经过解调后得到的曼彻斯特编码信号,将之接收并解码校验后可得到所读出的标签的值。
  • RDY/CLK:时钟信号,为EM4095从天线线圈上提取出的经过谐振后的时钟频率,范围应在100kHz-150kHz,而本文所设计的系统此频率在125kHz。
  • SHD:休眠控制信号,此引脚为高电平时,EM4095将被强制进入休眠状态,天线线圈上没有电流,目的是保护芯片和节省能源。
  • EM4095与单片机的连接方式并不是标准的控制和通信接口,无法利用单片机任何现成的控制和接口单元对其进行驱动和控制,根据EM4095的DEMOD_OUT,RDY/CLK和SHD这三个引脚,并按其数据手册上工作原理进行控制。
  • DEMOD_OUT为EM4095感应到线圈上的AM信号后经过解调后得到的曼彻斯特编码信号,因此将与DEMOD_OUT引脚连接的单片机的IO设置为输入,将曼彻斯特编码信号读入到单片机中。
  • RDY/CLK为EM4095的时钟信号,主要是在系统启动时,检测EM4095芯片能否正常工作。
  • SHD引脚控制的内容为EM4095的线圈加电,在不需读取RFID标签信息时将SHD引脚拉高,线圈未上电,EM4095不工作;在需要读取RFID标签信息时将SHD引脚拉低,EM4095正常工作

三、源码分析

检测方法1).确定起始位,首先要正确找到数据1 按规则下跳为1 上跳为0. 可检测高电平并等其变低 但这会把0错检为1因为0也存在高电平。但是如果检测到一个周期的高电平(数据01)则可 确定找到了数据1,找到1后就可以同步了,因为EM4100卡最后一位数据就是0正好可以利用 作为判断的特征。

2).对于数据的确定,由于有了同步则可在同步后延时384us即3/4个码原周期在判断接受段电平如何 如为高则置数据为1,并一直等到低电平的出现,相反则等高电平的出现,并在此之间插入超时 判断。这样,一个完整的数据判断就完成了,并确保数据的准确性,另外这种方法的抗干扰性 会非常好,而如果采用定时同步的话则会因信号的畸变而引起数据出错,整体会导致读卡几率降低 但是此程序也有其缺点,因为采用纯延时判断的手段,因此其占用单片机的运行时间比较大。

3).同步后开始接受同步数据即9个1,这一部分用一个循环做,如果出错则放弃接收

4).同步数据接收完后,则开始接受数据,数据分11行5列接收以利于校验位的判断 如有出错则放弃数据

5).如一切正常则返回卡号,如因尝试读卡次数到了则返回0以表示没有识别到标签

//读取卡号,
ulong Read_Card()
{
	uchar i=0;	//起始为的计数值
	uchar error;  //时间溢出的计数值
	uchar error_flag; //时间溢出标志
	uchar row,col;	  //行列寄存器
	uchar row_parity;  //行校验寄存器
	uchar col_parity[5]; //列校验寄存器
	uchar _data;		//数据寄存器
	ulong temp;			//卡号寄存器
	ulong timeout=0;	 //搜索次数寄存器
	while(1)
	{		
		if(timeout==10)return 0;//尝试10次搜索,如没有责返回0
		else timeout++;
		error=0;
		while(Manchester_IN==0)//等高电平
		{
			if(error==TIME_OF)break;//超时退出
			else error++;
		} 	
		if(error==100)continue;//结束本次主循环
		else error=0;	
		Delay384us();	  
		if(Manchester_IN)//寻找真正的1起始位,利用01的波形确定1起始位,即最后一位加第一位
		{	 
			for(i=0;i<8;i++)//判断是否是真的起始位
			{	  
				error=0;	   //限定等待时间
				while(Manchester_IN)
				{	
					if(error==TIME_OF)
					{	  
						error_flag=1;//时间溢出
						break;	//退出
					}
					else error++;
				}	 
				Delay384us();				   //延时至下一码原
				if(Manchester_IN&&error_flag==0); //判断下一位是否为1 和是否没有时间溢出
				else break;			 //不是1退出,溢出退出			   
			}
			if(error_flag)//因时间溢出造成的本次主循环退出
			{	  
				error_flag=0;
				continue;	//退出本次循环
			}
			else;
			if(i==8)  //起始位接受完并且正确后开始接受数据
			{	
				error_flag=0;
				error=0;	 //限定等待时间
				while(Manchester_IN)
				{  
					if(error==TIME_OF)
					{	
						error_flag=0;
						break;		 //时间溢出造成的出错
					}
					else error++;
				}	  
				if(error_flag)	   
				{
					error_flag=0;
					continue;	   //因等待待第一个正式数据错误引起的本次主循环退出
				}
				else; 
				//所有列校验清零
				col_parity[0]=col_parity[1]=col_parity[2]=col_parity[3]=col_parity[4]=0;
				for(row=0;row<11;row++)	//共11行数据
				{
					for(col=0,row_parity=0/*行校验清零*/;col<5;col++)//共5列数据
					{
						Delay384us();  //延时至下一码原
						if(Manchester_IN)_data=1;  //数据为1
						else _data=0;			   //数据为0
						if(col<4&&row<10)		   //数据区的接受,后四个字节
						{
							temp<<=1;			 //左移一位
							temp+=(ulong)_data;	 //数据相加
						}
						else;
						row_parity+=_data;		 //行校验加入数据
						col_parity[col]+=_data;	 //相应列校验加入数据  虽最后一列没有校验但为了方便也加上
						error=0;				 //限定等待时间清零
						while(Manchester_IN==(bit)_data)
						{
							if(error==TIME_OF)		  //由于时间溢出造成的数据出错
							{	
								error_flag=1;
								break;			  //退出本while循环
							}
							else error++;
						}
						if(error_flag)break;	 //出错退出内层for循环
						else;
					}
					if(row<10)//最后一行没有校验所以要加限制
					{
						if((row_parity&0x01)||error_flag) //出错退出外for循环
						{
							temp=0;
							error_flag=1; 
							break;			 //退出
						}
						else;
					}
					else; 	 
				}

				//对最后接收的列校验进行判断,及对来自上面数据错误error_flag处理以结束本次主循环
				if(error_flag||((col_parity[0]&0x01)&&(col_parity[1]&0x01)&&(col_parity[2]&0x01)&&(col_parity[3]&0x01)))
				{	//最后一列没有校验												 
					error_flag=0;
					temp=0;
					continue; //退出本次循环
				} 
				else return temp;//将正确的数据返回
			}
			continue;
		}
		continue;
	}
}

 四、OLED显示

OLED显示货物识别状态信息,采用SPI串口的通讯模式控制数据的传输和显示,OLED模块与单片机连接的引脚共有4个,分别为OLED_RST,OLED_DC,OLED_SCK,OLED_SDA。

  • OLED_RST为OLED模块的复位引脚,低电平时OLED模块复位;
  • OLED_DC控制写入的是数据是控制命令还是普通的点阵数据。当OLED_DC拉高时,写入的数据为显示的点阵数据;当OLED_DC拉低时,写入的数据为OLED的控制命令;
  • OLED_SCK为单片机与OLED通信的时钟信号线;
  • OLED_SDA为单片机与OLED通信的数据信号线。

配套资料中有射频模块的驱动程序,欢迎下载。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
本篇所含全部资料,点击此处留下邮箱我会发给你
资料明细:EM4095程序.zip
觉得内容不错的朋友,别忘了一键三连哦!
赞 15
收藏 13
关注 202
成为作者 赚取收益
全部留言
0/200
  • dy-nE83KiaB 3星期前
    老师,能不能发我一下资料,谢谢! 30****@****.com
    回复 1条回复
  • dy-LkxDbaui 10-14 13:44
    老师,能不能发我一下资料,谢谢! 56****@****.com
    回复 1条回复
  • dy-pNaswETU 09-06 13:38
    老师,能不能发我一下资料,谢谢! 10****@****.com
    回复 1条回复
  • dy-4rAI7YxR 07-11 10:07
    老师,能不能发我一下资料,谢谢! xi****@****.com
    回复 1条回复
  • dy-C7cTljnX 04-10 08:22
    老师,能不能发我一下资料,谢谢! 53****@****.com
    回复 1条回复
  • 不吃土豆D 01-23 22:32
    老师,能不能发我一下资料,谢谢! 25****@****.com
    回复 1条回复
  • 不吃土豆D 01-23 22:31
    老师,能发我一下资料嘛?学习一下,谢谢您!
    回复
  • dy-GQGIEwxK 01-22 15:01
    老师,能不能发我一下资料,谢谢! 98****@****.com
    回复 1条回复
  • sdll825 2023-03-16 14:45
    老师,能不能发我一下资料,谢谢! sd****@****.com
    回复 1条回复
  • dy-52CNfgif 2023-03-05 17:51
    老师,有没有更详细的资料,我想做一下这个试试
    回复
  • dy-52CNfgif 2023-03-05 15:44
    老师,能不能发我一下资料,谢谢! 25****@****.com
    回复 1条回复
  • dy-AADLTwmq 2023-01-15 14:05
    老师,能不能发我一下资料,谢谢! da****@****.com
    回复 1条回复
  • dy-UjjuYBCc 2022-09-16 10:44
    老师,能不能发我一下资料,谢谢! 38****@****.com
    回复 1条回复
  • 小董 2021-03-09 09:35
    佩服楼主
    回复
  • dy-blNlwnWV 2021-02-24 23:07
    请教一下
    回复
  • liuxiaofei126 2021-01-30 19:44
    开源不错
    回复
  • 星球居民-YBPLIKJ1 2021-01-24 12:59
    挺好的
    回复
  • keyhei66 2021-01-20 21:51
    快递自动分拣不错
    回复
  • 如梦烟尘 2021-01-19 20:08
    内容已删除 xu****@****.com
    回复 1条回复
  • 如梦烟尘 2021-01-19 20:07
    厉害
    回复