0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

构建一个很酷数字罗盘的教程分享

科技观察员 来源:circuitdigest 作者:阿斯温斯·拉吉 2022-10-28 16:59 次阅读

人类的大脑是由复杂的结构层构建的,这有助于我们成为地球上的主导物种。例如,大脑中的内嗅皮层可以给你方向感,帮助你轻松地在你不熟悉的地方导航。但与我们不同的是,机器人无人驾驶的Ariel车辆需要一些东西来获得这种方向感,这样它们就可以在新的地形和景观中自主操纵。不同的机器人使用不同类型的传感器来实现这一点,但常用的传感器是磁力计,它可以通知机器人当前面向的地理图形方向。这不仅可以帮助机器人感知方向,还可以在预定义的方向和天使中轮流。

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

阿尔杜伊诺指南针项目所需材料

阿尔杜伊诺专业迷你版

HMC5883L磁力计传感器

LED 灯 - 8 否

470欧姆电阻器 – 8Nos

桶杰克

像PCB戈这样的可靠印刷电路板制造商

小型 FTDI 编程

个人电脑/笔记本电脑

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

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

磁力计实际上是一种设备,可以感应地球的磁极,并据此指向方向。我们都知道,地球是巨大的球形磁铁,有北极和南极。因此存在磁场。磁力计感测这个磁场,并根据磁场的方向,它可以检测我们面临的方向。

HMC5883L传感器模块的工作原理

HMC5883L作为磁力计传感器也做同样的事情。它上面有霍尼韦尔的HMC5883L IC。该 IC 具有 3 种磁阻材料,其内部排列在 x、y 和 z 轴上。流经这些材料的电流量对地球磁场很敏感。因此,通过测量流经这些材料的电流的变化,我们可以检测到地球磁场的变化。一旦变化被磁场吸收,这些值就可以通过I2C协议发送到任何嵌入式控制器,如微控制器或处理器

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

HMC5883L 与 QMC5883L 之间的区别

对于许多初学者来说,围绕这些传感器存在一种常见的困惑。这是因为一些供应商(实际上是大多数供应商)销售QMC5883L传感器,而不是霍尼韦尔的原始HMC5883L。这主要是因为QMC5883L比HMC5883L模块便宜得多。可悲的是,这两个传感器的工作原理略有不同,并且不能将相同的代码用于两者。这是因为两个传感器的 I2C 地址不相同。本教程中给出的代码仅适用于常用传感器模块 QMC5883L

pYYBAGNbmfWACd0_AABst202x4Y650.jpg

要知道您拥有的是哪种型号的传感器,您只需仔细观察IC本身即可阅读其上写的内容。如果它写成类似L883的东西,那么它就是HMC58836L,如果它写成DA5883之类的东西,那么它就是QMC5883L IC。这两个模块都如下图所示,以便于轻描淡写。

poYBAGNbmfmAIDfJAAD6zzLIPUA795.png

阿尔杜伊诺数字罗盘电路图

这款基于Arduino的数字罗盘的电路非常简单,我们只需将HMC5883L传感器与Arduino接口,并将8个LED连接到Arduino Pro mini的GPIO引脚。完整的电路图如下所示

poYBAGNbmUuACxWUAAJYGUKtbKY325.png

传感器模块有5个引脚,其中DRDY(数据就绪)在我们的项目中未使用,因为我们在连续模式下操作传感器。Vcc 和接地引脚用于从 Arduino 板以 5V 电压为模块供电。SCL 和 SDA 是 I2C 通信总线,分别连接到 Arduino Pro 迷你版的 A4 和 A5 I2C 引脚。由于模块本身在线路上有一个拉高电阻,因此无需在外部添加它们。

为了指示方向,我们使用了8个LED,所有这些LED都通过470欧姆的限流电阻连接到Arduino的GPIO引脚。完整电路由一个 9V 电池通过桶形插孔供电。该 9V 直接提供给 Arduino 的 Vin 引脚,在那里使用 Arduino 上的板载稳压器将其调节至 5V。然后,该5V用于为传感器和Arduino供电。

为数字罗盘制造 PCB

电路的想法是将8个LED以圆形方式放置,以便每个LED分别指向所有8个方向,即北,东北,东,东南,南,西南,西和西北。因此,将它们整齐地排列在面包板上甚至性能板上并不容易。为该电路开发PCB将使其看起来更整洁,更易于使用。因此,我打开PCB设计软件,将LED和电阻器以整齐的圆形模式放置,并连接轨道以形成连接。完成后,我的设计如下所示。

