研究了一晚上稍微有点成果分享下

HMC5883L使用i2c接口,接线很容易

以Arduino Uno为例:
SDA to A4 
SCL to A5
Vcc to 3.3V
GND to GND

基本原理很简单:
方向角其实就是X轴和Y轴读数的反正切
而校准其实就是要排除环境中的磁场对地磁场的干扰
另外别忘了当地的磁偏角

如下代码没有使用专门的传感器库
上电后先进行20秒校准,请把传感器任意乱转,各个方向都要转到
然后就会显示校准值,然后持续显示初始值和方向角
不知道怎么在ide里面用中文写注释,所以就保留英文了

个人测试下来和手机上的指南针相差不超过5度,更精细的校准待研究

刚刚接触Arduino,望高手指教

[cpp] view plaincopy
  1. #include <Wire.h> //I2C 库
  2. #define address 0x1E //001 1110b(0x3C>>1), HMC5883的7位i2c地址
  3. #define MagnetcDeclination 4.43 //笔者所在地磁偏角,请根据情况自行百度
  4. #define CalThreshold 0
  5. int offsetX,offsetY,offsetZ;
  6. void setup()
  7. {
  8. //初始化串口和i2c
  9. Serial.begin(9600);
  10. Wire.begin();
  11. //设置HMC5883模式
  12. Wire.beginTransmission(address); //开始通信
  13. Wire.write(0x00); //选择配置寄存器A
  14. Wire.write(0x70); //0111 0000b,具体配置见数据手册
  15. Wire.endTransmission();
  16. Wire.beginTransmission(address);
  17. Wire.write(0x02); //选择模式寄存器
  18. Wire.write(0x00); //连续测量模式:0x00,单一测量模式:0x01
  19. Wire.endTransmission();
  20. calibrateMag();
  21. }
  22. void loop()
  23. {
  24. int x,y,z; //三轴数据
  25. getRawData(&x,&y,&z);
  26. //输出数据
  27. Serial.print("x: ");
  28. Serial.print(x);
  29. Serial.print("  y: ");
  30. Serial.print(y);
  31. Serial.print("  z: ");
  32. Serial.print(z);
  33. Serial.print(" angle(x,y): ");
  34. Serial.println(calculateHeading(&x,&y,&z));//输出x,y平面方向角
  35. delay(250);
  36. }
  37. void getRawData(int* x ,int* y,int* z)
  38. {
  39. Wire.beginTransmission(address);
  40. Wire.write(0x03); //从寄存器3开始读数据
  41. Wire.endTransmission();
  42. //每轴的数据都是16位的
  43. Wire.requestFrom(address, 6);
  44. if(6<=Wire.available()){
  45. *x = Wire.read()<<8; //X msb,X轴高8位
  46. *x |= Wire.read(); //X lsb,X轴低8位
  47. *z = Wire.read()<<8; //Z msb
  48. *z |= Wire.read(); //Z lsb
  49. *y = Wire.read()<<8; //Y msb
  50. *y |= Wire.read(); //Y lsb
  51. }
  52. }
  53. int calculateHeading(int* x ,int* y,int* z)
  54. {
  55. float headingRadians = atan2((double)((*y)-offsetY),(double)((*x)-offsetX));
  56. // 保证数据在0-2*PI之间
  57. if(headingRadians < 0)
  58. headingRadians += 2*PI;
  59. int headingDegrees = headingRadians * 180/M_PI;
  60. headingDegrees += MagnetcDeclination; //磁偏角
  61. // <span style="font-family: Arial, Helvetica, sans-serif;">保证数据在0-360之间</span>
  62. if(headingDegrees > 360)
  63. headingDegrees -= 360;
  64. return headingDegrees;
  65. }
  66. void calibrateMag()
  67. {
  68. int x,y,z; //三轴数据
  69. int xMax, xMin, yMax, yMin, zMax, zMin;
  70. //初始化
  71. getRawData(&x,&y,&z);
  72. xMax=xMin=x;
  73. yMax=yMin=y;
  74. zMax=zMin=z;
  75. offsetX = offsetY = offsetZ = 0;
  76. Serial.println("Starting Calibration......");
  77. Serial.println("Please turn your device around in 20 seconds");
  78. for(int i=0;i<200;i++)
  79. {
  80. getRawData(&x,&y,&z);
  81. // 计算最大值与最小值
  82. // 计算传感器绕X,Y,Z轴旋转时的磁场强度最大值和最小值
  83. if (x > xMax)
  84. xMax = x;
  85. if (x < xMin )
  86. xMin = x;
  87. if(y > yMax )
  88. yMax = y;
  89. if(y < yMin )
  90. yMin = y;
  91. if(z > zMax )
  92. zMax = z;
  93. if(z < zMin )
  94. zMin = z;
  95. delay(100);
  96. if(i%10 == 0)
  97. {
  98. Serial.print(xMax);
  99. Serial.print(" ");
  100. Serial.println(xMin);
  101. }
  102. }
  103. //计算修正量
  104. if(abs(xMax - xMin) > CalThreshold )
  105. offsetX = (xMax + xMin)/2;
  106. if(abs(yMax - yMin) > CalThreshold )
  107. offsetY = (yMax + yMin)/2;
  108. if(abs(zMax - zMin) > CalThreshold )
  109. offsetZ = (zMax +zMin)/2;
  110. Serial.print("offsetX:");
  111. Serial.print("");
  112. Serial.print(offsetX);
  113. Serial.print(" offsetY:");
  114. Serial.print("");
  115. Serial.print(offsetY);
  116. Serial.print(" offsetZ:");
  117. Serial.print("");
  118. Serial.println(offsetZ);
  119. delay(5000);
  120. }

