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 加速度センサ類取得クラスを書いてみました。