pYYBAGNbmfuAYYW_AABojnnW2tM462.png

我将其设计为双面板,因为我希望Arduino位于PCB的底部,这样它就不会破坏PCB顶部的外观。如果你担心你必须为双面PCB支付高价,那么请坚持住我得到了很好的新来。

现在,我们的设计已经准备就绪,是时候将它们制造出来了。要完成PCB非常容易,只需按照以下步骤操作即可

第 1 步: 进入 www.pcbgogo.com,如果这是您的第一次注册。然后,在“PCB 原型”选项卡中,输入 PCB 的尺寸、层数和所需的 PCB 数量。我的PCB是80厘米×80厘米,所以标签看起来像下面这样

poYBAGNbmf2AZlK2AABI4Ym4tDg942.png

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

pYYBAGNbmf-AXpoIAABKisTeaAM856.png

第 3 步:最后一步是上传Gerber文件并继续付款。为了确保过程顺利进行,PCBGOGO在继续付款之前验证您的Gerber文件是否有效。通过这种方式,您可以确保您的PCB是制造友好的,并将按照承诺到达您手中。

组装印刷电路板

订购电路板后,几天后,它到达了我,尽管快递在一个整齐的标签包装良好的盒子里,并且一如既往地,PCB的质量很棒。我在下面分享了几张板的图片供您判断。

poYBAGNbmgGAUXjmAACbwK8K27U214.jpg

我打开焊条,开始组装电路板。由于脚印、焊盘、过孔和丝网印刷的形状和尺寸都非常合适,因此我在组装电路板时没有问题。从拆开包装盒开始,电路板在短短10分钟内就准备好了。

焊接后的电路板的几张图片如下所示。

poYBAGNbmgOAZ7ujAACtgsDFinM804.jpg

对阿尔杜伊诺进行编程

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

数字罗盘项目的完整代码可在本页末尾找到。您可以在包含库后直接将其上传到您的板上,然后就可以开始了。但是,如果您想进一步了解代码中实际发生的情况。

如前所述,我们使用的是QMC5883L IC,为了与IC通信,我们需要知道其寄存器的I2C地址,该地址可以在其数据表中找到。但幸运的是,所有这些都已经完成,并被一个叫做Keeping的人打包成一个图书馆。因此,您所要做的就是通过单击链接下载QMC5883L的库以获取ZIP文件。然后,可以通过按照草图 ->包含库 -> 添加.ZIP库,将此 ZIP 文件添加到 Arduino IDE 中。

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

#include //Wire Librarey for I2C communication

#include //QMC5883 Librarey is added since mine is QMC583 and not HMC5883

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

MechaQMC5883 qmc; //Create an object name for the snsor, I have named it as qmc

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

int 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

空隙设置功能中,我们初始化 I2C 通信、串行通信和传感器。然后,我们将所有LED引脚声明为输出引脚。由于我们已经使用了数组,因此通过使用 for 循环并在 for 循环中导航来引用所有引脚,如下所示。

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

}

}

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

int x,y,z;

qmc.read(&x,&y,&z); //Get the values of X,Y and Z from sensor

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

int heading=atan2(x, y)/0.0174532925; //Calculate the degree using X and Y parameters with this formulae

//Convert result into 0 to 360

if(heading < 0)

heading+=360;

heading = 360-heading;

最后一步是向北方向发光。为此,我们有一系列if条件语句,我们检查当前度数的范围,并据此打开LED。代码如下所示

//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);

}

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

poYBAGNbmaKAT7l9AABy4NKZAY4909.png

程序的最后一部分是设置结果的更新速度。我已经创建了一个500毫微秒的延迟,然后使所有LED关闭以再次启动,形成第一个内部的空隙路。但是,如果您需要更快的更新,则可以进一步减少延迟。

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);

}

测试数字罗盘

由于我们已经使用了Arduino pro mini,我们需要一个像FTDI板这样的外部程序员来上传程序。上传程序后,您应该注意到板上有一个LED发光,LED发光的方向将是NORTH方向

pYYBAGNbmgaARdBOAACRSXZo_5U444.jpg

