在中,你可以使用 HMC5883L 三轴力计测量这个地球磁场的大小和方向。
介绍
在这个中,我们的 HMC5883L 3 项目设备可以测量地球将磁力计连接到 Arduino 方向。 Uno。它是一种以低轴设备中的设备,可以在手机或导航中,找到提供准确的您航还可以使用它们来检测含铁(含铁)金属,因为金属中的铁在靠近传感器的时候会改变磁场。
别迷路,让我们开始吧!
204像素LCD
与16x2 LCD相比,20x4 LCD每行增加了两行。与我们在之前的项目中使用的16x2类似,204LCD使用日立x,因此命令和接口也是一样的。具有相同的 16 针接头,允许您在不更改任何接线的情况下拔下 16x2 LCD 并插入 20x4。我们列唯一需要的是一行代码 lcd.begin(20, 4),它指定 LCD 的(第一个个)和行(第二个参数)。20x4 LCD 的图像如下所示:
HMC5883L 三轴磁力计
HMC5883L 3轴磁力计可以精确测量地球在x、y、z的大小和方向。是一款外形类似的低调设备,可以让您将其插入到几乎任何需要指南的项目中。下面提供了一些不同的规格:
设备 HMC 的 5 分 DR 板和 5 分 DR 的数据线组成: VIN、DY、SCL 组成的数据线(如图所示)该模块在 2.7V 至 6.5V 的电压工作,但我们无法让磁力计在 5V 电压下工作,因此我们建议使用 3Vdc 范围内的连接模块。电压。
为了使用与部署设备通信的方式,我们使用 CL 和 S 的 I2C 来配置设备上的交付模式和输出模式),并获取 X Y 和 Z 。该0x1 0x1 设备进行7 次编排,因此在IE2C 处设备上进行多个。
DR(但您的数据)用于传输(Uno X、Y和Z向主设备的数据已发送)17月7日。DR DY DY,可以通过使用频率到达目的地。您可以访问可以在这个目的地连接到这个目的地,但不能在这个目的地中使用有效的地权。
该设备在其这些 3 个轴的每个轴上装有一个电阻器,用于测量下磁场变化。在磁场存在的情况下,元件的电阻会发生变化,从而导致输出电压发生变化。器件的 12 位 ADC 在每个轴上测量,然后将测量结果写入相应的 X、Y 和 Z 8 位数据。
下面这张表要显示屏幕显示我们的屏幕显示价值。在屏幕上的屏幕显示我们的屏幕。 IC的数据表:
当您必须围绕 X、Y 和 Z 轴旋转设备时,各个轴的结构发生变化,使之如图所示。
将磁力计安装到您的图标。您将需要一个 M2 角支架、M2 螺栓和 M2 允许以六角支架来安装它。这个 XY 平面与提供垂直方向,并保持Adapticon您可以使用正确的计算盘航向您的燃料罐,因此可以向您使用准确的计算盘。确保有色金属磁安装的硬件围绕着 Z 轴显示。
我们将把 12 英寸跨接线连接到上面,我们就可以在左右方向连接设备这样自由。
无焊面包板
您如果使用的是无焊面包板,请使用下面的示意图为 16×2 LCD 进行必要的连接。磁力计通过 12 英寸 F/M 跳线直接连接到 Uno。我们使用 Uno 的3V电源,是Fuel的3V而不是3能够实现。因为公头针的0.1英寸间距太近,将测试夹线电缆安装
注:16×4液晶显示,但需要2×4液晶显示与中图。
如果您连接
到 Fuel Can 的悬空制作,请继续操作。您需要的天线和两个接地板为您提供测试使用接线夹,+5个接地线的接地线。用于为 LCD 供电。
计算机,USB的A端插入USB1型,使用,将B端未连接型插入USB1型连接的端头。 6‘A A型连接器 - 外部连接器插入(即主机)。 AC-DC 电源为 FuelCan 供电。
函数首先必须从setOperatingMode
()和设备通信中使用setOperatingMode()和设备通信,因此请在我们的设备上使用setOperatingMode()进行配置,以将数据操作模式设置为连续,将每个测量输出的平均样本数设置为 8 个。其他所有内容都将保留默认值。
现在已经配置好了,我们可以开始使用函数getXYZ()获取原始X、Y和Z数据。这个函数获取X、Y和Z的每一个16位数据。getXYZ()中的Wire.requestFrom()函数用于请求 6 个字节的数据。
X、 和 Z 的值,为了使用 Y 函数convert(用于测量我们转换为高的单位)。必须进行转换,必须使用 IC 数据表格的原始值表 9(用于使用 1090 的大小,我们可以用一个简单的缩放比例,将我们的每一个镜头都以高标准的比例分配给我们。
在我们将数据输出到设备之前,可以用它来计算出设备的最后一个方向。 () 完成。了解切是在 (X, Y) 点和 x 轴之间计算的,如下图所示。我们的原因是能够计算出所有象限的使用情况。
atan2弧度角度,因此我们可以将其转换为度数。 360我们可以删除360。并且航向数据已经归化,我们可以通过现在已经展示给它计算。
//将 HMC5883L 3 轴数字罗盘连接到 Arduino Uno
/*Copyright (c) 2019, ProteShea LLC
保留所有权利。 如果满足以下条件,则允许
以源代码和二进制形式重新分发和使用,无论是否修改: 1. 重新分发源代码必须保留上述版权 声明、此条件列表和以下免责声明。 2. 二进制形式的再分发必须在 随分发提供的文档和/或其他材料中复制上述版权 声明、此条件列表和以下免责声明。 3. 既不是版权持有人的姓名,也不是
未经事先书面许可,其贡献者的姓名可用于认可或推广
源自本软件的产品。
本软件由版权持有人“按原样”提供,
不提供任何明示或默示的保证,包括但不限于对
适销性和特定用途适用性的默示保证
。在任何情况下,版权所有者均不对任何
直接、间接、偶然、特殊、惩戒性或后果性损害
(包括但不限于采购替代商品或服务;
使用、数据或利润或业务损失)负责中断)无论是由何种原因造成的,
以及基于任何责任理论,无论是合同、严格责任或侵权
(包括疏忽或其他原因)以任何方式因使用本
软件而引起的,即使已被告知存在此类损害的可能性。
*/
#include
//寄存器地址映射
#define configA 0x00
#define configB 0x01
#define mode 0x02
#define dataOutX_U 0x03
#define dataOutX_L 0x04
#define dataOutZ_L 0x05
#define dataOutZ_L 0x06
#define dataOutY_L 0x07
#define dataOutY_L 0x08
#define statusReg 0x09
//工作模式发送到模式寄存器(0x02)
#define Continuous 0x00
#define single 0x01
#define idle 0x02
#define i2c_addr 0x1E
#define gain 1090
int16_t x = 0;
int16_t y = 0;
int16_t z = 0;
浮动航向;
浮动高斯X;
浮动高斯Y;
浮动高斯Z;
void setup() {
Wire.begin();
序列号.开始(9600);
设置操作模式(连续);
集合样本();
}
无效循环() {
getXYZ();
转换(x,y,z);
获取航向(高斯X,高斯Y,高斯Z);
Serial.print("X:");
Serial.print(gaussX);
Serial.print("Y:");
串行打印(高斯Y);
Serial.print("Z:");
Serial.println(gaussZ);
Serial.print("标题:");
Serial.println(标题);
延迟(500);
}
//将原始X、Y、Z计数转换为高斯
void convert(int16_t rawX, int16_t rawY, int16_t rawZ){
gaussX = (float)rawX/gain;
gaussY = (float)rawY/gain;
gaussZ = (float)rawZ/增益;
}
//考虑磁偏角(取决于位置的磁场误差)
void getHeading(float X, float Y, float Z){
heading = (atan2(Y,X) - 0.1) * 180 / PI;
如果 (标题 < 0) 标题 += 360;
如果(标题> 360)标题-= 360;
}
void setSamples(void){
Wire.beginTransmission(i2c_addr);
Wire.write(configA);//写入配置A寄存器
Wire.write(0x70);//8个样本平均,15Hz输出速率,正常测量
Wire.endTransmission();
延迟(10);
}
void setOperatingMode(uint8_t addr){
Wire.beginTransmission(i2c_addr);
Wire.write(模式);//写入模式寄存器
Wire.write(addr);//设置测量模式
Wire.endTransmission();
延迟(10);
}
//从寄存器 0x03 到 0x08 获取 X、Y、Z 的原始计数
void getXYZ(void){
Wire.beginTransmission(i2c_addr);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(i2c_addr, 6);
if (Wire.available() >= 6){
int16_t temp = Wire.read();//读取X的高字节
x = temp << 8;
temp = Wire.read();//读取X的低字节
x = x |温度;
temp = Wire.read();//读取 Z 的高字节
z = temp << 8;
temp = Wire.read();//读取 Z 的低字节
z = z |温度;
temp = Wire.read();//读取 Y 的高字节
y = temp << 8;
temp = Wire.read();//读取 Y 的低字节
y = y |温度;
}
}
下一个示例通过调用函数writeLCD()在20×4 LCD上显示数据。
//将 HMC5883L 3 轴数字罗盘连接到 Arduino Uno 并
在 20x4 LCD 上显示 //数据
/*版权 (c) 2019,ProteShea LLC
保留所有权利。 如果满足以下条件,则允许
以源代码和二进制形式重新分发和使用,无论是否修改: 1. 重新分发源代码必须保留上述版权 声明、此条件列表和以下免责声明。 2. 二进制形式的再分发必须在 随分发提供的文档和/或其他材料中复制上述版权 声明、此条件列表和以下免责声明。 3. 既不是版权持有人的姓名,也不是
未经事先书面许可,其贡献者的姓名可用于认可或推广
源自本软件的产品。
本软件由版权持有人“按原样”提供,
不提供任何明示或默示的保证,包括但不限于对
适销性和特定用途适用性的默示保证
。在任何情况下,版权所有者均不对任何
直接、间接、偶然、特殊、惩戒性或后果性损害
(包括但不限于采购替代商品或服务;
使用、数据或利润或业务损失)负责中断)无论是由何种原因造成的,
以及基于任何责任理论,无论是合同、严格责任或侵权
(包括疏忽或其他原因)以任何方式因使用本
软件而引起的,即使已被告知存在此类损害的可能性。
*/
#include
#include
//寄存器地址映射
#define configA 0x00
#define configB 0x01
#define mode 0x02
#define dataOutX_U 0x03
#define dataOutX_L 0x04
#define dataOutZ_L 0x05
#define dataOutZ_L 0x06
#define dataOutY_L 0x07
#define dataOutY_L 0x08
#define statusReg 0x09
//操作模式发送到模式寄存器(0x02)
#define Continuous 0x00
#define single 0x01
#define idle 0x02
#define i2c_addr 0x1E
#define gain 1090
const int RS = 2, EN = 3, D4 = 4, D5 = 5, D6 = 6, D7 = 7;
LiquidCrystal lcd(RS,EN,D4,D5,D6,D7);//设置连接到 LCD 的 Uno 引脚,4 位模式
int16_t x = 0;
int16_t y = 0;
int16_t z = 0;
浮动航向;
浮动高斯X;
浮动高斯Y;
浮动高斯Z;
void setup() {
Wire.begin();
lcd.开始(20,4);//设置20列4行20x4 LCD
setOperatingMode(continuous);
集合样本();
}
无效循环() {
getXYZ();
转换(x,y,z);
获取航向(高斯X,高斯Y,高斯Z);
写液晶显示器();
延迟(500);
}
无效写入液晶显示器(无效){
lcd.clear();
lcd.print("X:");
lcd.print(高斯X);
lcd.setCursor(0,1);
lcd.print("Y:");
lcd.print(高斯);
lcd.setCursor(0,2);
lcd.print("Z:");
lcd.print(高斯Z);
lcd.setCursor(0,3);
lcd.print("标题:");
lcd.print(标题);
}
//将原始X、Y、Z计数转换为高斯
void convert(int16_t rawX, int16_t rawY, int16_t rawZ){
gaussX = (float)rawX/gain;
gaussY = (float)rawY/gain;
gaussZ = (float)rawZ/增益;
}
//考虑磁偏角(取决于位置的磁场误差)
void getHeading(float X, float Y, float Z){
航向 = (atan2(Y,X) - 0.1) * 180 / PI;
如果 (标题 < 0) 标题 += 360;
如果(标题> 360)标题-= 360;
}
void setSamples(void){
Wire.beginTransmission(i2c_addr);
Wire.write(configA);//写入配置A寄存器
Wire.write(0x70);//8 个样本平均,15Hz 输出速率,正常测量
Wire.endTransmission();
延迟(10);
}
void setOperatingMode(uint8_t addr){
Wire.beginTransmission(i2c_addr);
Wire.write(模式);//写入模式寄存器
Wire.write(addr);//设置测量模式
Wire.endTransmission();
延迟(10);
}
//从寄存器 0x03 到 0x08 获取 X、Y、Z 的原始计数
void getXYZ(void){
Wire.beginTransmission(i2c_addr);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(i2c_addr, 6);
if (Wire.available() >= 6){
int16_t temp = Wire.read();//读取X的高字节
x = temp << 8;
temp = Wire.read();//读取X的低字节
x = x |温度;
temp = Wire.read();//读取 Z 的高字节
z = temp << 8;
temp = Wire.read();//读取 Z 的低字节
z = z |温度;
temp = Wire.read();//读取 Y 的高字节
y = temp << 8;
temp = Wire.read();//读取 Y 的低字节
y = y |温度;
}
}
-
三轴磁力计
+关注
关注
0文章
7浏览量
8374 -
HMC5883L
+关注
关注
0文章
25浏览量
15015
发布评论请先 登录
相关推荐
评论