4 有用
1 下载

使用Arduino构建指南针

文件列表(压缩包大小 74.83K)

免费

概述

需要的元件

  • Arduino UNO

  • HM5883L磁传感器

  • LCD1602显示屏

    part-00726-2604
  • 杜邦线

  • 面包板

  • Arduino IDE

原理及流程

介绍

有人用机器人技术开发项目,而最大的问题之一是确定他们的导航方向。换句话说,机器人在环境中移动,但是系统不知道其确切方向,这暗示了其需要导航过程

作为解决方案,许多人采用GPS设备来协助确定方向。但是,由于其商业财务价值,该项目变得更加昂贵,并且无法使用它仅确定导航方向。

在这种情况下,理想的是使用磁力计传感器。它具有从项目的低财务投资中确定指导方向的能力。这样,你将能够确定机器人的导航方向。

在本文中,你将学习如何使用Arduino构建自己的数字指南针。通过它,你将能够了解HMC5883L传感器的完整操作,并检测其方向。

此外,你还将学习如何构建自己的电子罗盘并与Arduino一起使用。下图显示了数字指南针的印刷电路板。

bussola_pq9VlFshg8

数字罗盘的印刷电路板。

因此,在本文结尾,你将学到以下几点

  • 用Arduino创建数字罗盘;
  • HMC5883L传感器的操作;
  • 用Arduino创建Compass印刷电路板;
  • 使用Arduino赢得Compass印刷电路板文件。

项目发展

该项目将分为三个重要阶段:指南针印刷电路板的构造,带有HMC5883L传感器的Arduino电路以及Arduino的代码,以控制印刷电路板上的数字指南针。

首先,我们将介绍数字罗盘电路的结构。接下来,我们将介绍Arduino和HMC5883L磁力计传感器电路结构

最后,我们将提供一个基本程序来控制印刷电路板上的数字罗盘。

1.数字指南针印刷电路板的开发

要开始开发数字罗盘的印刷电路板,必须开发具有8个LED和9针公连接器的电路。

每个LED代表罗盘玫瑰的特定方向。该电路如下图所示。

schematic_bussolaarduino_sheet_1_20200131160012_2DtsD9AqFA

数字罗盘的电子原理图。

电子原理图构建完成后,便开发了电子板。PCB设计如下图所示。

pcb_pcb_2020-01-24_09_58_51_20200131162156_cO5S9bUW6b

数字罗盘的印刷电路板。

完成电子板项目的构建后,我们可以在下图看到其结构。

rosa2_x04i0FDb9K

罗盘PCB

现在,我将向你展示如何使用Arduino和HMC5883L传感器构建电路。通过该电路,我们将能够检测机器人的方向,然后激活罗盘玫瑰的特定LED 。

2.使用HMC5883L传感器进行Arduino的电路开发

在下面的电路中,我们介绍了与HMC5883L传感器连接的Arduino Nano 。

所述HMC5883L传感器负责从北检测方向南,然后阿尔杜伊诺将接收和处理这些信息。

从那里,Arduino将触发D2到D9的输出之一。这些输出将连接到步骤1中开发的板。

因此,每个LED将代表一个特定的方向。电子原理图如下图所示。

bussola_bb_WKPRbYrMZW

Arduino和传感器HMC5883L的电子原理图。

现在,我们将介绍上述项目的编程。

3. Arduino编程项目

首先,我们介绍项目编程的完整逻辑。

#include <Wire.h> //Biblioteca de Comunicacao I2C
#include <MechaQMC5883.h> //Biblioteca do Sensor QMC5883 - Modulo GY-273

MechaQMC5883 bussola; //Criacao do objeto para o sensor

int x = 0, y = 0, z = 0;
int angulo = 0;

void setup()
{
    Wire.begin(); //Inicializacao da Comunicacao I2C
    Serial.begin(9600); //Inicializacao da comunicacao Serial
    bussola.init(); //Inicializando o Sensor QMC5883
    for(byte pino = 2; pino <= 9; pino++)
    {
     pinMode(pino, OUTPUT);
    }
}

