ThinkPadの加速度センサ

〜加速度センサで遊んでみた〜

X41以降のThinkPadにはThinkPadを落としたり、強い揺れが生じたときHDDの破損を防止する機能が搭載されている。
 → 急な加速度変化が生じたとき、ヘッドを待避することで実現。
この目的のため、2軸の加速度センサを搭載しているが、この加速度センサは傾斜センサとしても使うことができる。
(地球の重力を検出しているため、左右と奥行きの高さの差を検出可能)

Thinkpad 加速度センサのデータ取得

C:\Windows\system32\Sensor.DLLが、インタフェースモジュール。
ShockproofGetAccelerometerData メソッドを呼んでデータを取得する。

元ネタはこちら→http://www.stanford.edu/~bsuter/thinkpad-accelerometer/
このページからIBMのページを手繰ったら、こんなページに詳細なソースが!
上記ページに、『Download this Modified SDL Library zip.』がミソ。
このアーカイブにある SDL_events.c.patch というファイルの266〜278行が目的のもの。

typedef struct _ACCELREPORT {
    INT      PresentState;        // Current internal state (stable: 0, unstable1: 1: unstable2: 2)
    USHORT   LatestRawAccelDataX; // latest raw acceleration data of X axis    <-- works!
    USHORT   LatestRawAccelDataY; // latest raw acceleration data of Y axis    <-- works!
    USHORT   LatestAccelDataX;    // latest acceleration data of X axis (average in 40ms)   <-- Works even better?
    USHORT   LatestAccelDataY;    // latest acceleration data of Y axis (average in 40ms)   <-- Works even better?
    CHAR     Temperature;         // latest temperature
    USHORT   LatestZeroG_X;       // latest zero-G offset of X axis  <-- Seems to be the current notion of "center"
    USHORT   LatestZeroG_Y;       // latest zero-G offset of Y axis  <-- ""
} ACCELREPORT, *PACCELREPORT;
		
プログラム起動時に、LatestZeroG_X,LatestZeroG_Yを取得し、
以降は、LatestAccelDataX,LatestAccelDataYとの差分をとる。
これだけで左右(Y軸)と奥行き方向(X軸)のズレ(傾斜)を取得できる。
 ・
 ・
 ・
何故か、温度まで取れるようだが…。

サンプルプログラム

プログラムはこれ。参照元がGPL(LGPL)なので趣旨に則り、これもGPLとする。
SENSOR01.RAR

ここ数年、javaとvbばかりでアホになりそうだったので、リハビリも兼ねてC++で作成。
開発環境はMSの VS2008ExpressWithSP1JPNX1504866.iso を利用。
なので、ソースが汚いとか書き方が怪しいとか苦情を言わないこと。(文句があるなら勝手に直して公開してくれ)


mailto: spam_spam_spam_spam_spam_spam@mbj.nifty.com
Last update:2009/03/08