找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15694|回复: 10
收起左侧

Arduino学习3-Arduino连接HMC5883L三轴电子罗盘传感器

  [复制链接]
ID:114115 发表于 2016-4-14 02:52 | 显示全部楼层 |阅读模式
用途:测量地磁方向,测量物体静止时候的方向,测量传感器周围磁力线的方向。注意,测量地磁时候容易受到周围磁场影响,

主芯片HMC5883三轴磁阻传感器特点(抄自网上):
1,数字量输出:I2C数字量输出接口,设计使用非常方便。
2,尺寸小: 3x3x0.9mm LCC封装,适合大规模量产使用。
3,精度高:1-2度,内置12位A/D,OFFSET, SET/RESET 电路,不会出现磁饱和现象,不会有累加误差。
4,支持自动校准程序,简化使用步骤,终端产品使用非常方便。
5,内置自测试电路,方便量产测试,无需增加额外昂贵的测试设备。
6,功耗低:供电电压1.8V, 功耗睡眠模式-2.5uA 测量模式-0.6mA
205520desfhb8ho4g8esyf.jpg


连接方法:
只要连接VCC,GND,SDA,SCL四条线。Arduino GND -> HMC5883L GNDArduino 3.3V -> HMC5883L VCCArduino A4 (SDA) -> HMC5883L SDAArduino A5 (SCL) -> HMC5883L SCL

(注意,接线是A4,A5,不是D4,D5)



程序编写:下载HMC5883L库文件。下载地址: HMC5883L.zip (5.55 KB, 下载次数: 100)
回复

使用道具 举报

ID:114115 发表于 2016-4-14 02:54 | 显示全部楼层
最近实在太忙,就先单独把我的八字校准程序贴上来。
其实很简单,我没去管Z轴,如果想要更高的精度,需要加一个加速度传感器,我刚好没有。

我的整个校准分2个子函数:calibRead() 和 calibration()

参照官方HMC5883L的程序先把该定义的变量定义好。
  1.     HMC5883L digicomp;
  2.      
  3.     float X_max = 0.0;  //X轴最大读数
  4.     float X_min = 0.0;  //X轴最小读数
  5.      
  6.     float Y_max = 0.0;  //Y轴最大读数
  7.     float Y_min = 0.0;  //Y轴最小读数
  8.      
  9.     float X_offset = 0.0;  //X轴偏移
  10.     float Y_offset = 0.0;  //Y轴偏移
  11.      
  12.     void calibRead() //指南针读数
  13.     {
  14.             MagnetometerScaled scaled2 = digicomp.ReadScaledAxis();
  15.      
  16.             if (  (abs(scaled2.XAxis) < 500) && (abs(scaled2.YAxis) < 500) && (abs(scaled2.ZAxis) < 500)) //这行对于我很重要,能过滤掉很多干扰,增加校准的精度。
  17.             {  //下面几行就是读取到每个轴的最大值和最小值,然后算出相应的偏移量
  18.                 if(scaled2.XAxis > X_max) {X_max = scaled2.XAxis;}
  19.                 if(scaled2.YAxis > Y_max) {Y_max = scaled2.YAxis;}
  20.      
  21.                 if(scaled2.XAxis < X_min) {X_min = scaled2.XAxis;}
  22.                 if(scaled2.YAxis < Y_min) {Y_min = scaled2.YAxis;}
  23.      
  24.                 X_offset = (X_max + X_min) / 2.0;
  25.                 Y_offset = (Y_max + Y_min) / 2.0;
  26.             }
  27.     }
  28.      
  29.     void calibration()
  30.     {
  31.             int i = 0;
  32.             digitalWrite(motor1EnPin, 0);  // 定义转弯方向,对于我的小车来说是左转,逆时针方向
  33.             digitalWrite(motor2EnPin, 1);
  34.      
  35.             analogWrite(motor1, 80);  // 启动马达开始转动
  36.             analogWrite(motor2, 80);
  37.      
  38.             while(i < 1000)  // 逆时针方向循环读取XY轴每个方向的值,然后算出相应的偏移量
  39.             {  calibRead();
  40.                 delay(10);
  41.                 i++;
  42.             }
  43.      
  44.             i = 0;
  45.             digitalWrite(motor1EnPin, 1);  // 右转小车,顺时针方向
  46.             digitalWrite(motor2EnPin, 0);
  47.      
  48.             while(i < 1000)  // 再顺时针方向方向旋转测算偏移量
  49.             {  calibRead();
  50.                 delay(10);
  51.                 i++;
  52.             }
  53.      
  54.             analogWrite(motor1, 0);  // 停止小车,校准完成
  55.             analogWrite(motor2, 0);
  56.     }
  57.      
  58.     float readCompass()  //得到偏移了就可以读数了
  59.     {
  60.             MagnetometerScaled scaled = digicomp.ReadScaledAxis();
  61.      
  62.             float heading = atan2(scaled.YAxis - Y_offset, scaled.XAxis - X_offset);  // 读数的时候直接减掉偏移量就可以了
  63.      
  64.             //float declinationAngle = 36.36/1000.0;  [这几行是考虑磁偏角的,除非真的是想
  65.             //heading = heading + declinationAngle;    找地理北极,不然对方向判断用处不大]
  66.      
  67.             if(heading < 0)  heading += 2*PI;
  68.             if(heading > 2*PI)  heading -= 2*PI;
  69.      
  70.             float headingDegrees = heading * 180/M_PI;
  71.      
  72.             return headingDegrees;
  73.     }
