ESP8266-Arduino编程实例-MAG3110磁力计驱动

MAG3110磁力计驱动

1、MAG3110介绍

飞思卡尔的 MAG3110 是一款小型、低功耗、数字 3 轴磁力计。 该设备可与三轴加速度计配合使用,实现与方向无关的电子罗盘,可提供准确的航向信息。 它具有标准 I2C 串行接口输出和智能嵌入式功能。

MAG3110 能够以高达 80 Hz 的输出数据速率 (ODR) 测量磁场; 这些输出数据速率对应于从 12.5 毫秒到几秒的采样间隔。 MAG3110 采用塑料 DFN 封装,保证在 -40°C 至 +85°C 的扩展温度范围内工作。

MAG3110有如下特性:

  • 1.95 V 至 3.6 V 电源电压 (VDD)
  • 1.62 V 至 VDD IO 电压 (VDDIO)
  • 超小型 2 mm x 2 mm x 0.85 mm、0.4 mm 间距、10 引脚封装
  • 满量程±1000

μ

\mu

μT

  • 0.10

μ

\mu

μT 的灵敏度

  • 噪声低至 0.25

μ

\mu

μT rms

  • 输出数据速率 (ODR) 高达 80 Hz
  • 400 kHz 快速模式兼容的 I2C 接口
  • 低功耗、单次测量模式

在这里插入图片描述

MAG3110的数据手册,请参考:https://www.nxp.com/docs/en/data-sheet/MAG3110.pdf

本次实例使用的MAG3110模块如下:

在这里插入图片描述

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • MAG3110模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

ESP8266引脚 TEA5767 引脚
3v3 VCC
GND GND
D2 SDA
D1 SCL
在这里插入图片描述

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

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

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

4、代码实现

1)导入依赖库头文件

1
2
3
4
#include <Wire.h>
// 7-bit地址
#define MAG\_ADDR 0x0E

2)设备配置与初始化

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
void config(void)
{
// 开始传输数据
Wire.beginTransmission(MAG_ADDR);
// cntrl寄存器2
Wire.write(0x11);
// 自动重置
Wire.write(0x80);
// 结束数据传输
Wire.endTransmission();
delay(15);
Wire.beginTransmission(MAG_ADDR);
// cntrl 寄存器1
Wire.write(0x10);
// 设置active模式
Wire.write(1);
Wire.endTransmission();
}

void setup()
{
Wire.begin();
Serial.begin(9600);
config();
}

3)数据采集与显示

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
void loop()
{
print\_values();
delay(5);
}

void print\_values(void)
{
Serial.print("x=");
Serial.print(read\_x());
Serial.print(",");
Serial.print("y=");
Serial.print(read\_y());
Serial.print(",");
Serial.print("z=");
Serial.println(read\_z());
}

int mag\_read\_register(int reg)
{
int reg_val;

Wire.beginTransmission(MAG_ADDR);
Wire.write(reg);
Wire.endTransmission();
delayMicroseconds(2); // 启动和停止之间至少需要 1.3us 空闲时间

Wire.requestFrom(MAG_ADDR, 1); // 请求一位数据
while(Wire.available())
{
reg_val = Wire.read(); // 读数据
}

return reg_val;
}

int mag\_read\_value(int msb_reg, int lsb_reg)
{
int val_low, val_high;
val_high = mag\_read\_register(msb_reg);
delayMicroseconds(2); // 启动和停止之间至少需要 1.3us 空闲时间
val_low = mag\_read\_register(lsb_reg);
int out = (val_low|(val_high << 8));
return out;
}

int read\_x(void)
{
return mag\_read\_value(0x01, 0x02);
}

int read\_y(void)
{
return mag\_read\_value(0x03, 0x04);
}

int read\_z(void)
{
return mag\_read\_value(0x05, 0x06);
}

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