使用Arduino和HMC5883L磁力计的数字罗盘

article/2025/10/13 17:37:34

原文:https://circuitdigest.com/microcontroller-projects/digital-compass-with-arduino-and-hmc5883l-magnetometer

使用Arduino和HMC5883L磁力计的数字罗盘

ARDUINO的

经过**阿斯温斯·拉吉(Aswinth Raj)** 2018年11月6日
在这里插入图片描述

人脑由复杂的结构层构成,可帮助我们成为地球上的优势物种。例如,大脑中的内嗅皮层可以为您提供方向感,帮助您轻松导航到您不熟悉的地方。但是与我们不同的是,机器人和无人驾驶Ariel车辆需要某种东西来获得这种方向感,以便他们能够在新的地形和风景中自动进行操纵。不同的机器人使用不同类型的传感器来完成此任务,但是最常用的是磁力计,它可以告知机器人当前所处的地理方向。这不仅可以帮助机器人感应方向,还可以按照预定的方向和角度转弯。

由于传感器可以指示北,南,东和西的地理信息,因此我们人类也可以在需要时使用它。因此,在本文中,让我们尝试了解磁力计传感器的工作原理以及如何将其与Arduino等微控制器接口。在这里,我们将构建一个很酷的数字罗盘,它会通过发出指向北方向的LED来帮助我们找到方向。这款数字指南针是由PCBGOGO精巧地在PCB上制成的,以便下次野外出行时可以携带它,并希望我迷路只是为了用这个东西找到回家的路。让我们开始吧。

Arduino指南针项目所需的材料

  • Arduino Pro迷你版
  • HMC5883L磁力计传感器
  • LED灯-8号
  • 470Ohm电阻器– 8号
  • 桶杰克
  • 像PCBgogo这样的可靠PCB制造商
  • 迷你FTDI编程器
  • 电脑/笔记本电脑

什么是磁力计,它如何工作?

在深入探讨电路之前,让我们先了解一下磁力计及其工作原理。顾名思义,“电磁”一词并不是指奇迹中那种疯狂的突变体,他可以通过在空中弹钢琴来控制金属。哦!但是我喜欢那个他很酷的家伙。

磁力计实际上是一种设备,可以感应地球的磁极并据此指出方向。众所周知,地球是一块带有北极和南极的球形磁铁。并因此而产生磁场。磁力计感测到该磁场,并根据磁场的方向可以检测出我们所面对的方向。

HMC5883L传感器模块如何工作

作为磁力计传感器HMC5883L具有相同的功能。它上面有霍尼韦尔(中国)的HMC5883L IC。该IC具有3种磁阻材料,它们沿x,y和z轴排列。流过这些材料的电流量对地球磁场很敏感。因此,通过测量流过这些材料的电流的变化,我们可以检测到地球磁场的变化。一旦吸收了磁场的变化,就可以通过I2C协议将这些值发送到任何嵌入式控制器,例如微控制器或处理器。

由于传感器通过感应磁场来工作,因此如果在附近放置金属,则输出值将受到很大影响。可以利用这种行为将这些传感器也用作金属探测器。注意不要将磁铁靠近该传感器,因为来自磁铁的强磁场可能会触发传感器上的错误值。

HMC5883L和QMC5883L之间的区别

对于许多初学者来说,围绕这些传感器存在一个普遍的困惑。这是因为某些供应商(实际上是大多数供应商)出售了QMC5883L传感器,而不是霍尼韦尔的原始HMC5883L。这主要是因为QMC5883L比HMC5883L模块便宜。可悲的是,这两个传感器的工作方式略有不同,并且不能对两个传感器使用相同的代码。这是因为两个传感器的I2C地址不同。本教程中给出的代码仅适用于QMC5883L常用的传感器模块。
在这里插入图片描述
磁力计QMC5883L

要知道您所使用的传感器型号,您只需仔细查看IC本身,以读取上面写的内容。如果写的是类似L883的东西,那就是HMC58836L;如果写的是类似DA5883的话,那就是QMC5883L IC。下图显示了这两个模块,以方便进行低估。
在这里插入图片描述

