2013/12/01

Arduino練習:三軸加速度感測器ADXL335

從Adafruit Industries買了三軸加速度感測器ADXL335分線板,ADXL335的工作電壓是3.3V,這塊分線板加入了穩壓器,所以可接5V電源。可量測正負3g的加速度,由三個腳位類比輸出XYZ三軸的加速度,-3g是0V、0g是1.65V、3g是3.3V。

分線板的Vin接Arduino的5V腳位。
分線板的3Vo接Arduino的AREF腳位。
分線板的GND接Arduino的GND腳位。
分線板的Xout接Arduino的A0腳位。
分線板的Yout接Arduino的A1腳位。
分線板的Zout接Arduino的A2腳位。

分線板上也標示出XYZ軸的方向。


因為ADXL335輸出的類比電壓介於0~3.3V,所以我們將3Vo腳位(3.3V)接到Arduino的AREF腳位,作為參考電壓準位。

底下是程式碼:
#define X_PIN A0
#define Y_PIN A1
#define Z_PIN A2

void setup(){
  Serial.begin(19200);
  // 注意,在呼叫analogRead之前必須先呼叫analogReference
  analogReference(EXTERNAL);
}
// 將類比輸入的值轉成g
float toG(float v){
  return v * 6 / 1023 - 3;
}
void loop(){
  int x  = analogRead(X_PIN);
  int y  = analogRead(Y_PIN);
  int z  = analogRead(Z_PIN);
 
  Serial.print("X: ");
  Serial.print(x);
  Serial.print(", Y: ");
  Serial.print(y);
  Serial.print(", Z: ");
  Serial.print(z);
  Serial.print(";  X: ");
  Serial.print(toG(x));
  Serial.print("g, Y: ");
  Serial.print(toG(y));
  Serial.print("g, Z: ");
  Serial.print(toG(z));
  Serial.println("g");
  delay(100);
}

然後搖動ADXL335,應可得到類似下列的輸出訊息:
X: 499, Y: 485, Z: 615;  X: -0.07g, Y: -0.16g, Z: 0.61g
X: 506, Y: 443, Z: 589;  X: -0.03g, Y: -0.40g, Z: 0.45g
X: 490, Y: 486, Z: 630;  X: -0.13g, Y: -0.15g, Z: 0.70g
X: 502, Y: 506, Z: 641;  X: -0.06g, Y: -0.03g, Z: 0.76g
X: 524, Y: 534, Z: 638;  X: 0.07g, Y: 0.13g, Z: 0.74g
X: 505, Y: 541, Z: 621;  X: -0.04g, Y: 0.17g, Z: 0.64g
X: 512, Y: 549, Z: 602;  X: 0.00g, Y: 0.22g, Z: 0.53g
X: 502, Y: 536, Z: 616;  X: -0.06g, Y: 0.14g, Z: 0.61g
X: 473, Y: 529, Z: 624;  X: -0.23g, Y: 0.10g, Z: 0.66g
X: 462, Y: 512, Z: 624;  X: -0.29g, Y: 0.00g, Z: 0.66g
X: 442, Y: 500, Z: 621;  X: -0.41g, Y: -0.07g, Z: 0.64g
X: 443, Y: 522, Z: 605;  X: -0.40g, Y: 0.06g, Z: 0.55g
X: 488, Y: 541, Z: 598;  X: -0.14g, Y: 0.17g, Z: 0.51g
X: 524, Y: 512, Z: 626;  X: 0.07g, Y: 0.00g, Z: 0.67g

當然啦,這些是資料規格表上書寫的數字,工廠出產的每一顆晶片或多或少都會有些許不同,所以必須進行校準,不過若是不在乎精確數值的情況,便可省略。

