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

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

72 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
    10. 謝謝您的解答

      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. Anonymous5/8/16 16:10

    請問為什麼要加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. Anonymous5/8/16 16:23

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

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

      Delete
    4. Anonymous5/8/16 16:37

      那直視沒加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. Anonymous5/8/16 16:50

      This comment has been removed by the author.

      Delete
    7. Anonymous5/8/16 16:54

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

      Delete
    8. 嘿。

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

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

      Delete
    10. Anonymous5/8/16 17:47

      我是用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. Anonymous5/8/16 17:40

    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. Anonymous8/8/16 10:53

      這是他給的產品相關資料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. Anonymous8/8/16 11:13

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

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


      Delete
    6. Anonymous8/8/16 13:28

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

      Delete
    7. Anonymous8/8/16 13:42

      規格表 -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. Anonymous8/8/16 14:10

      知道了,感謝您的幫忙

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

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

      Delete
  11. 我想請問輸入完程式碼後,下方顯示:[無法得知程式大小:java.io.IOException: Cannot run program "C:\Users\米??\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2/bin/avr-size": CreateProcess error=2, 系統找不到指定的檔案。0]
    是代表哪裡出錯了?

    ReplyDelete
    Replies
    1. Arduino IDE的問題吧,無能為力。

      建議,換個版本。

      Delete
  12. 不好意思我想請問一下,這個可以做出角度控制嗎?
    例如我用arduino做一台自走車,然後我想要讓他轉30度或60度或90度的角度

    ReplyDelete
  13. Anonymous2/11/17 21:04

    你好,想要請教一下,我們監控視窗裡面出現的XYZ都是1023,不管怎麼搖晃數字都不會改變,不知道是怎麼一回事,我是用杜邦線接到uno上面,用的加速規是GY-61

    ReplyDelete
    Replies
    1. 你只告訴我結果,沒給任何資訊,我只能亂猜,呵呵。
      電路?程式?
      硬體線路錯了?程式錯了?

      Delete
    2. Anonymous2/11/17 22:02

      程式碼是參考你文章上面的程式碼,把Serial.begin(19200)改成Serial.begin(9600),其他的都沒有變動
      下面是圖片連結
      https://drive.google.com/drive/folders/0B8llM0YvgY3CTkNIcG9QM3NDRkE?usp=sharing
      我們vcc接在5V;x_out 接在A0;y_out接在A1;z_out接在A2;gnd接在gnd

      Delete
    3. 把Uno的3.3V腳位,接到Uno的AREF腳位。

      Delete
    4. Anonymous2/11/17 22:12

      成功了!!謝謝你
      但是想要請教為甚麼要把3.3V接到AREF呢

      Delete
    5. 這篇文章有寫。

      Delete
    6. Anonymous2/11/17 22:19

      我看到了! 謝謝你

      Delete
  14. 如果我是用ADXL345,請問我可以套用這個範例嗎?(硬體接法:NANO板+vcc-5V腳位、GND-GND腳位、SCL&SDA-A0~A5腳位)

    ReplyDelete
    Replies
    1. 不行。

      請參考https://learn.adafruit.com/adxl345-digital-accelerometer

      Delete
    2. 謝謝。測試後首先,VCC是5V(因為我的NANO擴充版上只有5V),
      然後網頁上的範例是序列窗上按任何鍵後,會出現感測器當下xyz的加速度:
      Accel Minimums: 0.00 0.00 0.00
      Accel Maximums: 0.12 0.20 1.14;
      但是我的結果是:
      Accel Minimums: -2.86 -0.47 0.00
      Accel Maximums: 9.30 2.28 9.61, 請問我的實驗結果是不是有錯誤?

      Delete
    3. 你執行的是校準程式吧,
      > 會出現感測器當下xyz的加速度
      你的值當然會跟他的不一樣。

      不是應該執行範例程式sensortest嗎?

      Delete
    4. 另外因為範例檔上的兩個函數庫"Adafruit_ADXL345_U.h"和"Adafruit_Sensor.h"因為網頁上沒有zip檔可以下載, 打開範例後我從"草稿碼/加入檔案"開啟這兩個檔案, 不知道這種方式有沒有影響序列窗結果...

      Delete
    5. Arduino IDE從1.6.2版起,有程式庫管理員Library Manager,使用它就能安裝程式庫,不需要自己手動抓。

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

    ReplyDelete
  16. This comment has been removed by the author.

    ReplyDelete
  17. 請參考sensortest.pde的內容如下:
    !DOCTYPE html、html lang、head、link rel......不大像ARDUINO語法, 比較像是網頁語法。

    並且因為"找到無效的程式庫"而無法上傳, 結果如下:
    Arduino:1.8.2 (Windows 7), 開發板:"Arduino Nano, ATmega328"

    Property line '' in file C:\Program Files (x86)\Arduino\libraries\Adafruit_ADXL345_U\library.properties is invalid

    開發板 Arduino Nano 編譯錯誤。
    在C:\Program Files (x86)\Arduino\libraries\Adafruit_ADXL345_U: Missing 'version' from library裡找到無效的程式庫
    在C:\Program Files (x86)\Arduino\libraries\Adafruit_Sensor: Missing 'version' from library裡找到無效的程式庫
    在C:\Program Files (x86)\Arduino\libraries\Adafruit_ADXL345_U: Missing 'version' from library裡找到無效的程式庫
    在C:\Program Files (x86)\Arduino\libraries\Adafruit_Sensor: Missing 'version' from library裡找到無效的程式庫

    This report would have more information with
    "Show verbose output during compilation"
    option enabled in File -> Preferences.

    請問還有哪個步驟出錯?

    ReplyDelete
    Replies
    1. sensortest.pde的內容是:
      #include
      #include
      #include

      /* Assign a unique ID to this sensor at the same time */
      Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
      ...

      > Missing 'version' from library裡找到無效的程式庫
      應該是程式庫沒裝好。

      Delete
  18. 原來是我之前下載library的方式有錯,已經可以打開sensortest範例檔了,
    謝謝葉大!

    ReplyDelete
  19. 你好,請問我該如何將ADXL335的加速度數值存取並使用matlab去讀取呢?

    ReplyDelete
  20. 請問 ADXL345 與 ADXL335 有什麼差異?
    有類似 ADXL335 更高 g 數的模組嗎?
    謝謝.

    ReplyDelete
  21. Anonymous17/4/23 17:06

    您好,請問如何讓三軸在靜止的情況下G值為零

    ReplyDelete