热度 20
2015-6-16 10:41
1103 次阅读|
0 个评论
已刊登至《无线电》六月刊 早在 1994 年爱立信公司就创立了蓝牙技术,并制定了基本的技术规范,原意是创造一种设备间通讯的标准化协议,以解决设备间通讯不兼容的情况,规范公布后得到大量移动设备制造商的支持,并于 1999 年成立 蓝牙技术联盟(Bluetooth Special Interest Group),该联盟制定并维护蓝牙无线规范,并对设备制造厂商提供Bluetooth认证与授权。 当前影响最广的版本应该是蓝牙4.0, 本标准中增加了 Bluetooth Smart 和 Bluetooth SmartReady 标准。特别是 Bluetooth Smart 版本,作为低功耗蓝牙( Bluetooth Low Energy ,简称 BLE ),相对历史版本有质的飞跃,主要表现在成本低,功耗低,峰值电流极小并可以非常快速的建立连接,使用一粒纽扣电池就可以连续工作数年之久。相较于 Zigbee 和传统蓝牙,协议标准化和低功耗的优势让 BLE 在智能家居和穿戴设备上的优势一目了然,如图 1 所示。 图 1 常用无线协议比较 特别是 2011 年开始苹果 iOS 原生支持 BLE 之后, BLE 得到大量 iOS 周边厂商和智能设备厂商的响应,基于 BLE 技术开发的智能硬件遍地开花,如:智能体重秤,智能手环,智能灯控,智能水杯,智能马桶,智能闹钟…… 项目背景 近两年各种智能家居的产品层出不穷,而且众多“科技公司”“互联网企业”“资本投资公司”纷纷加入战团,看到做手机的 A 公司出了一个智能净化器,做空调的 B 公司出了一个智能手机,做手表的 C 公司出了一个智能手环,做马桶的 D 公司坐不住了,在马桶里面塞进去了一个温控 + 通讯模块,就诞生了智能马桶 … 智能设备市场好热闹啊。那么智能产业迅速发展的现在,我们在智能家居上还能有什么创意可以挑衅?灵感真的都源于生活,小熊有一天开门收快递,然后无情的风把万恶的门拍死了,只剩小熊穿着睡衣举着手机拿着包裹在风中凌乱,开锁小哥在小熊女友担保外加 3 张毛爷爷之后才高抬贵手开了门,懊恼啊 … 拍大腿的瞬间,当时小熊就萌发了一个念头,要是门锁换成智能控制的话,是不是钥匙就不再困扰我们了!!!只需要打开手机 APP ,就可以操纵智能门锁开门,或者像有强迫症的熊二,每次锁完门都要回头再看一次门有没有锁好,是不是有了门锁的手机 APP ,就可以随时看自家门锁的开关状态了! 想法出来了,回头就开始一步步落实。经过对场景设想,最终选用蓝牙 + 以太网网关的方案,正是因为蓝牙短距离 + 传输速度快的优势,其中以太网网关部分使用 W5500 硬件协议栈芯片实现。为了更加体现门锁的智能化,小熊设想了几个场景:其一是小熊出门收快递,门被无意中关上了,可以直接用手机开门;其二小熊不在家,小熊女朋友需要进门洗衣服做饭,小熊可以远程给女朋友开门;其三是熊二被女朋友赶出来了,需要临时借宿,小熊可以给熊二手机授予限时的开门权限(如 2 周)。看起来是不是很强大!图 2 就是小熊今天要为大家介绍的蓝牙智能门锁的实现示意图。 图 2 蓝牙智能门锁示意图 本方案的组成主要分为三个部分: BLE 门锁机构, BLE 网关设计,门锁管理服务器。因为门锁管理服务器主要为数据库管理以及 APP 调用等内容,本文不做过多阐述,本文将主要讲述 BLE 门锁和 BLE 的以太网网关的实现等部分内容。 关于 BLE 的实现,我们选用的是目前市场上最常见的 TI CC2541 , CC2541 是 BLE 单芯片解决方案,包含一个工业级的 8051 内核以及 RF 收发器,集成 TI 的 BLE 低功耗协议栈并拥有相对完善的低功耗外设;而以太网部分用的硬件协议栈芯片 W5500 , W5500 芯片 使用硬件逻辑门电路实现TCP/IP协议栈的传输层及网络层(如:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE 等协议),并集成了数据链路层,物理层,以及 32K 字节片上 RAM 作为数据收发缓存。不言而喻, W5500 非常适合 CC2541 这种 8051 内核,而且片上资源不是很丰富的 MCU ,一切就这么愉快的决定了。 为了实现 BLE 通讯,我们需要使用两个 CC2541 模块,一个作为 Central ,另一个作为 Peripheral ;他们之间实现 BLE 通信,其中 Peripheral 作为门锁机构的控制,而 Central 则驱动 W5500 作为 TCP Client 实现网络通信,从而在网络端查询门锁状态以及实现网络控制开锁的功能。图 3 列出了需要准备的硬件设备。 图 3 所需硬件设备 准备工作: 1. 安装编译环境 IAR Embedded Workbench for 8051 8.10 Evaluation 2. 安装协议栈 BLE-CC254x-1.3.2 3. 安装 CC-Debugger 模块调试下载器驱动 BLE 以太网网关部分: BLE 以太网网关部分结构如图 4 : 图4 BLE 以太网网关接线图 需要在 CC2541 的 Central 模式中集成 W5500 的驱动以及 Socket 处理部分,由于 W5500 的函数驱动库是分层次书写的,我们只需将 SPI 通信的硬件抽象层的函数重新编写即可。 以下为 CC2541 的 SPI1 的初始化配置函数和数据收发函数的程序,以及复位管脚的控制程序: 01 void WIZ_SPI_Init(void) 02 { 03 PERCFG |= 0x02; // PERCFG.U1CFG = 1 04 P1SEL |= 0xE0; // P1_7, P1_6, and P1_5 are 05 peripherals 06 07 P1SEL = ~0x10; // P1_4 is GPIO (SSN) 08 P1DIR |= 0x10; // SSN is set as output 09 10 // Set baud rate to max (system clock frequency / 8) 11 U1CSR = 0; // SPI Master Mode 12 // Configure phase, polarity, and bit order 13 U1GCR = 15; 14 U1BAUD = 255; 15 U1UCR = 0x80; 16 U1GCR |= BV(5); 17 18 P1SEL = ~0x08; // P1_3 is GPIO (SSN) 19 P1DIR |= 0x08; // P1_3 is set as output 20 } 21 22 void WIZ_RST(uint8 val) 23 { 24 if (val == LOW) 25 { 26 P1_3=0; 27 } 28 else if (val == HIGH) 29 { 30 P1_3=1; 31 } 32 } 33 // Connected to Data Flash 34 void WIZ_CS(uint8 val) 35 { 36 if (val == LOW) 37 { 38 P1_4=0; 39 } 40 else if (val == HIGH) 41 { 42 P1_4=1; 43 } 44 } 需要注意的是, CC2541 的 LCD 驱动的部分引脚与 SPI1 的几个引脚是复用的,需要将和 LCD 有关的编译项去掉,避免发生冲突,导致 SPI 不可用。具体方法为在工程选项的编译子项里,将 ”HAL_LCD=TRUE” 更改为 “HAL_LCD=FALSE” 。 程序重写完毕后,打开 TI 官方 BLE 的例程 SerialApp3 ,此例程包含 Central 和 Peripheral 两部分,原始例程可以实现串口数据透传,基于此例进行集成相对起来会比较简单。将 W5500 的驱动程序包添加到工程中,如图 5 所示。 图 5 将 W5500 部分集成并初始化 其中Ethernrt_Init函数主要负责W5500的接口和参数的初始化: 01 /* 该函数将会在任务函数的初始化函数中调用 */ 02 void Ethernrt_Init( uint8 taskID ) 03 { 04 WIZ_SPI_Init(); //初始化CC2541的SPI1作为W5500的通讯接口 05 Reset_W5500(); //复位W5500 06 set_default(); //设置初始化参数如MAC,IP地址等参数 07 set_network(); //使初始化的IP参数生效 08 09 //记录任务函数的taskID,备用 10 sendMsgTo_TaskID = taskID; 11 } TI 的官方 BLE 例程中有比较完备的协议栈程序,提供了完备的应用函数供用户调用,用户可以在应用层添加自己的任务和事件;更改应用层数据之前我们必须了解一下 BLE 的应答机制以及 CC2541 的 OSAL 也就是系统抽象层的任务调用机制,首先 TI 已经做了大量工作,我们无需重写 BLE 协议,而只需要根据自身的需求更改相应任务参数即可,在 SimpleBLECentral_Init 函数中将 Central 的相关参数初始化,比如: GAPCentralRole_SetParameter : 设置 Central 可以扫描到的最大从端设备数目; 继续阅读: http://www.iwiznet.cn/blog/?p=7192