基于深度学习的目标检测实现方案介绍
目标检测(也叫目标提取)是计算机视觉和数字图像处理的一个热门方向,一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力。尤其是在复杂场景中,需要对多个目标进行实时处理时,目标自动提取和识别就显得特别重要。
简单的说,目标检测就是把一张图或一个视频里面的目标物找出来,比如我要找摩托车,这就是目标检测。而人下一刻它到了什么地方,这就是目标跟踪问题,本文暂不讨论。
本文主要介绍基于深度学习的目标检测实现方案的实现原理及基础单元组成。
视频名称:基于深度学习的人脸识别双路门禁系统
视频地址:https://v.qq.com/x/page/v0852d7yppd.html
视频中介绍的案例是在嵌入式平台上进行机器视觉的目标检测,通过深度学习的方法实现对多目标物体进行检测并识别。使用Arm的嵌入式人工智能开发套件(EAIDK-610)为基础平台,通过网络摄像机进行视频数据采集,EAIDK-610作为边缘智能处理对视频进行分析,并实时显示分析结果。
◆◆展示方案由三个单元组成
1、网络摄像机(IPC)
高清1080P视频编码支持,作为为视频采集单元将采集到的视频信息进行编码后通过网络传输给边缘智能处理单元EAIDK-610;
2、EAIDK-610
边缘测智能单元,执行功能包括:接收IPC的视频流并进行解码,视频分析,检测并识别视频中的目标,通过HDMI接口进行实时显示;
3、显示终端
对用户显示视频分析(目标检测)结果。
此方案中显示终端的显示效果如下:
EAIDK-嵌入式人工智能开发套件(Embedded AI Development Kit 简称EAIDK),是全球首个采用Arm架构的人工智能开发平台,专为 AI 开发者精心打造,面向边缘计算的人工智能开发套件。
硬件平台具备语音、视觉等传感器数据采集能力,及适用于多场景的运动控制接口;智能软件平台支持视觉处理与分析、语音识别、语义分析、SLAM 等应用和主流开源算法,满足AI 教育、算法应用开发、产品原型开发验证等需求。
Tengine 一个注重性能和兼容性的AI框架
前段时间,Tensorflow官方提供的本地编译的方式在Arm嵌入式设备运行Tensorflow Lite,我在11月中旬,使用本地编译的方式编译二进制的Label_image, 对RK3288 以及树莓派上做了性能的测试。
今天我想介绍一个我新发现并让我眼前一亮的框架Tengine.
Tengine 显著的优点是性能和兼容性,使用Tengine框架后运行性能可以得到大幅度的提升。
下图为MobileNet V1_1.0_224 浮点型模型单张图片分类在单核A53的性能对比。我们可以看到Tengine 有显著的优势。
Tengine 框架有着非常好的模型兼容性,支持直接加载caffe/mxnet/tensorflow模型文件,而不需要事先转换,而且用户仅需编译就可以利用Tengine的加速Caffe和Tensorflow性能。
Tengine 不仅可以让分类网络的性能大大提升,连大家众所周知的MobileNet-SSD 网络也能提升它的性能。很多人都觉得树莓派的性能不足以hold住检测网络,但是如果用Tengine框架就可以做到。
即使是开源版是每一帧的检测耗时仅为 286.136ms,足以看出Tengine的性能非常强大。
有兴趣的朋友可以看一下Tengine GitHub的主页,最近还推出了跑MobileNet分类网络的Android App, 手机端就可以使用AI 程序。
https://github.com/OAID/Tengine/?csdn010701
https://github.com/OAID/Tengine-app/?csdn010701
收起阅读 »EAIDK-全球首个采用Arm架构的人工智能开发平台
EAIDK( Embedded Artificial Intelligence Development Kit)-嵌入式人工智能开发套件,是全球首个采用Arm架构的人工智能开发平台,专为 AI 开发者精心打造,面向边缘计算的人工智能开发套件。
硬件平台具备语音、视觉等传感器数据采集能力,及适用于多场景的运动控制接口;智能软件平台支持视觉处理与分析、语音识别、语义分析、SLAM等应用的基础平台和主流开源算法,满足AI教育、算法应用开发、产品原型开发验证等需求。
EAIDK搭载了ARM中国开发的人工智能应用开发平台 - AID,其核心专门针对于前端智能开发深度学习框架 - Tengine和支持异构计算、经过微架构级别优化的NN计算库 - HCL构成,同时包含丰富的ML/DL视觉、语音算法库。
EAIDK作为Arm中国嵌入式人工智能教育应用技术开发平台。所搭载的AID为应用开发者提供简洁、高效、统一的API,可加速AI产品实现以及场景化应用落地。
2018年9月14日,首届“Arm人工智能开发者全球峰会”上正式发布EAIDK,同时发布第一款套件EAIDK-610。EAIDK-610处理器使用RK3399,硬件平台具备丰富的接口扩展能力,同时使用AID提供强大的计算能力。
EAIDK-610运行典型的深度学习算法,同等条件下,比基于原始Caffe的实现快3-5倍,内存占用下降一倍。
围绕 EAIDK 官方提供以下资源及内容
1、完整体系化的使用说明文档;
2、AI技术基础/应用案例源代码及说明文档;
3、教学用算法源代码,以及从算法训练、调参到部署的详细说明文档;
4、商业场景化应用的典型实例分析和应用分析;
5、基于EAIDK的行业典型行业应用案例介绍;
EAIDK开放平台将为AI应用开发者带来三大助力优势:
1、缩短AI产品开发周期
软件和硬件层面 “模块化”的开发环境,开发者可聚焦于场景应用,搭建合适的软件、算法和硬件组合,减少系统搭建的麻烦。
2、提升开发效率
模块化的组织使EAIDK提供的开发环境,让软件、算法和硬件的配置和开发都极其便利,最大程度减少规格修改和平台移植带来的额外工作量。
3、更开放的环境
EAIDK使开发者能更方便地评估算法、传感器、硬件平台,同时更快导入新算法和应用,并持续改进,提高产品的竞争力。
EAIDK开发套件将创新者快速带入人工智能世界,同时也是商业产品开发者的最佳实施平台。
收起阅读 »Tengine支持GPU / CPU异构调度
随着深度学习的快速发展,把深度学习算法部署到嵌入式设备的需求也日益增加。
目前开源的嵌入式推理框架中,有支持ARM CPU加速推理的,也有支持GPU加速的,但这些移动端推理框架中,还没有一个框架能够进行CPU / GPU异构调度。
如今,Tengine作为ARM人工智能平台的软件框架,首次发布支持CPU / GPU异构调度。
Tengine的GPU / CPU异构调度的原理是:
下面我们将演示,如何调用Tengine进行GPU / CPU异构调度,进行检测网络MobilenetSSD的推理加速。
我们的测试环境是Linux的测试平台是开发板萤火虫RK3399:
Tengine是通过调用Arm Compute Library(ACL)进行GPU加速,我们使用的ACL版本为18.05:
为了发挥GPU的最高性能,我们需要设置GPU的频率到最高频率:
显示的 GPU 频率应该是 800000000 。
git clone Tengine项目:
在配置文件中打开开关CONFIG_ACL_GPU = y,并指定ACL路径:
编译:
下载MobilenetSSD模型,可以从[Tengine model zoo](https://pan.baidu.com/s/1LXZ8vOdyOo50IXS0CUPp8g)(psw:57vb)下载模型〜/ tengine / models /路径下:
执行时需要设置一些环境变量:
设置GPU_CONCAT = 0,是为了避免GPU / CPU在的concat这一层在GPU / CPU频繁来回传输数据造成性能损失;
设置ACL_FP16 = 1,是支持GPU用float16的数据格式进行推理计算;
设置REPEAT_COUNT = 100,是让算法重复执行100次,取平均时间作为性能数据;
taskset 0x1用于绑定CPU0(1A53)执行程序;执行的时候需要加-d acl_opencl来打开使用gpu的开关。
从下图可以看到,GPU用半浮点精度float16的检测结果是正确的。
我们对比了 Tengine 用纯 CPU 进行 MobilenetSSD 的推理计算的性能:
可以看出,通过GPU / CPU异构调度(GPU + 1A53)的性能大约是两个CPU大核A72的性能,且A53的占用率为50%左右。
Tengine支持的GPU / CPU异构调度,有两个方面的优势:
一方面,把NN网络中的主要算子在GPU运行,把特定算子在CPU上运行,使得开发者的开发成本大大降低,开发者可以快速通过Tengine将深度学习算法在GPU / CPU上运行起来。
另一方面,把深度学习算法跑在GPU上,其余的CPU计算资源就可以用于其他算法,比如SLAM中的特征提取,路径规划等算法,充分利用了GPU / CPU计算资源。
计算机视觉教学内容介绍-EAIDK-610
EAIDK-610是专为AI开发者和学生精心打造,面向边缘计算的人工智能开发套件。学生或者开发者可以使用此套件了解人工智能的相关知识,了解计算机视觉、人脸检测、人脸识别、双目立体视觉等相关算法,并且可以使用此套件做一些扩展,做产品原型的验证。
EAIDK-610硬件平台(EAI610-P0)使用高性能Arm SoC(瑞芯微rk3399),搭载OPEN AI LAB嵌入式AI开发平台AID(包含支持异构计算库HCL、嵌入式深度学习框架Tengine、以及轻量级嵌入式计算机视觉加速库BladeCV)。为AI应用提供简洁、高效、统一的API接口,加速终端AI产品的场景化应用落地实现。
计算机视觉教学主要内容如下:
01图像采集
图像采集主要介绍如何对EAI610-P0的视频图像进行采集,以及介绍V4L2,RockchipISP和RockchipRGA 的概念及简单操作应用。
02图像处理
图像处理是指对图像进行分析、加工、和处理,使其满足视觉、心理或其他要求的技术。图像处理是信号处理在图像领域上的一个应用。图像处理通过对MIPI摄像头采集到的图像应用多种处理方法,介绍了数字图像处理领域的常用概念和基本方法。
03视频编码
视频编码教学案例的目的是介绍视频压缩的原理,并以EAIDK610为例展示一个实际的视频硬编码实例。主要介绍的视频压缩的概念和历史,同时着重分析了H.264标准,在此基础上采用EAIDK610上的硬件编码作为实例,希望达到理论和实践相结合的教学目标。
04视频解码
视频解码介绍视频压缩的原理,并以EAIDK610为例展示一个实际的视频硬解码实例。教学方案介绍的视频压缩的概念和历史,同时着重分析了H.264标准,在此基础上采用EAIDK610上的硬件解码作为实例,希望达到理论和实践相结合的教学目标。
05视频分析之背景提取
背景提取主要介绍在EAI610-P0的实时采集视频图像基础上的背景提取,着重介绍和实现基于混合高斯模型和CodeBook的背景提取算法,最后对结果简单分析,并对其他算法进行简要介绍。
06人脸检测(传统机器学习方法)
人脸检测是为了学习人脸检测的概念,了解传统机器学习人脸检测方法,展示传统机器学习算法及应用开发过程。本教学方案以haar+adaboost算法为例,从算法的原理分析开始,不仅介绍了算法训练的过程,也展示了算法在嵌入式平台(EAI610-P0)的部署。
07人脸特征提取(深度学习方法)
人脸特征提取是以人脸特征提取方案为例,展示完整的深度学习算法及应用开发过程,同时介绍人脸识别中的核心算法概念。此教学方案以Light CNN 为例,从算法的原理分析开始,不仅介绍了算法训练的过程,也展示了算法在嵌入式平台(EAI610-P0)的部署。
08双目立体视觉
双目立体视觉是学习立体视觉的概念,掌握用双目相机计算深度信息的方法。从双目相机标定及矫正原理分析开始,介绍双目立体视觉的基础理论方法,并且介绍了基于SGBM的深度计算算法,最终在嵌入式平台(EAI610-P0)上使用两个高清相机模组部署。
09人脸识别系统
人脸识别是以人脸特征提取方案为例,展示完整的深度学习算法及应用开发过程,以 Light CNN 1 为例 ,从算法的原理及特点开始,不仅介绍了算法训练的过程,也展示了算法在嵌入式平台(EAI610-P0)的部署 。
010双路人脸门禁系统
双路人脸门禁系统是以嵌入式人工智能开发套件(EAIDK-610)为基础平台,人员进门时,网络摄像机(IPC)连续抓取多张人脸信息,并毫秒级地比对抓取照片和底库信息,比对成功后触发开门动作,人脸抓取、比对结果和人员进门的信息在显示设备上实时展示。
011目标检测(深度学习方法)
目标检测方案是在嵌入式平台上进行机器视觉的目标检测,通过深度学习的方法实现对多目标物体进行检测并识别。使用Arm的嵌入式人工智能开发套件(EAIDK-610)为基础平台,通过网络摄像机进行视频数据采集,EAIDK-610作为边缘智能处理对视频进行分析,并实时显示分析结果。
EAIDK-嵌入式人工智能开发套件(Embedded AI Development Kit 简称EAIDK),是全球首个采用Arm架构的人工智能开发平台,专为 AI 开发者精心打造,面向边缘计算的人工智能开发套件。
硬件平台具备语音、视觉等传感器数据采集能力,及适用于多场景的运动控制接口;智能软件平台支持视觉处理与分析、语音识别、语义分析、SLAM 等应用和主流开源算法,满足AI 教育、算法应用开发、产品原型开发验证等需求。
Lora系统产品即将推出视频教程
为了给客户提供更直观生动的使用体验,我司针对教学产品、开发套件将逐步推出系列视频教程。
先期将针对lora/lorawan相关产品推出视频教程,敬请关注。下面是先导片:
https://www.bilibili.com/video/av45125243/
lorawan开发套件资源汇总下载(持续更新中)
1、lorawan开发工具选型指南:
LPKT系列-lorawan开发工具-产品简介-V1.02.pdf
2、开发套件产品简介:
LPKT001-CE版-lorawan开发套件-产品简介-V1.00.pdf
LPKT001-PRO版-lorawan开发套件-产品简介-V1.00.pdf
LPKT002-PRO版-lorawan开发套件-产品简介-V1.00.pdf
3、网关模块简介:
LPGWMD002-miniPCIE接口sx1301模块-产品简介-V1.00.pdf
LPGWMD001-插针接口sx1301模块-产品简介-V1.00.pdf
4、终端节点模块及测试板简介:
LPMD003-低功耗LoraWan节点模块-产品简介-V1.00.pdf
LPTD009-ATMODEM-产品简介-V1.00.pdf
5、网关模块及终端节点模块选型表:
LPGWMD系列-sx1301模块-产品简介-V1.00.pdf
LPMD系列-低功耗LoraWan节点模块-产品简介-V1.00.pdf
LPMD002用户手册--SDK使用开发指南
1本文目的
通过本文的说明介绍用户将了解和熟悉LPMD002节点模块的SDK开发使用流程。
注:本文默认用户已经熟悉IAR软件的安装和使用方法以及相关仿真下载工具的使用,故这方面内容不在本文说明范围之内,下同。
2 SDK开发环境
IAR6.20 FOR ARM
3.1完全符合LoraWan 1.0.1协议标准
3.2支持ClassA和ClassC协议
3.3支持ABP和OTAA激活
3.4支持上下行双向通信
3.5支持低功耗
4 SDK使用方法
IAR6.20 FOR ARM
LPKT002-SDK-V2.00\IAR\loranode.eww
4.4编译工程:
结果如下所示,
该头文件定义了lorawan的基础配置参数,如下:
宏定义 | 说明 |
#define OVER_THE_AIR_ACTIVATION | 1-OTAA激活 0-ABP激活 |
#define LORAWAN_PUBLIC_NETWORK | True-公开网络 False-私有网络 |
#define LORAWAN_DEVICE_EUI | DEVICE_EUI,8字节 |
#define LORAWAN_APPLICATION_EUI | APPLICATION_EUI,8字节 OTAA模式和ABP模式均需要设置 |
#define LORAWAN_APPLICATION_KEY | APPLICATION_KEY,16字节 OTAA模式需要设置 |
#define LORAWAN_NETWORK_ID | 网络ID |
#define LORAWAN_DEVICE_ADDRESS | 设备地址,4字节 ABP模式需手动设置 |
#define LORAWAN_NWKSKEY | NWKSKEY,16字节 |
#define LORAWAN_APPSKEY | APPSKEY,16字节 ABP模式需要设置 |
4.5.2头文件“LoRaMac-definitions.h”及信道
该头文件定义了lorawan的基础通信配置的参数,其中根据不同频段参数有所不同,
使用频段为USE_BAND_470(标准CN470~510频段),
根据lorawan协议的设计通过:
#define LORA_MAX_NB_CHANNELS 96
可知该频段总共支持96个上行信道,具体的信道配置如下:
for( uint8_t i = 0; i < LORA_MAX_NB_CHANNELS; i++ )
{
Channels.Frequency = 470.3e6 + i [i] 200e3; //ast c
Channels[i].DrRange.Value = ( DR_5 << 4 ) | DR_0;
Channels[i].Band = 0;
}
即从470.3Mhz开始,信道间隔200Khz,489.3Mhz结束。
由lorawan协议可知与96上行信道对应的下行信道只有48个,从500.3Mhz开始,信道间隔200Khz,509.7Mhz结束
#define LORAMAC_FIRST_RX1_CHANNEL ( (uint32_t) 500.3e6 )
#define LORAMAC_LAST_RX1_CHANNEL ( (uint32_t) 509.7e6 )
通过下面函数与上行信道对应,
RxWindowSetup( LORAMAC_FIRST_RX1_CHANNEL + ( Channel % 48 ) LORAMAC_STEPWIDTH_RX1_CHANNEL, RxWindowsParams[0].Datarate, RxWindowsParams[0].Bandwidth, RxWindowsParams[0].RxWindowTimeout, false );
其中利用( Channel % 48 )将上行信道分为0~47和48~95,分别与下行的信道的0~47对应。
另外还有1个固定的下行RX2信道
#define RX_WND_2_CHANNEL { 505300000, DR_0 }
实际单sx1301网关只有8上行信道,所以需要设置sdk的信道掩码,只开启需要的信道即可,
如图所示LoRaMacParamsDefaults.ChannelsMask数组元素为uint16_t类型,其中每1bit代表一个信道,所以该6个长度的数组,总共可代表16*6=96个信道,并且每一元素都是LSB,即
0x00FF;//bit 15~0
0x0000;//bit 31~16
0x0000;//bit 47~32
0x0000;//bit 63~48
0x0000;//bit 79~64
0x0000;//bit 95~80
所以在本例中LoRaMacParamsDefaults.ChannelsMask[0] = 0x00FF;表示只使用0~7信道。
本sdk功能是OTAA自动入网,10S间隔,按确认上行方式发送数据,默认工作流程如下:
该函数执行基础硬件初始化,其中BoardUnusedIoInit( ); 该函数为低功耗处理用的IO配置函数,为满足低功耗,不用使用的IO应做如下处理:
GpioInit( &ioPin, UNUSEDPINPA0, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
其中的串口相关配合如下:
此处串口收发均采用fifo+irq方式处理,用户可以更改。
串口接受处理如下:
建议采用状态机方式进行数据接受。
该函数为状态机式主循环,主循环根据以下状态机依次执行,
l DEVICE_STATE_INIT状态:最主要的初始化以下三个回调函数,
LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
用户上行确认类事件,如确认上行,非确认上行回复的处理等,通信流程在此处理
LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
下行通知类事件,如接受应答,读取数据包rssi,snr等,接受数据处理均在该函数中进行,如下
LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
系统上行类事件,如join请求处理,linkcheck请求处理等,主要处理OTAA 入网
l DEVICE_STATE_JOIN状态:根据OVER_THE_AIR_ACTIVATION宏定义决定采用OTAA还是ABP入网,然后从Comissioning.h头文件中读取数据进行配置,默认配置如下:
l DEVICE_STATE_SEND:
周期发送数据,10S
发送函数
该发送调用通过
准备好的数据,可以修改AppData数组更改发送的数据
l DEVICE_STATE_CYCLE:
自动开启定时器
l DEVICE_STATE_SLEEP:
低功耗函数
TimerLowPowerHandler( );
该函数内部由USE_DEBUGGER宏定义控制是否真正进入低功耗状态,
关于低功耗:
除了上文介绍的IO口处理,其他如IIC,UART,SPI,HSEIO,LSEIO等程序本身可以控制的都在低功耗前关闭,唤醒后开启。
SDK给出了示例可以参考,如下图所示:
低功耗除了程序本身外,还取决于硬件设计的,如使用有源晶振,无源晶振,IO外置的上下拉电阻等,本司另提供LPMD003小体积低功耗高性能lorawan模块,有意可联系客户。
收起阅读 »LPGWMD002用户手册--硬件设计开发指南
LPGWMD002是一款10通道 (8 x Multi-SF + 1 x Standard LoRa + 1 x FSK) LoRa/LoRaWAN网关和集中器模块。模块上提供了miniPCIE接口,用户可以利用此接口将嵌入式系统主板与LPGWMD002相连接,快速开发出自定义网关。
LPGWMD002的硬件设计有硬件SPI接口和通过FT232HQ进行虚拟SPI转换的USB接口,模块出厂均为硬件SPI接口模式(支持和接受出厂定制为USB接口1)。
LPGWMD002模块支持和接受定制化的频段需求2,模块出厂默认是的频段是CN470~510Mhz。
注1,2:根据订货信息下单或联系工作人员。
模块采用标准MINIPCIE52PIN引脚定义:
序号 | 名称 | 类型 | 说明 |
2,6,48,52 | VDD | PW | 电源+5V |
4,9,15,18,21,26-29,34,35,40,50 | GND | PW | 地 |
8 | GWM-RESET | I/O | 高电平复位,高电平保持时间>100ns,该引脚内部下拉电阻10KΩ。 |
10 | GWM-SCK | I/O | SX1301 SPI-SCK |
12 | GWM-MISO | O | SX1301 SPI-MISO |
14 | GWM-MOSI | I | SX1301 SPI-MOSI |
16 | GWM-CS | I/O | SX1301 SPI-CS |
39 | GPIO4 | I/O | SX1301 GPIO4 |
41 | GPIO3 | I/O | SX1301 GPIO3 |
43 | GPIO2 | I/O | SX1301 GPIO2 |
45 | GPIO1 | I/O | SX1301 GPIO1 |
47 | GPIO0 | I/O | SX1301 GPIO0 |
51 | PPS | I/O | GPS PPS 信号输入 |
36 | USBD-(DM) | I/O | FT232HQ USBD-(DM) |
38 | USBD+(DP) | I/O | FT232HQ USBD+(DP) |
1,3,5,7,11,13,17,19-20,22-25,28,30-33,37,42,44,46,49 | RESERVER | NC | 保留(空) |
3.1模块外边框尺寸为40x62.5mm±0.2mm,定位孔直径为2.6mm,接口等详细位置见下图:
3.2MiNiPCIE封装顺序定义(正面图):
3.3MiNiPCIE封装顺序定义(反面图):
3.4MiNiPCIE金手指封装定义(参考标标准miniPCIE尺寸):
3.5建议配套使用的插座型号:
天线接口为射频连接器,要求天线的特征阻抗为50欧姆。
模块采用标准SMA作为输出天线接口,在天线满足阻抗,增益,频段等参数的条件下,用户可以很据自己的需要自由选配天线。
5.1绝对最大电气值:
注意:为避免输入功率过大,当发射端功率>模块最大输入功率15dBm时,应保持收发两端距离>1米。
5.2通用电气参数:
5.3IO口电气参数:
5.4SPI电气参数:
6.1输出功率参数配置:
6.2输出特性
6.3接收性能参数:
参考上图:
7.1模块使用SPI接口时只需要将5V电源及地以及RESET,SCK,MOSI,MISO,CS连接至相应的HOST主机上即可;
7.2模块使用USB接口时只需要将5V电源及地以及USBDM,USBDP连接至相应的HOST主机上即可。
注:VDD电源需满足5V/1A的供电要求。
收起阅读 »
LPGWMD002用户手册--软件设计开发指南
LPGWMD002支持硬件SPI或USB方式连接LinuxHost主机构成lorawan网关,下面将分别对这两种使用场景进行说明,帮助用户快速熟悉模块的使用和操作流程。
本文还将对模块驱动代码工程进梳理,有利于客户进行优化和二次开发。
2.1基础概念
下图是lorawan网络的基础系统构架,其中LPGWMD002是lorawan网络的核心模块,由它进行无线数据的收发;但是部分协议处理的相关工作由外部的Host主机系统以及lorawanserver完成。
2.2 Host主机系统
参考上图需要由Host主机系统配合LPGWMD002来构成Gateway(此处我们假设用户已经准备好了linux(包括嵌入式linux)系统的Host主机系统,如Raspberry PI或类似的系统,同样我们假设用户对基础的linux操作已经熟悉,包括命令行操作、代码编译操作等)。
本文所有的操作及使用均在Debian 8 “Jessie” Linux发型版上进行,依赖的硬件平台为Raspberry PI3 B+或CM3。虽然本文操作均在Raspberry PI上进行,但是在其他类似的linux系统同样也适用,但是可能有些微小差别(本文不负责解释和说明)。
参考《LPGWMD002-miniPCIE接口sx1301模块-硬件设计开发指南-V1.00.pdf》文档第7节之7.1所述将模块与LinuxHost主机,此处根据需要使用硬件SPI或者USB接口,注意电源供电需满足条件。
Semtech提供了开源的sx1301驱动代码,并将其存储在( https://github.com/ )上,github仓库地址(https://github.com/Lora-net ),此处存放所有官方提供的lorawan相关的代码资源,本文所有用到的驱动代码为:
https://github.com/Lora-net/lora_gateway
注1:本文所用的SPI驱动版本为3.2.1,其他版本可参考本文以及github文档自行处理,恕不通知。
注2:本文所用的USB驱动版本为3.0.1,该版本为最后支持USB驱动的固件版本之一,在此之后官方删除了对USB的支持。
2.5.1获取源码
A)sudo apt-get install git
B)mkdir -p ~/LoRa/lora_gateway
C)cd ~/LoRa/lora_gateway
D)git clone https://github.com/Lora-net/lora_gateway.git
2.5.2Host主机系统配置
E)驱动源码需要使用主机系统的 “native” SPI,源码中的设备名为 “/dev/spidev0.0”,通过以下一系列操作开启主机系统的“native” SPI,最后需要重启生效:
sudo raspi-config->Advanced Options->SPI->YES->sudo reboot
F)配置完SPI接口还需配置RESET控制引脚,此处需要编写一个脚本文件,假设使用 Raspberry Pi 的 GPIO 17 (pin 11)作为RESET引脚,内容如下:
#!/bin/bash
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
echo "1" > /sys/class/gpio/gpio17/value
sleep 5
echo "0" > /sys/class/gpio/gpio17/value
sleep 1
echo "0" > /sys/class/gpio/gpio17/value
然后保存为“LPGWMD002-SPI_reset.sh”,以后每次Raspberry Pi重启后需手动执行该复位脚本,使sx1301正常复位后开始工作。
2.5.3驱动配置
通过修改ora_gateway/libloragw/library.cfg中的相关配置,可以打印相关信息,用于测试和调试
DEBUG_AUX = 0
DEBUG_SPI = 0
DEBUG_REG = 0
DEBUG_HAL = 0
DEBUG_GPS = 0
只需将相应的项设置成=1即可开始相关调试信息。
2.5.4编译驱动
G)cd ~/LoRa/lora_gateway
H)make
执行完该命令后将在目录“lora_gateway\libloragw”编译生成 “libloragw.a” 备用,以及测试程序如:“test_loragw_reg”,“test_loragw_hal”等,可以之后测试sx1301硬件寄存器功能等‘
将在“lora_gateway”下再生成“lora_gateway\util_tx_test”等目录可以用于测试sx1301通信功能,如:
A)cd lora_gateway/util_tx_test
B)./util_tx_test –r 1255 –f 471.5
执行完后将按如下所示参数进行周期数据发送。
Sending -1 packets on 471500000 Hz (BW 125 kHz, SF 10, CR 1,
16 bytes payload, 8 symbols preamble) at 14 dBm, with 1000 ms
between each
INFO: concentrator started, packet can be sent
Sending packet number 1 ...OK
Sending packet number 2 ...OK
Sending packet number 3 ...OK
...
其他不在赘述,更详细内容请参考每个文件夹下的“readme.md”说明文件。
2.6.1安装扩展驱动
LPGWMD002通过USB连接到Host主机,需要安装“libmpsse”驱动。
A)sudo apt-get update
B)sudo apt-get install git --assume-yes
C)sudo apt-get install libftdi-dev --assume-yes
D)mkdir –p ~/LoRa/libmpsse
E)cd ~/LoRa/libmpsse
F)wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/libmpsse/
libmpsse-1.3.tar.gz
G)tar zxvf libmpsse-1.3.tar.gz
H)cd libmpsse-1.3/src
I)./configure --prefix=/usr --disable-python
J)make
K)sudo make install
L)cd /etc/udev/rules.d
M)sudo wget N)https://raw.githubusercontent.com/mirakonta/lora_gateway/master/libloragw/99-libftdi.rules
O)sudo udevadm control --reload-rules
P)sudo udevadm trigger
2.6.2获取源码
R)sudo apt-get install git
S)mkdir -p ~/LoRa/lora_gateway
T)cd ~/LoRa/lora_gateway
U)git clone https://github.com/Lora-net/lora_gateway.git
2.6.3驱动配置
通过修改ora_gateway/libloragw/library.cfg中的相关配置,可以打印相关信息,用于测试和调试
CFG_SPI= ftdi
CFG_BRD= ref_1301_868
此处为源码中对应的硬件版本号,只是一个宏定义,在此默认它就是LPGWMD002。
DEBUG_AUX = 0
DEBUG_SPI = 0
DEBUG_REG = 0
DEBUG_HAL = 0
DEBUG_GPS = 0
只需将相应的项设置成=1即可开启相关调试信息。
2.6.4编译驱动
同2.5.4所述,不再赘述。
3 lora_gateway源码结构及HAL库使用说明
本文使用https://github.com/Lora-net/lora_gateway仓库中V5.0.1版本进行说明。
是配合Semtech的SX1301AP2参考设计所用的文件。
是sx1301的HAL层(LoRa concentrator Hardware Abstraction Layer),通过这个C库用户可以通过API调用实现对sx1301的配置以及数据收发,这个HAL层由以下6(8)个子模块构成,
目录是lora_gateway\libloragw\src:
l loragw_hal:主模块,包含高等级函数来配置和使用集中器
l loragw_reg:这个模块用来操作集中器的寄存器
l loragw_spi:通过SPI接口来操作集中器的寄存器
l loragw_aux:包含一个主机需要的wait_ms函数,用于指定ms的延时
l loragw_gps:通过基准时基来同步集中器内部计数,例如例程中的GPS授时。
l loragw_radio:配置 SX125x 和 SX127x。
l loragw_fpga (only for SX1301AP2 ref design):SX1301AP2参考设计才需要,用于操作FPGA的寄存器,以及配置FPGA功能。
l loragw_lbt (only for SX1301AP2 ref design):SX1301AP2参考设计才需要,用于配置和使用LBT功能。
文件lora_gateway\libloragw\library.cfg用来配置HAL库调试信息的输出,
DEBUG_AUX = 0
DEBUG_SPI = 0
DEBUG_REG = 0
DEBUG_HAL = 0
DEBUG_LBT = 0
DEBUG_GPS = 0
如需输出某种打印信息将DEBUG_xx置成 = 1即可。
3.3目录lora_gateway\util_xx_xx类似的文件
均为使用通过API调用HAL库的例子程序,这些例子同样可以做为测试功能使用。
l lora_gateway\util_lbt_test:这个软件用来测试“Listen-Before-Talk”的信道时间戳。
l lora_gateway\util_pkt_logger:这个软件用来让sx1301使用JSON配置文件,以及将所有的包记录于一个log文件。
l lora_gateway\util_spectral_scan:这个软件用来扫描基站工作环境的频谱。
l lora_gateway\util_spi_stress:这个软件通过Host主机读取sx1301的寄存器文件来检测的连接的稳定性。
l lora_gateway\util_tx_continuous:这个软件用来设置sx1301为持续TX模式,用于频谱测试。
l lora_gateway\util_tx_test:这个软件用来做发包测试。包里有少量非协议格式信息,但可以用来检测基站下行功能,需要使用另一台基站来做接收。
3.4文件lora_gateway\reset_lgw.sh
他是依赖于特定平台的通过GPIO口复位sx1301的脚本文件,需要在每次使用sx1301功能前执行此脚本复位芯片。
3.5.1软件细节
这个库按照ANSI C99进行编写。loragw_aux模块中的ms精确延时含有POSIX格式函数,嵌入式平台可以用硬件定时器进行重写。
library.cfg 中 DEBUG_xxx 如果置为1,则会用 fprintf 输出对应的调试信息。
对于交叉编译,需要设置 Makefile 中的 ARCH 和 CROSS_COMPILE 变量,或者在 shell 环境中,使用正确的工具链名字和路径。
例如:
l export PATH=/home/foo/rpi-toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH
l export ARCH=arm
l export CROSS_COMPILE=arm-linux-gnueabihf-
libloragw目录下的Makefile会解析 library.cfg 文件,产生一个config.h的C头文件,包含 #define 选项。那些选项会使能或禁用loragw_xxx.h 文件和 .c 原文件中的代码。library.cfg 也用来直接选择动态链接库。
注:树莓派系统自带编译和以直接编译本文代码。
如果想在其他系统使用编译后的库,你需要导出这些文件:
l libloragw/library.cfg -> 根配置文件
l libloragw/libloragw.a -> 静态库
l libloragw/readme.md -> license要求
l libloragw/inc/config.h -> 从 library.cfg 衍生出的C配置标志
l libloragw/inc/loragw_.h -> 你需要用到的头文件 (例如. _hal and _gps)
在这个库链接到你的应用之后,只有 license 文件要求在程序文件中拷贝和保留。
3.6.1 设置软件环境
对一个典型应用,你需要这么做:
l 源码中包含 loragw_hal.h
l 编译时链接 libloragw.a 静态库文件
l 由于 loragw_aux 的依赖关系,需要链接 librt 库
如果应用需要直接访问集中器配置寄存器的话(例如做些高级配置),你还需要这样做:
l 源码中包含 loragw_reg.h
3.6.2 使用软件API
要在你的应用中使用 HAL,需要遵守如下规则:
l 在射频启动之前需要配置好 radios path 和 IF+modem path
l 只有在调用了 start 函数之后,配置才会传送给硬件
l 只有在 radio 使能,同时IF+modem 使能,以及集中器启动后,才能接收数据包。
l 只有在 radio 使能,以及集中器启动后,才能发送数据包。
l 改变配置之前,必须停止集中器。
一个对HAL的典型应用流程图如下:
<configure the radios and IF+modems>
<start the LoRa concentrator>
loop {
<fetch packets that were received by the concentrator>
<process, store and/or forward received packets>
<send packets through the concentrator>
}
<stop the concentrator>
注意:lgw_send 在LoRa集中器仍然发包时,或者即使在准备开始发包时,是非阻塞立即返回。当有数据包在发送时,将无法收到任何数据。你的应用需要考虑发包的时长,或者在尝试发包前检查下状态(使用 lgw_status)。当前一包未完成时立即发一包,会导致前一包无法发送,或者发送部分(会导致接收端出现CRC错误)。
3.7.1 硬件版本
loragw_reg 和 loragw_hal 是针对Semtech硬件编写的程序:
Semtech SX1301 芯片
Semtech SX1257 or SX1255 收发器
如果硬件版本和库版本不匹配的话,这个库将无法使用。你可以用 test_loragw_reg 来测试软硬件是否匹配。
loragw_spi 的SPI函数适合平台相关的,如果你用别的SPI接口可能需要重写这个函数:
SPI master matched to the Linux SPI device driver (provided)
SPI over USB using FTDI components (not provided)
native SPI using a microcontroller peripheral (not provided)
你可以用 test_loragw_spi 来测试SPI通信。
为了使用库中的GPS模块,主机必须要通过串口连接GPS接收器,串口连接必须以“tty”设备出现在 /dev/ 目录,启用这个程序的用户必须用读写这个设备的权限。使用 chmod a+rw 来允许所有用户能操作指定的tty设备,或者使用sudo来运行你的程序(例如. sudo ./test_loragw_gps)。
当前版本,库只从串口读取数据,在GPS接收器上电后会收到他们发出NMEA帧 以及 u-blox 模块私有的 UBX 消息。
GPS接收器必须在发出PPS脉冲后发出UBX消息,让内部集中器的时间戳可以用GPS时基校准。如果GPS接收器发出了GGA NMEA语句,gateway则可以进行3D定位。