然后,您可以通过旋转电路板来玩它,并检查LED是否仍然指向北方向。之后,您可以随时使用9V电池为设置供电并检查您面临的方向。数字罗盘的完整工作原理可以在下面的视频中找到。您可能会注意到,当电路板附近有重金属片时,或者即使您沿着Z轴旋转电路板,这些值也会出错。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2549

    文章

    50817

    浏览量

    752405
  • 数字罗盘
    +关注

    关注

    1

    文章

    12

    浏览量

    14958
  • 磁力计
    +关注

    关注

    1

    文章

    71

    浏览量

    20847
收藏 人收藏

    评论

    相关推荐

    基于Arduino构建自动饮水机

    在这个项目中,我们将使用Arduino构建自动饮水机和电磁阀,当玻璃杯靠近它时,它可以自动给你水。听起来
    的头像 发表于 11-09 16:22 3034次阅读
    基于Arduino<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>自动饮水机

    HMC5883 数字罗盘算法优化

    目前本人手里有数字罗盘产品,当初设计人员对于数字罗盘没有增加算法或许涉及不深,导致产品使用过程中经常稳定性比较差,目前硬件产品现有,需要的是改动软件算法,有兴趣请联系我产品
    发表于 05-21 17:38

    如何用STM32实现电子罗盘

    项目需要用STM32实现电子罗盘,我已经移植了ucgui,该如何实现了?比较令我头疼的是问题有:(1)如何实现在表盘中非水平(随着角度不同有定的倾斜)显示刻度?(2)如何实现表盘
    发表于 10-27 22:55

    使用Arduino构建个数字罗盘

    方向。在本文中,您将学习如何使用 Arduino 构建自己的数字罗盘。通过它,您将能够了解HMC5883L传感器的完整操作,来检测它的方位方向。此外,您将学习如何构建自己的电子
    发表于 08-25 06:11

    报话式罗盘

    报话式罗盘   报话式罗盘主要霍尔效应方位
    发表于 09-17 17:56 535次阅读
    报话式<b class='flag-5'>罗盘</b>

    ST推出MEMS数字罗盘模块

    ST推出MEMS数字罗盘模块 意法半导体在单模块内集成3轴数字加速计和
    发表于 01-16 08:37 947次阅读

    什么是电子罗盘/数字罗盘

    什么是电子罗盘/数字罗盘     电子罗盘,也叫数字
    发表于 01-29 10:11 3497次阅读

    HMR3000数字罗盘的读数程序

    HMR3000数字罗盘的读数程序,感兴趣的小伙伴们可以看看。
    发表于 08-23 16:23 29次下载

    digilentPmodCMPS:三轴数字罗盘简介

    Pmod CMPS使用了霍尼韦尔的HMC5883L三轴数字罗盘,并且可以向任何带有I2C接口的Digilent主板上添加罗盘航向读数。
    的头像 发表于 12-02 10:18 2619次阅读
    digilentPmodCMPS:三轴<b class='flag-5'>数字</b><b class='flag-5'>罗盘</b>简介

    digilent三轴数字罗盘介绍

    Digilent Pmod CMPS2是一款数字罗盘模块,基于 Memsic 的 MMC34160PJ 磁力计设计。
    的头像 发表于 12-02 11:19 3024次阅读
    digilent三轴<b class='flag-5'>数字</b><b class='flag-5'>罗盘</b>介绍

    电子罗盘在终端设备上有着怎样的应用

    电子罗盘在终端的应用 电子罗盘在人们日常生活中最常用的产品手机指南针。手机电子罗盘就是手机软件也是手机的
    发表于 06-15 11:35 889次阅读

    电子罗盘在终端的应用

    电子罗盘在终端的应用 电子罗盘在人们日常生活中最常用的产品手机指南针。手机电子罗盘就是手机软件也是手机的
    发表于 03-23 11:37 1369次阅读

    电子罗盘是什么_电子罗盘工作原理

    电子罗盘,是利用地磁场来定北极的种方法。古代称为罗经,现代利用先进加工工艺生产的磁阻传感器为罗盘数字化提供了有力的帮助。现在般有用磁阻
    的头像 发表于 02-01 15:15 1.5w次阅读

    Arduino数字罗盘模块

    电子发烧友网站提供《Arduino数字罗盘模块.zip》资料免费下载
    发表于 08-02 14:23 1次下载
    Arduino<b class='flag-5'>数字</b><b class='flag-5'>罗盘</b>模块

    如何构建触摸传感器电路?

    在本项目中,您将构建触摸传感器电路。这是很酷且简单的电路,可让您通过手指触摸来控制LED
    的头像 发表于 06-29 14:39 2083次阅读
    如何<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>触摸传感器电路?