想让小车或机器人知道自己在朝哪个方向走,电子罗盘是个便宜又好用的选择,QMC5883L就是常见的一颗三轴磁力计,常被打在GY-271之类的蓝色小板上。它通过感知地磁场算出方位角,接上Arduino就能当指南针用。这篇讲接线、读数据和怎么让它读得准。
QMC5883L模块引脚和接线
GY-271板子一般是六针,但真正要用的就四根:VCC接3.3V(部分板5V也能用,先看丝印说明)、GND接地、SDA接A4、SCL接A5,走标准I2C。剩下一般是DRDY数据就绪脚,普通读取可以先不接。接线颜色我习惯红-电源、黑-地、黄-SCL、蓝-SDA,看着清楚不容易接错。

接好先跑一遍I2C扫描确认地址,QMC5883L一般是0x0D(有的资料写0x0C,跟HMC5883L搞混的不少,注意区分)。库可以用QMC5883LCompass,封装好现成的方位角接口,不用自己啃寄存器。
读方位角的代码思路
初始化后在循环里调getAzimuth就能拿0到360度的方位角,北就是0度、东90、南180、西270。想更顺滑可以多次采样取平均,晃动时读数会更稳。这套东西拿去给小车做方向修正,或者配合GPS做导航修正都很实用。

校准才是读数准的关键
出厂没校准的磁力计读数会偏,甚至整体画个圈漂移。常见的做法是先跑校准拿到偏移量(offset)和比例(scale),再通过setCalibrationOffsets和setCalibrationScales把校准值写进去。步骤其实简单:拿着板和Arduino连着串口,水平慢慢转一圈,记录下X、Y的最大最小值,算出中点和幅度填进校准接口就行。
还有一个点,如果这颗磁力计是跟别的传感器一起用,得先确认I2C总线上有没有冲突。比如我之前把它和MPU6050一起挂,靠MPU6050开了I2C bypass才顺利读到,不然两个设备抢总线,数据就全乱了。总之接线先对、地址确认、校准做一遍,罗盘就能老老实实给你指北了。


地址0x0D别跟HMC5883L搞混,看着像但不一样
拿来做小车方向修正很实用,getAzimuth直接给角度
跟MPU6050一起挂的时候要靠I2C bypass,不然总线抢了我半天没搞懂
不校准读数偏得厉害,转一圈记最大最小值填进去立马准了