前几天有朋友问我,想给孩子做一个动作姿态检测的小玩具,用什么方案最快。我第一反应就是ST的SensorTile.box。这块板子真的小得夸张,去掉外壳只有13.5mm见方,比一块钱硬币还小一圈,上面却密密麻麻集成了六颗传感器、一颗120MHz主频的STM32L4R9ZI单片机,以及BLE射频电路。更友好的是,它不需要你先把硬件电路搭起来,插上USB或者装个电池,配合ST BLE Sensor手机App,十分钟内就能把加速度、陀螺仪、气压、温湿度这些数据全部实时看到。这篇文章就是我从开箱到做数据采集、再到自己改固件的一条龙经验记录,适合想快速上手IOT和可穿戴传感器应用的同学。
1. SensorTile.box硬件底子:小尺寸里到底塞了什么
很多第一次拿到这块板子的人都会先愣一下,因为实物比宣传图还小。但尺寸小不代表东西少,恰恰相反,这块开发板的硬件密度相当高,基本上把一套可穿戴传感器节点该有的核心部件全塞进去了。想玩好它,得先把底下的器件和选型逻辑摸清楚。
1.1 从主控到无线,核心器件的选型逻辑
SensorTile.box的主控是STM32L4R9ZI,一颗基于Cortex-M4F内核的单片机,最高主频120MHz,带FPU硬件浮点单元,Flash有2MB,RAM有640KB。这个配置放在可穿戴设备里算是相当能打的了,跑传感器融合算法、BLE协议栈,还有一点富余。
为什么ST会选L4系列而不是F4或者H7?答案在功耗上。可穿戴设备最核心的诉求不是跑分,而是电池能用多久。STM32L4系列是专门为低功耗场景设计的,有多个低功耗模式,比如睡眠、停止、待机模式,在待机模式下功耗可以压到微安级别。F4系列虽然性能也不错,但动态功耗明显更高,H7系列性能更强但功耗也更大,对一颗用纽扣电池或者小锂电池供电的开发板来说,并不是最优解。
无线通信方面用的是BlueNRG-2,一颗独立BLE 5.0射频芯片。很多初学者会问,为什么MCU里不是自带蓝牙吗?确实有些芯片是SoC单芯片方案,比如nRF52系列就是蓝牙和应用处理器集成在一起。但SensorTile.box选择MCU加独立蓝牙芯片的架构,好处是两者可以分开管理,射频部分有独立的协议栈,哪怕BLE占用的资源再多,也不会拖累主控跑算法的实时性。而且BlueNRG-2这颗芯片本身也是一颗Cortex-M0内核,可以承担一部分蓝牙协议栈的底层工作,主控只需要用标准HCI接口跟它通信就行。
1.2 六颗传感器各自能干什么
说完了主控和蓝牙,来看真正的重头戏,传感器阵列。SensorTile.box上焊了六颗传感器,覆盖了运动、环境、声音三个大类,基本凑齐了一个可穿戴数据采集节点所能想到的常见采集对象。
| 传感器型号 | 类型 | 主要用途 |
|---|---|---|
| LSM6DSOX | 6轴惯性传感器(加速度计+陀螺仪) | 姿态检测、计步、活动识别 |
| LIS3DHH | 高精度3轴加速度计 | 静态姿态、倾斜角测量 |
| LIS2MDL | 3轴磁力计 | 电子罗盘、航向计算 |
| LPS22HH | 气压计 | 高度测量、气象监测 |
| HTS221 | 温湿度传感器 | 环境监测、皮肤微气候测量 |
| MP23ABS1 | 模拟麦克风 | 声音检测、语音唤醒 |
这里最值得留意的其实是LSM6DSOX,因为它不只是普通的六轴惯性传感器,内部还集成了一个机器学习核(MLC)和有限状态机。这是什么概念?传统方案里做活动识别,需要主控不停读取加速度数据,然后跑一个分类模型,非常耗电。但LSM6DSOX可以在传感器内部直接跑简单的决策树模型,完成走路、跑步、静止、抬手这类动作识别后,把最终结果通过中断告诉主控。也就是说,主控可以一直睡眠,传感器自己在那里默默判断,有结果了才喊主控起来处理。这个特性对可穿戴设备来说太重要了,我在后面谈功耗优化时还会提到。
LIS3DHH是一颗高精度加速度计,量程是±2.5g,噪声性能非常好,适合做需要精细角度测量的场景。LPS22HH气压计则可以辅助判断楼层变化,很多室内定位方案会用它来检测上下楼动作。HTS221温湿度传感器体积很小,但在穿戴场景下可以用来监测汗湿程度或者皮肤表面微环境。麦克风MP23ABS1虽然只是模拟输出,但在SensorTile.box这种小尺寸板子上能做简单的声学事件检测,比如拍手触发、声音强度监测。
1.3 供电、接口和扩展设计
说完传感器,再看外围设计。SensorTile.box支持通过板载USB Micro-B接口供电,也支持外接电池。实际使用中我更喜欢用锂电池或者CR2032纽扣电池供电,因为这样才能真正模拟可穿戴设备的供电环境。它也把很多引脚通过金手指扩展出来了,包括I2C、SPI、UART、ADC等,方便你做外设扩展。板上有按键和LED,虽然数量不多,但做交互控制足够了。
有一点值得注意:SensorTile.box上没有板载调试器,不像Nucleo开发板那样插上USB就能在线调试。你需要用ST-Link调试器通过SWD接口连接,或者直接用USB DFU模式烧录固件。新手第一次上手时可能会在这个地方卡一下,我后面会专门讲到怎么烧录和更新固件。
2. 为什么说它适合IOT与可穿戴开发
很多人手里有树莓派、ESP32或者各种Arduino开发板,觉得也能做IOT项目,为什么还要选SensorTile.box?这个问题的答案不在单一参数上,而在整个方案的设计思路上。如果你只是做一个桌面上通电运行的传感器Demo,那随便一块板子都行。但一旦涉及到“穿戴”和“低功耗”这两个关键词,很多普通开发板就会露馅。
2.1 低功耗是整个方案的核心,不只是芯片数据
我曾见过有人想用Arduino Nano加一个MPU6050做穿戴姿态检测,结果做出来一个比烟盒还大的模块,还得挂着一块充电宝供电,根本没法戴。问题不在传感器,而在整个系统的功耗和集成度。SensorTile.box把这里边的功课提前做完了:六颗传感器贴片在指甲盖大小的PCB上,主控有丰富的低功耗模式,BLE协议栈由独立芯片处理,传感器自身也支持电源关断和FIFO缓存。
拿MCU的功耗来说,STM32L4R9ZI在Stop 2模式下可以跑到几个微安级别。传感器也可以配置成低功耗模式,比如LSM6DSOX的性能模式从正常模式切换到低功耗模式后,电流可以从几百微安降到几十微安。再加上BLE广播和事件驱动的设计,整板在待机状态下的功耗能做到非常低。
我在实际测试中做过一个很简单的实验:用一颗小容量锂电池给SensorTile.box供电,开了加速度计和陀螺仪,采样率50Hz,BLE每隔100ms上报一次融合后的姿态数据。连续跑了一天多,电池电压只下降了一点点。如果你在代码里把上报策略改成“检测到运动事件才上报”,续航还要长得多。这种水平,普通MCU加外部传感器模块的方案很难达到。
2.2 BLE数据通道帮你省掉一代硬件设计
可穿戴IOT设备的数据传输,蓝牙BLE是当前最主流的选择。SensorTile.box自带BLE 5.0射频,天线已经画好,射频匹配也调试完了,你不需要像用独立蓝牙模块那样去考虑天线净空区、阻抗匹配这些乱七八糟的射频问题。手机端有官方ST BLE Sensor App,可以很方便地连接板子、订阅数据、记录日志。
这一点对原型验证特别重要。我以前做产品原型,最怕的就是RF电路部分,一个小阻抗不匹配,板子就是连不上手机,查起来非常费劲。用SensorTile.box之后,这一类问题基本消失了,你拿到手的是一个已经验证过的无线传感器节点,能让你把精力集中到数据算法和产品逻辑上。等原型验证完成,再根据实际量产成本去设计自己的RF电路也不迟。
蓝牙BLE还有一个传统蓝牙比不了的好处,就是低功耗连接。BLE的连接间隔可以设置成几百毫秒甚至更长,连接事件之间射频模块可以睡觉,这正好和可穿戴设备的间歇性上报场景匹配。
2.3 从原型到量产,算法和代码可以平移
这块板子另一个容易被忽视的价值,是它背后一套完整成熟的固件和算法库。ST在官方Github上放出了SensorTile.box的整套固件源码,包括外设驱动、传感器驱动、BLE服务、数据融合算法示例。你用STM32CubeIDE打开工程,可以直接看到LSM6DSOX的驱动是怎么写的、BLE服务是怎么注册的。
这意味着什么?你在SensorTile.box上调试好的姿态解算逻辑、传感器初始化时序、数据滤波算法,都是标准的C代码,直接移植到自己设计的STM32主控板子上也完全可行。从“开发板验证”到“自研硬件生产”,中间的代码复用率很高,这是很多闭源开发板做不到的。
3. 快速上手指南:十分钟看到第一组传感器数据
理论说了不少,现在开始动真格。这一节我尽量按实际操作顺序来写,你跟着一步步做,基本都能在十分钟内看到SensorTile.box的实时数据。
3.1 开箱和硬件准备
打开SensorTile.box包装后,你会看到一块很小的板子和一个塑料外壳。第一次玩建议先别急着装进外壳,裸板直接用,这样观察LED状态和按键位置都方便。硬件准备只需要三样东西:SensorTile.box本体、手机或平板、USB线(Micro-B接口)。
上电有两种方式:第一种是直接用USB线连电脑或充电头;第二种是装电池。用USB上电时,板子上的蓝色LED会亮起来,这个过程就是系统启动。如果你用手头的电池盒接上去,同样可以上电,但要注意供电电压,板子的电源管理设计支持常见电池,但别超过推荐电压范围,通常3.3V到5V之间的USB供电是最稳的。
上电之后,如果板子烧录的是出厂固件,它应该会开始广播蓝牙信号,设备名一般是“Sensortile_BOX_XXXX”这种格式,后面的四位是设备标识。如果看不到这个广播名,先不用慌,可能是固件状态不对,待会我会讲怎么恢复。
3.2 手机App连接与实时数据展示
在手机应用商店搜索“ST BLE Sensor”,下载安装ST官方出品的这个App。需要注意,iOS和Android的权限机制不太一样,Android版本要打开定位权限和蓝牙权限,iOS要打开蓝牙权限。虽然这个App本身不会获取你的定位信息,但Android的蓝牙扫描机制需要定位权限配合,这是系统的限制。
打开App后,主界面会自动扫描周围的BLE设备。找到你的SensorTile.box设备名,点击连接。连接成功后,App会自动列出当前固件支持的数据服务,你会看到加速度、陀螺仪、磁力计、气压计、温湿度等各种传感器卡片。
随便点进一个加速度计的卡片,就能看到三轴实时数据曲线。拿着板子转一下方向,曲线会跟着变化。到这里,你已经完成了一次完整的无线传感器数据采集链路:传感器采集数据,主控通过I2C读取,打包成BLE服务数据,无线发送到手机App,App解析并显示。整个过程不再需要自己写一行代码,这也是SensorTile.box最适合入门的原因之一。
App里还有一个“融合数据”的概念,这里要多说一句。LSM6DSOX配合LIS2MDL磁力计,可以算出设备的姿态四元数。ST BLE Sensor App里会直接展示一个3D模型,你转动板子,手机上的模型会跟着动,非常直观。这个功能对理解IMU和姿态解算非常有帮助,建议新手都玩一玩。
3.3 把数据记录下来并导出分析
光看实时曲线不过瘾,我们通常还需要记录数据。在ST BLE Sensor App里有一个Data Log功能,可以按设定的采样率把数据记录到手机本地,可以导出成CSV文件,方便后续用Python、MATLAB或者Excel分析。
我在做实验时,一般会把采样率设置成50Hz或者100Hz,然后记录几分钟的数据。这里有个经验可以分享:BLE的数据通道带宽有限,如果同时开启所有传感器并以高采样率记录,可能会导致数据丢帧。所以我的习惯是,先只记录当前实验需要的传感器,其他传感器关掉,这样可以减少BLE的数据压力。
| 传感器 | 常见采样率 | 单帧数据量 | 50Hz连续记录1小时预估大小 |
|---|---|---|---|
| 加速度计 | 50-200Hz | 6字节 | 约1MB-4MB |
| 陀螺仪 | 50-200Hz | 6字节 | 约1MB-4MB |
| 磁力计 | 10-50Hz | 6字节 | 约0.2MB-1MB |
| 气压计 | 1-50Hz | 4字节 | 约0.07MB-0.9MB |
| 温湿度 | 1-10Hz | 4字节 | 约0.07MB-0.07MB |
注意,上面这个表只是按原始传感器数据量估算,实际BLE传输时还会带上时间戳、校验字节、协议头尾,数据量会比表中大一些。数据记录时间长了,建议定期导出文件,不然App里的日志文件会越攒越多。
4. 在PC上获取数据:串口读取和自动化处理
手机App适合看实时曲线,但如果要做大量数据记录、算法验证、信号分析,还得把数据引到PC上来处理。SensorTile.box支持USB虚拟串口,通过USB线连接电脑后,会被识别成一个串口设备。
4.1 USB连接与驱动识别
先把USB线连上SensorTile.box和电脑。大多数情况下,Windows会自动识别并安装驱动,设备管理器里会出现一个COM口。如果你的Windows无法自动识别,可以安装STM32CubeProgrammer自带的USB驱动,或者ST官网的虚拟串口驱动。macOS和Linux一般直接识别成tty.usbmodem或者ttyACM设备。
需要注意一个坑:并非所有出厂固件都会默认开启USB CDC串口功能。如果你插上USB后设备管理器里并没有出现COM口,那很可能是当前固件没有启用USB虚拟串口。这个情况下,需要先用手机App升级固件,或者直接烧录一个开启了USB串口打印的固件。这一点会在下一节细讲。
4.2 用串口助手快速看数据流
电脑上能打开一个串口终端后,选好COM口号,设定波特率,就能看到数据打印。SensorTile.box的串口波特率不一定都是115200,取决于固件配置,默认的官方固件里经常是115200,Data Log固件也常用115200,但如果你烧录的是别人做的固件,那就以代码里的配置为准。
我习惯先用一个轻量级串口调试工具,先确认数据流能打出来,再接Python脚本做自动化处理。串口助手打开后,如果屏幕上能看到类似传感器数据的一串文本,说明链路通了。
4.3 用Python脚本实时记录传感器数据
有了串口数据流之后,就可以用Python写一个小脚本,把数据实时保存成CSV,方便后续分析。这里给一个最简单的示例,重点是把思路讲清楚。
import serial import time import csv ser = serial.Serial( port='COM7', # Windows下改成你的实际COM口 baudrate=115200, timeout=1 ) with open('sensor_log.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['timestamp', 'raw_data']) while True: line = ser.readline() if line: text = line.decode('utf-8', errors='ignore').strip() print(text) writer.writerow([time.time(), text])这段代码做的事情很简单:打开指定串口,持续读取每一行数据,把时间戳和原始数据一起写入CSV文件。跑起来之后,你可以用它来记录几小时的数据,后续再写脚本解析原始字符串,提取出加速度、陀螺仪等具体值。
如果固件输出的是结构化数据,比如JSON或者CSV格式,你还可以在写入文件之前直接把字符串按分隔符切分,生成带字段名的表格。这一点在实际项目里很有用,我可没少在解析数据上吃过亏,数据格式化输出这一步,一定在写固件时就规划好。
5. 固件更新和自定义开发:从Demo走向自己的工程
如果你只满足于用App看数据,那SensorTile.box发挥不了真正价值。它的可玩性和强大之处在于可以刷自定义固件,把板子变成真正属于自己的传感器数据采集设备。这里我会把固件更新和开发环境搭建讲清楚,新手也可以照着做。
5.1 通过App更新官方固件
ST BLE Sensor App自带固件更新功能。在App的设置或固件更新入口里,可以连接板子、选择固件版本、通过BLE无线传输给板子更新。这是最简单的方式,不需要接线,不需要装驱动,手机上点几下就完事。
但这个方式有个前提,板子当前必须要能正常连接手机。如果板子已经刷过错误的固件,或者压根连不上了,那就只能走USB DFU的方式救砖。更新过程中要注意:不要断电,不要强行关闭App,尽量把手机靠近板子,避免蓝牙信号衰减导致传输失败。很多人在OTA更新的时候翻车,其实不是固件问题,而是传输中途断了。
5.2 USB DFU模式刷机流程
当板子进入无法正常连接App的状态时,就只能用USB DFU模式刷机。DFU全称是Device Firmware Update,利用STM32内置的Bootloader,通过USB口烧录固件。
进入DFU模式的方法一般是:按住板子上的按键,同时插入USB,或者按住按键再按一下复位键,板子就会进入DFU状态。不同板子版本的操作方式略有差异,建议以官方用户手册为准。
进入DFU模式后,电脑设备管理器里会出现一个STM32 Bootloader设备。这时用STM32CubeProgrammer,选择USB模式,连接芯片,然后加载固件文件(.hex或.bin),点击下载。这个过程很快,几秒钟就完成。掉电重新上电后,板子就会运行新固件。
5.3 搭建STM32CubeIDE工程
如果你要自己写固件,首选开发环境是STM32CubeIDE,ST官方免费提供的集成开发环境,内部集成了STM32CubeMX的代码生成功能。安装好IDE之后,不用从零开始写外设驱动,推荐直接去ST的Github仓库拉取SensorTile.box官方固件,在已有的项目基础上修改。
用官方固件的工程有两个好处:第一,所有外设初始化配置都是现成的,I2C、UART、SPI、BLE服务都配好了,省去大量对照原理图查引脚的时间;第二,传感器驱动都是官方验证过的,你只需要关注业务逻辑。
假如你想读取LSM6DSOX的加速度数据,核心代码逻辑其实很简洁,类似这样:
uint8_t data[6]; LSM6DSOX_ACC_GetRawAcceleration(&dev, data); int16_t acc_x = (int16_t)((data[1] << 8) | data[0]); float acc_x_g = (float)acc_x * 0.061f / 1000.0f; printf("ACC_X = %.3f g\r\n", acc_x_g);这只是一个示意,不同SDK版本的函数名会有差异。但思路是固定的:初始化设备,通过I2C读取原始寄存器,根据灵敏度系数换算成物理量,然后打印或上报。真正写自己的固件时,你会意识到官方SDK帮你省了多少时间。
6. 常见问题与排查实录
到这里,主要操作流程都过了一遍。这一节专门整理我实际踩过的一些坑,按“问题现象、原因分析、处理方法”的结构列出来,大家遇到类似情况可以直接翻。
6.1 手机搜不到SensorTile.box怎么办
这是新手最容易遇到的情况。最常见的原因是板子没进入广播状态,或者广播名被其他设备干扰了。处理办法是先检查LED是否在闪烁,如果LED不亮,大概率是板子没上电。如果LED正常但手机上就是搜不到,可以试试用另一台手机扫描,排除蓝牙缓存的问题。
还有一个很容易被忽略的情况:手机和板子之前连接过,但连接信息没有清除,导致手机不再主动去连接。解决方法是到手机蓝牙设置里找到该设备,选择忽略此设备,然后重新在App里扫描连接。
6.2 BLE连接后频繁断开
这种问题大概率跟距离和供电有关。BLE本身适合短距离通信,人和板子之间不要隔着厚厚的墙壁。另外,如果板子用USB线连电脑供电,某些电脑USB口的供电可能不太干净,会造成射频输出功率不稳定。实验时建议直接用电池供电。
如果以上都没问题,就要考虑固件异常,特别是自己修改过BLE连接参数的情况。连接间隔设置得过短,板子功耗会变大;设置得过长,手机端容易判定超时断开。官方出厂固件的默认参数是经过测试的,除非你明确知道自己在做什么,否则不建议乱调。
6.3 Windows识别不到USB串口
插上USB后没有出现COM口,先换一根USB线试一下,很多Micro-B线只能充电不能传数据,这是最高频的原因。如果线没问题,去设备管理器看是不是出现了未知设备或者黄色感叹号。这种情况下安装一下ST官方USB驱动,或者直接装STM32CubeProgrammer,驱动一般都会跟着装上。
如果未知设备的名字是“STM32 Bootloader”,说明板子处于DFU模式,此时不会进入串口模式。需要退出DFU重新上电,才能恢复USB CDC串口。
6.4 传感器数据输出明显异常或漂移
加速度计和陀螺仪偶尔有静态漂移是正常的,尤其是陀螺仪零点偏置会随温度变化。如果数值偏离离谱,先检查板子是否被磁源干扰,比如手机、电机、音箱都在附近;磁力计尤其敏感,校准时尽量远离金属和磁性物体。
如果用的是自研固件,还要检查传感器量程配置是否正确。量程设小了,数据一饱和就满量程输出,看起来就是“直接飙到顶”。我遇到过几次这种情况,最后发现都是初始化的量程寄存器配错了。
6.5 固件更新失败或板子变砖
先说结论,SensorTile.box基本不会被刷成真砖。因为STM32内部有独立的系统Bootloader,只要还能通过USB进入DFU模式,就一定能刷回来。更新失败最可能出现的原因是传输中断,所以再次强调,OTA更新时手机要离得够近、电量要够足,刷机过程中千万别拔线。
如果BLE OTA怎么都失败,那就别折腾了,直接走USB DFU刷机。先下载官方恢复正常固件,让板子回到能工作的状态,再考虑后续调试。
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 手机搜不到设备 | 板子没上电、引脚接触不良、蓝牙缓存 | 检查LED、换线、忽略蓝牙设备重新扫描 |
| 串口不显示 | 固件未开启USB CDC、线不支持数据 | 更换固件、更换数据线、安装ST驱动 |
| 传感器数据异常 | 量程配置错误、外部磁场干扰 | 检查配置、远离磁源、重新校准 |
| 固件更新失败 | 传输中断、供电不稳 | 增加距离、检查供电、用USB DFU恢复 |
7. 写在最后:我实际使用后的几点体会
最后分享几个我自己在SensorTile.box上折腾出来的经验和体会。如果你打算长期做可穿戴相关项目,这些东西可能比快速入门流程更有价值。
第一,验证算法时不要急着写固件。先用官方App的数据记录功能跑几天实验,把数据量、采样率、BLE传输稳定性这些基础问题先摸清楚。App导出的CSV数据带时间戳,足够用来验证算法可行性。等你确认算法逻辑没问题,再组织人力和精力去写定制固件,能省很多返工成本。
第二,数据输出格式一定要在固件设计时就规范好。我早期做过一个项目,固件里用printf直接打印各种调试信息,格式五花八门,后来PC端解析数据时吃了不少苦头。建议大家从一开始就定义一套结构化的输出格式,比如CSV、JSON或者固定长度的二进制帧,传感器类型、时间戳、单位全部写明白,后续不管是串口调试还是BLE上报,都能少很多麻烦。
第三,SensorTile.box的典型价值是“快速验证”,尤其是把想法变成可戴在身上的原型。它不适合直接拿去做量产产品,因为集成度太高,单颗元器件的成本和生产难度都不适合从零复刻。但正因为它把原型阶段的坑都提前填好了,我才能在后续把惯性数据采集逻辑迁移到自研板子时那么顺利。
我也试过把它绑在哑铃上采集挥动轨迹,绑在手腕上记录睡眠姿态变化,甚至贴在冰箱门上做开关门检测。虽然精度比不上专业工业设备,但对原型验证和算法预研来说,完全够用。如果你手里正好也有一块SensorTile.box,别只停留在“连上手机看看曲线”这一步,试着给它写一段自己的数据采集或算法处理代码,你会发现这个指甲盖大小的板子能做的事情远比你想象中多。