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
μ
\mu
μT 的灵敏度
μ
\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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!