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

描述

人类的大脑是由复杂的结构层构建的,这有助于我们成为地球上的主导物种。例如,大脑中的内嗅皮层可以给你方向感,帮助你轻松地在你不熟悉的地方导航。但与我们不同的是,机器人和无人驾驶的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

数字罗盘

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

数字罗盘

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

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

数字罗盘

传感器模块有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和电阻器以整齐的圆形模式放置,并连接轨道以形成连接。完成后,我的设计如下所示。

数字罗盘

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

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

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

数字罗盘

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

数字罗盘

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

组装印刷电路板

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

数字罗盘

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

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

数字罗盘

对阿尔杜伊诺进行编程

现在我们的硬件已经准备就绪,让我们看看必须上传到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。

数字罗盘

程序的最后一部分是设置结果的更新速度。我已经创建了一个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方向

数字罗盘

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分