標(biāo)題: 【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(158)---QMC5883L三軸羅盤(pán) [打印本頁(yè)]
作者: eagler8 時(shí)間: 2021-1-22 21:35
標(biāo)題: 【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(158)---QMC5883L三軸羅盤(pán)
37款傳感器與模塊的提法,在網(wǎng)絡(luò)上廣泛流傳,其實(shí)Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒于本人手頭積累了一些傳感器和執(zhí)行器模塊,依照實(shí)踐出真知(一定要?jiǎng)邮肿觯┑睦砟,以學(xué)習(xí)和交流為目的,這里準(zhǔn)備逐一動(dòng)手試試做實(shí)驗(yàn),不管成功與否,都會(huì)記錄下來(lái)---小小的進(jìn)步或是搞不定的問(wèn)題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+圖形編程+仿真編程)
實(shí)驗(yàn)一百五十八:QMC5883L電子指南針羅盤(pán)模塊 三軸磁場(chǎng)傳感器GY-271
0.jpg (133.65 KB, 下載次數(shù): 122)
下載附件
2021-1-22 21:35 上傳
0-.jpg (105.04 KB, 下載次數(shù): 116)
下載附件
2021-1-22 21:35 上傳
作者: eagler8 時(shí)間: 2021-1-22 21:40
0-- (1).jpg (37.81 KB, 下載次數(shù): 114)
下載附件
2021-1-22 21:40 上傳
QMC5883L
源于Honeywell的HMC5883L,是一款表面貼裝的集成了信號(hào)處理電路的三軸磁性傳感器,應(yīng)用場(chǎng)景主要包括羅盤(pán)、導(dǎo)航、無(wú)人機(jī)、機(jī)器人和手持設(shè)備等一些高精度的場(chǎng)合。HMC5883是霍尼韋爾公司生產(chǎn)的一款地磁場(chǎng)檢測(cè)芯片,其國(guó)產(chǎn)替代產(chǎn)品為QMC5883。這兩種芯片基本相似,QMC 5883也是號(hào)稱(chēng)得到了霍尼韋爾公司的授權(quán)。
作者: eagler8 時(shí)間: 2021-1-23 08:57
QMC5883L特征
(1)霍尼韋爾(中國(guó))QMC5883L是一款表面貼裝多芯片模塊,設(shè)計(jì)用于具有數(shù)字接口的低場(chǎng)磁感應(yīng),適用于低成本指南針和磁力計(jì)等應(yīng)用
(2)結(jié)合低噪聲AMR傳感器的12位ADC在±8高斯場(chǎng)中實(shí)現(xiàn)5毫高斯場(chǎng)分辨率
(3)低電壓運(yùn)行,低功耗; 支持內(nèi)置的自檢
(4)內(nèi)置式皮帶驅(qū)動(dòng)電路,I2C數(shù)字接口,寬磁場(chǎng)范圍(+/- 8 oe)
(5)工作電壓:3.3v-5v; PCB尺寸:1.3 x 2.3厘米(QMC5883L尺寸:3.0 x 3.0 x 0.9毫米),帶有16引腳無(wú)鉛芯片載體(LCC)
0-1.jpg (34.32 KB, 下載次數(shù): 120)
下載附件
2021-1-23 08:57 上傳
作者: eagler8 時(shí)間: 2021-1-23 09:39
QMC5883L內(nèi)部原理圖
01-.jpg (57.11 KB, 下載次數(shù): 113)
下載附件
2021-1-23 09:39 上傳
作者: eagler8 時(shí)間: 2021-1-23 09:57
QMC5883L是一款多芯片三軸磁傳感器。 這個(gè)表面貼裝的小尺寸芯片集成了磁傳感器信號(hào)條件ASIC,面向高精度應(yīng)用,例如無(wú)人機(jī),機(jī)器人,移動(dòng)設(shè)備中的指南針,導(dǎo)航和游戲個(gè)人手持設(shè)備。
QMC5883L基于最新的高分辨率,霍尼韋爾AMR技術(shù)授權(quán)的磁阻技術(shù)。結(jié)合定制設(shè)計(jì)的16位ADC ASIC,它具有以下優(yōu)勢(shì):
低噪聲,高精度,低功耗,偏移消除和溫度補(bǔ)償。 QMC5883L啟用1°至2°指南針航向精度。 I2C串行總線(xiàn)可簡(jiǎn)化接口。QMC5883L位于3x3x0.9mm3中表面貼裝16針焊盤(pán)柵格陣列(LGA)封裝。
功能
1、3x3x0.9 mm3中的3軸磁阻傳感器陸地柵格陣列封裝(LGA),保證在擴(kuò)展的溫度范圍內(nèi)工作-40°C至+85°C。
2、具有低噪聲AMR傳感器的16位ADC實(shí)現(xiàn)2毫高斯場(chǎng)分辨率。
3、寬磁場(chǎng)范圍(±8高斯)。
4、溫度補(bǔ)償數(shù)據(jù)輸出和溫度輸出。
5、具有標(biāo)準(zhǔn)模式和快速模式的I2C接口。
6、寬范圍工作電壓(2.16V至3.6V)和低功耗(75uA)。
7、無(wú)鉛封裝構(gòu)造。
8、提供軟件和算法支持。
優(yōu)點(diǎn)
1、體積小,適用于高度集成的產(chǎn)品。 信號(hào)有已數(shù)字化和校準(zhǔn)。
2、啟用1°至2°度的羅盤(pán)航向精度,允許導(dǎo)航和LBS應(yīng)用。
3、最大化傳感器的完整動(dòng)態(tài)范圍和分辨率。
4、在寬廣的范圍內(nèi)自動(dòng)保持傳感器的靈敏度工作溫度范圍。
5、用于快速數(shù)據(jù)通信的高速接口,最大200Hz數(shù)據(jù)輸出速率。
6、兼容電池供電的應(yīng)用。
7、符合RoHS標(biāo)準(zhǔn)。
8、羅盤(pán)航向,硬鐵,軟鐵和自動(dòng)可用校準(zhǔn)庫(kù)。
0-0.jpg (94.25 KB, 下載次數(shù): 96)
下載附件
2021-1-23 09:57 上傳
作者: eagler8 時(shí)間: 2021-1-23 10:23
QMC5883L封裝3-D視圖
箭頭指示在正常測(cè)量中產(chǎn)生正輸出讀數(shù)的磁場(chǎng)方向組態(tài)。
01----.jpg (33.29 KB, 下載次數(shù): 102)
下載附件
2021-1-23 10:23 上傳
作者: eagler8 時(shí)間: 2021-1-23 10:51
01-0.jpg (139.38 KB, 下載次數(shù): 104)
下載附件
2021-1-23 10:50 上傳
作者: eagler8 時(shí)間: 2021-1-23 10:55
01-2.jpg (82.17 KB, 下載次數(shù): 98)
下載附件
2021-1-23 10:55 上傳
01-------.jpg (46.52 KB, 下載次數(shù): 121)
下載附件
2021-1-23 10:55 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:08
外部連接
雙電源連接
01--------.jpg (64.08 KB, 下載次數(shù): 92)
下載附件
2021-1-23 11:08 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:10
單電源連接
01---------.jpg (60.7 KB, 下載次數(shù): 108)
下載附件
2021-1-23 11:10 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:22
QMC5883L性能
01-3.jpg (42.61 KB, 下載次數(shù): 96)
下載附件
2021-1-23 11:22 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:25
01-4.jpg (119.61 KB, 下載次數(shù): 86)
下載附件
2021-1-23 11:25 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:27
01-5.jpg (119.84 KB, 下載次數(shù): 59)
下載附件
2021-1-23 11:27 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:28
01-6.jpg (75.73 KB, 下載次數(shù): 66)
下載附件
2021-1-23 11:28 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:30
01-7.jpg (91.34 KB, 下載次數(shù): 64)
下載附件
2021-1-23 11:30 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:32
01-8.jpg (31.81 KB, 下載次數(shù): 66)
下載附件
2021-1-23 11:32 上傳
01-9.jpg (89.13 KB, 下載次數(shù): 63)
下載附件
2021-1-23 11:32 上傳
作者: eagler8 時(shí)間: 2021-1-23 11:56
GY-271 QMC5883L模塊 電子指南針羅盤(pán)模塊 三軸磁場(chǎng)傳感器
采用高品質(zhì)沉金pcb,機(jī)器焊接工藝,保證品質(zhì)
名稱(chēng):QMC5883L模塊(三軸磁場(chǎng)模塊)
型號(hào):GY-271使用芯片:QMC5883L
供電電源:3-5v
通信方式:IIC通信協(xié)議
測(cè)量范圍:±1.3-8 高斯
02 (1).jpg (56.46 KB, 下載次數(shù): 84)
下載附件
2021-1-23 11:56 上傳
作者: eagler8 時(shí)間: 2021-1-23 12:01
該模塊包括一個(gè)最新的高分辨率QMC5883X系列磁阻傳感器,一個(gè)包含放大功能的ASIC,自動(dòng)消磁帶驅(qū)動(dòng)器,失調(diào)消除以及一個(gè)12位ADC,可實(shí)現(xiàn)1°至2°的羅盤(pán) 航向精度。 I2C串行總線(xiàn)可簡(jiǎn)化接口。電原理圖如下。
06.jpg (67.01 KB, 下載次數(shù): 65)
下載附件
2021-1-23 12:01 上傳
06-.jpg (148.77 KB, 下載次數(shù): 111)
下載附件
2021-1-23 12:01 上傳
作者: eagler8 時(shí)間: 2021-1-23 12:08
06-0.jpg (83.18 KB, 下載次數(shù): 60)
下載附件
2021-1-23 12:08 上傳
引腳功能
VCC + 5V-電源引腳,給它3.3v-5VDC。 對(duì)于Arduino,建議5v
GND-接地引腳
SDA和SCL-這些是I2C數(shù)據(jù)和時(shí)鐘引腳,用于從模塊向微控制器發(fā)送和接收數(shù)據(jù)。 這些引腳上有1萬(wàn)上拉至3.3v引腳。 您可以將這些引腳連接到5V I2C線(xiàn)路,板上有電平轉(zhuǎn)換器,可將引腳安全降低到3V
DRDY-這是“數(shù)據(jù)就緒”引腳輸出。 如果要高速流傳輸數(shù)據(jù)(每秒超過(guò)100次),則可以在準(zhǔn)備好讀取數(shù)據(jù)時(shí)收聽(tīng)此引腳。 有關(guān)使用DRDY引腳的更多詳細(xì)信息,請(qǐng)參見(jiàn)數(shù)據(jù)表,我們不使用它,因?yàn)槲覀冏x得不快!
Build the circuit
QMC5883L--------------- Uno/Mega2560
VCC------------------- 5V
GND------------------- GND
SCL------------------- A5/ pin21 mega2560
SDA------------------- A4/pin20 mega2560
DRDY------------------ N/C
作者: eagler8 時(shí)間: 2021-1-23 13:37
QMC5883L模塊的幾個(gè)定義:
AMR Bridge:三軸磁性傳感器
MUX:多路復(fù)用通道
PGA:可編程控制的傳感器信號(hào)增益放大器
Signal Conditioning:進(jìn)行磁場(chǎng)信號(hào)校正及補(bǔ)償?shù)臄?shù)字模塊
ADC:16位的模數(shù)轉(zhuǎn)換器
I2C:總線(xiàn)形式
NVM:用于校正的非易失性存儲(chǔ)器
SET/RST Driver:用于初始化磁性傳感器的內(nèi)部驅(qū)動(dòng)
Reference:用于內(nèi)部偏移的電壓/電流基準(zhǔn)
Clock Gen.:內(nèi)部振蕩器,用于內(nèi)部操作
POR:上電復(fù)位
Temperature Sensor:用于內(nèi)部精度/偏移的溫度傳感器,也可以用于測(cè)量溫度并輸出
QMC5883L有兩種工作模式:連續(xù)測(cè)量模式和待命模式。
08.jpg (73.06 KB, 下載次數(shù): 72)
下載附件
2021-1-23 13:37 上傳
作者: eagler8 時(shí)間: 2021-1-23 13:42
QMC5883L模塊實(shí)驗(yàn)接線(xiàn)示意圖
07.jpg (123.22 KB, 下載次數(shù): 70)
下載附件
2021-1-23 13:42 上傳
作者: eagler8 時(shí)間: 2021-1-23 14:14
11.jpg (138.38 KB, 下載次數(shù): 66)
下載附件
2021-1-23 14:14 上傳
作者: eagler8 時(shí)間: 2021-1-24 19:05
項(xiàng)目一:簡(jiǎn)易測(cè)量方位角度的實(shí)驗(yàn)開(kāi)源代碼
- /*
- 【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+圖形編程+仿真編程)
- 實(shí)驗(yàn)一百五十八:QMC5883L電子指南針羅盤(pán)模塊 三軸磁場(chǎng)傳感器GY-271
- 1、安裝庫(kù):IDE--工具--管理庫(kù)--搜索“QMC5883L”--安裝QMC5883LCompass
- 2、項(xiàng)目一:簡(jiǎn)易測(cè)量方位角度
- 3、實(shí)驗(yàn)接線(xiàn):
- 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;
- // 讀取羅盤(pán)值
- compass.read();
- // 返回方位角讀數(shù)
- a = compass.getAzimuth();
- Serial.print("A: ");
- Serial.print(a);
- Serial.println();
- delay(500);
- }
復(fù)制代碼
作者: eagler8 時(shí)間: 2021-1-24 19:12
實(shí)驗(yàn)串口返回情況
12.jpg (34.75 KB, 下載次數(shù): 75)
下載附件
2021-1-24 19:12 上傳
作者: eagler8 時(shí)間: 2021-1-24 19:25
實(shí)驗(yàn)場(chǎng)景圖
13.jpg (90.38 KB, 下載次數(shù): 58)
下載附件
2021-1-24 19:25 上傳
作者: eagler8 時(shí)間: 2021-1-24 20:14
項(xiàng)目二:簡(jiǎn)易測(cè)量方位角度的實(shí)驗(yàn)開(kāi)源代碼(數(shù)值在0-11之間,每個(gè)數(shù)值間隔30度)
- /*
- 【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+圖形編程+仿真編程)
- 實(shí)驗(yàn)一百五十八:QMC5883L電子指南針羅盤(pán)模塊 三軸磁場(chǎng)傳感器GY-271
- 1、安裝庫(kù):IDE--工具--管理庫(kù)--搜索“QMC5883L”--安裝QMC5883LCompass
- 2、項(xiàng)目二:簡(jiǎn)易測(cè)量方位角度(數(shù)值在0-11之間,每個(gè)數(shù)值間隔30度)
- 3、實(shí)驗(yàn)接線(xiàn):
- 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() {
- compass.read();
- byte a = compass.getAzimuth();
- // 根據(jù)方位/方位角的方向,此處的輸出將是介于0到11之間的值。
- byte b = compass.getBearing(a);
-
- Serial.print("B: ");
- Serial.print(b);
- Serial.println();
-
- delay(250);
- }
復(fù)制代碼
作者: eagler8 時(shí)間: 2021-1-24 20:26
實(shí)驗(yàn)串口返回情況
14.jpg (30.72 KB, 下載次數(shù): 79)
下載附件
2021-1-24 20:26 上傳
作者: eagler8 時(shí)間: 2021-1-24 20:46
知識(shí)點(diǎn):方位角
又稱(chēng)地平經(jīng)度(Azimuth angle,縮寫(xiě)為Az),是在平面上量度物體之間的角度差的方法之一。是從某點(diǎn)的指北方向線(xiàn)起,依順時(shí)針?lè)较虻侥繕?biāo)方向線(xiàn)之間的水平夾角,用“度”和“密位”表示。常用于判定方位、指示目標(biāo)和保持行進(jìn)方向。
從真子午線(xiàn)起算的為真方位角,通常在精密測(cè)量中使用,從磁子午線(xiàn)起算的方磁方位角,在航空、航海、炮兵射擊、軍隊(duì)行進(jìn)時(shí)廣泛使用,從地形圖的坐標(biāo)縱線(xiàn)起算的為坐標(biāo)方位角,炮兵使用較多。磁方位角與真方位角的關(guān)系式為:磁方位角=真方位角-(±磁偏角)。坐標(biāo)方位角與磁方位角的關(guān)系式為:坐標(biāo)方位角=磁方位角+ (±磁坐偏角)。
從標(biāo)準(zhǔn)方向的北端起,順時(shí)針?lè)较虻街本(xiàn)的水平角稱(chēng)為該直線(xiàn)的方位角。以北點(diǎn)為起算點(diǎn),由北點(diǎn)開(kāi)始按順時(shí)針?lè)较蛴?jì)量。方位角的取值范圍為0~360度,北點(diǎn)為0°,東點(diǎn)為90°,南點(diǎn)為180°,西點(diǎn)為270°。
09.jpg (63.88 KB, 下載次數(shù): 56)
下載附件
2021-1-24 20:46 上傳
作者: eagler8 時(shí)間: 2021-1-24 21:05
QMC5883L Compass是一個(gè)Arduino庫(kù),用于將QMC5583L系列模塊使用指南針(電子羅盤(pán))功能。支持:
1、獲取XYZ軸的值。
2、計(jì)算方位角。
3、獲得16點(diǎn)方位角軸承方向(0-15)。
4、獲取16點(diǎn)方位角軸承名稱(chēng)(N,NNE,NE,ENE,E,ESE,SE,SSE,S,SSW,SW,WSW,W,WNW,NW,NNW)
5、通過(guò)滾動(dòng)平均和最小/最大消除來(lái)平滑XYZ讀數(shù)。
6、任選的芯片組模式。
QMC5883LCompass.cpp 庫(kù)文件
- /*
- ===============================================================================================================
- QMC5883LCompass.h
- Library for using QMC5583L series chip boards as a compass.
- Learn more at [https://github.com/mprograms/QMC5883LCompass]
- Supports:
- - Getting values of XYZ axis.
- - Calculating Azimuth.
- - Getting 16 point Azimuth bearing direction (0 - 15).
- - Getting 16 point Azimuth bearing Names (N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW)
- - Smoothing of XYZ readings via rolling averaging and min / max removal.
- - Optional chipset modes (see below)
- ===============================================================================================================
- v1.0 - June 13, 2019
- Written by MRPrograms
- Github: [https://github.com/mprograms/]
- Release under the GNU General Public License v3
- [https://www.gnu.org/licenses/gpl-3.0.en.html]
- ===============================================================================================================
- FROM QST QMC5883L Datasheet [https://nettigo.pl/attachments/440]
- -----------------------------------------------
- MODE CONTROL (MODE)
- Standby 0x00
- Continuous 0x01
- OUTPUT DATA RATE (ODR)
- 10Hz 0x00
- 50Hz 0x04
- 100Hz 0x08
- 200Hz 0x0C
- FULL SCALE (RNG)
- 2G 0x00
- 8G 0x10
- OVER SAMPLE RATIO (OSR)
- 512 0x00
- 256 0x40
- 128 0x80
- 64 0xC0
-
- */
- #include "Arduino.h"
- #include "QMC5883LCompass.h"
- #include <Wire.h>
- QMC5883LCompass::QMC5883LCompass() {
- }
- /**
- INIT
- Initialize Chip - This needs to be called in the sketch setup() function.
-
- @since v0.1;
- **/
- void QMC5883LCompass::init(){
- Wire.begin();
- _writeReg(0x0B,0x01);
- setMode(0x01,0x0C,0x10,0X00);
- }
- /**
- SET ADDRESS
- Set the I2C Address of the chip. This needs to be called in the sketch setup() function.
-
- @since v0.1;
- **/
- // Set I2C Address if different then default.
- void QMC5883LCompass::setADDR(byte b){
- _ADDR = b;
- }
- /**
- REGISTER
- Write the register to the chip.
-
- @since v0.1;
- **/
- // Write register values to chip
- void QMC5883LCompass::_writeReg(byte r, byte v){
- Wire.beginTransmission(_ADDR);
- Wire.write(r);
- Wire.write(v);
- Wire.endTransmission();
- }
- /**
- CHIP MODE
- Set the chip mode.
-
- @since v0.1;
- **/
- // Set chip mode
- void QMC5883LCompass::setMode(byte mode, byte odr, byte rng, byte osr){
- _writeReg(0x09,mode|odr|rng|osr);
- }
- /**
- RESET
- Reset the chip.
-
- @since v0.1;
- **/
- // Reset the chip
- void QMC5883LCompass::setReset(){
- _writeReg(0x0A,0x80);
- }
- // 1 = Basic 2 = Advanced
- void QMC5883LCompass::setSmoothing(byte steps, bool adv){
- _smoothUse = true;
- _smoothSteps = ( steps > 10) ? 10 : steps;
- _smoothAdvanced = (adv == true) ? true : false;
- }
- /**
- SET CALIBRATION
- Set calibration values for more accurate readings
-
- @author Claus Näveke - TheNitek [https://github.com/TheNitek]
-
- @since v1.1.0
- **/
- void QMC5883LCompass::setCalibration(int x_min, int x_max, int y_min, int y_max, int z_min, int z_max){
- _calibrationUse = true;
- _vCalibration[0][0] = x_min;
- _vCalibration[0][1] = x_max;
- _vCalibration[1][0] = y_min;
- _vCalibration[1][1] = y_max;
- _vCalibration[2][0] = z_min;
- _vCalibration[2][1] = z_max;
- }
- /**
- READ
- Read the XYZ axis and save the values in an array.
-
- @since v0.1;
- **/
- void QMC5883LCompass::read(){
- Wire.beginTransmission(_ADDR);
- Wire.write(0x00);
- int err = Wire.endTransmission();
- if (!err) {
- Wire.requestFrom(_ADDR, (byte)6);
- _vRaw[0] = (int)(int16_t)(Wire.read() | Wire.read() << 8);
- _vRaw[1] = (int)(int16_t)(Wire.read() | Wire.read() << 8);
- _vRaw[2] = (int)(int16_t)(Wire.read() | Wire.read() << 8);
- if ( _calibrationUse ) {
- _applyCalibration();
- }
-
- if ( _smoothUse ) {
- _smoothing();
- }
-
- //byte overflow = Wire.read() & 0x02;
- //return overflow << 2;
- }
- }
- /**
- APPLY CALIBRATION
- This function uses the calibration data provided via @see setCalibration() to calculate more
- accurate readings
-
- @author Claus Näveke - TheNitek [https://github.com/TheNitek]
-
- Based on this awesome article:
- https://appelsiini.net/2018/calibrate-magnetometer/
-
- @since v1.1.0
-
- **/
- void QMC5883LCompass::_applyCalibration(){
- int x_offset = (_vCalibration[0][0] + _vCalibration[0][1])/2;
- int y_offset = (_vCalibration[1][0] + _vCalibration[1][1])/2;
- int z_offset = (_vCalibration[2][0] + _vCalibration[2][1])/2;
- int x_avg_delta = (_vCalibration[0][1] - _vCalibration[0][0])/2;
- int y_avg_delta = (_vCalibration[1][1] - _vCalibration[1][0])/2;
- int z_avg_delta = (_vCalibration[2][1] - _vCalibration[2][0])/2;
- int avg_delta = (x_avg_delta + y_avg_delta + z_avg_delta) / 3;
- float x_scale = (float)avg_delta / x_avg_delta;
- float y_scale = (float)avg_delta / y_avg_delta;
- float z_scale = (float)avg_delta / z_avg_delta;
- _vCalibrated[0] = (_vRaw[0] - x_offset) * x_scale;
- _vCalibrated[1] = (_vRaw[1] - y_offset) * y_scale;
- _vCalibrated[2] = (_vRaw[2] - z_offset) * z_scale;
- }
- /**
- SMOOTH OUTPUT
- This function smooths the output for the XYZ axis. Depending on the options set in
- @see setSmoothing(), we can run multiple methods of smoothing the sensor readings.
-
- First we store (n) samples of sensor readings for each axis and store them in a rolling array.
- As each new sensor reading comes in we replace it with a new reading. Then we average the total
- of all (n) readings.
-
- Advanced Smoothing
- If you turn advanced smoothing on, we will select the min and max values from our array
- of (n) samples. We then subtract both the min and max from the total and average the total of all
- (n - 2) readings.
-
- NOTE: This function does several calculations and can cause your sketch to run slower.
-
- @since v0.3;
- **/
- void QMC5883LCompass::_smoothing(){
- byte max = 0;
- byte min = 0;
-
- if ( _vScan > _smoothSteps - 1 ) { _vScan = 0; }
-
- for ( int i = 0; i < 3; i++ ) {
- if ( _vTotals[i] != 0 ) {
- _vTotals[i] = _vTotals[i] - _vHistory[_vScan][i];
- }
- _vHistory[_vScan][i] = ( _calibrationUse ) ? _vCalibrated[i] : _vRaw[i];
- _vTotals[i] = _vTotals[i] + _vHistory[_vScan][i];
-
- if ( _smoothAdvanced ) {
- max = 0;
- for (int j = 0; j < _smoothSteps - 1; j++) {
- max = ( _vHistory[j][i] > _vHistory[max][i] ) ? j : max;
- }
-
- min = 0;
- for (int k = 0; k < _smoothSteps - 1; k++) {
- min = ( _vHistory[k][i] < _vHistory[min][i] ) ? k : min;
- }
-
- _vSmooth[i] = ( _vTotals[i] - (_vHistory[max][i] + _vHistory[min][i]) ) / (_smoothSteps - 2);
- } else {
- _vSmooth[i] = _vTotals[i] / _smoothSteps;
- }
- }
-
- _vScan++;
- }
- /**
- GET X AXIS
- Read the X axis
-
- @since v0.1;
- @return int x axis
- **/
- int QMC5883LCompass::getX(){
- return _get(0);
- }
- /**
- GET Y AXIS
- Read the Y axis
-
- @since v0.1;
- @return int y axis
- **/
- int QMC5883LCompass::getY(){
- return _get(1);
- }
- /**
- GET Z AXIS
- Read the Z axis
-
- @since v0.1;
- @return int z axis
- **/
- int QMC5883LCompass::getZ(){
- return _get(2);
- }
- /**
- GET SENSOR AXIS READING
- Get the smoothed, calibration, or raw data from a given sensor axis
-
- @since v1.1.0
- @return int sensor axis value
- **/
- int QMC5883LCompass::_get(int i){
- if ( _smoothUse )
- return _vSmooth[i];
-
- if ( _calibrationUse )
- return _vCalibrated[i];
- return _vRaw[i];
- }
- /**
- GET AZIMUTH
- Calculate the azimuth (in degrees);
-
- @since v0.1;
- @return int azimuth
- **/
- int QMC5883LCompass::getAzimuth(){
- int a = atan2( getY(), getX() ) * 180.0 / PI;
- return a < 0 ? 360 + a : a;
- }
- /**
- GET BEARING
- Divide the 360 degree circle into 16 equal parts and then return the a value of 0-15
- based on where the azimuth is currently pointing.
-
- @since v1.0.1 - function now requires azimuth parameter.
- @since v0.2.0 - initial creation
-
- @return byte direction of bearing
- */
- byte QMC5883LCompass::getBearing(int azimuth){
- unsigned long a = azimuth / 22.5;
- unsigned long r = a - (int)a;
- byte sexdec = 0;
- sexdec = ( r >= .5 ) ? ceil(a) : floor(a);
- return sexdec;
- }
- /**
- This will take the location of the azimuth as calculated in getBearing() and then
- produce an array of chars as a text representation of the direction.
-
- NOTE: This function does not return anything since it is not possible to return an array.
- Values must be passed by reference back to your sketch.
-
- Example:
-
- ( if direction is in 1 / NNE)
-
- char myArray[3];
- compass.getDirection(myArray, azimuth);
-
- Serial.print(myArray[0]); // N
- Serial.print(myArray[1]); // N
- Serial.print(myArray[2]); // E
-
-
- @see getBearing();
-
- @since v1.0.1 - function now requires azimuth parameter.
- @since v0.2.0 - initial creation
- */
- void QMC5883LCompass::getDirection(char* myArray, int azimuth){
- int d = getBearing(azimuth);
- myArray[0] = _bearings[d][0];
- myArray[1] = _bearings[d][1];
- myArray[2] = _bearings[d][2];
- }
復(fù)制代碼
作者: eagler8 時(shí)間: 2021-1-24 21:07
QMC5883LCompass.h 庫(kù)文件
- #ifndef QMC5883L_Compass
- #define QMC5883L_Compass
- #include "Arduino.h"
- #include "Wire.h"
- class QMC5883LCompass{
-
- public:
- QMC5883LCompass();
- void init();
- void setADDR(byte b);
- void setMode(byte mode, byte odr, byte rng, byte osr);
- void setSmoothing(byte steps, bool adv);
- void setCalibration(int x_min, int x_max, int y_min, int y_max, int z_min, int z_max);
- void setReset();
- void read();
- int getX();
- int getY();
- int getZ();
- int getAzimuth();
- byte getBearing(int azimuth);
- void getDirection(char* myArray, int azimuth);
-
- private:
- void _writeReg(byte reg,byte val);
- int _get(int index);
- bool _smoothUse = false;
- byte _smoothSteps = 5;
- bool _smoothAdvanced = false;
- byte _ADDR = 0x0D;
- int _vRaw[3] = {0,0,0};
- int _vHistory[10][3];
- int _vScan = 0;
- long _vTotals[3] = {0,0,0};
- int _vSmooth[3] = {0,0,0};
- void _smoothing();
- bool _calibrationUse = false;
- int _vCalibration[3][2];
- int _vCalibrated[3];
- void _applyCalibration();
- const char _bearings[16][3] = {
- {' ', ' ', 'N'},
- {'N', 'N', 'E'},
- {' ', 'N', 'E'},
- {'E', 'N', 'E'},
- {' ', ' ', 'E'},
- {'E', 'S', 'E'},
- {' ', 'S', 'E'},
- {'S', 'S', 'E'},
- {' ', ' ', 'S'},
- {'S', 'S', 'W'},
- {' ', 'S', 'W'},
- {'W', 'S', 'W'},
- {' ', ' ', 'W'},
- {'W', 'N', 'W'},
- {' ', 'N', 'W'},
- {'N', 'N', 'W'},
- };
-
-
-
- };
- #endif
復(fù)制代碼
作者: eagler8 時(shí)間: 2021-1-25 10:12
實(shí)驗(yàn)開(kāi)源代碼,
項(xiàng)目三:通過(guò)串口實(shí)時(shí)繪制電子羅盤(pán)方位角的波形
- /*
- 【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+圖形編程+仿真編程)
- 實(shí)驗(yàn)一百五十八:QMC5883L電子指南針羅盤(pán)模塊 三軸磁場(chǎng)傳感器GY-271
- 1、安裝庫(kù):IDE--工具--管理庫(kù)--搜索“QMC5883L”--安裝QMC5883LCompass
- 2、項(xiàng)目三:通過(guò)串口實(shí)時(shí)繪制電子羅盤(pán)方位角的波形
- 3、實(shí)驗(yàn)接線(xiàn):
- 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;
- // 讀取羅盤(pán)值
- compass.read();
- // 返回方位角讀數(shù)
- a = compass.getAzimuth();
- Serial.print("電子羅盤(pán)方位角: ");
- Serial.print(a);
- Serial.println();
- delay(800);
- }
復(fù)制代碼
作者: eagler8 時(shí)間: 2021-1-25 10:15
用手轉(zhuǎn)動(dòng)QMC5883L模塊,串口輸出的實(shí)時(shí)波形,數(shù)值在0--359°之間波動(dòng),簡(jiǎn)單又直觀。
16.jpg (63.47 KB, 下載次數(shù): 71)
下載附件
2021-1-25 10:15 上傳
作者: eagler8 時(shí)間: 2021-1-25 10:17
串口輸出的實(shí)時(shí)數(shù)值
15.jpg (70.74 KB, 下載次數(shù): 64)
下載附件
2021-1-25 10:17 上傳
作者: eagler8 時(shí)間: 2021-1-25 11:07
QMC5883L Compass庫(kù)函數(shù)的幾個(gè)使用要點(diǎn)
1、QMC5883L與Arduino Uno / Nano的連接
VCC O ---- O +5v
GND O ---- O GND
SCL O ---- O A5
SDA O ---- O A4
DRDY O ---- X NOT CONNECTED
2、入門(mén)
首先,在程序頂部包括QMC5883L指南針庫(kù)。
#include <QMC5883LCompass.h>
QMC5883LCompass compass;
然后在setup()函數(shù)中添加:
void setup(){
compass.init();
}
3、獲取X,Y或Z軸的數(shù)值
要獲取X,Y或Z傳感器的讀數(shù),只需調(diào)用所需的功能。
void loop(){
int x = compass.getX();
int y = compass.getY();
int z = compass.getZ();
}
作者: eagler8 時(shí)間: 2021-1-25 11:11
4、獲取方位角的數(shù)值
要獲取計(jì)算出的方位角(羅盤(pán)度)值,只需調(diào)用getAzimuth();。
void loop(){
int a = compass.getAzimuth();
}
5、獲取方向/方位
QMC5883L指南針庫(kù)可計(jì)算傳感器指向的方向范圍和方向。您可以調(diào)用兩個(gè)函數(shù)。
要獲取傳感器面向的方向的12點(diǎn)值,可以調(diào)用getBearing(azimuth)。這會(huì)將羅盤(pán)的360度范圍劃分為12個(gè)部分,并按順時(shí)針順序返回值0-12。在這種情況下,0 = N,4 = E,8 = S,12 =W。如果您希望滾動(dòng)自己的方向輸出功能而不需要計(jì)算,則此功能很有用。
void loop(){
azimuth = compass.getAzimuth();
byte b = compass.getBearing(azimuth);
}
要獲取傳感器指向方向的12點(diǎn)文字表示,可以致電getDirection(azimuth);。這將產(chǎn)生一個(gè)char數(shù)組[3],其中的字母代表每個(gè)方向。由于我們無(wú)法返回?cái)?shù)組,因此需要通過(guò)引用傳遞值。
void loop(){
azimuth = compass.getAzimuth();
char myArray[3];
getDirection(myArray, azimuth);
}
如果要打印這些值,可以這樣:
void loop(){
azimuth = compass.getAzimuth();
char myArray[3];
getDirection(myArray, azimuth);
Serial.print(myArray[0]);
Serial.print(myArray[1]);
Serial.print(myArray[2]);
Serial.println();
}
作者: eagler8 時(shí)間: 2021-1-25 11:35
6、更改I2C地址
要在調(diào)用compass.setADDR(BYTE_VALUE);之前更改I2C地址呼叫,compass.init();如下所示:
void setup(){
compass.setADDR(BYTE);
compass.init();
}
7、更改模式,數(shù)據(jù)速率,比例,采樣率
您還可以更改QMC5583L芯片的模式,靈敏度,采樣率和輸出率。等等,只需在調(diào)用compass.setMode(MODE, ODR, RNG, OSR);后調(diào)用即可compass.init()。請(qǐng)注意,每個(gè)值必須是一個(gè)字節(jié)。設(shè)置每個(gè)模式的值在預(yù)設(shè)中,并取自QST QMC5583L數(shù)據(jù)表。
17.jpg (66.81 KB, 下載次數(shù): 79)
下載附件
2021-1-25 11:35 上傳
作者: eagler8 時(shí)間: 2021-1-25 11:55
8、精細(xì)QMC5583L傳感器輸出
在傳感器讀數(shù)似乎反彈的情況下,平滑可以提供幫助。QMC5883L指南針庫(kù)使用滾動(dòng)平均值功能來(lái)存儲(chǔ)(N)個(gè)傳感器讀數(shù)并返回每個(gè)軸的平均值。該平均還對(duì)方位角和方向輸出進(jìn)行平滑處理。
如果啟用,該功能的第二部分將采用內(nèi)部滾動(dòng)逐步通過(guò)的當(dāng)前替代和替代,將其從總體上中刪除。這可以幫助消除在錯(cuò)誤的讀數(shù)中可能發(fā)生的替代的高點(diǎn)和低點(diǎn)。
應(yīng)該注意的是,內(nèi)置的平滑功能將導(dǎo)致額外的處理時(shí)間。
compass.setSmoothing(STEPS, ADVANCED);
在循環(huán)之前啟用平滑調(diào)用。
步驟:int,使結(jié)果平滑的步驟數(shù)。1到10的有效值。更高的步長(zhǎng)等于更平滑,但處理時(shí)間縮短。
*:?jiǎn)⒂么斯δ軐⑹蛊交Ч茫幚頃r(shí)間縮短。*
void setup(){
compass.init();
compass.setSmoothing(10, true);
}
作者: eagler8 時(shí)間: 2021-1-25 11:59
9、校準(zhǔn)QMC5583L傳感器
QMC5883LCompass庫(kù)包含校準(zhǔn)功能和實(shí)用程序大綱,可幫助您校準(zhǔn)QMC5883L芯片。校準(zhǔn)是一個(gè)兩步過(guò)程。
步驟1:運(yùn)行校準(zhǔn)程序
a、確保已連接QMC5883L芯片。
b、在示例> QMC5883LCOMPASS>校準(zhǔn)下找到隨附的校準(zhǔn)草圖。
c、將校準(zhǔn)草圖上傳到您的arduino,然后打開(kāi)串行監(jiān)視器。
d、校準(zhǔn)過(guò)程開(kāi)始時(shí),通過(guò)移動(dòng)傳感器來(lái)伴隨屏幕上的指示。
c、收集完所有校準(zhǔn)數(shù)據(jù)后,復(fù)制副本的代碼
compass.setCalibration(-1537, 1266, -1961, 958, -1342, 1492);
可能需要保存它以備將來(lái)參考。
步驟2:使用校正資料
a、項(xiàng)目的程序,將然后復(fù)制的代碼行直接插入到compass.init()調(diào)用下方。
b、照常使用QMC5883LCompass庫(kù)。
建議您使用提供的校準(zhǔn)草圖來(lái)生成傳感器的預(yù)設(shè)和替代,但也可以使用該
compass.setCalibration(X_MIN, X_MAX, Y_MIN, Y_MAX, Z_MIN, Z_MAX);
函數(shù)添加自己的預(yù)設(shè)和替代。
作者: eagler8 時(shí)間: 2021-1-25 13:16
實(shí)驗(yàn)開(kāi)源代碼
項(xiàng)目四:通過(guò)串口實(shí)時(shí)繪制電子羅盤(pán)方位(12等分)的波形
說(shuō)明:實(shí)時(shí)數(shù)值 0 = N,3 = E,6 = S,9 =W
- /*
- 【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+圖形編程+仿真編程)
- 實(shí)驗(yàn)一百五十八:QMC5883L電子指南針羅盤(pán)模塊 三軸磁場(chǎng)傳感器GY-271
- 1、安裝庫(kù):IDE--工具--管理庫(kù)--搜索“QMC5883L”--安裝QMC5883LCompass
- 2、項(xiàng)目四:通過(guò)串口實(shí)時(shí)繪制電子羅盤(pán)方位(12等分)的波形
- 3、實(shí)驗(yàn)接線(xiàn):
- QMC5883L-------------- UNO
- VCC------------------- 5V
- GND------------------- GND
- SCL ------------------- A5
- SDA------------------- A4
- DRDY------------------ N/C
- 4、說(shuō)明:實(shí)時(shí)數(shù)值 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();
- // 根據(jù)方位/方位角的方向,此處的輸出將是介于0到11之間的值。
- byte b = compass.getBearing(a);
-
- Serial.print("指南針?lè)轿? ");
- Serial.print(b);
- Serial.println();
-
- delay(800);
- }
復(fù)制代碼
作者: eagler8 時(shí)間: 2021-1-25 14:08
用手轉(zhuǎn)動(dòng)QMC5883L模塊,串口輸出的指南針?lè)轿粩?shù)值變動(dòng)實(shí)時(shí)波形
19.jpg (65.1 KB, 下載次數(shù): 65)
下載附件
2021-1-25 14:08 上傳
作者: eagler8 時(shí)間: 2021-1-25 14:11
串口輸出的指南針?lè)轿粩?shù)值
20.jpg (60.6 KB, 下載次數(shù): 233)
下載附件
2021-1-25 14:11 上傳
作者: 春陰釀寒 時(shí)間: 2021-3-18 16:18
準(zhǔn)確度怎么樣
作者: bynaruto 時(shí)間: 2021-6-14 18:13
very professionnel, thank you it's really useful
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |