ESP8266-Arduino编程实例-BMA250加速度传感器驱动

BMA250加速度传感器驱动

1、BMA250介绍

BMA250 是一款先进的超小型三轴低重力加速度传感器,具有数字接口,适用于低功耗消费电子应用。

BMA250 允许测量 3 个垂直轴上的加速度,从而感应手机、手持设备、计算机外围设备、人机界面、虚拟现实功能和游戏控制器的倾斜、运动、冲击和振动。

在这里插入图片描述

BMA250 支持两种操作模式:

  • 流数据模式:加速度数据通过传感器的数字接口直接读出,并由系统微控制器、应用处理器或基带处理器计算。
  • 中断引擎模式:加速度数据已在 BMA250 内由集成的可编程中断引擎计算。 根据可编程设置,BMA250 的集成中断引擎通过传感器的两个中断引脚向某些事件的发生发出信号。 BMA250 的相应寄存器可以通过数字传感器接口轻松设置和读取。

BMA250 尺寸仅为 2mm x 2mm,代表了新一代数字加速度传感器。 BMA250 集成了多种功能,特别是在运动检测应用领域,例如设备方向检测、游戏、HMI 和菜单浏览器控制。 BMA250 的全工作电流消耗仅为 100µA,非常适合移动消费电子设备。 在低功耗模式下,电流消耗甚至可以进一步降低一个数量级以上。 BMA250 具有高度可配置性,以便在将传感器集成到系统中时为设计人员提供充分的灵活性。

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • BMA250传感器模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

传感器引脚 ESP8266开发板引脚
Vin 5v
Gnd Gnd
SCL D1
SDA D2

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、代码实现

本次实例使用的驱动库如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <Wire.h>

// BMA250 I2C address is 0x18(24)
#define Addr 0x18

void setup()
{
// Initialise I2C communication as MASTER
Wire.begin();
// Initialise Serial Communication, set baud rate = 9600
Serial.begin(9600);

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select range selection register
Wire.write(0x0F);
// Set range +/- 2g
Wire.write(0x03);
// Stop I2C Transmission
Wire.endTransmission();

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select bandwidth register
Wire.write(0x10);
// Set bandwidth 7.81 Hz
Wire.write(0x08);
// Stop I2C Transmission
Wire.endTransmission();
delay(300);
}

void loop()
{
unsigned int data[0];
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select Data Registers (0x02 − 0x07)
Wire.write(0x02);
// Stop I2C Transmission
Wire.endTransmission();

// Request 6 bytes
Wire.requestFrom(Addr, 6);

// Read the six bytes
// xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb
if(Wire.available() == 6)
{
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
data[4] = Wire.read();
data[5] = Wire.read();
}
delay(300);

// Convert the data to 10 bits
float xAccl = ((data[1] \* 256.0) + (data[0] & 0xC0)) / 64;
if (xAccl > 511)
{
xAccl -= 1024;
}
float yAccl = ((data[3] \* 256.0) + (data[2] & 0xC0)) / 64;
if (yAccl > 511)
{
yAccl -= 1024;
}
float zAccl = ((data[5] \* 256.0) + (data[4] & 0xC0)) / 64;
if (zAccl > 511)
{
zAccl -= 1024;
}

// Output data to the serial monitor
Serial.print("Acceleration in X-Axis :");
Serial.println(xAccl);
Serial.print("Acceleration in Y-Axis :");
Serial.println(yAccl);
Serial.print("Acceleration in Z-Axis :");
Serial.println(zAccl) ;
}

文章来源: https://iotsmart.blog.csdn.net/article/details/126537767