复制代码

严格来说这个传感器读出来的仅仅是三轴方向磁场强度而已,角度是算出来的。另外他对磁场感应很灵敏,周围有金属就会有干扰,拿块金属在他周围转转就能看到读数很大的变化,所以校准还是很有必要的。

手机的话因为画8字能很快测得XY的偏移,所以方法就叫8字校准。小车的话因为可以旋转,就没必要真的去走8字,直接转圈就可以了。这是我的理解。
回复

使用道具 举报

ID:114115 发表于 2016-4-14 02:54 | 显示全部楼层
上传一个HMC5883L库文件,放在C:\Program Files (x86)\Arduino\libraries就可运行,ARDUINO 1.0.6版本的三轴传感器。代码详见1楼。

    HMC5883L新头文件: HMC5883L.rar (5.14 KB, 下载次数: 40)
回复

使用道具 举报

ID:114115 发表于 2016-4-14 02:55 | 显示全部楼层
焊接还是很简单的,个人玩买个可调温和恒温的电烙铁,最好60W的,升温快,焊接前先将烙铁头附锡(其实一般新电烙铁都需要先附锡,每次用完也要附锡防氧化),面板焊接点注意刷好助焊剂(可以用松香+酒精自己调,酒精要纯度高的工业酒精大概酒精和松香1:0.2就差不多了,然后刷到要焊接的引脚和PCB板上),最后直接焊锡丝点烙铁头刷引脚(不要担心连线,先让焊锡全部下到引脚上,最后拿烙铁刷一边,焊锡会自己焊接到点,最好让板子稍微倾斜,自上而下刷,这样多余的锡会流到最下边,然后拿烙铁点掉就好了),最后用酒精棉擦洗焊点(将多余助焊剂洗掉),检查焊点是否有连接,如果不确定用镊子刮一刮就好了。(烙铁使用要快点快提,这样锡会自己成非常漂亮的形状,不要长时间点焊点)

PCB板是不会附着焊锡的,所以不用担心焊不好,其实很简单,关键烙铁要好,个人用我觉得黄花907调温恒温烙铁就好,淘宝上很便宜,反正我自己用的就很不错。。。。

最后,烙铁头要多买几个不同样式的,以应对不同焊点。。

------------------------

另,最近发现一个HMC5883的问题,一并记这儿:最近买了几片HMC5883L模块,结果被坑了,卖家没说不能用在5V系统,只说能5V供电,以为在MEGA2560上能用,结果读数据有问题,一开始是读出来不更新,每次复位更新一次数据,后来发现上拉电阻不是装的PCB上印的4.7K,装的是10K,换成4.7K后,可以连续读数据,但读一断时间后就会死机,以为程序有问题,查来查去,后来发现以前买的模块能正常读,仔细比较两个模块,发现新买的模块没有电平转换电路,以HMC5883L的IIc的1.8V电平直接接5V系统,不死才怪,所以5V系统买这个模块一定要买GY-271型号,有两个小6脚芯片的,一个是LDO,一个是双MOS做电平转换,只有一个LDO的模块只能用在3.3V或1.8V系统。
回复

使用道具 举报

ID:148138 发表于 2016-11-15 21:32 | 显示全部楼层
5893也出来了
回复

使用道具 举报

ID:165193 发表于 2017-2-18 00:07 | 显示全部楼层
回复有黑币吗
回复

使用道具 举报

ID:24730 发表于 2017-3-2 16:50 | 显示全部楼层
51黑有你更精彩
回复

使用道具 举报

ID:1 发表于 2017-3-2 17:06 | 显示全部楼层

回复是没有的 只能通过发布文件 管理员审核通过后 才会发放
回复

使用道具 举报

ID:230088 发表于 2017-8-31 16:24 | 显示全部楼层
回复有黑币么?
回复

使用道具 举报

ID:326549 发表于 2019-5-30 15:51 | 显示全部楼层
fatal error: ../Wire/Wire.h: No such file or directory #include "../Wire/Wir
请问这是怎么回事
回复

使用道具 举报

ID:514567 发表于 2019-6-7 12:00 | 显示全部楼层
很厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表