2009/3/11

使用 Freerunner 的三軸動作感應器 (3 axis accelerometer) - motion sensor


Neng-Yu Tu (Tony Tu)

自從任天堂的 Wii 跟蘋果的 iPhone 出現以後, 動作感應器 (or 微機電 MEMS 系統) 感覺一下子變成顯學. 這幾年也看到越來越多的應用出現在 iPhone 或其他的 Device 上, 最常見的還是拿來當樂器或是其他控制器使用. 例如:




不過這個 air guitar 跟 Accelerometer 可能沒什麼直接關係 ;) 只是提神用!!!

Freerunner 有 2 個 ST LIS320DL 的三軸動作感應器, 一個位在機器的左上方靠近 Aux 鍵的位置, 一個在主板的右下方靠近麥克風的位置. 一般的手機只需用到 1 顆, 就可以偵測目前手機的機身狀態 (朝哪個方向傾斜/加速度). ST LIS320DL 規格是偵測區間可調 +- 2g 或 +-8g, 丟資料的頻率可設成 100 Hz 或 400 Hz. 它還有可以設定的 interrupt 腳位. 可以在特定狀況下(自由落體, 靜止突然移動), 才發出 interrupt. 這兩個 motion sensor 一個有接到可把 CPU 從 suspend 喚醒的腳位上. 詳細的 datasheet 可參考下面的網址: http://www.st.com/stonline/products/literature/ds/12726/lis302dl.htm

這兩個三軸動作感應器可以同時使用. 但是在大部分狀況下, 1 顆就已經足夠. 2 顆 motion sensor 組合起來是可以做比較複雜跟精準動作偵測 (偵測角加速度, 而不是只是單純 3 軸), 或是進一步作 gyro sensor, 生物動作特徵辨認等 or something you could dream of ;-)

簡單來說, 有一點像是原先的 Wii Remote + MotionPlus





* 設定 Accelerometer

設定 Accelerometer 可以透過 /sys 下面完成, 不過因為 kernel 版本關係, 2.6.28 版之後, 相關的 sysfs 設定會出現在

/sys/class/i2c-adapter/i2c-0/0-0073/lis302dl.{12}

root@om-gta02:/sys/devices/platform/lis302dl.1# ls
driver duration modalias sample_rate threshold wakeup
dump full_scale power subsystem uevent

可以設定包括 threshold (觸發臨界值), sample (取樣頻率) 以及其他的 Accelerometer 參數. 可以直接透過 cat threshold 或是 echo 72 > threshold 的方式改變設定數值. 同時, 設定數值有時並不是以 1 為基數, 以 threshold 來說, 就是 18 的倍數.

* 讀取 Accelerometer 數值

Openmoko wiki 一樣有詳細如何讀取 motion sensor 資料的方法, 請參考:
http://wiki.openmoko.org/wiki/Accelerometer_data_retrieval

最簡單的存取方式 motion sensor 方式, 就是直接 cat Accelerometer 的 event 輸出.

root@om-gta02:/# cat /dev/input/event2
root@om-gta02:/# cat /dev/input/event3

event2 及 event3 分別是第 1 顆及第 2 顆 Accelerometer 的資料輸出.

Accelerometer 輸出的資料格式如下:

root@om-gta02:/# cat /dev/input/event3 hexdump
0000000 3fec 3896 ebe5 0000 0002 0000 ffb8 ffff
0000010 3fec 3896 ebf2 0000 0002 0001 0036 0000
0000020 3fec 3896 ebf7 0000 0002 0002 0414 0000
0000030 3fec 3896 ebfd 0000 0000 0000 0000 0000
0000040 3fec 3896 ee80 0000 0002 0000 ffb8 ffff
0000050 3fec 3896 eea9 0000 0002 0001 0036 0000
0000060 3fec 3896 eeaf 0000 0002 0002 0132 0000
0000070 3fec 3896 eeb5 0000 0000 0000 0000 0000

以第一筆資料來說:

3fec 3896 ebe5 0000 是時間
0000 0002 是事件的種類
接下來的 0000 是 X 軸, 而 0001, 0002 分別是 Y 軸及 Z 軸
ffb8 ffff 是 Accelerometer 的數值.

你可以參考 http://wiki.openmoko.org/wiki/Accelerometer_data_retrieval 的內容, 用 perl/python, 或是 C 來讀取 accelerometer 數值. Community 的 rui 也 donate 了一個程式 rotate, 可以偵測手機機身的狀態. Source code 可以從這取得:

http://t0ny.net/openmoko/samples/src/rotate/ 執行結果如下.

root@om-gta02:~# ./test
Types: a(2), b(2), c(2)
Codes: a(0), b(1), c(2)
Value: a(-792), b(-252), c(522)
left
Types: a(2), b(2), c(2)
Codes: a(0), b(1), c(2)
Value: a(-810), b(-252), c(558)
left
Types: a(2), b(2), c(2)
Codes: a(0), b(1), c(2)
Value: a(-810), b(-270), c(540)
left
Types: a(2), b(2), c(2)
Codes: a(0), b(1), c(2)
Value: a(-774), b(-270), c(504)
left
Types: a(2), b(2), c(2)
Codes: a(0), b(1), c(2)
Value: a(-792), b(-270), c(522)
left

* 利用 Accelerometer 作動作捕捉

基本上像 Wii Sport 之類的遊戲, 都是透過比較複雜的動作捕捉方式來完成, 並不是單純的讀某一個時間的 Accelerometer 數值達成. 動作捕捉並不需要 2 顆 Accelerometer (模擬 gryo sensor 才需要), 但是需要比較/紀錄不同 Accelerometer 資料以及作加速度計算等. 在 GSoC (Google Summer of Code) 上, 有一個透過 FreeRunner 來做動作捕捉的範例.





Source code 及可安裝的 ipk 在此, 還意外的看到了 bb 檔 ;)
http://code.google.com/p/accelges/source/browse/#svn/trunk

論文位址如下:
http://dev.borza.ro/demo/Motion-based%20Gesture%20Recognition%20with%20an%20Accelerometer/Paper.pdf
另一個有關把 motion sensor 專案當成遙控器的專案是 ReMoko, 程式分為 target 端及 server 端:
Source 在:

Google Developer 也有官方的 sample

http://developer.android.com/resources/samples/AccelerometerPlay/index.html

呵, 突然發覺還是有 tube 有真相.

2 則留言:

Unknown 提到...

請問你有cat 過Android-Freerunner的accelerometer 的值嗎?因為以下都是亂碼

#cat /dev/input/events2

NengYu 提到...

我有 cat 過, 但是我忘了是哪一個版本試過. Koolu 的 kernel 基本上是用 andy-tracking, /dev 下的東西應該都是一樣的.

 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.