GY—86很牛X的一個模塊_第1頁
GY—86很牛X的一個模塊_第2頁
GY—86很牛X的一個模塊_第3頁
GY—86很牛X的一個模塊_第4頁
GY—86很牛X的一個模塊_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、在我們的之前的博文中,我們講過一模塊arduIMU 9DOF的使用,現(xiàn)在稍稍升級下,今天來個10DOF的!光從包含傳感器的種類上看,其實他們的區(qū)別不是很大,只是10DOF上包含了9DOF上沒有的氣壓傳感器BMP085,只是10DOF模塊上不再有MCU了-一純粹的傳感器集模塊!下面就開始介紹 一、模塊簡介模塊板上集成了四種傳感器,分別是加速度傳感器ADXL345、磁場強度傳感器HMC5883L、三軸陀螺儀ITG3205,氣壓傳感器BMP085,給您帶來10維的測量空間,它們彼此串聯(lián)在一起,這樣在工作時能夠補償彼此的缺陷,同時在使用算法濾波時也給您提供了一個清晰的方向。如果應(yīng)用在機器人、無人駕駛機

2、、自動汽車、圖像穩(wěn)定系統(tǒng)中它將會是強有力的控制器,這將不僅會大大簡化您的設(shè)計,而且在控制效果方面也很令人滿意! 還是先來看看模塊長啥樣吧模塊較小,結(jié)構(gòu)緊湊!二、模塊的一些特征1、模塊結(jié)構(gòu)緊湊、尺寸小!2、預(yù)留了兩個安裝孔,方便安裝3、集成了加速度傳感器ADXL3454、集成了磁場強度傳感器HMC5883L5、集成了三軸陀螺儀ITG32056、集成了氣壓傳感器BMP0857、3.3V供電8、I2C接口通信三、板載傳感器的簡單介紹 _ADXL345:是一款小而薄的超低功耗3軸加速度計,分辨率高(13位),測量范圍達(dá)± 16g。數(shù)字輸出數(shù)據(jù)為16位二進(jìn)制補碼格式,可通過SPI(3線或4線)

3、或I2C數(shù)字接口訪問。ADXL345非常適合移動設(shè)備應(yīng)用,它可以在傾斜檢測應(yīng)用中測量靜態(tài)重力加速度,還可以測量運動或沖擊導(dǎo)致的動態(tài)加速度,其高分辨率(3.9mg/LSB),能夠測量不到1.0°的傾斜角度變化。HMC5883L:是一款帶數(shù)字接口的弱磁傳感器芯片,主要應(yīng)用于低成本羅盤和磁場檢測領(lǐng)域,包括最先進(jìn)的高分辨率HMC118X系列磁阻傳感器,并附帶霍尼韋爾專利的集成電路包括放大器、自動消磁轉(zhuǎn)換器、偏差校準(zhǔn)、能使羅盤精度控制在1° 到 2°的12位模數(shù)轉(zhuǎn)換器,簡易的I2C總線接口。采用霍尼韋爾各向異性磁阻(AMR)技術(shù);ITG3205:輸出為數(shù)字量,三個整合之16

4、-bit的模數(shù)轉(zhuǎn)換器(ADCs),提供陀螺儀同步取樣,且不需額外的多任務(wù)器(multiplexer)。一個用戶可選擇的內(nèi)部的數(shù)字低通濾波器,并可編程改變其帶寬,并帶有快速模式(400KHZ)的I2C接口。此外,它還嵌入了溫度傳感器和精度為2%的內(nèi)部晶振。BMP085:高精度、低功耗的氣壓傳感器,在一些先進(jìn)的移動設(shè)備中都有應(yīng)用。它的測量范圍300 - 1100hPa,并且其絕對精度2.5hPa,噪聲干擾僅有0.03hPa。它的尺寸很小,采用LCC封裝,通過I2C接口能很好的與移動設(shè)備中微控制器連接。四、模塊使用指南具體的引腳功能,模塊板上都有絲印!下面是它與Arduino主控板的連接原理圖由于采

5、用的是I2C接口,他們之間的連接也很簡單。說到I2C接口,我們不得不注意了:I2C器件地址的問題!下面是該模塊對應(yīng)個傳感器的I2C地址(這在程序設(shè)計中將會用到)ADXL345: 0x53ITG3205: 0x68BMP085: 0x77HMC5883L: 0x1E話不多說,現(xiàn)在都躍躍欲試了,好像知道它會給我們帶來怎樣的體驗! 五、模塊演示演示前的準(zhǔn)備1、Arduino控制器 × 1 2、USB數(shù)據(jù)線 × 1 3、10DOF模塊 × 1按照上面的原理圖先接好演示電路先準(zhǔn)備好測試代碼#include <Wire.h> / 包含I2C庫文件;#include

