eagler8 发表于 2021-1-25 10:12:04

实验开源代码,项目三:通过串口实时绘制电子罗盘方位角的波形

/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
1、安装库:IDE--工具--管理库--搜索“QMC5883L”--安装QMC5883LCompass
2、项目三:通过串口实时绘制电子罗盘方位角的波形
3、实验接线:
QMC5883L-------------- UNO
VCC------------------- 5V
GND------------------- GND
SCL ------------------- A5
SDA------------------- A4
DRDY------------------ N/C
*/

#include <QMC5883LCompass.h>

QMC5883LCompass compass;

void setup() {
Serial.begin(9600);
compass.init();

}

void loop() {
int a;

// 读取罗盘值
compass.read();

// 返回方位角读数
a = compass.getAzimuth();

Serial.print("电子罗盘方位角: ");
Serial.print(a);
Serial.println();

delay(800);
}

eagler8 发表于 2021-1-25 10:14:53

用手转动QMC5883L模块,串口输出的实时波形,数值在0--359°之间波动,简单又直观。

eagler8 发表于 2021-1-25 10:16:38

串口输出的实时数值

eagler8 发表于 2021-1-25 11:07:38

QMC5883L Compass库函数的几个使用要点

1、QMC5883L与Arduino Uno / Nano的连接

VCCO ---- O +5v
GNDO ---- O GND
SCLO ---- O A5
SDAO ---- O A4
DRDY O ---- X NOT CONNECTED

2、入门
首先,在程序顶部包括QMC5883L指南针库。

#include <QMC5883LCompass.h>
QMC5883LCompass compass;

然后在setup()函数中添加:

void setup(){
compass.init();
}

3、获取X,Y或Z轴的数值
要获取X,Y或Z传感器的读数,只需调用所需的功能。

void loop(){
   int x = compass.getX();
   int y = compass.getY();
   int z = compass.getZ();
}

eagler8 发表于 2021-1-25 11:11:45

4、获取方位角的数值

要获取计算出的方位角(罗盘度)值,只需调用getAzimuth();。

void loop(){
   int a = compass.getAzimuth();
}

5、获取方向/方位
QMC5883L指南针库可计算传感器指向的方向范围和方向。您可以调用两个函数。

要获取传感器面向的方向的12点值,可以调用getBearing(azimuth)。这会将罗盘的360度范围划分为12个部分,并按顺时针顺序返回值0-12。在这种情况下,0 = N,4 = E,8 = S,12 =W。如果您希望滚动自己的方向输出功能而不需要计算,则此功能很有用。

void loop(){
   azimuth = compass.getAzimuth();
   byte b = compass.getBearing(azimuth);
}

要获取传感器指向方向的12点文字表示,可以致电getDirection(azimuth);。这将产生一个char数组,其中的字母代表每个方向。由于我们无法返回数组,因此需要通过引用传递值。

void loop(){
   azimuth = compass.getAzimuth();
   char myArray;
   getDirection(myArray, azimuth);
}

如果要打印这些值,可以这样:

void loop(){
   azimuth = compass.getAzimuth();
   char myArray;
   
   getDirection(myArray, azimuth);
   
   Serial.print(myArray);
   Serial.print(myArray);
   Serial.print(myArray);
   Serial.println();
}

eagler8 发表于 2021-1-25 11:35:29

6、更改I2C地址
要在调用compass.setADDR(BYTE_VALUE);之前更改I2C地址呼叫,compass.init();如下所示:

void setup(){
compass.setADDR(BYTE);
compass.init();
}

7、更改模式,数据速率,比例,采样率
您还可以更改QMC5583L芯片的模式,灵敏度,采样率和输出率。等等,只需在调用compass.setMode(MODE, ODR, RNG, OSR);后调用即可compass.init()。请注意,每个值必须是一个字节。设置每个模式的值在预设中,并取自QST QMC5583L数据表。


eagler8 发表于 2021-1-25 11:55:17

8、精细QMC5583L传感器输出
在传感器读数似乎反弹的情况下,平滑可以提供帮助。QMC5883L指南针库使用滚动平均值功能来存储(N)个传感器读数并返回每个轴的平均值。该平均还对方位角和方向输出进行平滑处理。

如果启用,该功能的第二部分将采用内部滚动逐步通过的当前替代和替代,将其从总体上中删除。这可以帮助消除在错误的读数中可能发生的替代的高点和低点。

应该注意的是,内置的平滑功能将导致额外的处理时间。

compass.setSmoothing(STEPS, ADVANCED);

在循环之前启用平滑调用。

步骤:int,使结果平滑的步骤数。1到10的有效值。更高的步长等于更平滑,但处理时间缩短。

*:启用此功能将使平滑效果更好,但处理时间缩短。*

void setup(){
compass.init();
compass.setSmoothing(10, true);
}

eagler8 发表于 2021-1-25 11:58:55

9、校准QMC5583L传感器
QMC5883LCompass库包含校准功能和实用程序大纲,可帮助您校准QMC5883L芯片。校准是一个两步过程。

步骤1:运行校准程序
a、确保已连接QMC5883L芯片。
b、在示例> QMC5883LCOMPASS>校准下找到随附的校准草图。
c、将校准草图上传到您的arduino,然后打开串行监视器。
d、校准过程开始时,通过移动传感器来伴随屏幕上的指示。
c、收集完所有校准数据后,复制副本的代码

compass.setCalibration(-1537, 1266, -1961, 958, -1342, 1492);

可能需要保存它以备将来参考。

步骤2:使用校正资料
a、项目的程序,将然后复制的代码行直接插入到compass.init()调用下方。
b、照常使用QMC5883LCompass库。
建议您使用提供的校准草图来生成传感器的预设和替代,但也可以使用该

compass.setCalibration(X_MIN, X_MAX, Y_MIN, Y_MAX, Z_MIN, Z_MAX);

函数添加自己的预设和替代。

eagler8 发表于 2021-1-25 13:16:00

实验开源代码
项目四:通过串口实时绘制电子罗盘方位(12等分)的波形
说明:实时数值 0 = N,3 = E,6 = S,9 =W

/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
1、安装库:IDE--工具--管理库--搜索“QMC5883L”--安装QMC5883LCompass
2、项目四:通过串口实时绘制电子罗盘方位(12等分)的波形
3、实验接线:
QMC5883L-------------- UNO
VCC------------------- 5V
GND------------------- GND
SCL ------------------- A5
SDA------------------- A4
DRDY------------------ N/C
4、说明:实时数值 0 = N,3 = E,6 = S,9 =W
*/

#include <QMC5883LCompass.h>

QMC5883LCompass compass;

void setup() {
Serial.begin(9600);
compass.init();
}

void loop() {
compass.read();

byte a = compass.getAzimuth();
// 根据方位/方位角的方向,此处的输出将是介于0到11之间的值。
byte b = compass.getBearing(a);

Serial.print("指南针方位: ");
Serial.print(b);
Serial.println();

delay(800);
}

eagler8 发表于 2021-1-25 14:07:58

用手转动QMC5883L模块,串口输出的指南针方位数值变动实时波形

eagler8 发表于 2021-1-25 14:10:40

串口输出的指南针方位数值

页: 1 2 [3]
查看完整版本: 【Arduino】168种传感器模块系列实验(158)---QMC5883L三轴罗盘