Arduino数字指南针电路图

基于Arduino的Digital Compass的电路非常简单,我们只需要将HMC5883L传感器与Arduino接口并将8个LED连接到Arduino Pro mini的GPIO引脚即可。完整的电路图如下所示
在这里插入图片描述
传感器模块具有5个引脚出其中的DRDY(数据准备好)未在我们的项目,因为我们正在操作在连续模式中的传感器使用。Vcc和接地引脚用于从Arduino板以5V为模块供电。的SCL和SDA是I2C通信总线线路分别连接到Arduino临迷你的A4和A5 I2C引脚。由于模块本身在线路上具有上拉电阻,因此无需在外部添加它们。

为了说明方向,我们使用了8个LED,它们全部通过470欧姆的限流电阻连接到Arduino的GPIO引脚。完整电路由9V电池通过桶形插孔供电。该9V直接提供给Arduino的Vin引脚,并使用Arduino上的板载稳压器将其调节为5V。然后使用此5V电压为传感器和Arduino供电。

制作用于数字罗盘的PCB

电路的想法是将8个LED圆形放置,以便每个LED指向所有8个方向,分别是北,东北,东,东南,南,西南,西和西北。因此,就此而言,将它们整齐地排列在面包板上或什至在穿孔板上是不容易的。为该电路开发PCB将使其看起来更整洁且易于使用。因此,我打开了PCB设计软件,将LED和电阻器排列成整齐的圆形图案,并连接了走线以形成连接。完成后,我的设计如下所示。您也可以从下面给出的链接下载Gerber文件。

  • 下载用于数字罗盘PCB的Gerber文件
    在这里插入图片描述
    我将其设计为双面板,因为我希望将Arduino放在PCB的底部,以免破坏PCB顶部的外观。如果您担心必须为双面PCB付出高昂的价格,那么请耐心等待。

现在,我们的设计已经准备就绪,是时候制作它们了。要完成PCB非常简单,只需执行以下步骤

第1步: 进入www.pcbgogo.com,如果这是您第一次,请注册。然后,在“ PCB原型”选项卡中,输入PCB的尺寸,层数和所需的PCB数。我的PCB是80cm×80cm,所以标签如下
在这里插入图片描述

*第2步:单击立即报价***按钮继续。您将进入一个页面,在该页面上可以根据需要设置一些其他参数,例如使用的轨道间距等材料。但是大多数情况下,默认值都可以正常工作。我们在这里唯一需要考虑的是价格和时间。如您所见,构建时间仅为2-3天,而我们的PSB只需花费$ 5。然后,您可以根据需要选择一种首选的运输方式。
在这里插入图片描述

**步骤3:**最后一步是上传Gerber文件并继续付款。为确保流程顺利进行,PCBGOGO在继续付款之前会验证您的Gerber文件是否有效。这样,您可以确保您的PCB易于制造,并且能够按承诺达到您的要求。

组装PCB

订购该板后,几天后便到达了我手中,尽管快递员装在贴有整齐标签的包装好的盒子中,而且像往常一样,PCB的质量很棒。我分享了以下几张木板的图片,供您判断。
在这里插入图片描述
我打开了焊锡棒,开始组装电路板。由于脚印,焊盘,通孔和丝网印刷的形状和尺寸都非常合适,因此我组装电路板没有问题。拆箱后仅需10分钟即可准备好板子。

焊接后板子的几张图如下所示。
在这里插入图片描述

编程Arduino

现在我们的硬件已经准备好了,让我们研究一下必须上载到Arduino板上的程序。该代码的目的是从QMC5883L磁力计传感器读取数据并将其转换为度数(0到360)。一旦知道了度数,就必须打开指向特定方向的LED。我在此程序中使用的方向是北。因此,无论您身在何处**,板上的LED都会发光,并且LED的方向将指示“北”方向**。一旦可以稍后计算出另一个方向,就可以知道一个方向。

数字指南针项目的完整代码可在此页面的末尾找到。包含库之后,您可以直接将其上载到板上,并且可以开始使用了。但是,如果您想进一步了解代码中实际发生的情况,请进一步阅读。

如前所述,我们正在使用QMC5883L IC,要与该IC通信,我们需要知道其寄存器的I2C地址,该地址可在其数据表中找到。但幸运的是,所有这些工作已经完成,并由Github上名为keepworking的一个人打包为一个库。因此,您只需单击链接以获取ZIP文件,即可**下载QMC5883L的库**。然后,可以通过遵循Sketch-> Include Library-> Add .ZIP library将这个ZIP文件添加到您的Arduino IDE中。

添加库后,我们可以继续执行程序。我们**通过包含所需的库文件开始该程序,**如下所示。线库用于启用I2C通信,而MechaQMC5883是我们刚刚添加到Arduino的库。该库包含有关如何与EMC5883L传感器通信的所有信息。

#include <Wire.h> //导线库使用用于I2C通信
#include <MechaQMC5883.h> // QMC5883库,自从设备是QMC583而不是HMC5883

在下一行中,我们为正在使用的传感器创建一个对象名称。我用过***qmc***这个名字,但可以是任何您喜欢的名字。

MechaQMC5883 qmc ; //为snsor创建一个对象名称,我将其命名为qmc

接下来,我们进入全局变量声明。在这里,由于我们有8个LED作为输出,因此很难通过引脚名称来引用每个LED,因此我们使用数组选项来引用所有LED。数组的名称是ledPins,变量led_count是我们拥有的led的数量。它从0开始。

int ledPins [] = {2,3,4,5,6,7,8,9}; // LED连接到的输出引脚的阵列
char led_count = 7; // LED引脚总数

在*void setup*函数内部,我们还初始化了I2C通信,串行通信和传感器。然后,我们将所有LED引脚声明为输出引脚。由于我们使用了数组,因此通过使用for循环并在for循环中进行导航很容易引用所有引脚,如下所示。

void setup(){ Wire.begin(); //开始I2C通讯Serial.begin(9600); //开始串行通讯qmc.init(); //初始化QMC5883传感器for(int thisPin = 0; thisPin <= led_count; thisPin ++){//遍历数组pinMode(ledPins [thisPin],OUTPUT);//将它们中所有引脚声明为输出  } 
}

在无限循环的循环中,我们必须传感器**获取x,y和z的值,**并计算传感器当前面对的程度。要读取x,y和z的值,请使用以下行

int x,y,z; 
qmc.read(&x,&y,&z); //从传感器获取X,Y和Z的值

下面显示了计算航向度的公式。由于我们不会沿z轴旋转指南针,因此我们不会考虑该值。仅当IC平面像我们的设置一样朝上时,才可以使用此公式。计算航向后,该值将在-180到180范围内,就像在所有数字罗盘中一样,我们必须将其转换为0到360。

int heading= atan2(x,y)/0.0174532925; //使用带有以下公式的X和Y参数计算度数
//将结果转换为0到360 if(heading <0)heading + = 360; heading= 360-heading;

最后一步是在辉光北方向的LED指示。为此,我们有一系列if条件语句,其中检查当前度数在什么范围内,并根据该值打开LED。代码如下所示

//根据标题的值打印调试结果,并使相应的LED发光。
if (heading > 338 || heading < 22){Serial.println("NORTH");digitalWrite(ledPins[0],HIGH);}if (heading > 22 && heading < 68){Serial.println("NORTH-EAST");digitalWrite(ledPins[7],HIGH);}if (heading > 68 && heading < 113){Serial.println("EAST");digitalWrite(ledPins[6],HIGH);}if (heading > 113 && heading < 158){Serial.println("SOUTH-EAST");digitalWrite(ledPins[5],HIGH);}if (heading > 158 && heading < 203){Serial.println("SOUTH");digitalWrite(ledPins[4],HIGH);}if (heading > 203 && heading < 248){Serial.println("SOTUH-WEST");digitalWrite(ledPins[3],HIGH);}if (heading > 248 && heading < 293){Serial.println("WEST");digitalWrite(ledPins[2],HIGH);}if (heading > 293 && heading < 338){Serial.println("NORTH-WEST");digitalWrite(ledPins[1],HIGH);}

通过查看下表,可以了解代码值背后的逻辑。基本上,我们计算所面对的方向,并预测北向,并使相应的LED发光。

方向方向对应的度数该方向的范围
0°/ 360°> 338°或<22°
东北45°22°至68°
东方的90°68°至113°
东南部135°113°至158°
180°158°至203°
西南225°203°至248°
西170°248°至293°
西北315°293°至338°

该程序的最后一部分是设置必须更新结果的速度。我创建了500毫秒的延迟,然后关闭了所有LED,以从void循环中的第一个开始重新启动。但是,如果您需要更快的更新,则可以进一步减少延迟。

  delay(500); 的LED每//更新位置ALF秒
//关闭所有的LEDfor(int thisPin = 0; thisPin <= led_count; thisPin ++){ digitalWrite(ledPins[thisPin],LOW); }

测试数字指南针

因为我们已经使用了Arduino pro mini,所以我们需要一个FTDI板之类的外部编程器来上载程序。上载程序后,您应该注意到板上的一个LED发光,该LED发光的方向将是NORTH方向
在这里插入图片描述

然后,您可以通过旋转面板来进行操作,并检查LED是否仍指向北方向。之后,您可以随时使用9V电池为设置供电,并检查您所面对的方向。可以在下面的视频中找到数字指南针的完整功能。您可能会注意到,如果靠近电路板的地方有一块重金属,或者即使沿Z轴旋转电路板,这些值也会出错。有一些方法可以解决此问题,这是另一篇教程。

希望您喜欢本教程并从中学到了一些有用的东西。如果是,则将积分转给赞助此职位的PCBGOGO,因此请尝试一下您的PCB。像往常一样,将您的想法发表在下面的评论部分。

代码

/** Program for Arduino Digital Compass using QMC5883* Project by: Aswinth Raj* Dated: 1-11-2018* Website: www.circuitdigest.com* Lib. from https://github.com/keepworking/Mecha_QMC5883L* WARNING: This code works only for QMC5883 Sensor which is commonly being sold as HMC5883 read article to find the actual name of the sensor you have.*/#include <Wire.h> //Wire Librarey for I2C communication 
#include <MechaQMC5883.h> //QMC5883 Librarey is added since mine is QMC583 and not HMC5883MechaQMC5883 qmc; //Create an object name for the snsor, I have named it as qmcint ledPins[] = {2,3,4,5,6,7,8,9}; //Array of output pin to which the LED is connected to
char led_count = 7; //Total number of LED pins void setup() {Wire.begin(); //Begin I2C communication Serial.begin(9600); //Begin Serial Communication qmc.init(); //Initialise the QMC5883 Sensor for (int thisPin=0; thisPin <= led_count; thisPin++){ //Navigate through all the pins in array pinMode(ledPins[thisPin],OUTPUT); //Declare them as output }}void loop() { //Infinite Loopint x,y,z;qmc.read(&x,&y,&z); //Get the values of X,Y and Z from sensor int heading=atan2(x, y)/0.0174532925; //Calculate the degree using X and Y parameters with this formulae //Convert result into 0 to 360if(heading < 0) heading+=360;heading = 360-heading;Serial.println(heading); //Print the value of heading in degree for debugging //Based on the value of heading print the result for debugging and glow the respective LED.if (heading > 338 || heading < 22){Serial.println("NORTH");digitalWrite(ledPins[0],HIGH);}if (heading > 22 && heading < 68){Serial.println("NORTH-EAST");digitalWrite(ledPins[7],HIGH);}if (heading > 68 && heading < 113){Serial.println("EAST");digitalWrite(ledPins[6],HIGH);}if (heading > 113 && heading < 158){Serial.println("SOUTH-EAST");digitalWrite(ledPins[5],HIGH);}if (heading > 158 && heading < 203){Serial.println("SOUTH");digitalWrite(ledPins[4],HIGH);}if (heading > 203 && heading < 248){Serial.println("SOTUH-WEST");digitalWrite(ledPins[3],HIGH);}if (heading > 248 && heading < 293){Serial.println("WEST");digitalWrite(ledPins[2],HIGH);}if (heading > 293 && heading < 338){Serial.println("NORTH-WEST");digitalWrite(ledPins[1],HIGH);}delay(500); // update position of LED for every alf seconds 
//Turn off the all the LED for (int thisPin=0; thisPin <= led_count; thisPin++){digitalWrite(ledPins[thisPin],LOW);}
}

