兰州企业建设网站/seo软件视频教程
模块介绍
霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在 1°~2°的 12 位模数转换器.简易的 I2C 系列总线接口。HMC5883L 的所应用领域有手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统。
HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,该技术的优点是其他磁传感器技术所无法企及。这些各向异性传感器具有在轴向高灵敏度和线性高精度的特点.传感器带有的对于正交轴低敏感行的固相结构能用于测量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。霍尼韦尔的磁传感器在低磁场传感器行业中是灵敏度最高和可靠性最好的传感器。
连接莓派
在之前的文章中已经驱动了MPU6050这个模块。
12.树莓派3B+ MPU6050 两轴姿态显示
其实HMC5883L这个模块的驱动方式和MPU6050一样,差别只是在芯片的初始设置部分。最后读取的数据都是用的两个8位寄存器分别存储高低位的数据。
这里我是直接淘宝买的模块GY-273:
和树莓派的连接只需要4根线,VCC、GND、SCL和SDA。
寄存器列表
下面表格列出了寄存器及其访问。所有地址为8 bits。
寄存器说明
在实际操作中一般使用只需要关注前9个寄存器即可,其中只有前3个是需要设置的。
1.配置寄存器A
2.配置寄存器B
3.模式寄存器
4.数据输出寄存器X、Y、Z
数据输出X、Y、Z寄存器是两个 8 位寄存器,数据输出寄存器 A 和 B。这些寄存器储存从通道 X 所测量结果。数据输出 X 寄存器 A 储存一个来自测量结果中的 MSB(高位数据),数据输出 X 寄存器 B 储存一个来自测量结果中的 LSB(低位数据)。存储在这两个寄存器的值是一个 16 位值以二进制的补码形式存在,其范围是 0xF800到 0x07FF。DXRA0 至 DXRA7、DXRB0 至 DXRB7 标识出位置, DXRA 和 DXRB 标识出在数据输出寄存器 X 中的位。DXRA7 和 DXRB7 标识出数据流的第一位,括号中的数目显示该位的默认值。在事件的ADC上溢或下溢阅读给定的通道,或者如果有一个数学溢出的过程,这种数据寄存器将包含-4096的值。在下一次有效测量完成进行之后,该寄存器上的值将被清除。其他寄存器就不说了。
驱动代码
var i2c = require('i2c-bus');// 寄存器说明 可读可学
var CONFIG_A = 0x00, // 配置寄存器ACONFIG_B = 0x01, // 配置寄存器BMODE = 0x02; // 模式寄存器
// 数据存储寄存器 只读
var X_DATA_REG = 0x03, // 寄存器高位 低位+1Z_DATA_REG = 0x05,Y_DATA_REG = 0x07;
// 状态寄存器 只读
var STATUS = 0x09;// 识别寄存器 只读
var ID_A = 0x10, // 识别寄存器AID_B = 0x11, // 识别寄存器BID_C = 0x12; // 识别寄存器C// 工作模式 配置寄存器A的CRA1~CRA0
var workModeMap = {'0': 0, // 正常测量模式 (默认)'1': 1, // X、Y、Z 轴正偏压配置'2': 2, // X、Y、Z 轴负偏压配置'3': 3, // 次配置预留
}// 采样率(Hz) 配置寄存器A的CRA4~CRA2
var sampleRateMap = {'0.75': 0,'1.5': 1,'3': 2,'7.5': 3,'15': 4, // 默认值'30': 5,'75': 6
};// 增益 配置寄存器B的CRB7~CRA5
var scaleMap = {'0.88': {reg: 0, scalar: 0.73}, // 默认值'1.3': {reg: 1, scalar: 0.92},'1.9': {reg: 2, scalar: 1.22},'2.5': {reg: 3, scalar: 1.52},'4.0': {reg: 4, scalar: 2.27},'4.7': {reg: 5, scalar: 2.56},'5.6': {reg: 6, scalar: 3.03},'8.1': {reg: 7, scalar: 4.35}
};// 模式 模式寄存器的MR1~MR0
var modeMap = {'0': 0, // 连续测量模式'1': 1, // 单一测量模式(默认)'2': 2, // 闲置模式'3': 3 // 闲置模式
};function hmc5883l(i2cbus, hmcaddress,options) {if (!(this instanceof hmc5883l)) {return new hmc5883l(i2cbus, hmcaddress,options);}this.address = hmcaddress;this.bus = i2c.openSync(i2cbus);if (!options) {options = {rate: '15',workMode: '0',scale: '0.88',mode: '0'};}// 采样率this.sampleRate = sampleRateMap[options.rate || '15'];// 工作模式this.workMode = workModeMap[options.workMode || '0'];// 增益this.scale = scaleMap[options.scale || '0.88'];// 模式this.mode = modeMap[options.mode || '0'];this.bus.writeByteSync(this.address, CONFIG_A, (224 + (this.sampleRate << 2) + this.workMode));// 配置增益 默认0.88this.bus.writeByteSync(this.address, CONFIG_B, this.scale.reg << 5); // 配置测量模式this.bus.writeByteSync(this.address, MODE, this.mode);
}hmc5883l.prototype.read_raw_data = function (addr) {var high = this.bus.readByteSync(this.address, addr);var low = this.bus.readByteSync(this.address, addr+1);var value = (high << 8) + low; // 高8位 左移8位 组装成16位的数据if (value > 32768) {value = value - 65536;}return value;
};
// 获取 X Y Z 三轴的磁场值
hmc5883l.prototype.get_magnetic_xyz = function() {var x = this.read_raw_data(X_DATA_REG);var y = this.read_raw_data(Y_DATA_REG);var z = this.read_raw_data(Z_DATA_REG);var magnetic_xyz = {x:x,y:y,z:z}return magnetic_xyz;
}
module.exports = hmc5883l;
测试例子
var HMC5883L = require('./hmc5883l');
var rpio = require('rpio'); // 引入rpio这个库
var hmc5883l_add = 0x1E; //HMC5883L 地址
var bus = 1; // i2c.1
var Compass = new HMC5883L( bus,hmc5883l_add);
rpio.sleep(5);function main(){var i = 0;let hmcData = {};let angle = 0;while(true){hmcData = Compass.get_magnetic_xyz();// 角度angle = Math.atan2(hmcData.y,hmcData.x) * (180 / 3.14159265) + 180;console.log('hmc5883l = ',hmcData);console.log('angle = ',angle);rpio.msleep(500);console.log('------------------------> ' + i + ' <------------------------');i++;}
}
main();
这里没有自检也没有校正操作。这些可以自行百度。
最后
实际在使用这个芯片的时候发现晚上没有Node.js操作的,都是C和python。但是关于Node.js操作的都是外国友人写的。我这个也是在外国友人的基础上对着手册总结的。后面计划把自己操作过的芯片全部总结之后发布npm上了。
想了解更多可以关注我: