硬件基础:蓝牙芯片选型与传感器介绍
好,咱们进入第二章。这一章我打算聊聊硬件选型那些事。说实话,很多做App的同学一听到硬件就头大,觉得那是硬件工程师的活。但你想啊,如果你连牙刷里装了什么芯片、传感器怎么工作的都不清楚,那交互设计就真成空中楼阁了。
我个人习惯是,做交互设计之前,先摸清楚硬件的脾气。你想想看,蓝牙能传多少数据?传感器能采多快的频率?这些直接决定了你的App能做什么、不能做什么。好,咱们开始。
2.1 蓝牙芯片选型:NRF52832 vs ESP32
蓝牙芯片是整个牙刷的大脑。它负责接收传感器数据,然后通过蓝牙发给手机。市面上主流的方案就两个:NRF52832和ESP32。我两个都用过,各有各的脾气。
NRF52832
这是Nordic家的经典款。Cortex-M4F内核,64MHz主频,512KB Flash,64KB RAM。功耗极低,待机时电流能到微安级别。我在项目中遇到过一个问题:用NRF52832做数据采集,电池续航能做到三个月以上。嗯,这对牙刷这种日用设备来说,太重要了。
它的蓝牙协议栈非常成熟。SDK写得很舒服,API设计清晰。但有个坑——它的RAM只有64KB。如果你要跑复杂的算法,比如实时姿态解算,内存会非常吃紧。我曾经因为内存不够,被迫把算法砍掉一半功能。
核心参数:
- 主频:64MHz
- Flash:512KB
- RAM:64KB
- 蓝牙版本:BLE 5.0
- 待机功耗:< 1μA
ESP32
乐鑫家的明星产品。双核Xtensa LX6,主频240MHz,520KB SRAM,4MB Flash。性能比NRF52832强一大截。而且自带Wi-Fi和蓝牙双模。说白了,它更像一个微型电脑。
但代价是什么?功耗高。正常工作时电流能到几十毫安。如果你用电池供电,续航会是个大问题。我记得有一次帮客户做方案,他们坚持用ESP32,结果牙刷三天充一次电,用户骂翻了。
避坑指南:我曾经因为贪图ESP32的性能,忽略了功耗问题。结果产品上市后,差评全是关于续航的。后来不得不换回NRF52832。所以,选芯片之前,先想清楚你的产品是插电用还是电池用。
| 对比项 | NRF52832 | ESP32 |
|---|---|---|
| 主频 | 64MHz | 240MHz |
| RAM | 64KB | 520KB |
| 功耗 | 极低 | 较高 |
| 蓝牙版本 | BLE 5.0 | BLE 4.2 + Wi-Fi |
| 适用场景 | 电池供电设备 | 插电或高性能需求 |
我个人建议:做牙刷这种日用设备,首选NRF52832。功耗低、蓝牙稳定、开发资料多。除非你有特殊需求,比如要跑复杂的AI模型,那才考虑ESP32。
2.2 传感器介绍
牙刷上需要三个核心传感器:加速度计、陀螺仪、压力传感器。它们各自负责什么?我一个个说。
加速度计
加速度计测量的是线性加速度。说白了,就是检测牙刷在X、Y、Z三个方向上的运动。你刷牙时上下左右移动,加速度计都能感知到。
常用的型号有MPU6050(集成了陀螺仪)、ADXL345。我习惯用MPU6050,因为它便宜、资料多、社区活跃。但要注意,加速度计对震动很敏感。牙刷电机一开,震动会干扰数据。我曾经因为这个原因,不得不加一个低通滤波器来去噪。
小技巧:加速度计的数据采样率建议设在100Hz以上。太低的话,快速刷牙动作会丢失细节。我一般用200Hz,既能保证精度,又不会让蓝牙传输压力太大。
陀螺仪
陀螺仪测量的是角速度。它告诉你牙刷在旋转。比如你刷牙时手腕翻转,陀螺仪就能捕捉到。加速度计和陀螺仪配合使用,可以算出牙刷的实时姿态——也就是它朝哪个方向、倾斜了多少度。
这里有个坑:陀螺仪有零偏漂移。什么意思?就是静止时它也会输出非零值。我刚开始做项目时,发现牙刷明明没动,App上却显示在旋转。后来才知道,需要做校准。每次开机时,先让牙刷静止几秒,采集零偏值,然后减去它。
// 陀螺仪零偏校准示例
void calibrate_gyro() {
float sum_x = 0, sum_y = 0, sum_z = 0;
int samples = 100;
for (int i = 0; i < samples; i++) {
sum_x += read_gyro_x();
sum_y += read_gyro_y();
sum_z += read_gyro_z();
delay(10);
}
offset_x = sum_x / samples;
offset_y = sum_y / samples;
offset_z = sum_z / samples;
}
压力传感器
这个传感器检测的是你刷牙时用了多大力。太轻了刷不干净,太重了伤牙龈。压力传感器通常是一个薄膜式力敏电阻,贴在刷头根部。你用力按压时,电阻值会变化。
我建议用模拟输出的压力传感器,因为可以精确读取力度值。数字输出的虽然方便,但精度不够。我曾经试过一款数字压力传感器,只有三个档位:轻、中、重。结果用户反馈说,根本分不清「中」和「重」的区别。后来换成模拟的,用ADC读取,精度好多了。
压力传感器选型要点:
- 量程:0-5N(牛顿)足够
- 输出方式:模拟输出优先
- 防水等级:至少IPX7(牙刷要防水)
- 寿命:至少10万次按压
2.3 硬件架构框图
好,现在我们把所有东西串起来。一个典型的智能牙刷硬件架构是这样的:
+------------------+ +------------------+
| 压力传感器 | | 加速度计+陀螺仪 |
| (模拟输出) | | (I2C接口) |
+--------+---------+ +--------+---------+
| |
v v
+--------+---------+ +--------+---------+
| ADC模块 | | I2C控制器 |
| (读取压力值) | | (读取运动数据) |
+--------+---------+ +--------+---------+
| |
+----------+---------------+
|
v
+----------+----------+
| 主控芯片 |
| (NRF52832/ESP32) |
| - 数据融合 |
| - 算法处理 |
| - 蓝牙协议栈 |
+----------+----------+
|
v
+----------+----------+
| 蓝牙天线 |
| (BLE 5.0) |
+---------------------+
这个架构图看起来简单,但每个模块之间都有讲究。比如,压力传感器和运动传感器是独立采集的,但到了主控芯片里,需要做时间同步。否则,你测到的力度和姿态对不上时间,那数据就没意义了。
我习惯的做法是:在主控芯片里维护一个统一的系统时钟。每个传感器数据采集时,都打上时间戳。这样,App端收到数据后,可以精确知道每个数据点是什么时候采集的。
注意:蓝牙传输有延迟。如果你在牙刷端不做时间同步,App端收到的数据可能会有几百毫秒的偏差。对于刷牙这种快速动作,几百毫秒足以让姿态判断完全错误。我曾经因为这个bug,被测试团队追着改了一个星期。
好了,这一章就到这里。下一章我们会聊蓝牙通信协议的设计——怎么把传感器数据高效地传给手机。嗯,那才是真正有意思的部分。