ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Posts Tagged ‘Accelerometer

Windows Phoneプログラミング – 加速度計の値をAccelerometerから取得すると重力加速度は1、最大加速度は2だが値を超えることもある – 実験機はNokia Lumia 800

leave a comment »

IMG_4035_mid_640_480

<Fig.1 : Wondows Phoneの加速度情報を取得するサンプル>

Accelerometerオブジェクトを使ってWindows Phoneから加速度情報を取得して画面に表示するサンプルを作ってみた。加速度情報はWindows Phoenに対してX、Y、Zの3軸で値を取得するようになっている。Windows Phone本体を上向きで水平状態に保ったとき、XとYの値は「0」、Zの値は「-1」となっている。本体を裏返しにして水平状態に保つと、XとYの値は「0」、Zの値は「1」となる。

本体を表に向けた状態で、右に傾けるとXの値が「0」から次第に増加し、90度傾けて立てた状態にするとXの値は「1」になる。本体を向こう側に傾けるとYの値が「0」から次第に増加し、90度傾けて立てた状態にする、つまりWindows Phoneを逆さに立てた状態にするとYの値は「1」になる。リアルタイムに加速度計の値が変化するサンプルは以前ここで紹介した。

<Windows Phoneアプリ開発 – たった3行でできる加速度センサの利用>
https://matsumotoyoshio.wordpress.com/2012/06/27/windows-phone%e3%82%a2%e3%83%97%e3%83%aa%e9%96%8b%e7%99%ba-%e3%81%9f%e3%81%a3%e3%81%9f3%e8%a1%8c%e3%81%a7%e3%81%a7%e3%81%8d%e3%82%8b%e5%8a%a0%e9%80%9f%e5%ba%a6%e3%82%bb%e3%83%b3%e3%82%b5/

しかし加速度計の値は、単に傾きを取得するのではなく「加速度」を取得するので、Windows Phone本体を振るなどして加速度を与えると「1」以上の値や「-1」以下の値を取得する。瞬間的に「1」や「-1」を超えることがあるのだ。このあたりは加速度の値を使って操作するアプリを作ったとき、値が閾値を超えてエラーにならないように考えなければならない。

では実際にWindows Phoneを振るなどして加速度の値がどのくらいまで取得されるかを試したのが上のFig.1である。このサンプルでリアルタイムに加速度の値を取得して表示すると同時に、X、Y、Z各値の最大値と最小値を表示させるようにしたものだ。テキストボックスの上からXのリアルタイム値、次は左がXの最大値で右がXの最小値、Yのリアルタイム値、Yの最大値とYの最小値、そしてZのリアルタイム値、Zの最大値とZの最小値、である。

サンプルプログラムを実行し、Windows Phoneをいろんな角度に振ると最大値、最長値がわかる。わかったのは、加速度の最大値は「2」、最長値は「-2」で、これはつまり重力加速度の2倍まで検知できると考えていいだろう。また最大値はぴったりではなく、XとYの加速度は最大2.000977まで上がり、Zの加速度は-2.000977まで下がっていることだ。

この原因はWindows Phoneの加速度センサに誤差があるからだろうか。このサンプルプログラムはNokia Lumia 800で実行したものだが、同機種の他の実機で実行したり、他機種モデルで実行して調べてみたい。もし機器の個体差によるものなら、アプリのプログラミングにおいてはこの誤差を考慮する必要があるだろう。

IMG_4054_mid_640_480

<Fig.2 : サンプルプログラムを実行したWindows Phone Nokia Lumia 800>

広告

Windows Phoneアプリ開発 – たった3行でできる加速度センサの利用

with 3 comments

IMG_3857_mid_640_480

<Fig.1 : 加速度センサの値を画面に表示するサンプル>

Windows Phoneにとって、というよりもモバイルデバイスにとって加速度センサの役割は重要である。加速度センサは言葉を変えると「傾きセンサー」であり、これを使うとモバイル機器を傾けることで機器をコントロールすることができる。Windows Phoneは様々なメーカーからモデルが出されるが、加速度センサーは標準仕様であり、必ず実装されなければならないものとなっている。このように基本仕様を決めることは開発にとってメリットがある。開発ツールで標準のライブラリさえ提供できれば、プログラム上で利用することが簡単になるからだ。Windows Phoneプログラミングでは加速度センサーを参照する標準のクラスが用意されており、これを使うと実に簡単に加速度センサの値を取得することができる。

上のFig.1は加速度センサの値をX、Y、Z軸でそれぞれ検知し、テキストボックスに値を表示するサンプルである。

加速度センサを参照するためには、次のようにたった3行でいい。

1.Accelerometerのインスタンス変数を定義する
2.new演算子でインスタンスを生成する
3.myAccelerometer.CurrentValue.Acceleration.Xで値を取得する

実際には上のサンプルは、myAccelerometer.CurrentValueChangedイベントプロシージャでリアルタイムに加速度センサの値が変化するたびにテキストボックスの値を書き換える処理をしている。このサンプルでは、テキストボックスの上から「X値」、「Y値」、「Z値」を表示している。また必要な参照設定を追加し、名前空間の追加も必要である。

IMG_3858_mid_640_480

<Fig.2 : Windows Phoneを右に傾けると加速度センサのX値が正となり増加する>

IMG_3859_mid_640_480

<Fig.3 : Windows Phoneを左に傾けると加速度センサのX値が負となり減少する>

Windows Phone本体を左右に傾けるとX軸の値が変化する。右に傾ければX値が増加し、左に傾ければX値は減少する。平らな状態が「0」であり、最大値は1、最小値は-1だ。また本体を左右に傾けることでZ軸も傾くのでZ値も変化していることがわかる。

IMG_3860_mid_640_480

<Fig.4 : Windows Phoneを向こう側に傾けると加速度センサのY値が正となり増加する>

IMG_3861_mid_640_480

<Fig.5 : Windows Phoneを手前に傾けると加速度センサのY値が負となり減少する>

Windows Phone本体を向こう側や手前に傾けるとY軸の値が変化する。向こう側に傾ければY値が増加し、手前に傾ければY値は減少する。平らな状態が「0」であり、最大値は1、最小値は-1だ。左右に傾けた時と同様に、向こう側や手前に傾けるとZ軸も傾くのでZ値も変化している。

IMG_3862_mid_640_480

<Fig.6 : Windows Phoneをひっくりかえすと加速度センサのZ値が正となり増加する>

加速度センサのZ値は、体感的にはわかりにくいが本体の手前から裏側に向かって突き抜ける回転軸である。Windows Phone本体をどの方向にであれ傾けるとZ軸の値が変化する。通常、表パネルを手前に向けた状態でZ値は負であり、上の写真のように本体をひっくりかえすとZ値は正になる。平らな状態が「-1」または「1」であり、本体が立った状態で「0」となる。

加速度センサは魅力的なインターフェースである。加速度センサーを使うことができれば、いろいろなアプリケーションのアイデアが湧くだろう。どんなアプリケーションを作ろうかと、いろいろと考えるだけで楽しい。30年以上も前、はじめて「パソコン」というものに触れ、プログラミングに熱中してあっというまに朝が来た日々を思い出す。Windows Phoneプログラミングは俺の心を捉えて離さない。