查看: 16657
回复: 26
参赛作品《基于STM32L151C8T6的近场自行车智能无线防盗报警器》
sheng
2
主题
38
回复
发表于2017-06-22 21:10:06 | 显示全部楼层
1# 电梯直达

【报名阶段需要填写的内容】


1. 参赛者姓名(必填项):刘奇胜


2. 单位或学校名称(必填项):电子科技大学


3. 当前职务或职称(必填项):学生


4. 参赛作品的名字(必填项):基于STM32L151C8T6的近场自行车智能无线防盗报警器


5. 简要陈述您的idea和作品(必填项):目前市场上类似的防盗报警器,要么是价格低廉的侦测到移动就狂叫的“报警器”,布防撤防还需要人为操作,要么就是价格高昂的使用GMS或GPRS通信的报警器,功能虽然强大,但是用户在购买硬件的同时还需要维护一张流量卡,使用成本太过高昂,而且续航也不长。本作品考虑到人们普遍不会离开自己的车太远,一般都在5公里以内,且盗窃行为需要一定时间才能成功的实际情况。选用低功耗处理器STM32L151C8T6及六轴愦性传感器MPU6050,使用具备远距离及低功耗特性的LORA通信手段,当爱车静止一段时间时自动进入布防状态,在此期间若发生异常移动或震动时,通过判断无线接收模块是否在几米范围内来实现主人身份的鉴别,若是主人在动车,报警器自动撤防,而若不然,车上报警器持续呜笛报警的同时,主人随身携带的接收机也将报警提醒用户快速赶到现场处理。接收机这边利用内罝的运动传感器,用户可通过翻转机身等动作实现人机交互。整个报警器成本低廉,且不会产生流量费用,用户在实际使用过程中布防撤防全自动进行,实现了无感操作!而低功耗的STM32处理器及lora通信模块可以为报警器提供长达数十天的续航时间。


6. 拟用到的立创商城在售物料(必填项):电阻电容电感若干, SC662K-3.3V, STM32L151C8T6, MPU605, 3.3v有源蜂鸣器,RGB三色LED


7. 拟用到的非立创商城物料或其它补充(必填项):QX2301DCDC升压芯片,IntoRobot-L6 Lora通信模块



【作品正式发表(报名成功后进入设计阶段)需要填写的内容】


一、作品简介

例如,可以包括但不局限于以下内容:

1.作品的整机外观图片或焊接组装好的PCBA图片;

 点击查看大图 点击查看大图 点击查看大图 点击查看大图

焊工太差,见笑了,画板子时少布了根线,只好用漆包线飞了咳咳,,,本打算用弹簧天线的,测试发现通信效果太差了,最后改用了FPC天线~于是焊天线的地方就变成这个鬼样了咳咳~用户端为了节约空间,直接焊了根漆包线作为天线,通信效果也没打折扣哈哈~

2.作品的研究背景、目的和功能、市场应用前景:

研究背景:在某些区域,尤其是某些高校,电瓶车自行车偷盗行为猖獗目前市场上的防盗报警器,一种是价格低廉的侦测到移动就狂叫的“报警器”,布防撤防还需要人为操作,没有有效的实际的慑止盗窃行为的能力;另一种就是价格高昂的使用GMS或GPRS通信的报警器,功能虽然强大,但是用户在购买昂贵硬件的同时还需要维护一张手机流量卡的费用,使用成本太过高昂,而且续航也不长。在实际生活经验中发现人们普遍不会离开自己的车太远,一般都在5公里以内,且在加了不算太差的锁(某宝30块以上的)的情况下,盗窃行为一般需要一定时间才能成功。因此,产生了研制一款近场智能无线防盗报警器的想法。


目的和功能:选用低功耗处理器STM32L151C8T6及六轴愦性传感器MPU6050,使用具备远距离及低功耗特性的LORA通信手段(sx1276芯片实现),作品分为用户端、车载端、社区公共管理端(可选组成部分),它们共用相同的硬件,仅软件层不同。通过布防状态下车载端监测到移动时发送一个包含自身电量等状态信息的无线数据包,用户端在收到信息后向车载端反馈一个数据包,根据无线信号RSSI值判断执行报警动作还是撤防动作,若停车区域附近物业管理方安装了社区公共管理端,在产生报警动作时,保安处亦能收到报警信息。除了这个主要功能外,作品还具有电池低电量提醒,翻转机身实现人机交互等功能。整个工作流程智能感应,自动撤防布防,实现了用户体验上的无感操作,全周期等效工作电流仅0.7ma左右,实现了长续航的目标,作品体积小,可毫无累赘感地串在钥匙串上。


