模块介绍

霍尼韦尔 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上了。
想了解更多可以关注我:

(二十六)树莓派3B+ 获取HMC5883L的磁场数据相关推荐

  1. (二十七)树莓派3B+ 获取ADXL345加速度计的数据

    简介 在之前的文章中,介绍了MPU6050<12.树莓派3B+ MPU6050 两轴姿态显示>和HMC5883L<14.树莓派3B+ 获取HMC5883L的磁场数据>.这里的A ...

  2. (二十四)树莓派3B+ Node.js驱动MPU6050

    在之前的博客中写过MPU6050模块. (十四)树莓派3B+ wiringPi库的使用–硬件IIC驱动MPU6050 之前使用的wiringPi和C语言写的,现在使用Node.js操作一下.关于电路连 ...

  3. Android 项目必备(二十六)-->获取手机中所有 APP

    效果图 代码 添加依赖 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30' implementation ...

  4. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  5. 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url

    第三百二十六节,web爬虫,scrapy模块,解决重复url--自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...

  6. 【Vue2.0】—vue-router(二十六)

    [Vue2.0]-vue-router(二十六) 一.vue-router 的理解 它是vue 的一个插件库,专门用来实现 SPA 应用 二.对 SPA 应用的理 单页 Web 应用(single p ...

  7. GPS从入门到放弃(二十六) --- RTKLIB函数解析

    GPS从入门到放弃(二十六) - RTKLIB函数解析 为了贴合这个系列的标题"从入门到放弃",在入门之后现在就要放弃此方向了.虽然感觉遗憾,暂时也没有办法.在此附上此系列最后一篇 ...

  8. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...

  9. JAVA面经复习(二十六)面试难度:☆☆☆☆

    JAVA面经复习(二十六)面试难度:☆☆☆☆ 面试难度:☆☆☆☆ 推荐指数:☆☆☆☆☆ 推荐原因:总体来说本篇面经难度不高,且基本都是基础知识,不涉及复杂的分布式应用的工具,适合新手复习. 声明:答案 ...

  10. JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇

    二十六.JVM监控及诊断工具-GUI篇 1.工具概述 使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限: (1)无法获取方法级别的分析数据,如方法间的调用关系 ...

最新文章

  1. QIIME 2教程. 20实用程序Utilities(2020.11)
  2. linux配置文件为yum,Linux系统配置本地yum源
  3. JavaScript设计模式学习——builder pattern(建造者模式)
  4. pyqt5讲解1:窗口,QLabel,QLineEdit,QTextEdit
  5. 【工厂模式】设计模式之工厂模式【原创】
  6. VS2013配置编译Caffe-Win10_X64
  7. Java入门算法(暴力篇)丨蓄力计划
  8. Android应用开发—LayoutParams的用法
  9. 结对和团队项目建议 - 黄金点游戏
  10. JavaScript中一个对象如何继承另外一个对象
  11. 把excel每一行中的数据输出为一个txt文档的VBA函数
  12. 不用图像文件的圆角解决--跳起按钮制作(html)
  13. vue 组件传值$attrs $listeners $bus provide/inject $parent/$children
  14. 09-部署配置kubedns插件
  15. [2018.10.20 T3] 巧克力
  16. TextMesh Pro不能显示中文的解决办法是创建字贴图,常用汉字3500
  17. ubuntu下安装CAJ阅读器
  18. stm32 HC05驱动
  19. java foreach 中止_如何正确终止 forEach
  20. wx.chooseImage上传本地PC端和移动端区别

热门文章

  1. 【转载】爷爷和我---来自泊小豆的微博
  2. android 签名工具 autoSign jarsigner
  3. 常用Windows 运行命令
  4. codesmith mysql 注释_代码生成工具:CodeSmith 安装、改造适配Mysql 字段注释、DLL修改 及批量生成实体类代码...
  5. Oracle数据库的备份方式
  6. 在线购物系统-面对对象设计
  7. BUUCTF刷题-RAR 压缩包暴力破解密码
  8. 科技周刊第十期:自顶向下还是自底向上?
  9. 联想Y7000安装ubuntu1604 双系统
  10. 24小时改变你的人生 (1至12小时)很好的书,推荐大家有时间在网上看看。