HMC5883L电子罗盘Arduino怎么读航向?I2C校准和朝向避坑

写launch的皮皮硬件DIY 2026-10-14 12:55:57 18阅读 举报

给小车定向、给航模补偿方向、给门做一个朝向感知,电子罗盘很好用。HMC5883L是一颗三轴磁力计芯片,常见的是GY-271模块,能测出地球磁场在X、Y、Z三个方向的分量,算一算就能得到航向角,精度能到一两度。但磁力计最怕的就是“干扰”,这篇把读取和校准的坑讲透。

I2C接线,先认芯片是HMC还是QMC

GY-271模块默认I2C通信,接线是VCC接3.3V(或5V看模块)、GND接地、SCL接A5、SDA接A4,DRDY是数据就绪中断脚,不用可以悬空。这里有个超级大坑:很多标着GY-271的模块,板子上的芯片实际是QMC5883L,而不是HMC5883L,两者I2C地址和寄存器完全不同,库也不通用。

怎么分辨?先扫一遍I2C地址:实例的真HMC5883L地址是0x1E,QMC5883L是0x0D。扫出0x0D,就说明你手上是QMC这颗“克隆”芯片,得装对应QMC5883L的库才行。我第一次就是没认地址,读出来的全是噪声,排查半天。

测向很简单,但一定要先校准

拿到X、Y分量后,航向角就是atan2(y, x)再转成0到360度。看起来一行公式,实际直接读出来的角度是很飘的,因为周围任何铁磁材料(电机磁铁、螺丝、扬声器、钢结构)都会让读数偏移。

所以磁力计必须做校准:最常见的叫硬磁(hard-iron)校准,做法是让传感器水平旋转一整圈甚至多个方向,记录每个轴读到的最小值和最大值,把偏移算成(min+max)/2,读数时都减掉这个偏移。做完这一步,角度才算稳定。

三个高频坑,提前绕开

第一是磁偏角(declination)。航向算出来是相对磁北的,而地图上用的是真北,两者差一个你所在地区的磁偏角。算完atan2后要加上当地磁偏角,比如北京大约要加几度偏西的修正,不然方向永远偏着。

第二是远离电机和金属。磁力计最怕的就是电机磁铁和电调切换噪声,这对无人机尤其明显。安装时尽量把罗盘架高、远离电机和铁质结构,再用软件低通滤波(比如新读数旧读数加权平均)把抖动压平。

第三是倾角误差。HMC5883L单独用,稍微倾斜角度会引入误差。要更准,就再配一个加速度计(IMU里的陀螺仪)做倾角补偿,但入门先做正放平测就够了。

把认芯片、硬磁校准、磁偏角三件事捋顺,HMC5883L就是小车定向很可靠的航向来源,配合GPS做航向保持、配合超声波定向前进都好使。

版权声明:
作者:写launch的皮皮
链接:https://www.aiddithome.com/p/13e26e628f7a.html
来源:硬件DIY
实践版权归作者所有,未经允许请勿转载,若此实践存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论

磁偏角别忘了加,不然航向永远偏着,查本地偏角一加上就准了

线比代码多
2楼 · 2天前

放车上离电机远点,电机磁铁干扰太大,架高就好很多

拆开看看再说
3楼 · 2天前

GY-271板子很多是QMC5883L,地址0x0D,我一开始没认出来一直读到噪音

硬磁校准不做就是乱的,转一圈记录min/max算偏移后稳多了