47 comments:

  1. 想請問,return v * 6 / 1023 - 3;怎麼來的!? 感激不盡>//<

    ReplyDelete
    Replies
    1. 因為-3g是0V、0g是1.65V、3g是3.3V。
      而且分線板的3Vo接Arduino的AREF腳位。

      v會是介於0~1023的值(對應代表0V~3.3V)。
      * 6 / 1023後轉成0~6g,-3後得到-3g~3g的值。


      Delete
    2. 請問為什麼乘上六就是對應0~6G啊?

      我加速度計是+-1.5G
      800mV/g
      是不是要把它改成 v*3/800-1.5 ?

      Delete
    3. v會介於0~1023,對應0V~3.3V,又對應到-3g~+3g。
      所以先* 6 / 1023後,對應到0~6g,然後-3對應到-3g~+3g。

      至於你的情況,光這樣無法判斷,
      要看你的腳位讀到的是什麼。

      Delete
    4. 您好 我使用的是 MMA7361三加速度計 以下是產品說明
      http://wiki.dfrobot.com.cn/index.php/MMA7260%E4%B8%89%E8%BD%B4%E5%8A%A0%E9%80%9F%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8%28Arduino%E5%85%BC%E5%AE%B9%29_%28SKU:_DFR0143%29

      v的初始數值是X=350上下浮動 Y, Z是430上下浮動

      並請問 針腳插在A0~A5上 v就會是介於0~1023的值嗎?

      Delete
    5. 還有 MMA7361加速度計 供應電壓是5V 好像不同於ADXL335的是3.3V

      Delete
    6. 根據你給的網頁,MMA7361的供電電壓是3.3-8V。
      如果是±1.5g的話,輸出應會介於0.45V~2.85V,
      若是使用Arduino的類比腳位來量測,因為解析度是10 bits,
      所以若把參考電壓調成3.3V,那麼量測到的值應該會介於139~883。

      沒用過MMA7361,只是根據你給的網頁的資料。

      Delete
    7. 請問
      為何 輸出應會介於0.45V~2.85V?
      參考電壓 是甚麼意思?
      如何計算出139~883?
      謝謝

      Delete
    8. 還有
      供電電壓是3.3-8V 不是代表給予加速度計的電壓可以介於3.3-8V之間嗎?
      給予3.3V和5V輸出會有差別嗎?

      Delete
    9. 你給的網頁寫的。
      1g是2.45V,0g是1.65V,差了0.8V,所以1.5g應該是2.85V。

      Arduino的類比輸入腳位,會以參考電壓為上限,譬如Uno預設為5V,那麼就會把0~5V對應到0~1023。

      若參考電壓是3.3V,那麼-1.5g(0.45V)就會量測到139.5。1.5g(2.85V)則是883.5。

      根據網頁寫的,供電電壓是可以介於3.3-8V之間。

      輸出會有差別嗎? 不知道,網頁沒寫。

      Delete
  2. 嗨!我要做一個實驗,要用到三軸加速器,但設計電路與寫程式我是門外漢,可以請您協助嗎?謝謝!

    sam47215@gmail.com.tw

    ReplyDelete
    Replies
    1. 不懂你的意思。

      有問題就請留言,盡量回答。

      Delete
  3. 請問版大有做過測傾角的實驗嗎,有的話可以分享一下嗎^^

    ReplyDelete
    Replies
    1. 測傾角的實驗?
      根據x y z的g值找出傾斜角度嗎?是不是用個數學運算式就可以算出來呢?

      Delete
  4. 基本傾角實驗沒那麼簡單

    準確的傾角需要用到 六軸, 才能準確的知道現在的角度...

    而移動中的物件(快速) 還須靠GPS才能準確地知道傾角-..-

    我目前也在研究這方面, 不過實力太低了, 所以還在努力


    以上資訊我是靠APM(一塊以arduino MEGA 2560 為基礎而開發的飛控板(多軸機使用)...看它裡面CODE跟朋友解說得知的

    ReplyDelete
    Replies
    1. 哇,有高手發聲為我們解惑了,謝謝。

      Delete
  5. 不過基本的傾角還是靠加速度計就能實現啦-.-

    只是移動中物件比較繁瑣一點

    p.s 有事情想請教版主, 不知有甚麼聯絡方式較好呢?

    ReplyDelete
    Replies
    1. 有問題請直接留言,謝謝。

      不方便直接給聯絡方式。

      Delete
  6. 板主你好><不好意思打擾您了~~
    有一個問題想問你
    就是我程式碼都照著寫 電路也應該是沒接錯
    但是每次跑出來都只有
    X: 1023, Y: 1023, Z: 1023; X: 3g, Y: 3g, Z: 3g
    用ADXL345也一樣情況
    不知道到底哪裡出錯了QQQ
    拜託救救困擾很久的新手

    ReplyDelete
    Replies
    1. 光這樣也不知道哪裡出錯。

      有記得共同接地嗎?

      Delete
  7. This comment has been removed by the author.

    ReplyDelete
  8. 請問為什麼要加analogReference(EXTERNAL);
    我加這行後值顯示是X: 1023, Y: 1023, Z: 1023; X: 3g, Y: 3g, Z: 3g
    不加平放值是X: 348, Y: 348, Z: 425; X: -0.96g, Y: -0.96g, Z: -0.51g
    為什麼X Y g值不會歸0?

    ReplyDelete
    Replies
    1. 因為ADXL335輸出XYZ三軸的加速度,-3g是0V、0g是1.65V、3g是3.3V。
      介於0~3.3V,所以分線板的3Vo接Arduino的AREF腳位,並且加上analogReference(EXTERNAL);,

      以AREF腳位的電壓為準。
      否則一般板子會以5V為準。

      > 為什麼X Y g值不會歸0?
      因為ADXL335不完美,因為你沒辦法讓它呈現完全靜止、無加速度的狀態。

      Delete
    2. 那我要如何在加了analogReference(EXTERNAL);後出現值?

      Delete
    3. what?
      你不是有值了嗎?

      Delete
    4. 那直視沒加analogReference(EXTERNAL);時才有的
      有加analogReference(EXTERNAL);時是出現X: 1023, Y: 1023, Z: 1023; X: 3g, Y: 3g, Z: 3g

      Delete
    5. 你的Arduino板子是哪一塊?
      分線板的3Vo有接Arduino的AREF腳位嗎?

      一直讀到1023的話,代表一直讀到3.3V。
      哪裡出錯了呢?

      Delete
    6. This comment has been removed by the author.

      Delete
    7. SORRY我找到錯了我這顆沒有3Vo這腳位

      Delete
    8. 嘿。

      那麼,請你先看你的是哪一顆加速計晶片/模組,
      查它的x y z軸輸出的訊號為何,是不是類比訊號,若是的話上下電壓界限為何,
      然後連接線路,做相對應的修改。

      Delete
    9. 每個感測器的用法,各自不同。
      請找出晶片型號,到網路上找找有無介紹文。

      Delete
    10. 我是用http://www.playrobot.com/accelerometers/909-adxl335-pin.html這顆
      工作電壓:DC 3V ~ 5V
      加速度測量範圍為 ±3g
      我是用UNO板vcc接5v,所以-3g是0V、0g是2.5V、3g是5V??
      公式是v * 5 / 1023 - 2.5??

      Delete
  9. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. 也是ADXL335,但模組不同。
      根據你給的網頁,無法得知該產品的輸出是不是介於0~5V、還是介於0~3.3V,請向該公司詢問。


      > -3.3g是0v,0g是2.5v,3.3g是5v?
      不是,哪來的3.3g ?

      > v * 5 / 1023 - 2.5?
      不是。

      Delete
    2. 這是他給的產品相關資料https://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf

      Delete
    3. 那是ADXL335的資料規格表。
      我說的是模組產品本身的規格,你買的產品是sparkfun設計的。

      需要知道的是
      X_OUT, Y_OUT, Z_OUT的輸出電壓,上下界限為何?
      對應到哪個範圍的加速度(應該是-3g ~ 3g)。

      xyz輸出電壓,是否隨VCC而改變。

      如果對方沒給,可以自己做試驗找出來。

      Delete
    4. 對方沒給,請問我該怎麼做?

      Delete
    5. 接線後,假設以3.3V供應給模組,
      然後使用analogRead讀取xyz輸出,
      (假定你的板子是5V)
      翻轉模組,觀察analogRead輸出的數值,
      如果數值介於0 ~ 675之間,那就應該代表xyz的輸出介於0~3.3V。
      那麼,就可以使用本篇的線路與程式。
      (小修改 Arduino的AREF接到3.3V)


      Delete
    6. 對方沒給,請問我該怎麼做?

      Delete
    7. 規格表 -1g 0g 1g
      X 423 -0.52g 354 -0.92g 280 -1.36g
      Y 426 -0.51g 360 -0.88g 283 -1.34g
      Z 427 -0.50g 351 -0.94g 284 -1.33g
      這是我測出的數值,我是以https://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf第12頁下方的方法測試
      請問analogRead輸出的數值不是介於0-1023嗎?
      g值不是介於+-3g嗎?
      這樣上方的公式試用嗎?

      Delete
    8. 不斷翻轉模組,找出最大最小值各為何。

      > 請問analogRead輸出的數值不是介於0-1023嗎?
      要看你輸入的電壓值上下限是多少,
      若是0~3.3V,那就應該得到約0~675。
      > g值不是介於+-3g嗎?
      那麼,0~675就對應到-3g ~ +3g

      > 這樣上方的公式試用嗎?
      你是說我這篇的程式吧。
      如果模組輸出的是0到3.3V的話,可用。

      Delete
    9. 知道了,感謝您的幫忙

      Delete
  10. 要如何讓他轉換成速度與位置

    ReplyDelete
    Replies
    1. 請參考
      http://forum.arduino.cc/index.php?topic=47523.0

      Delete