市场应用前景:自行车电瓶车的保有量是巨大的,尤其是在各大高校,盗窃行为又猖獗,学校根本管不住,像我这种学生狗买了辆好点的山地车压根不敢骑去上课去实验室。而现有的报警器要么功能太LOW,要么就很昂贵且需要插手机卡使用。本作品在考察了实际用车习惯的情况下,通过较低的成本,无需插卡的形式,亦实现了当前基于GSM或GPRS这样的高端报警器的相应功能。且实现了全自主布防撤防,无感操作,润物细无声。此外可与物业合作提供社区公共管理端,形成功能强大的区域防盗警戒系统。市场前景应该不错。


3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现?

现有的报警器要么功能太LOW,要么就很昂贵且需要插手机卡使用。本作品在考察了实际用车习惯的情况下,通过较低的成本,无需插卡的形式,亦实现了当前基于GSM或GPRS这样的高端报警器的相应功能。且实现了全自主布防撤防,无感操作,润物细无声。此外可与物业合作提供社区公共管理端,形成功能强大的区域防盗警戒系统。


二、系统构架图

用流程图或思维导图等形式,描述您的作品的组成构架,即方案图。

1、硬件组成框图(用户端、车载端、社区公共管理端相同):

 

可以看出硬件其实很简单~

2、系统组成框图:

  点击查看大图

用户随身携带的用户端与对应的安装在自己车上的车载端形成最小系统,社区公共监控端是可选组成部分,其可接收任意车载端发出的异常报警信息从而提醒物业保安前往相应停车区域查看,当用户将车停在了安装了社区公共监控端的社区时,如若发生防盗报警,不仅用户能收到,社区管理处也能收到报警信息,具体工作流程见下一小节。


三、硬件部分的描述

1.附上原理图&PCB实物图的图片或者源文件(官方建议大家尽量用源文件上传),如果是图片,请确保图片是清晰可辨的;

近场智能无线防盗报警器原理图及PCB 

2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。


系统工作流程:选用低功耗处理器STM32L151C8T6及六轴愦性传感器MPU6050,使用具备远距离及低功耗特性的LORA通信手段(sx1276芯片实现),作品分为用户端、车载端、社区公共管理端(可选组成部分),它们共用相同的硬件,仅软件层不同。车载端固定安装在车辆上,由于体积小,可以放在座椅下等较隐蔽处,用户端直接串在钥匙上即可,对于社区物业方,可在集中停车区域固定安装社区公共管理端,并在保安室也安装一个社区公共管理端。由于给社区公共管理端分配了一个特殊地址,其能收到任意信号范围内车载端发来的报警信号,而其他通信行为仅能在绑定的用户端和车载端之间进行。当车辆静止时间超过10秒时自动进入布防状态,在布防状态下发生异常震动或移动时,车载端向用户发送一个包含自身电量等状态信息的无线数据包,用户端在收到信息后立即反馈一个数据包给车载端,同时根据收到数据包的RSSI值判断是否进行蜂鸣报警,此外,根据数据包中车载端发来的电量信息决定是否红灯闪烁以提醒用户更换车载端电池,用户端低电量告警则使用蓝灯闪烁进行提醒,无论是盗窃行为产生的蜂鸣报警还是低电提醒造成的灯光告警都只能通过翻转用户端机身180度来进行关闭。车载端收到反馈的数据包时,也根据无线信号RSSI值判断执行报警动作还是撤防动作,或者10秒内未收到反馈,亦执行报警动作(此时往往意味着用户离车太远或建筑阻隔太严重,本作品市区街道环境可靠通信距离达5公里,据通信模块厂商称在空旷地带测试距离可达30公里,不过这个数据并没有意义)。报警动作主要是蜂鸣器及灯光闪烁,以慑止盗窃行为,当然,效果有限,还是得靠用户和物业人员收到报警后赶到现场制止才靠谱。值得一提的是,发生报警动作时,车载端将向公共地址(即社区公共管理端)发送报警数据包,若物业安装了社区公共管理端即可收到报警从而赶到现场进行应对。

   在前不久实际测试试用的时间里,成都每天都有暴雨,由于盗窃行为侦测主要依靠加速度计进行感应,起初的算法在暴雨时由于雨滴对车身的击打会产生误报,但若直接使用滤波器去过滤的话将使报警器变得极不敏感。通过分析暴雨时的加速度数据,发现其存在一定规律性,设计了一个有效的暴雨判断算法,既保留了对盗窃行为的敏感性,又能消除大部分暴雨时误报的情况。