void loop()
{

  bussola.read(&x,&y,&z); //Obter o valor dos eixos X, Y e Z do Sensor
  angulo = atan2(x, y)/0.0174532925; //Calculo do angulo usando os eixos X e Y atraves     da formula

//Ajuste do angulo entre 0 e 360 graus
if(angulo < 0)
angulo+=360;
angulo = 360-angulo;

Serial.println(angulo); //Imprime o valor do angulo na Serial do Arduino
//Apresentando o sentido com base no angulo encontrado

if (angulo > 338 || angulo < 22)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Norte");
}

if (angulo > 22 && angulo < 68)
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Nordeste");
}

if (angulo > 68 && angulo < 113)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Leste");
}

if (angulo > 113 && angulo < 158)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Suldeste");
}

if (angulo > 158 && angulo < 203)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Sul");
}

if (angulo > 203 && angulo < 248)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Suldoste");
}

if (angulo > 248 && angulo < 293)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
Serial.println("Oeste");
}

if (angulo > 293 && angulo < 338)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
Serial.println("Noroeste");
}

delay(500); //Delay de 500 ms entre novas leituras
}

现在,我们将开始讨论代码的每个部分。

首先,我们声明库,即“ bussola”对象,然后声明程序变量。代码区域如下所示。

#include <Wire.h> //Biblioteca de Comunicacao I2C
#include <MechaQMC5883.h> //Biblioteca do Sensor QMC5883 - Modulo GY-273

MechaQMC5883 bussola; //Criacao do objeto para o sensor

int x = 0, y = 0, z = 0;
int angulo = 0;

之后,我们进入功能void setup。在其中,我们初始化串行和I2C通信,然后初始化磁力计传感器。

最后,我们将数字引脚2到9设置为输出。这些引脚将用于驱动印刷电路板上的LED。该部分代码如下所示。

void setup()
{
    Wire.begin(); //Inicializacao da Comunicacao I2C
    Serial.begin(9600); //Inicializacao da comunicacao Serial
    bussola.init(); //Inicializando o Sensor QMC5883
    for(byte pino = 2; pino <= 9; pino++)
    {
     pinMode(pino, OUTPUT);
    }
}

在完全执行void setup函数之后,我们将进入void循环函数。在此功能中,将执行项目的主要逻辑。

首先,我们读取传感器的x,y和z轴,然后执行到角度计算的转换。

bussola.read(&x,&y,&z); //Obter o valor dos eixos X, Y e Z do Sensor
  angulo = atan2(x, y)/0.0174532925; //Calculo do angulo usando os eixos X e Y atraves     da formula

随后,我们将角度值转换为0到360度之间的值范围。调整计算在以下条件下给出。

//Ajuste do angulo entre 0 e 360 graus
if(angulo < 0)
angulo+=360;
angulo = 360-angulo;

因此,根据获得的角度的计算,我们将在以下条件下应用该值。每个角度值代表一个不同的方向。

这样,根据当前角度,它将触发数字罗盘上的LED 。

if (angulo > 338 || angulo < 22)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Norte");
}

if (angulo > 22 && angulo < 68)
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Nordeste");
}

if (angulo > 68 && angulo < 113)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Leste");
}

if (angulo > 113 && angulo < 158)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Suldeste");
}

if (angulo > 158 && angulo < 203)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Sul");
}

if (angulo > 203 && angulo < 248)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
Serial.println("Suldoste");
}

if (angulo > 248 && angulo < 293)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
Serial.println("Oeste");
}

if (angulo > 293 && angulo < 338)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
Serial.println("Noroeste");
}

delay(500); //Delay de 500 ms entre novas leituras
}

因此,通过该系统,可以设计自己的机器人引导系统。

PCB文件已给出。

最后

所有需要的文件在下载区均可找到。

via:https://www.hackster.io/322974/the-3-steps-for-you-to-build-your-compass-with-arduino-56ebc6

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈

评论(0)

0/250