MMA8452加速传感器的应用(简)
硬件設置接線:
MMA8452--------- Arduino
“+”- - - - - - - - - - - - - - - - - - - - - - - - 3.3 v
SDA - - - - - - - ?- - - - - - - A4
SCL - - - - - - - ?- - - - - - - A5
“—”- - - - - - - - - - - - - - - - - - - - - - -GND
加速度傳感器的原理是檢測xyz軸上的值
而后將這三個數值儲存在g中
然后在依次讀取,所以這里我們以圖1的代碼來解釋
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1
這段代碼中我們主要用到的是打印出來的g值三個值為一行
打印出來的效果如圖2:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2
圖2中三個值分別是x、y、z的數值。
合理使用這三個數值
簡單陀螺儀原理:
首先要知道加速度傳感器的安裝位置(即傳感器正向方向)已確定x、y、z軸。
然后根據x、y、z的值進行判斷裝置運動的方向,具體思路簡單理解如下:
當x值變化且y、z值基本不變時,裝置是沿x軸方向運動的;
同理y、z也是這樣;
當x、y值變化且z值基本不變時,裝置是沿y=kx+b方向運動的;
同理y、z也是這樣;
當x、y、z都變化時,裝置是沿ax+by+cz=d方向運動的;
?
碰撞檢測原理:
確定好加速度傳感器的方向,然后確定以x、y、z其中的一個值,多測測是找到撞擊臨 界點的加速度,然后將這個值設置為報警值,當加速度大于或等于這個值時報警撞擊(這 里我應用在老年人摔倒報警拐杖上,當加速度大于19.55時,開啟警報告知周圍的人老 人摔倒了請盡快扶起)
?
參考讀取數據的代碼:(我也是網上查的改了一下拿來用)
/* 硬件設置: MMA8452--------- Arduino 3.3 v - - - - - - - - - - - - - - - - - - - - - - - - 3.3 v SDA - - - - - - - - - - - - - - A4 sci - - - - - - - - - - - - - - A5 接地- - - - - - - - - - - - - - - - - - - - - - -接地 */ #include <Wire.h> // 用于I2C//SparkFun斷接板默認值為1,如果設置板底部的SA0跳線,則設置為0 #define MMA8452_ADDRESS 0x1D // 如果SA0高則0x1D,如果低則0x1C//定義一些我們將在MMA8452上訪問的寄存器 #define OUT_X_MSB 0x01 #define XYZ_DATA_CFG 0x0E #define WHO_AM_I 0x0D #define CTRL_REG1 0x2A#define GSCALE 2 // 將全尺寸范圍設置為+/-2、4或8g。用于計算實際g值。void setup() {Serial.begin(9600);Serial.println("MMA8452 Basic Example");Wire.begin(); //Join the bus as a masterinitMMA8452(); //Test and intialize the MMA8452pinMode(5, OUTPUT);pinMode(6, INPUT);pinMode(2, OUTPUT);pinMode(12, INPUT);pinMode(7, OUTPUT);pinMode(13, OUTPUT);}//定義超聲波傳感器的trig為5號端口,定義echo為6號端口,并測出距離值 float checkdistance_5_6() {digitalWrite(5, LOW);delayMicroseconds(2);digitalWrite(5, HIGH);delayMicroseconds(10);digitalWrite(5, LOW);float distance = pulseIn(6, HIGH) / 58.00;delay(10);return distance; }void loop() { //光控ledif (analogRead(A3) < 500) {digitalWrite(13,HIGH);} else {digitalWrite(13,LOW);}int accelCount[3]; // 存儲12位的簽名值readAccelData(accelCount); // 讀取x/y/z adc值//現在我們要計算實際的g的加速度值float accelG[3]; //將實際accel值存儲在g中for (int i = 0 ; i < 3 ; i++){accelG[i] = (float) accelCount[i] / ((1<<12)/(2*GSCALE)); // 得到實際的g值,這取決于所設置的刻度}// 打印出的數值for (int i = 0 ; i < 3 ; i++){ Serial.print(accelG[i], 4); // 打印出g值Serial.print("\t"); // 打印軸間制表符}Serial.println();// float v = 0.0;delay(10); // 此處為能見度延遲 /* v = accelG[2] * 9.8;Serial.print(v,4);while (v > 19.55 or v < -19.55){digitalWrite(7,HIGH);if (digitalRead(12)) {digitalWrite(7,LOW);break;}Serial.print("摔倒了!!");}//測距if (checkdistance_5_6() < 30) {digitalWrite(2,HIGH);} else {digitalWrite(2,LOW);}*/ }void readAccelData(int *destination) {byte rawData[6]; // x/y/z accel注冊存儲在這里的數據readRegisters(OUT_X_MSB, 6, rawData); // 將6個原始數據寄存器讀入數據數組// 循環計算每個軸的12位ADC和g值for(int i = 0; i < 3 ; i++){int gCount = (rawData[i*2] << 8) | rawData[(i*2)+1]; //將兩個8位寄存器合并成一個12位數字gCount >>= 4; //寄存器是左對齊的,這里我們右對齊12位整數//如果數字為負,我們必須手動設置(沒有12位數據類型)if (rawData[i*2] > 0x7F){ gCount = ~gCount + 1;gCount *= -1; // 轉換成- 2的補碼#}destination[i] = gCount; //將這個g計數記錄到3 int數組中} }// 初始化MMA8452寄存器 // 有關設置所有這些寄存器的更多信息,請參閱許多應用程序說明: // http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8452Q void initMMA8452() {byte c = readRegister(WHO_AM_I); // WHO_AM_I寄存器中讀取if (c == 0x2A) // WHO_AM_I總是0x2A{ Serial.println("MMA8452Q is online...");}else{Serial.print("Could not connect to MMA8452Q: 0x");Serial.println(c, HEX);while(1) ; // 如果通信沒有發生,則永遠循環}MMA8452Standby(); // 必須處于待命狀態才能更改寄存器嗎// 將整個范圍設置為2,4或8g。byte fsr = GSCALE;if(fsr > 8) fsr = 8; //簡單的錯誤檢查fsr >>= 2; //靈巧的技巧,見第22頁。00 = 2G, 01 = 4A, 10 = 8GwriteRegister(XYZ_DATA_CFG, fsr);//默認的數據速率是800Hz,在這個示例代碼中我們不修改它MMA8452Active(); //設置為active開始閱讀 }//將MMA8452設置為待機模式。它必須處于備用狀態才能更改大多數寄存器設置 void MMA8452Standby() {byte c = readRegister(CTRL_REG1);writeRegister(CTRL_REG1, c & ~(0x01)); //清除活動位進入備用狀態 }// 將MMA8452設置為活動模式。需要在此模式下輸出數據 void MMA8452Active() {byte c = readRegister(CTRL_REG1);writeRegister(CTRL_REG1, c | 0x01); //設置活動位開始檢測 }// 按順序讀bytesToRead,從addressToRead開始讀到dest字節數組 void readRegisters(byte addressToRead, int bytesToRead, byte * dest) {Wire.beginTransmission(MMA8452_ADDRESS);Wire.write(addressToRead);Wire.endTransmission(false); //結束傳輸,但保持連接活動Wire.requestFrom(MMA8452_ADDRESS, bytesToRead); //請求字節,一旦完成,總線在默認情況下被釋放while(Wire.available() < bytesToRead); //等待,直到我們得到所期望的字節數for(int x = 0 ; x < bytesToRead ; x++)dest[x] = Wire.read(); }// 從addressToRead讀取一個字節并將其作為字節返回 byte readRegister(byte addressToRead) {Wire.beginTransmission(MMA8452_ADDRESS);Wire.write(addressToRead);Wire.endTransmission(false); //結束傳輸,但保持連接活動Wire.requestFrom(MMA8452_ADDRESS, 1); //請求一個字節,一旦完成,總線在默認情況下被釋放while(!Wire.available()) ; //等待數據返回return Wire.read(); //返回一個字節 }// 將單個字節(dataToWrite)寫入addressToWrite void writeRegister(byte addressToWrite, byte dataToWrite) {Wire.beginTransmission(MMA8452_ADDRESS);Wire.write(addressToWrite);Wire.write(dataToWrite);Wire.endTransmission(); //停止傳輸 }?
總結
以上是生活随笔為你收集整理的MMA8452加速传感器的应用(简)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反激式开关电源技术归纳(上)
- 下一篇: 电源系列1:LDO 基本 原理(一)