使用Arduino构建指南针
文件列表(压缩包大小 74.83K)
免费
概述
Arduino UNO
HM5883L磁传感器
LCD1602显示屏
杜邦线
面包板
Arduino IDE
有人用机器人技术开发项目,而最大的问题之一是确定他们的导航方向。换句话说,机器人在环境中移动,但是系统不知道其确切方向,这暗示了其需要导航过程。
作为解决方案,许多人采用GPS设备来协助确定方向。但是,由于其商业财务价值,该项目变得更加昂贵,并且无法使用它仅确定导航方向。
在这种情况下,理想的是使用磁力计传感器。它具有从项目的低财务投资中确定指导方向的能力。这样,你将能够确定机器人的导航方向。
在本文中,你将学习如何使用Arduino构建自己的数字指南针。通过它,你将能够了解HMC5883L传感器的完整操作,并检测其方向。
此外,你还将学习如何构建自己的电子罗盘并与Arduino一起使用。下图显示了数字指南针的印刷电路板。
数字罗盘的印刷电路板。
因此,在本文结尾,你将学到以下几点:
该项目将分为三个重要阶段:指南针印刷电路板的构造,带有HMC5883L传感器的Arduino电路以及Arduino的代码,以控制印刷电路板上的数字指南针。
首先,我们将介绍数字罗盘电路的结构。接下来,我们将介绍Arduino和HMC5883L磁力计传感器的电路结构。
最后,我们将提供一个基本程序来控制印刷电路板上的数字罗盘。
要开始开发数字罗盘的印刷电路板,必须开发具有8个LED和9针公连接器的电路。
每个LED代表罗盘玫瑰的特定方向。该电路如下图所示。
数字罗盘的电子原理图。
电子原理图构建完成后,便开发了电子板。PCB设计如下图所示。
数字罗盘的印刷电路板。
完成电子板项目的构建后,我们可以在下图看到其结构。
罗盘PCB
现在,我将向你展示如何使用Arduino和HMC5883L传感器构建电路。通过该电路,我们将能够检测机器人的方向,然后激活罗盘玫瑰的特定LED 。
在下面的电路中,我们介绍了与HMC5883L传感器连接的Arduino Nano 。
所述HMC5883L传感器负责从北检测方向南,然后阿尔杜伊诺将接收和处理这些信息。
从那里,Arduino将触发D2到D9的输出之一。这些输出将连接到步骤1中开发的板。
因此,每个LED将代表一个特定的方向。电子原理图如下图所示。
Arduino和传感器HMC5883L的电子原理图。
现在,我们将介绍上述项目的编程。
首先,我们介绍项目编程的完整逻辑。
#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)