6、 <HMC5883L.h> /包含HMC5883L的庫文件;HMC5883L compass; /定義類變量;int error = 0; /記錄電子羅盤可能出現(xiàn)的錯誤;#define BMP085_ADDRESS 0x77 /BMP085的I2C地址;const unsigned char OSS = 0; /過采樣設(shè)置;int ac1,ac2,ac3;unsigned int ac4,ac5,ac6;int b1,b2,mb,mc,md;long b5,pressure;short temperature;#define ACC 0x53 /ADXL345的I2C地址;#def

7、ine A_TO_READ (6) #define GYRO 0x68 /ITG3205的I2C地址(當(dāng)ADO連接到GND,具體可參考原理圖);#define G_SMPLRT_DIV 0x15#define G_DLPF_FS 0x16#define G_INT_CFG 0x17#define G_PWR_MGM 0x3E#define G_TO_READ 8 /每軸2字節(jié);int g_offx = 120; /偏移量校正int g_offy = 20;int g_offz = 93;int hx, hy, hz, turetemp; /定義ITG3205輸出變量;void initAcc(

8、) /啟動ADXL345;writeTo(ACC, 0x2D, 1<<3); writeTo(ACC, 0x31, 0x0B);writeTo(ACC, 0x2C, 0x09);/設(shè)置ADXL345的量程為+-2g;writeTo(GYRO, G_PWR_MGM, 0x00); /ITG3205 setwriteTo(GYRO, G_SMPLRT_DIV, 0x07);writeTo(GYRO, G_DLPF_FS, 0x1E); / +/- 2000 dgrs/sec, 1KHzwriteTo(GYRO, G_INT_CFG, 0x00);void initHMC() /HMC5

9、883L初始化設(shè)置;Serial.println("Constructing new HMC5883L");compass = HMC5883L();Serial.println("Setting scale to +/- 1.3 Ga");error = compass.SetScale(1.3);if(error != 0)Serial.println(compass.GetErrorText(error);Serial.println("Setting measurement mode to continous.");error

10、 = compass.SetMeasurementMode(Measurement_Continuous);if(error != 0)Serial.println(compass.GetErrorText(error);void bmp085Calibration() /BMP085初始化設(shè)置;ac1 = bmp085ReadInt(0xAA);ac2 = bmp085ReadInt(0xAC);ac3 = bmp085ReadInt(0xAE);ac4 = bmp085ReadInt(0xB0);ac5 = bmp085ReadInt(0xB2);ac6 = bmp085ReadInt(0

11、xB4);b1 = bmp085ReadInt(0xB6);b2 = bmp085ReadInt(0xB8);mb = bmp085ReadInt(0xBA);mc = bmp085ReadInt(0xBC);md = bmp085ReadInt(0xBE);void getAccelerometerData(int * result)int regAddress = 0x32; /ADXL345數(shù)據(jù)寄存器的首地址;byte buffA_TO_READ;readFrom(ACC, regAddress, A_TO_READ, buff); /從ADXL345讀取三軸加速度值;result0 =

12、 (int)buff1) << 8) | buff0; result1 = (int)buff3)<< 8) | buff2;result2 = (int)buff5) << 8) | buff4;void getGyroscopeData(int * result)int regAddress = 0x1B; /ITG3205數(shù)據(jù)寄存器的首地址;int temp, x, y, z;byte buffG_TO_READ;readFrom(GYRO, regAddress, G_TO_READ, buff); /從ITG3205讀取陀螺儀值;result0 =

13、 (buff2 << 8) | buff3) + g_offx;result1 = (buff4 << 8) | buff5) + g_offy;result2 = (buff6 << 8) | buff7) + g_offz;result3 = (buff0 << 8) | buff1; /溫度值void setup()Serial.begin(9600);Wire.begin();initAcc();initHMC();bmp085Calibration();void ADXL345DIS()int acc3;getAccelerometer

14、Data(acc);hx = acc0;hy = acc1;hz = acc2;Serial.print("ADXL345: ");Serial.print(" X=");Serial.print(hx);Serial.print(" Y=");Serial.print(hy);Serial.print(" Z=");Serial.println(hz);Serial.println();void ITG3205DIS()byte addr;int gyro4;getGyroscopeData(gyro);hx =

15、 gyro0 / 14.375;hy = gyro1 / 14.375;hz = gyro2 / 14.375;turetemp = 35+ (double) (gyro3 + 13200) / 280; / temperatureSerial.print("ITG3205: ");Serial.print(" X=");Serial.print(hx);Serial.print(" Y=");Serial.print(hy);Serial.print(" Z=");Serial.print(hz);Serial.