把冗长的数据手册读完了,有人想看的话,可以把自测试模式,空闲模式等的使用方法也写一下

参考资料:

https://www.sparkfun.com/tutorials/301

转自:http://blog.csdn.net/do335maomao/article/details/43916467

HMC5883L 转换方向角与简易校准方法相关推荐

  1. 声发射传感器的简易校准方法

    声发射传感器的简易校准方法 声发射传感器使用时间久了,担心其灵敏度会下降,应该怎样去确认并确保声发射传感器的灵敏度呢.这就需要对传感器进行灵敏度校准标定了. 除国标一级校准和二级校准外,这里重点给大家 ...

  2. linux加速度传感器校准,加速度传感器校准方法及装置与流程

    本申请涉及传感器校准领域,具体而言,涉及一种加速度传感器校准方法及装置. 背景技术: 在移动终端中,导航软件的使用频率越来越高,比如说百度地图.高德导航等.目前,移动终端通常包含加速度传感器,在导航过 ...

  3. Full Convert相互转换器,转换数据库格式简单的方法

    Full Convert相互转换器,转换数据库格式简单的方法 Full Convert相互转换器是用于将熟悉的数据库名称格式相互转换的软件名称.使用Full Convert相互转换器软件实际上是转换数 ...

  4. C# Socket 的简易使用方法

    C# Socket 的简易使用方法 1.服务端 新建一个Socket对象 Socket Server = new Socket(AddressFamily.InterNetwork,SocketTyp ...

  5. 安川机器人程序还原_安川机器人报错代码:功能概要和程序数据简易修复方法...

    10 程序数据简易修复功能 10.1 功能概要 在进行编辑操作过程中发生控制电源被切断等时,可能会导致文件系统数据不匹配. 若放任该不匹配状态不管,极少数情况下,可能会导致发生下列数据异常(不匹配状态 ...

  6. 固件升级校准_RS网络分析仪自检自校准方法-Agitekservice

    R&S罗德与施瓦茨在射频方面比较突出,罗德的网络分析仪不管是手持还是台式个人觉得都比较好用,仪器使用久了就需要定期进行维护保养.也需要做自检自校准测试,那么问题来了,有的工程师不知道如何去操作 ...

  7. html表格转换为csv,python实现将html表格转换成CSV文件的方法

    python实现将html表格转换成CSV文件的方法 发布于 2015-11-18 16:53:39 | 155 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种 ...

  8. kuka机器人焊接飞溅大_库卡机器人KCP4示教器屏幕校准方法

    库卡于1898年在德国奥格堡成立,是世界几家顶级工业机器人制造商之一,1973年公司研发的FAMULUS第一台工业机器人诞生.库卡机器人公司在全球拥有20 多个子公司,涵盖了美国.墨西哥.巴西.日本. ...

  9. java fastjson 泛型_解决fastjson泛型转换报错的解决方法

    错误信息 Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObj ...

  10. 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我也走了许多弯路,前 ...

最新文章

  1. 【Swift】变量/常量/类型总结
  2. 遗传算法入门到掌握(一)
  3. yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL
  4. 网易云首届渠道大会:多媒体通信助力互联网+
  5. 三十二、VsCode前端的开发工具介绍和使用
  6. linux lnmp分布式集群,LNMP 分布式集群(六):keepalived 高可用方案
  7. cocos2d-x jni相关目录分析
  8. html--form表单常用操作
  9. u-boot启动参数命令格式
  10. python中的编码问题
  11. Seven times have I despised my soul 《我曾七次鄙视自己的灵魂》
  12. Java 泛型中的PECS原则
  13. 问题 C: [入门OJ]和||
  14. 算法篇----求两数的最大公约数和最小公倍数
  15. layui 确认,取消弹窗
  16. 怎样区分线性和非线性_线性与非线性的区别(线性分析、线性模型)
  17. 基于Paddlehub与Wechaty的微信小助手--懂懂
  18. 双代号网络图如何用计算机画,怎么画双代号网络图,双代号网络图的绘制规则和步骤...
  19. ue4导入倾斜摄影_倾斜摄影如何和bim结合?倾斜摄影数据怎么导?我来告诉你!...
  20. python爬虫实例教程之豆瓣电影排行榜--python爬虫requests库

热门文章

  1. 蓝宝书优缺点之GRE词汇盘点
  2. 数据库开源项目_开源项目贴纸库
  3. eclipse快捷键使用
  4. [ASP调试]小旋风Web服务器使用
  5. 大数据读书——《淘宝技术这十年》读书笔记
  6. 【技巧】安卓版按键精灵手机抓抓 取色取坐标 获取屏幕触点坐标
  7. uchome持久XSS(2.0版本测试通过)
  8. 免费获取卫星影像的网站你知道几个?
  9. am3352 软时钟老是漂移 rx-8025时钟 rx-8025SA时钟
  10. Java程序强制删除文件