四、材料清单(BOM列表)

列出您这个作品所用到的主要器件(关键器件即可),比如单片机&ARM芯片、专用集成芯片(ASIC)、传感器、功能模块等。

如果所列出的芯片是来自我们立创商城上的,最好能写出该器件的商品编号或附上对应购买链接。

 点击查看大图


五、软件部分的描述(选填)

如果您的作品涉及到软件,请列出作品对应的软件工作流程图,及关键部分的例程、源码(如果您想开源的话请上传全部源码)。

软件流程图:(点击可查看清晰大图)

 点击查看大图

 车载端主程序源码:

/**
  ******************************************************************************
  * @file     main.c
  * @author   sheng
  * @date   2017-07-14
  * @version  V1.6.0
  * @brief   
  ******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "bsp.h"



#define BUFFER_SIZE    9 // Define the payload size heres

static uint16_t BufferSize = BUFFER_SIZE;			// RF buffer size
static uint8_t Buffer[BUFFER_SIZE];					// RF buffer

tRadioDriver *Radio = NULL;
uint8_t bike_state=STATUS_CALM;
uint8_t sending_flag=0;
/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/
/*
 * Manages the master operation
 */
void OnMaster( void )
{
    uint8_t i;

    switch( Radio->Process( ) )
    {
    case RF_RX_TIMEOUT:
			  sending_flag=0;
		    printf("RF_RX_TIMEOUT");
        break;
    case RF_RX_DONE:
        Radio->GetRxPacket( Buffer, ( uint16_t* )&BufferSize );
        if( BufferSize > 0 )
        {
            if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
            {
							  if(SX1276LoRaGetPacketRssi()>(-70)){
									 bike_locked=0;
									 bike_calm_count=0;
									 alarm_count=5;
									 printf("UNCLOCK\r\n");
								}
								else{
									 alarm_count=50;
									 printf("ALARM\r\n");
								}
								sending_flag=0;
								no_reply_count=0;
								request_flag=0;

                printf("master get rx packet:");
                for(i = 0; i < 4; i++)
                {
                    printf("%c",Buffer[i]);
                }

                printf("\r\n");
								printf("Rssi = %.3f \r\n", SX1276LoRaGetPacketRssi());
                
                
            }
        }
				Radio->StartRx( );
        break;
    case RF_TX_DONE:
        Radio->StartRx( );
        break;
    default:
        break;
    }
}