http://chatgpt.dhexx.cn/article/ZlV5Bvx8.shtml

相关文章

地磁计HMC5883L

信方式&#xff1a;IIC 工作电压&#xff1a;2.16~3.6V 工作电流&#xff1a;100uA 罗盘航向精度&#xff1a;1~2 当达到预定的最大输出频率&#xff0c;才需要监控DRDY中断引脚 I2C接口 装置包含一个7-bits串行地址&#xff0c;并且支持标注和快速模式&#xff08;100kHZ和400…

3轴数字罗盘IC HMC5883L介绍

3轴数字罗盘IC HMC5883L简介 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块&#xff0c;并带有数字接口的弱磁传感器芯片&#xff0c;应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X 系列磁阻传感器&#xff0c;并附带霍尼韦尔专利的集成电路包括放大…

HMC5883L

霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块&#xff0c;并带有数字接口的弱磁传感器芯片&#xff0c;应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器&#xff0c;并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校…

STM32模拟I2C协议获取HMC5883L电子罗盘磁角度数据 (HAL)

STM32模拟I2C协议获取HMC5883L电子罗盘磁角度数据(HAL) HMC5883L 传感器采用霍尼韦尔各向异性磁阻(AMR)技术&#xff0c;应用于罗盘和三轴磁场角度检测领域&#xff0c;常用于水平物体转动的角度识别。HMC5883L 采用I2C总线接口&#xff0c;2.16~3.6V供电范围&#xff0c;带有…

[11]ESP32+三轴磁罗盘HMC5883L移植与调试

文章目录 一、开发笔记二、初始化与工作流程1. 设置测量模式2. 设置采样率&#xff08;默认15Hz&#xff09;3. 设置测量范围4. 校准5. 开始测量6. 自测试操作&#xff08;可选&#xff09; 三、寄存器表1. 00-配置寄存器A2. 01-配置寄存器B3. 02-模式寄存器4. 09-状态寄存器5.…

STM32 HAL I2C读取HMC5883L磁偏角的实践

STM32 HAL I2C读取HMC5883L磁偏角的实践 源由成果代码头文件 G85HAL.h子文件 G85HAL.C主程序调用配置I2C引脚参考链接 源由 用传统的方式编写I2C总线数据读取&#xff0c;程序代码细碎&#xff0c;不好维护&#xff0c;移植性不好。CUBE MX配置方便灵活&#xff0c;程序架构好…

(二十六)树莓派3B+ 获取HMC5883L的磁场数据

模块介绍 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块&#xff0c;并带有数字接口的弱磁传感器芯片&#xff0c;应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器&#xff0c;并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动…

HMC5883L校准

HMC5883L 磁力计校准 (2015-02-14 11:48:21) 转载▼ 标签&#xff1a; hmc5883 磁力计 校准 分类&#xff1a; 电子技术 这里针对 HMC5883L 磁力计 的校准&#xff0c;做一个简单讲解。欢迎交流&#xff0c;新浪长沙WalkAnt。 先看看这篇文章&#xff1a;http://blo…

STC 51单片机53——电子指南针HMC5883l

#include <REG51.H> #include <math.h> //Keil library #include <stdio.h> //Keil library #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int //使用的端口&#xff0c;请按照以下接线 sbit …

HMC5883l磁力计数据读取

