物联网设备除了可以应用在智能家居上面也可以应用在一些可穿戴设备上。就像我们的智能手表一样,可以连接到手机记录我们心率步数等一些健康信息反馈给我们。那么在本节课中,我们将要一起来制作一款可穿戴设备——计步器,利用它我们就可以实时查看运动量,接下来让我们进入正题吧!

知识锦囊

三轴加速度传感器

image.png
三轴加速度计是一种能够测量物体加速度的传感器,在运动过程中,通过测量XYZ轴质量的惯性力和牛顿第二定律获得加速度值,根据传感器的不同敏感元件,常见的加速度传感器包括电容式,电感式,应变式,压阻式,压电式等。通过测量重力引起的加速度,可以计算出设备相对于水平方向的倾斜角度,三轴加速度计的应用非常广泛,除了手机、健康手环等日常生活领域,还应用在虚拟游戏、汽车安全、GPS卫星导航、机器人等领域。

知识窗:三轴加速度计的应用
虚拟游戏
近年来,游戏的发展已经从屏幕中走出,走到我们面前来了,我们可以通过AR/VR、游戏手柄同步人体运动,这些游戏设备能感应人体加速度同步游戏虚拟角色呈现同样的动作,达到更好的游戏体验,让我们仿佛置身于游戏当中。
image.png
汽车领域
三轴加速度计在汽车领域的应用主要在安全系统以及无人驾驶。以车身安全为例,当车身遭到撞击时,三轴加速度计会检测到加速度的突然变化并执行安全保护措施,如及时弹出安全气囊保障乘客安全。
image.png
GPS卫星导航
GPS导航给我们的生活和出行带来了极大的便利,可以规划路线、语音提示、定位等等,对于经常出差到陌生城市以及方向感不强的人简直是福音。那三轴加速度计在其中有什么作用呢?当进入卫星信号接收不良的区域或正常环境中丢失信号的时候,基于MEMS技术的3轴加速度传感器配合陀螺仪或电子罗盘等元件一起可创建方位推算系统,对GPS系统实现互补性应用。
image.png

实践操作

任务一:获取三轴加速度传感器的值

首先我们连接硬件,将三轴加速度传感器连接到主控板的IIC接口:
image.png

下载Grove-3-Axis-Digital-Accelerometer_LIS3DHTR.zip库文件并解压到Arduino\libraries文件夹,完成库文件的导入,然后编写以下代码:

  1. #include "LIS3DHTR.h"
  2. // if you use the software I2C to drive the sensor, you can uncommnet the define SOFTWAREWIRE which in LIS3DHTR.h.
  3. #ifdef SOFTWAREWIRE
  4. #include <SoftwareWire.h>
  5. SoftwareWire myWire(3, 2);
  6. LIS3DHTR<SoftwareWire> LIS(0);//IIC
  7. #define WIRE myWire
  8. #else
  9. #include <Wire.h>
  10. LIS3DHTR<TwoWire> LIS(0);//IIC
  11. #define WIRE Wire
  12. #endif
  13. #define BAT_ENABLE 19 //Grove端口使能引脚
  14. void setup()
  15. {
  16. digitalWrite(BAT_ENABLE, HIGH);//启用Grove端口
  17. Serial.begin(115200);
  18. while (!Serial) {};
  19. LIS.begin(WIRE); //IIC init
  20. LIS.openTemp();
  21. delay(100);
  22. LIS.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);
  23. }
  24. void loop()
  25. {
  26. if (!LIS) {
  27. Serial.println("LIS3DHTR didn't connect.");
  28. while (1);
  29. return;
  30. }
  31. Serial.print("x:"); Serial.print(LIS.getAccelerationX()); Serial.print(" ");
  32. Serial.print("y:"); Serial.print(LIS.getAccelerationY()); Serial.print(" ");
  33. Serial.print("z:"); Serial.println(LIS.getAccelerationZ());
  34. delay(300);
  35. }

上传完成后点击串口监视器,将波特率调整为115200观察串口监视器中三轴加速度的输出值。
image.png

任务二:使用三轴加速度传感器记录运动步数

