2011年4月8日 星期五

利順精密 DMARD03 三軸加速度計(Accelerometer)

實驗目的

練習用 Arduino 讀取 DMT DMARD03 三軸加速度計並透過 Serial port 把感測值印到電腦端。

這篇用的是利順精密(Domintech, DMT) 的 DMARD03 數位三軸加速度計(Accelerometer),在此要特別感謝彥陽科技 Johnny 與 Edison,謝謝你們提供我 DMARD03 模組。

材料

 image
▲ DMARD03 加速度計模組

利順 DMARD03 是一數位三軸加速度計,感測能力為正負 3G,工作電壓為 2.4V ~ 3.6V,通訊介面可使用 SPI 與 I2C。DMARD03 的應用有:

  1. 人體動作介面: 如 PS3 及 Wii 遙桿,AirMouse, PC-Game 手柄
  2. 自由落體偵測(Free fall detection): 如硬碟保護
  3. 手持裝置方向定位功能(Tilt sensing): 如手機或平板電腦幕自動翻轉
  4. 導航,電子羅盤: 如智慧型手機電子羅盤、適地性服務(Location-Based Service)、GPS 航位推算(dead reckoning)

▲ 資料來源: 利順精密

加速度計又稱重力感測器(Gravity Sensor, G-sensor)。

接線

DMARD03 AN001 (Application Note) 這份手冊提供了 I2C 和 SPI 兩種應用電路的接法,我們選用 I2C 最簡單的接法,電路圖如下:

image

所以,我們只要:

  • 把 1, 4, 5, 17, 19 接到 Arduino 的 GND
  • 把 2, 3, 11, 12, 13 接到 Arduino 的 +3.3V
  • 然後把 14 接到 Arduino 的 SCL,而 16 接到 Arduino 的 SDA,並且在這兩支接腳上各接一顆 4.7K 歐姆的提升電阻連到 +3.3V

實際接法可參考底下用 Fritzing 繒製的電路原型:

image

在這個實驗中,SCL 接腳用 Arduino 的 pin 2,而 SDA 接腳則用 Arduino 的 pin 3,你也可以使用其它腳位,但是程式要配合調整。

要特別注意一件事,由於 Arduino 大部份的板子如 UNO, Duemilanove 等,它們的工作電壓都是 5V,如果拿這些板子直接跟 DMARD03 接在一起,可能會把 DMARD03 給弄壞,這是因為 DMARD03 的工作電壓是 2.4V ~ 3.6V,所以你必須使用 Arduino Pro 或 Arduino Pro Mini 3.3V 的板子來跟 DMARD03 界接。

要用工作電壓為 5V 的 Arduino 當然也是可以的,只不過你必須處理 3.3V 與 5V 的邏輯準位轉換(Level Shift)。這部份可以參考 Philips 的 AN97055 這份手冊。

image

如上圖,AN97055 提供的方法是利用 MOS-FET 電晶體和提升電阻以便讓兩個不同邏輯準位的電路能相容運作。因為手邊沒有 MOS-FET 電晶體,所以我沒有實際進行實驗。

安裝 DMARD03 函式庫

點這裏下載 DMARD03 函式庫,然後把檔案解壓縮放到 Arduino 速寫簿(Sketchbook)資料夾的 Libraries 資料夾底下即可。Arduino 速寫簿(Sketchbook)資料夾的預設位置是在「我的文件 > Arduino」這個地方:

image
▲ 把 DMARD03 資料夾放在「我的文件 > Arduino > Libraries」底下即可

程式

底下這支程式示範如何讀取 DMARD03 加速度計(DMT_G_Sensor.pde):

用 Arduino IDE 編譯程式,把程式上傳到 Arduino 板子上,然後打開 Serial Monitor,你就會看到從 DMARD03 傳回來的三軸加速度(Accerleration),如下圖:

image

資料

根據 DMARD03 AN001 手冊的說明,理論上,在靜止狀態下 DMARD03 六個方向讀出的感測值應該會像下圖一樣:

image

a) Y 軸朝上,Y 值為 –256 (-1G)
b) Y 軸朝下垂直於地平線,Y 值為 256 (1G)
c) X 軸朝上,X 值為 -256 (-1G)
d) X 軸朝下垂直於地平線,X 值為 256 (1G)
e) Z 軸朝上(即 DMARD03 正面朝上),Z 值為 -256 (-1G)
f) Z 軸朝下垂直於地平線(即 DMARD03 正面朝下),Z 值為 256 (1G)

其中,加速度值除以 256 就是重力,單位為 G (1G = 9.8m/s²)。

而實際測量的結果如下表:

角度 X 軸 Y 軸 Z 軸
-90 度 (朝上) -276 -315 -295
90 度(朝上,垂直於地面) 235 192 207

結果並不一致,很可能是有什麼因素造成偏移,所以大概得做個校準(Calibration)把偏移值補償回來。以 X 軸為例,256 – 235 ~= 20,X 軸應該大約補償個 20 就可以了。

延伸閱讀

7 意見:

Lo cheng wei 提到...

終於有中文版的 三維方向測試!! 感謝提供

Unknown 提到...

請問一下用I2C不是要接在analog pin 4,5上嗎?
還是其實也可以接在digital pins上來運作?

Cooper Maa 提到...

analog pin 4,5 是 hardware I2C/TWI 介面
DMARD03 library 的 I2C 通訊是用軟體實作的
所以任何 digital pins 都可以。

Unknown 提到...

請問是否有將硬體I2C用軟體實作的範例教學呢?
我手邊有個感應器也想要將它轉成軟體I2C實作,但是不太懂轉換的原理...

Cooper Maa 提到...

你可以試試這個 I2C Library:

I2C Master Interface
http://homepage.hispeed.ch/peterfleury/avr-software.html

這個是根據 AVR300 application note 寫出來的 software i2c library。照文件說明,只要調整 i2cmaster.S 的 SDA 和 SCL 腳位應該就可以試了。

Pieter3D 提到...

Hi there thanks a lot for your blog post about the DMARD03 and Arduino it helpt me a lot. My setup is a bit different but your arduino library helped a lot. Thanks again. Also a made a blog post about it hope U do not mind
http://www.protorabbit.nl/?p=118

Cooper Maa 提到...

@Pieter3D, you're welcome. :)