如何利用HMC5883L实现三轴磁力计的设计

描述

  在中,你可以使用 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);
}
//从寄存器 0x​​03 到 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);
}
//从寄存器 0x​​03 到 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 | 温度;
 }
}

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

全部0条评论

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

×
20
完善资料,
赚取积分