1.数据手册地址 2.芯片介绍 设备的7位地址为0x1e&#xff0c;读地址为0x3d&#xff0c;写地址为0x3c。如图 2.主要需要配置的寄存器有3个。分别是配置寄存器A&#xff08;0x00&#xff09;&#xff0c;配置寄存器B&#xff08;0x01&#xff09;和模式寄存器&#xff08;0x03&…

ESP8266-Arduino编程实例-HMC5883L磁场传感器

HMC5883L磁场传感器 1、HMC5883L介绍 霍尼韦尔 HMC5883L 是一款表面贴装、多芯片模块,专为低场磁场传感而设计,具有数字接口,适用于低成本罗盘和磁力计等应用。 HMC5883L 包括我们先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含放大、自动消磁带驱动器、…

HMC5883L电子罗盘原理及应用,全网最详细~

寄存器配置部分 HMC5883L模块具有两个配置寄存器&#xff0c;配置寄存器A用来配置该装置设置的数据输出速率和测量配置&#xff1b;配置寄存器 B 设置装置的增益。 模式寄存器则是用来设定装置的操作模式&#xff0c;有连续测量模式&#xff0c;单一测量模式和闲置模式等。具…

HMC5883L磁力计使用

一、器件简介 HMC5883L是一款三轴磁场传感器&#xff0c;电子指南针罗盘模块。采用IIC通讯协议。 二、工作原理 传统罗盘用一根被磁化的磁针来感应地球磁场&#xff0c;地球磁场与磁针之间的磁力时磁针转动&#xff0c;直至磁针的两端分别指向地球的磁南极与磁北极。电子罗盘也…

HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)

HMC5883L电子罗盘/指南针实现&#xff0c;附带校准方法&#xff08;附STM32 源码&#xff09; 前言一、寄存器详解1.配置寄存器A2.配置寄存器B3.模式寄存器4.数据寄存器5.状态寄存器6.识别寄存器 二、使用步骤1.STM32CubeMX设置2.初始化3.读取原始数据 三、校准程序四、方位角计…

【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识&#xff0c;再给一个获取磁力计数据的例子&#xff0c;最后讲解HMC5883L磁力计的校准&#xff0c;以及一些使用中的经验。 1&#xff09;HMC5883L磁力计的基础知识 磁力计是用来测量磁场强弱&#xff08;也就…

Web 应用防火墙怎样添加域名

Web 应用防火墙是一款基于 AI 的一站式 Web 业务运营风险防护方案。沉淀了安全大数据检测能力和多年自营业务 Web 安全防护经验。通过 Web 入侵防护、0day 漏洞补丁修复、恶意访问惩罚、云备份防篡改等多维度防御策略全面防护网站的系统及业务安全。 包括四个步骤&#xff1a; …

WEB应用防火墙(WAF启明设备)

1.应用背景 网络安全形式严峻 新型0day漏洞频发 等保2.0 热点需求 行业规范 安全事件 2.产品介绍 1.工作原理 a) 桥模式串行部署于Web服务器前端&#xff0c;对应用层攻击行为进行精确识别和实时阻断&#xff0c;主动而有效的保护 Web应用不被攻击及篡改 b) 单臂代理模…

阿里云服务器接入云盾Web应用防火墙教学

什么是云盾Web应用防火墙&#xff1f; 云盾Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力实现&#xff0c;通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击&#xff0c;过滤海量恶意CC攻击&…

Web应用防火墙和普通防火墙的区别与联系

随着互联网的不断发展&#xff0c;Web应用程序的安全问题日益凸显&#xff0c;各种安全漏洞和攻击手段层出不穷。Web应用防火墙(WAF)作为保障Web应用程序安全的一种有效手段&#xff0c;正在被越来越多的企业所采用。那么&#xff0c;Web应用防火墙到底有什么用呢?web应用防火…

腾某云web应用防火墙-被ban后小技巧绕过

长这样式de 修改xff即可正常访问 &#xff08;X-Forwarded-For Header&#xff09;浏览器插件