计步器是如何工作的?

计步器使用向前、垂直和侧面的三个运动分量来计算一个人行走的总步数。计步器使用加速度计来获取这些值,每次取样后,加速度计都会不断更新三轴加速度的最大值和最小值。这些三轴(Max + Min)/ 2的平均值称为动态阈值水平,该阈值用于确定是否应该记录该步数。

计步器在运行时可以处于任何方向,因此计步器使用加速度变化最大的轴来计算步数。
image.png
现在,我们快速了解一下Arduino计步器的工作原理:

  1. 在void loop()函数中,连续获取从X、Y和Z轴的数据;
  2. 然后,从起点算出总加速度矢量;
  3. 加速度矢量是X、Y和Z轴值的平方根(x ^ 2 + y ^ 2 + z ^ 2);
  4. 然后将平均加速度值与阈值进行比较,以计算步数;
  5. 如果加速度矢量超过阈值,则增加步数;否则,认为是无效的振动,丢弃该数据。
  1. #include "LIS3DHTR.h"
  2. #ifdef SOFTWAREWIRE
  3. #include <SoftwareWire.h>
  4. SoftwareWire myWire(3, 2);
  5. LIS3DHTR<SoftwareWire> LIS(0);//IIC
  6. #define WIRE myWire
  7. #else
  8. #include <Wire.h>
  9. LIS3DHTR<TwoWire> LIS(0);//IIC
  10. #define WIRE Wire
  11. #endif
  12. #define BAT_ENABLE 19 //Grove端口使能引脚
  13. float threshhold=0.80;
  14. float xval[100]={0};
  15. float yval[100]={0};
  16. float zval[100]={0};
  17. float xavg;
  18. float yavg;
  19. float zavg;
  20. int steps,flag=0;
  21. void setup()
  22. {
  23. digitalWrite(BAT_ENABLE, HIGH);//启用Grove端口
  24. Serial.begin(115200);
  25. while (!Serial) {};
  26. LIS.begin(WIRE); //IIC init
  27. LIS.openTemp();
  28. delay(100);
  29. LIS.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);
  30. }
  31. void loop()
  32. {
  33. int acc=0;
  34. float totvect[100]={0};
  35. float totave[100]={0};
  36. float xaccl[100]={0};
  37. float yaccl[100]={0};
  38. float zaccl[100]={0};
  39. if (!LIS) {
  40. Serial.println("LIS3DHTR didn't connect.");
  41. while (1);
  42. return;
  43. }
  44. // Serial.print("x:"); Serial.print(LIS.getAccelerationX()); Serial.print(" ");
  45. // Serial.print("y:"); Serial.print(LIS.getAccelerationY()); Serial.print(" ");
  46. // Serial.print("z:"); Serial.println(LIS.getAccelerationZ());
  47. for (int i=0;i<100;i++)
  48. {
  49. xaccl[i]=float(LIS.getAccelerationX());
  50. delay(1);
  51. yaccl[i]=float(LIS.getAccelerationY());
  52. delay(1);
  53. zaccl[i]=float(LIS.getAccelerationZ());
  54. delay(1);
  55. totvect[i] = sqrt(((xaccl[i]-xavg)* (xaccl[i]-xavg))+ ((yaccl[i] - yavg)*(yaccl[i] - yavg)) + ((zval[i] - zavg)*(zval[i] - zavg)));
  56. totave[i] = (totvect[i] + totvect[i-1]) / 2 ;
  57. Serial.println(totave[i]);
  58. delay(200);
  59. if (totave[i]>threshhold && flag==0)
  60. {
  61. steps=steps+1;
  62. flag=1;
  63. }
  64. else if (totave[i] > threshhold && flag==1)
  65. {
  66. //do nothing
  67. }
  68. if (totave[i] <threshhold && flag==1){
  69. flag=0;
  70. }
  71. Serial.println('\n');
  72. Serial.print("steps=");
  73. Serial.println(steps);
  74. }
  75. delay(1000);
  76. }

成功上传程序之后打开串口监视器,然后模拟行走的状态去摇晃三轴加速度传感器,观察步数有没有变化。
image.png