Linux で ThinkPad の加速度センサーを読む

hirax.net::各種言語からのThinkpadの加速度センサ値取得方法 というものがあり、いろいろな取得方法があるようですが、Linux の場合には hdaps というものを用いると便利です。

最初に hdaps を導入します。 Browse tpctl Files on SourceForge.net から tp_smapi の最新版 (現時点では 0.40) を入手します。 これを展開し、インストールします。

$ tar -xzvf tp_smapi-0.40.tgz

$ cd tp_smapi-0.40

$ sudo make install HDAPS=1

$ sudo modprobe hdaps

この状態で、/sys/devices/platform/hdaps/calibrate からキャリブレーションの値を読むことができ、/sys/devices/platform/hdaps/position から現時点の位置を読むことができます。 したがって、awk でも簡単にプログラムすることができます。

#! /usr/local/bin/nawk -f
# hdaps.awk: Linux から ThinkPad の加速度センサーの値を読む
# usage: nawk -f hdaps.awk
# Ref: http://www.ibm.com/developerworks/jp/opensource/library/os-linuxthinkpad/
# Ref: http://www.ibm.com/developerworks/jp/linux/library/l-knockage/
# Ref: http://www.hirax.net/diaryweb/2009/12/13.html#8601

BEGIN {
    for (i = 1; i <= 20; i++) {
        hdaps_val = get_hdaps();
        split(hdaps_val, arr_hdaps_val);

        print "X = " arr_hdaps_val[1] ", Y = " arr_hdaps_val[2];

        system("/bin/sleep 0.1");
    }
}

# get_hdaps():     HDAPS から値を読む
#   in:     NONE
#   out:    キャリブレーション値からのズレ
function get_hdaps(    hdaps_cal_file, hdaps_pos_file, \
                        val, arr_val, cal_x, cal_y, pos_x, pos_y) {
    hdaps_cal_file = "/sys/devices/platform/hdaps/calibrate";
    hdaps_pos_file = "/sys/devices/platform/hdaps/position";

    # キャリブレーションの値を読み込む
    while (getline < hdaps_cal_file > 0) {
        val = $0;
        sub(/[()]/, "", val);
        split(val, arr_val, /,/);
        cal_x = arr_val[1];
        cal_y = arr_val[2];
    }
    close(hdaps_cal_file);

    # 今の値を読む
    while (getline < hdaps_pos_file > 0) {
        val = $0;
        sub(/[()]/, "", val);
        split(val, arr_val, /,/);
        pos_x = arr_val[1];
        pos_y = arr_val[2];
    }
    close(hdaps_pos_file);

    return pos_x - cal_x " " pos_y - cal_y;
}

早速 ThinkPad を持って、揺らしながら実行してみます。

$ nawk -f hdaps.awk
X = -1, Y = -6
X = 0, Y = -6
X = 0, Y = -6
X = 0, Y = -5
X = -1, Y = -5
X = -1, Y = -5
X = -1, Y = -5
X = 7, Y = -5
X = -6, Y = -6
X = -7, Y = -3
X = -13, Y = -1
X = -12, Y = -1
X = -9, Y = -3
X = -8, Y = -1
X = -9, Y = -4
X = -10, Y = -2
X = -20, Y = -1
X = -9, Y = -2
X = -4, Y = -6
X = -6, Y = -10

こんな感じで簡単に値を読むことができました。 Twitter に『オレオレ地震観測結果』を bot でアップしても楽しそうですね。

Linux ThinkPad の振動検出を活用する には Perl を用いた簡単なスクリプトが掲載されていますので、こちらも試してみてはいかがでしょうか。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png