HMC5883L 转换方向角与简易校准方法
研究了一晚上稍微有点成果分享下
HMC5883L使用i2c接口,接线很容易
以Arduino Uno为例:
SDA to A4
SCL to A5
Vcc to 3.3V
GND to GND
基本原理很简单:
方向角其实就是X轴和Y轴读数的反正切
而校准其实就是要排除环境中的磁场对地磁场的干扰
另外别忘了当地的磁偏角
如下代码没有使用专门的传感器库
上电后先进行20秒校准,请把传感器任意乱转,各个方向都要转到
然后就会显示校准值,然后持续显示初始值和方向角
不知道怎么在ide里面用中文写注释,所以就保留英文了
个人测试下来和手机上的指南针相差不超过5度,更精细的校准待研究
刚刚接触Arduino,望高手指教
- #include <Wire.h> //I2C 库
- #define address 0x1E //001 1110b(0x3C>>1), HMC5883的7位i2c地址
- #define MagnetcDeclination 4.43 //笔者所在地磁偏角,请根据情况自行百度
- #define CalThreshold 0
- int offsetX,offsetY,offsetZ;
- void setup()
- {
- //初始化串口和i2c
- Serial.begin(9600);
- Wire.begin();
- //设置HMC5883模式
- Wire.beginTransmission(address); //开始通信
- Wire.write(0x00); //选择配置寄存器A
- Wire.write(0x70); //0111 0000b,具体配置见数据手册
- Wire.endTransmission();
- Wire.beginTransmission(address);
- Wire.write(0x02); //选择模式寄存器
- Wire.write(0x00); //连续测量模式:0x00,单一测量模式:0x01
- Wire.endTransmission();
- calibrateMag();
- }
- void loop()
- {
- int x,y,z; //三轴数据
- getRawData(&x,&y,&z);
- //输出数据
- Serial.print("x: ");
- Serial.print(x);
- Serial.print(" y: ");
- Serial.print(y);
- Serial.print(" z: ");
- Serial.print(z);
- Serial.print(" angle(x,y): ");
- Serial.println(calculateHeading(&x,&y,&z));//输出x,y平面方向角
- delay(250);
- }
- void getRawData(int* x ,int* y,int* z)
- {
- Wire.beginTransmission(address);
- Wire.write(0x03); //从寄存器3开始读数据
- Wire.endTransmission();
- //每轴的数据都是16位的
- Wire.requestFrom(address, 6);
- if(6<=Wire.available()){
- *x = Wire.read()<<8; //X msb,X轴高8位
- *x |= Wire.read(); //X lsb,X轴低8位
- *z = Wire.read()<<8; //Z msb
- *z |= Wire.read(); //Z lsb
- *y = Wire.read()<<8; //Y msb
- *y |= Wire.read(); //Y lsb
- }
- }
- int calculateHeading(int* x ,int* y,int* z)
- {
- float headingRadians = atan2((double)((*y)-offsetY),(double)((*x)-offsetX));
- // 保证数据在0-2*PI之间
- if(headingRadians < 0)
- headingRadians += 2*PI;
- int headingDegrees = headingRadians * 180/M_PI;
- headingDegrees += MagnetcDeclination; //磁偏角
- // <span style="font-family: Arial, Helvetica, sans-serif;">保证数据在0-360之间</span>
- if(headingDegrees > 360)
- headingDegrees -= 360;
- return headingDegrees;
- }
- void calibrateMag()
- {
- int x,y,z; //三轴数据
- int xMax, xMin, yMax, yMin, zMax, zMin;
- //初始化
- getRawData(&x,&y,&z);
- xMax=xMin=x;
- yMax=yMin=y;
- zMax=zMin=z;
- offsetX = offsetY = offsetZ = 0;
- Serial.println("Starting Calibration......");
- Serial.println("Please turn your device around in 20 seconds");
- for(int i=0;i<200;i++)
- {
- getRawData(&x,&y,&z);
- // 计算最大值与最小值
- // 计算传感器绕X,Y,Z轴旋转时的磁场强度最大值和最小值
- if (x > xMax)
- xMax = x;
- if (x < xMin )
- xMin = x;
- if(y > yMax )
- yMax = y;
- if(y < yMin )
- yMin = y;
- if(z > zMax )
- zMax = z;
- if(z < zMin )
- zMin = z;
- delay(100);
- if(i%10 == 0)
- {
- Serial.print(xMax);
- Serial.print(" ");
- Serial.println(xMin);
- }
- }
- //计算修正量
- if(abs(xMax - xMin) > CalThreshold )
- offsetX = (xMax + xMin)/2;
- if(abs(yMax - yMin) > CalThreshold )
- offsetY = (yMax + yMin)/2;
- if(abs(zMax - zMin) > CalThreshold )
- offsetZ = (zMax +zMin)/2;
- Serial.print("offsetX:");
- Serial.print("");
- Serial.print(offsetX);
- Serial.print(" offsetY:");
- Serial.print("");
- Serial.print(offsetY);
- Serial.print(" offsetZ:");
- Serial.print("");
- Serial.println(offsetZ);
- delay(5000);
- }
把冗长的数据手册读完了,有人想看的话,可以把自测试模式,空闲模式等的使用方法也写一下
参考资料:
https://www.sparkfun.com/tutorials/301
转自:http://blog.csdn.net/do335maomao/article/details/43916467
HMC5883L 转换方向角与简易校准方法相关推荐
- 声发射传感器的简易校准方法
声发射传感器的简易校准方法 声发射传感器使用时间久了,担心其灵敏度会下降,应该怎样去确认并确保声发射传感器的灵敏度呢.这就需要对传感器进行灵敏度校准标定了. 除国标一级校准和二级校准外,这里重点给大家 ...
- linux加速度传感器校准,加速度传感器校准方法及装置与流程
本申请涉及传感器校准领域,具体而言,涉及一种加速度传感器校准方法及装置. 背景技术: 在移动终端中,导航软件的使用频率越来越高,比如说百度地图.高德导航等.目前,移动终端通常包含加速度传感器,在导航过 ...
- Full Convert相互转换器,转换数据库格式简单的方法
Full Convert相互转换器,转换数据库格式简单的方法 Full Convert相互转换器是用于将熟悉的数据库名称格式相互转换的软件名称.使用Full Convert相互转换器软件实际上是转换数 ...
- C# Socket 的简易使用方法
C# Socket 的简易使用方法 1.服务端 新建一个Socket对象 Socket Server = new Socket(AddressFamily.InterNetwork,SocketTyp ...
- 安川机器人程序还原_安川机器人报错代码:功能概要和程序数据简易修复方法...
10 程序数据简易修复功能 10.1 功能概要 在进行编辑操作过程中发生控制电源被切断等时,可能会导致文件系统数据不匹配. 若放任该不匹配状态不管,极少数情况下,可能会导致发生下列数据异常(不匹配状态 ...
- 固件升级校准_RS网络分析仪自检自校准方法-Agitekservice
R&S罗德与施瓦茨在射频方面比较突出,罗德的网络分析仪不管是手持还是台式个人觉得都比较好用,仪器使用久了就需要定期进行维护保养.也需要做自检自校准测试,那么问题来了,有的工程师不知道如何去操作 ...
- html表格转换为csv,python实现将html表格转换成CSV文件的方法
python实现将html表格转换成CSV文件的方法 发布于 2015-11-18 16:53:39 | 155 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种 ...
- kuka机器人焊接飞溅大_库卡机器人KCP4示教器屏幕校准方法
库卡于1898年在德国奥格堡成立,是世界几家顶级工业机器人制造商之一,1973年公司研发的FAMULUS第一台工业机器人诞生.库卡机器人公司在全球拥有20 多个子公司,涵盖了美国.墨西哥.巴西.日本. ...
- java fastjson 泛型_解决fastjson泛型转换报错的解决方法
错误信息 Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObj ...
- oracle8ir2,Oracle8iR2(oracle8.1.6)在redhat linux 7.1上的简易安装方法
Oracle8iR2(oracle8.1.6)在redhat linux 7.1上的简易安装方法 时间:2006/7/19 2:15:17 作者:佚名 人气:78 安装oracle我也走了许多弯路,前 ...
最新文章
- 【Swift】变量/常量/类型总结
- 遗传算法入门到掌握(一)
- yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL
- 网易云首届渠道大会:多媒体通信助力互联网+
- 三十二、VsCode前端的开发工具介绍和使用
- linux lnmp分布式集群,LNMP 分布式集群(六):keepalived 高可用方案
- cocos2d-x jni相关目录分析
- html--form表单常用操作
- u-boot启动参数命令格式
- python中的编码问题
- Seven times have I despised my soul 《我曾七次鄙视自己的灵魂》
- Java 泛型中的PECS原则
- 问题 C: [入门OJ]和||
- 算法篇----求两数的最大公约数和最小公倍数
- layui 确认,取消弹窗
- 怎样区分线性和非线性_线性与非线性的区别(线性分析、线性模型)
- 基于Paddlehub与Wechaty的微信小助手--懂懂
- 双代号网络图如何用计算机画,怎么画双代号网络图,双代号网络图的绘制规则和步骤...
- ue4导入倾斜摄影_倾斜摄影如何和bim结合?倾斜摄影数据怎么导?我来告诉你!...
- python爬虫实例教程之豆瓣电影排行榜--python爬虫requests库