hirax.net::inside out::2009年12月02日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2009年11月 を読む << 2009年12月 を読む >> 2010年1月 を読む

2009-12-02[n年前へ]

Ruby版 Thinkpad 加速度センサ類取得クラスを書きました 

 Lenovo(旧IBM)のノートPC ThinkPad にはハードディスク保護を目的として、加速度センサが付いています。SSDを搭載している機種でも、(その他のハードウェアは共通化されているからだろうと思いますが)やはり加速度センサが付いているということです。

 以前、C++でThinkpad加速度センサ類取得クラスを作りましたが(このC++コードを眺めてみると、不要な部分が残っていたので、その点については後で修正します)、今回はRubyでそのクラスを組んでみました。作成したRubyソースは、ここに置きました(accelerometer.rb)。ソース最下部には、使用方法もコメントアウトした上で付けておきました。また、このバージョンはC++バージョン同様、最近のThinkpadでも動く実装になっています。

 読みやすさのために改行を適当に入れたソースは、下記のようになります。

# jun hirabayashi jun@hirax.net 2009.12.02

class Accelerometer
  require 'Win32API'

  attr_accessor :x
  attr_accessor :y
  attr_accessor :temperature
  attr_accessor :presentState

  def initialize
    begin
      @sensorFunctionAPI=Win32API.new("Sensor",
        "ShockproofGetAccelerometerData", ['P'], 'V')
      @buffer=' '*17
      if @sensorFunctionAPI.Call(@buffer)
        parse(@buffer)
        @offsetX=-@latestRawAccelDataX.to_i;
        @offsetY=-@latestRawAccelDataY.to_i; 
      end
    rescue
      'We have some problem.'
      exit!
    end
  end
  
  def parse(result)
    @presentState,@latestRawAccelDataX,@latestRawAccelDataY,
    @latestAccelDataX,@atestAccelDataY,@temperature,
    @atestZeroG_X,@atestZeroG_Y=result.unpack("iSSSSCSS")
  end 

  def getAccelerometerData
     @sensorFunctionAPI.Call(@buffer)
     parse(@buffer)
     @x=@latestRawAccelDataX.to_i+@offsetX.to_i;
     @y=@latestRawAccelDataY.to_i+@offsetY.to_i;
     return [@x,@y]
  end
end

 このRubyクラスを使った加速度取得スクリプト例は、下記のようになります。ちなみに、Xが(ノートPCに向かって)左右方向で、Yが奥行方向になります。これで、1秒おきにThinkpadの傾斜をコンソール出力します。

require 'accelerometer'

accelerometer=Accelerometer.new
10.times{ |i|
  puts accelerometer.getAccelerometerData.join(',')
  sleep 1
}

 MA5授賞式で面白いものを作っている開発者を見たせいか、何か色々作ってみたくなります。4年ほど前には、この加速度センサテクニックを使って「「未来の立体ディスプレイ」を作る」とか色々作ったような覚えがありますが、まだまだ色々な応用がありそうな気がしてきました。というわけで、まずは準備のために、今日はRuby版 Thinkpad 加速度センサ類取得クラスを書いてみました。