1、套件概述
有幸得到一套SensorTile物联网开发套件,狂拽酷炫吊炸天的性能真是让我兴奋至极,经过一段时间的学习摸索,初步了解其开发流程,这里将这款神器介绍给大家,并分享开发经验与源代码,共同学习进步,希望大家持续关注。
在物联网大潮下,ST推出的STEVAL-STLKT01V1(SensorTile的全部套件)就是一款高度集成的开发套件,具有丰富的功能,可以缩短设计周期,加速开发。
极小的SensorTile核心板,只有13.5×13.5mm,具有高效且低功耗的惯性器件,气压计,MEMS麦克风,板上80Mhz的MCU,提供蓝牙智能连接,在最小的尺寸中提供最好的无线性能。
STEVAL-STLKT01V1开发套件可用于原型机的开发,可以被用于评估阶段,在一个最佳的系统框架评估系统的高效性,低功耗,数据融合和嵌入式信号处理算法。可被用于参考设计,提供高效,低功耗的设计。包括:原理图,PCB图,器件列表,3D CAD,从基础的例程到复杂的软件工程。
套件全家福
包括:SensorTile核心板,mini扩展板,锂电池,ST-Link下载连接线,扩展板,可穿戴式的塑料盒。
SensorTIle核心板。
引用 |
器件 |
描述 |
A |
MP34DT04 |
MEMS数字麦克风 |
B |
LD39115J18R |
1.8V低压差稳压器 |
C |
STM32L476JGY6 |
ARM Cortex-M4 32位MCU |
D |
LSM6DSM |
低功耗3轴加速度计和3轴陀螺仪 |
E |
LSM303AGR |
低功耗3轴加速度计和3轴磁力计 |
F |
LPS22HB |
MEMS气压计 |
G |
BlueNRG-MS |
BLE |
H |
BALF-NRG-01D3 |
谐波滤波器 |
STLCX01V1(SensorTile开发扩展板)
引用 |
器件 |
描述 |
A |
SensorTile的连接头 |
插接或焊接SensorTile |
B |
Arduino连接头 |
兼容STM23 Nucleo板子 |
C |
ST2378ETTR |
1.71到5.5V的电平转换器 |
D |
micro-USB连接头 |
供电与通信接口 |
E |
音频DAC,耳机孔 |
16位低功耗音频DAC,3.5mm耳机孔 |
F |
SWD连接头,复位按钮 |
5-pin SWD连接口,复位按钮 |
STLCR01V1(SensorTile mini扩展板)
引用 |
器件 |
描述 |
A |
SensorTile的连接头 |
插接或焊接SensorTile |
B |
HTS221 |
数字相对湿度和温度计 |
C |
STBC08PMR, STC3115, LDK120M-R, USBLC6-2P6 |
800mA锂电池充电器,低噪声低电压稳压器,静电保护 |
D |
电源开关 |
|
E |
SWD连接头 |
5-pin SWD连接口 |
F |
micro-USB连接头,3-pin电池接口 |
供电与通信接口,锂电池供电接口 |
G |
micro-SD卡插口 |
SensorTile的功能框架图如下:
系统需求:
如果仅仅需要运行demo,需要一台智能手机安卓4.4版本以上或者IOS 8.0以上操作系统,且支持4.0版本以上蓝牙。一个USB线用于供电。
如果需要自己设计,需要一台Windows7系统以上的电脑,安卓有IAR,KEIL或者AC6集成开发环境,USB线供电,一个STM32 Nucleo板子,ST-LINK固件。
多套固件支持该套件:
FP-SNS-ALLMEMS1
支持的硬件:BlueNRG ,LPS22HB, LSM6DSM, LSM303AGR MD34DT04。
FP-SNS-MOTENV1
支持的硬件:BlueNRG, HTS221, LPS25HB, LSM6DS0, LIS3MDL。
BLUEMICROSYSTEM1
支持的硬件:BlueNRG , LSM6DS3, LPS22HB, LSM6DSM, STC3115, LSM303AGR
开放MEMS算法(算法库会在之后介绍):osxMotionFX (实时姿态解算算法),osxMotionARactivity(运动状态识别算法)osxMotionCP (佩戴位置识别算法),osxMotionGR (手势识别算法),osxMotionPM (计步器)。
BLUEMICROSYSTEM2
支持的硬件:BlueNRG, LPS22HB, LPS25HB, LSM303AGR,LSM6DSM, MP34DT04。
开放MEMS算法:osxMotionFX (实时姿态解算算法),osxMotionARactivity(运动状态识别算法)osxMotionCP (佩戴位置识别算法),osxMotionGR (手势识别算法)。
注:所谓的算法库就是ST提供一种功能接口,调用可以方便的实现不同的功能。
总结:
极致小的尺寸,丰富的功能,简便的算法库,全套ST器件,开源SDK,甩SensorTag几条街,想拥抱物联网的你有什么理由拒绝呢?
参考引用:
SensorTile培训资料:
20160908 SensorTile 025 Training FINAL.pdf
SensorTile概述:
en.DM00298488.pdf
SensorTile用户手册:
en.DM00320099.pdf
SensorTile快速入门指南:
en.steval-stlkt01v1_quick_start_guide.pdf
Open.MEMS算法库介绍:
en.Open_MEMS_EN.pdf
2、功能展示
前面我们讲到有四套固件库支持SensorTile,但只有BLUEMICROSYSTEM1和BLUEMICROSYSTEM2提供算法库,两个固件库功能有稍许差别,BM1较BM2多了计步器和开关LED,BM2较BM1多了蓝牙语音,因此功能展示会综合两个固件库。以下功能展示全是本人亲自试验,绝不忽悠。
下载好Blue-MS(安卓默认是到谷歌商城下载,不能翻墙帖子最后有下载),SensorTile刷好固件(环境的搭建和程序的烧录会在以后介绍),开启手机BLE,打开软件界面如下:
扫描设备,ST采用了搜索过滤,只能搜索到使用了ST协议的设备,因此搜索的速度相当快。
传感器数据显示,点击设备名进入后,就出现各种传感器的信息,包括温度计,气压计等。可以查看Rssi,电池电量。相关界面如下:
虚拟示波器显示,可以看各种数据的波形,加速度计,磁力计,陀螺仪,温度计等(以后会介绍数据传输的工作原理,并做简单的DIY)。
加速度计相关算法,包括:朝向检查,自由落体检测,单击检测,双击检测,拿起检测,计步器,倾斜检测。在APP中体现如下(如果检测到相应状态图标就会跳动):
在注册了相关算法库之后开启算法库功能(注册方法以后介绍)。
osxMotionFX (实时姿态解算算法),这是9轴的姿态解算算法,首先需要磁力计校准,校准之后,界面上的六面体就会显示SensorTile的姿态,实测还是相当的准的,停下转动后在偏航上会有少许的滑动,这个是9轴的正常现象了,界面如下:
osxMotionARactivity(运动状态识别算法),这个可以显示佩戴者的运动状态,是静止、运动、走路、跑步等状态,界面如下:
osxMotionCP(佩戴位置识别算法),这个可以指示佩戴者佩戴的位置,是手上、脖子上、或是其的地方,检测出后会高亮显示,界面如下:
osxMotionPM (计步器),可以检测出行走的步数,并计算出速度,这个功能在加速度算法中也有实现,两者效果差不多,都不太准,不过市面上的多种手环也都存在不准的现象。SensorTile上的ST加速度计芯片已经硬件化了计步功能,也就是说直接从寄存器里读出来就是步数了,界面如下:
osxMotionGR (手势识别算法),可以检测出SensorTile是在左右运动,上下运运动还是摇晃,检测出后会高亮显示,界面如下:
osxAudioBV(蓝牙语音),这个厉害了,正如视频中所示,可以通过SensorTile传输语音到手机,然后手机将语音传输到Google语音识别云服务,最后传回文字到手机上,如果终端能识别这些文字,想想是不是很智能呢?不过使用这个功能之前需要先申请Google SpeechAPI Key,然后还需要手机可登录Google,这些暂时还实现不了,不过实测传输回来的语音还是挺清楚的,延迟也很低,界面如下:
遥控LED灯,可以使用手机来远程控制SensorTile上面的LED灯的状态(之后会介绍其工作原理,并从SDK-Example开始一步一步实现这个功能),界面如下:
相互通信功能,在APP中是Debug Console,发送什么数据过去就传回来什么(之后会介绍工作流程以及相关DIY),界面如下:
FOTA(空中固件下载)功能,最常见的就是固件更新,我也做了测试,首先将固件下载到手机,然后选择固件更新,耗时92秒,如下:
这就是目前SensorTile支持的功能,其实算法库拥有的功能还远不止如此,比如声音去燥,声音定位等等的,期待着大家去发现。
3、程序烧录与注册
拿到SensorTile之后,直接连接上USB线,然后用手机打开Blue-MS软件就可以直接使用了,但是要体验更多功能,这些并不够。
环境搭建:
硬件需求:SensorTile开发套件,满足要求的手机和电脑各一台,ST-link或者一个NUCLEO STM32开发版。
软件需求: IDE(IAR、KEIL、AC6),ST-Link驱动,BM1和BM2开发软件包,Blue-MS APP。
安装好IDE和ST-Link驱动,开发环境就搭好了。
程序烧录:
将一块STM32 NUCLEO板子的CN2跳帽去掉,USB线与相关的连接如下图所示:
将两根USB线连接电脑。使用IAR,KEIL或者AC6打开工程,这里采用KEIL5,BM2打开路径BlueMicrosystem2_V2.1.0\Projects\Multi\Applications\BlueMicrosystem2\MDK-ARM\STM32L476RG-SensorTile中的工程、编译、烧录。此时SensorTile上的灯在闪烁说明烧录成功了。
BM1打开路径BlueMicrosystem1_V3.0.0\Projects\Multi\Applications\BlueMicrosystem1\MDK-ARM\STM32L476RG-SensorTile,进行相同操作即可。
算法库注册
算法库的注册有两种方法,下载PC客户端,在电脑上进行注册,也可以直接在手机上进行注册。这里使用手机注册,点击状态栏上面的缩略点,弹出下拉菜单中选择”License Manager”然后弹出如下窗口:
列出的是该固件可以申请的License,打了勾的是已经弄好了的,有REQUEST 和UPLOAD的是还没有注册好的。以osxMotionAR为例,点击REQUEST弹出如下申请窗口:
填写名字、邮箱和公司信息。我使用的是QQ邮箱,点击红色按钮使用QQ邮箱发送,稍后会收到两封邮件,其中一个有注册序列号如下:
复制邮件中的序列号,点击UPLOAD粘贴序列号,最后点击红色的按钮,会提示注册成功。复位芯片,重新连接就会发现多了运动状态识别的功能。其他的算法库注册方法类似,这里要注意如果需要更换固件需要将License清除才能重新刷固件,不然会导致芯片无法启动。
4、DIY遥控LED
先上图片:
图片中实现的功能是用手机遥控控制LED,这个功能在Blue-MS是有的,但是在ST提供的SDK-Example中没有,那么就跟随我一起一步一步的实现吧!
SensorTile中烧录BM1固件,然后下载SDK,在帖子最后有下载,代码是托管在Github上的,用Android Studio 2.X打开,如果编译时提示缺少所需的编译工具,翻墙点击下载即可,或者直接修改代码中的编译工具版本。
整个工程分为BlueSTSDK和BlueSTExample两个部分,前者是SDK,后者是一个简单的例程,连接后可以显示所有的传感器数据,就像上面GIF图片中所示,点击列表就会出现详细的传感器数据。
打开工程后修改布局文件activity_demo.xml,添加一个按钮和两个线性布局,代码如下
:
-
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
-
xmlns:tools=”http://schemas.android.com/tools”
-
android:layout_width=”match_parent”
-
android:layout_height=”match_parent”
-
android:orientation=”vertical”
-
android:weightSum=”1″ tools:context=”com.st.BlueSTSDK.Example.FeatureListActivity”>
-
<LinearLayout
-
android:layout_width=”wrap_content”
-
android:layout_height=”wrap_content”>
-
<Button
-
android:layout_width=”wrap_content”
-
android:layout_height=”wrap_content”
-
android:id=”@+id/Btn_LED”
-
android:text=”LED”/>
-
</LinearLayout>
-
<ListView android:id=”@+id/featureList”
-
xmlns:android=”http://schemas.android.com/apk/res/android”
-
android:layout_width=”match_parent”
-
android:layout_height=”match_parent”/>
-
</LinearLayout>
-
复制代码
然后找到FeatureListActivity,给按钮添加响应函数,这里采用OnClickListener监听,而不直接在布局文件中添加android:onClick方法的原因是AppCompatActivity类并不支持。给FeatureListActivity添加接口类:
-
View.OnClickListener
复制代码
添加LED按钮的全局变量:
-
private Button LED;
复制代码
在onCreat函数中给按钮添加监听:
-
LED = (Button) findViewById(R.id.Btn_LED);
-
LED.setOnClickListener(this);
-
复制代码
在onCreat外添加按钮实现函数:
-
public void onClick(View view){
-
switch (view.getId()){
-
case R.id.Btn_LED:
-
FeatureSwitch f = mNode.getFeature(FeatureSwitch.class); //get Feature Switch class
-
if(!mNode.isEnableNotification(f))//Ensure the Switch is EnableNotification
-
mNode.enableNotification(f);
-
if(f.getSwitchStatus(f.getSample())==0){//Check the led state
-
f.changeSwitchStatus((byte)0x01);//Tuen on LED
-
}else {
-
f.changeSwitchStatus((byte) 0x00);//Tuen off LED
-
}
-
break;
-
}
-
}
-
复制代码
代码都进行了注释,界面上之所以显示这些类的信息是因为APP检测到有这些Feature类可用,如果注册了算法库后,会发现可用的Feature类变多,在点击了按钮之后,先获取Switch的类,然后判断该节点中Switch类是否Notification,,在没有点击列表中的Feature类的时候是没有Notification该类的,也就是说不会关注该Feature类的任何变动,对其各种操作也是不可行的。因此在这里先判断是否已经Notification了Switch类,如果没有就开启,这样无论是否点击列表中的Switch类都可以实现对LED的控制。然后调用Switch类中的获取LED灯状态的函数,该函数中需要Sample变量,该变量是收到的数据,这里同样需要调用Switch类中的获取Sample函数,这里获取到的是上一次收到的数据,根据LED的状态来控制LED灯,就实现了一键交替开关LED的效果。
有了以上的代码已经能够实现灯的开关操作了,但是却不敢保证LED灯按照要求控制了,还需要一个回馈,因此修改onUpdate函数如下:
-
public void onUpdate(Feature f, Feature.Sample sample) {
-
final String featureDump = f.toString();
-
if( f.getName().equals(“Switch”)){//if the Feature is Switch
-
FeatureSwitch Switch = mNode.getFeature(FeatureSwitch.class);
-
if(Switch.getSwitchStatus(sample)==0){//Check the led state
-
LED_State=true;
-
}else{
-
LED_State=false;
-
}
-
FeatureListActivity.this.runOnUiThread(new Runnable() {
-
@Override
-
public void run() {
-
if(LED_State) {
-
LED.setText(“Turn On”);//update button text
-
}else {
-
LED.setText(“Tuen Off”);//update button text
-
}
-
}
-
});
-
}
-
FeatureListActivity.this.runOnUiThread(new Runnable() {
-
@Override
-
public void run() {
-
mTextView.setText(featureDump);//Modify the button’s text
-
}
-
});
-
}//onUpdate
-
复制代码
SensorTile所有的数据更新都是通过调用onUpdate函数来实现的,在该函数中调用各个Feature中的toString函数,将收到的数据转换为字符串,最后在UI更新线程中更新。由于所有的Feature的数据更新都会调用onUpdate,那就可以在函数中根据不同的Feature来进行不同的操作。首先获取Feature的名字,如果是”Switch”就往下处理,获取该节点的Switch的类,然后调用该类中的getSwitchStatus,这里sample直接用,不调用Switch类中getsample方法。得到了LED灯的状态就给全局变量LED_State赋值,最后根据LED_State的值改变按钮上的文字,这就可以确保准确了。这里注意LED_State变量不能定义在函数里面,否则在UI线程中会报错。
SDK有很多Feature,熟悉了Switch的使用,其他的也就大同小异了,为以后更复杂的应用打好基础。
回顾整个DIY过程,我们根本没有接触到底层,没有配置服务地址,没有配置特征,没有写发送接收函数,一切都是调用接口函数,却可以满足各种需求,这种开发模式是不是很爽呢。
【SensorTile物联网开发套件(1)——概述】 http://m.toutiao.com/group/6345235550069031170/?iid=5947341222&app=news_article&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share
转载请注明:徐自远的乱七八糟小站 » 【SensorTile】物联网开发套件