/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  uint16_t needrun_flag=0,i,j;
  BSP_Init();
  Radio = RadioDriverInit( );

    Radio->Init( );
	  idle_GPIO_Config();

    Radio->StartRx( );

    printf("sx1278 Test \r\n");
    uint32_t freqSx1278 = SX1276LoRaGetRFFrequency();
    printf("sx1278 frequency = %d \r\n", freqSx1278);
	 SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
	

    while( 1 )
    {
			 if(wakeup_fromstop_flag>0){
				  wakeup_fromstop_flag=0;
				  IWDG_Feed();
					Prepare_Data();
				  prepare_data_flag=0;
					bike_state=getBikeStateByAcc();
						if((bike_locked>0)&&(sending_flag==0)){
							if(bike_state==STATUS_MOVE){
								if(lora_sleep_flag>0){
									SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
									lora_sleep_flag=0;
								}
								BAT_Value= Bat_Check();
								for(i=0;i<100;i++)//约22.2ms
								{
									for(j=0;j<1000;j++)
									{
										;
									}
								}
								sprintf((char *)Buffer,"P%.1f",BAT_Value);
								printf("P%.1f",BAT_Value);
								Radio->SetTxPacket( Buffer, 4 );
								sending_flag=1;
								if(request_flag==0){
								  request_flag=1;
									no_reply_count=20;
								}
							}
							if((request_flag>0)&&(no_reply_count==0)){
								alarm_count=100;
								sending_flag=0;
								request_flag=0;
							}
						}
						else if(bike_locked==0){
							if(bike_state==STATUS_CALM)
							   bike_calm_count++;
						  else
							   bike_calm_count=0;
							printf("bike_calm_count = %d \r\n", bike_calm_count);
							if(bike_calm_count>25){
								bike_locked=1;
								ACC_move_square_calm=ACC_move_square;
								alarm_count=5;
							}
						}
				if((request_flag==1)||(alarm_count>0))
					 needrun_flag=1;
				else
					 needrun_flag=0;
				if(needrun_flag>0){
					__disable_irq();  
					OnMaster( );
					__enable_irq();
				}
				else{
//					printf("stop from sleep");
					instopmode_flag=1;
					beep_Close();
					LED_CLOSE();
					if(lora_sleep_flag==0){
						SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
						lora_sleep_flag=1;
					}
					HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
				}
			}
			else{
				if(prepare_data_flag>0){
//					printf("time2msstart:%d",time2ms);
						Prepare_Data();
						prepare_data_flag=0;
						bike_state=getBikeStateByAcc();
							if((bike_locked>0)&&(sending_flag==0)){
								if(bike_state==STATUS_MOVE){
									if(lora_sleep_flag>0){
										SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
										lora_sleep_flag=0;
									}
									BAT_Value= Bat_Check();
									for(i=0;i<100;i++)//约22.2ms
									{
										for(j=0;j<1000;j++)
										{
											;
										}
									}
									sprintf((char *)Buffer,"P%.1f",BAT_Value);
									printf("P%.1f",BAT_Value);
									Radio->SetTxPacket( Buffer, 4 );
									sending_flag=1;
									if(request_flag==0){
										request_flag=1;
										no_reply_count=20;
									}
								}
								if((request_flag>0)&&(no_reply_count==0)){
									alarm_count=100;
									sending_flag=0;
									request_flag=0;
								}
							}
							else if(bike_locked==0){
								if(bike_state==STATUS_CALM)
									 bike_calm_count++;
								else
									 bike_calm_count=0;
								if(bike_calm_count>25){
									bike_locked=1;
									ACC_move_square_calm=ACC_move_square;
									alarm_count=5;
								}
							}
					if((request_flag==1)||(alarm_count>0))
						 needrun_flag=1;
					else
						 needrun_flag=0;
//					printf("time2msstop:%d",time2ms);
				}
					if(needrun_flag>0){
						//__disable_irq();  
						OnMaster( );
						//__enable_irq();
					}
					else{
						printf("stop from normal");
						instopmode_flag=1;
						beep_Close();
					  LED_CLOSE();
						if(lora_sleep_flag==0){
							SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
							lora_sleep_flag=1;
					  }
						HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
					}
			}
    }
}







/************************ (C) COPYRIGHT sheng *****END OF FILE****/ 



六、作品演示

请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得5分,具体详见活动规则。



https://v.qq.com/x/page/i0540lu8hhz.html



七、总结

例如您在完成该作品过程中的一些体会、碰到的技术问题或调试经验、作品的未来规划,及对我们主办方的建议和意见等。

总结体会:最开始只是因为自己买了辆山地车不敢骑出去才打算做这么个东西,来打样的时候恰巧赶上电子制作节,那就顺手报个名哈哈!因为参加了比赛,因此也变得更加重视,读研了“老板”比较勤奋,拉着我们一起朝九晚十,而且座位就在我附近,所以只能晚上回去和星期天的时候抽空调试。这是第一次把一个东西当成产品一样去考虑它的稳定性,续航时间,易用性之类的,其实本身这个系统的功能实现是不难的,几天也就写出来了,后面就一直着手优化续航,看着平均工作电流从38ma优化到0.7ma,别提有多高兴了!现在续航20多天应该没问题,当时测续航测到第16天的时候我就要出去浪了,怕电池在这期间没电过放了就不好了,所以就取下来关了。所以到底极限是多少还得再测。经过这次制作,我算是体会到了其实真正做产品时,其实最重要的是续航和稳定性,不像平时参加些比赛,功能出来了就好了,电池续航不行?who care?代码跑久了会崩?没事,复个位就好了,演示时不崩就行。但是真正做能用的产品就必须考虑这些了。还得感谢老铁给力,工作之余帮忙设计的外壳哈哈,现在总算是修得正果,这段时间一直在我那小破车上测试。差不多准备装到山地上骑出来了哈哈!感谢嘉立创提供的这么一个好的平台!

未来规划:其实这个东西还没做完,社区公共监控端这边还要给配一个上位机来着,用来分析收到的报警信息的传播路径,根据数据库里存储的途经的各社区公共监控端ID对应的安装位置,物业保安值班人员就可以迅速知道哪块停车区域出现了异常,然后迅速前往处理。由于时间仓促,还没来得及弄,现在只是简单地通过串口打印出各节点ID咳咳~回头有空把它补上




哪管多少辛酸已获胜算!
doraemon
2
主题
2444
回复
发表于2017-08-04 14:46:26   |  显示全部楼层
10#
很实用的作品

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部