16、print(" F=");Serial.print(turetemp);Serial.print(char)223);Serial.println("C");Serial.println();void HMC5883LDIS()MagnetometerRaw raw = compass.ReadRawAxis();MagnetometerScaled scaled = compass.ReadScaledAxis();int MilliGauss_OnThe_XAxis = scaled.XAxis;float heading = atan2(scale

17、d.YAxis, scaled.XAxis);float declinationAngle = 0.0457;heading += declinationAngle;if(heading < 0)heading += 2*PI;if(heading > 2*PI)heading -= 2*PI;float headingDegrees = heading * 180/M_PI;Output(raw, scaled, heading, headingDegrees);void BMPDIS()temperature = bmp085GetTemperature(bmp085ReadU

18、T();pressure = bmp085GetPressure(bmp085ReadUP();Serial.print("BMP085: ");Serial.print("Temperature: ");Serial.print(temperature, DEC);Serial.println(" *0.1 deg C");Serial.print(" Pressure: ");Serial.print(pressure, DEC);Serial.println(" Pa");Serial.p

19、rintln();void loop()ADXL345DIS();ITG3205DIS();HMC5883LDIS();BMPDIS();delay(500);void writeTo(int DEVICE, byte address, byte val) /向某一器件的的地址寄存器中寫數(shù)據(jù);Wire.beginTransmission(DEVICE); /開始通信,I2C總線占用;Wire.send(address); / 發(fā)送待寫入數(shù)據(jù)寄存器的地址;Wire.send(val); / 寫入數(shù)據(jù)/命令;Wire.endTransmission(); /釋放I2C總線;void readFro

20、m(int DEVICE, byte address, int num, byte buff) /從某一器件的數(shù)據(jù)緩存中讀取數(shù)據(jù);Wire.beginTransmission(DEVICE); /開始通信,I2C總線占用;Wire.send(address); /發(fā)送要讀取數(shù)據(jù)的寄存器地址;Wire.endTransmission(); /釋放I2C總線;Wire.beginTransmission(DEVICE); /再次啟動I2C總線;Wire.requestFrom(DEVICE, num); /讀取6 BYTE數(shù)據(jù);int i = 0;while(Wire.available() bu

21、ffi = Wire.receive(); / 接收1個字節(jié);i+;Wire.endTransmission(); /釋放I2C總線;void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)/電子羅盤數(shù)據(jù)輸出;Serial.print("HMC5883L: ");Serial.print("Raw:t "); /采集到的原始數(shù)據(jù);Serial.print(raw.XAxis);Serial.print(" &q

22、uot;); Serial.print(raw.YAxis);Serial.print(" "); Serial.println(raw.ZAxis);Serial.print(" Scaled: "); /校準(zhǔn)后輸出;Serial.print(scaled.XAxis);Serial.print(" "); Serial.print(scaled.YAxis);Serial.print(" "); Serial.println(scaled.ZAxis);Serial.print(" Heading:

23、"); Serial.print(heading); /偏離北向的弧度;Serial.print(" Radians ");Serial.print(headingDegrees); /偏離北向的角度;Serial.println(" Degrees t");Serial.println();short bmp085GetTemperature(unsigned int ut) /計算輸出溫度值,單位乘0.1攝氏度;long x1, x2;x1 = (long)ut - (long)ac6)*(long)ac5) >> 15;x2

24、= (long)mc << 11)/(x1 + md);b5 = x1 + x2;return (b5 + 8)>>4); long bmp085GetPressure(unsigned long up) /計算輸出壓力值;long x1, x2, x3, b3, b6, p;unsigned long b4, b7;b6 = b5 - 4000;x1 = (b2 * (b6 * b6)>>12)>>11;x2 = (ac2 * b6)>>11;x3 = x1 + x2;b3 = (long)ac1)*4 + x3)<<O

25、SS) + 2)>>2;x1 = (ac3 * b6)>>13;x2 = (b1 * (b6 * b6)>>12)>>16;x3 = (x1 + x2) + 2)>>2;b4 = (ac4 * (unsigned long)(x3 + 32768)>>15;b7 = (unsigned long)(up - b3) * (50000>>OSS);if (b7 < 0x80000000)p = (b7<<1)/b4;elsep = (b7/b4)<<1;x1 = (p>>

26、8) * (p>>8);x1 = (x1 * 3038)>>16;x2 = (-7357 * p)>>16;p += (x1 + x2 + 3791)>>4;return p;char bmp085Read(unsigned char address) /從BMP085的地址address讀取1 byte數(shù)據(jù);unsigned char data;Wire.beginTransmission(BMP085_ADDRESS);Wire.send(address);Wire.endTransmission();Wire.requestFrom(BMP085_ADDRESS, 1);while(!Wire.available();return Wire.receive();/從BMP085讀取2 byte數(shù)據(jù);第一字節(jié)在address,第二字節(jié)在address+1;int bmp085ReadInt(unsigned char address) unsigned char msb, lsb;Wire.beginTransmission(BMP085_ADDRESS);Wire.send(address);Wire.endTransmission();Wire

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論