ドムドムその6:3軸加速度センサーを組み込もう

サルでき.jp > 11.サルにもできるiPhoneアプリの作り方(旧アメブロ記事) > ドムドムその6:3軸加速度センサーを組み込もう

2009/10/05 09:00 投稿先 11.サルにもできるiPhoneアプリの作り方(旧アメブロ記事) 投稿者 カワサキ タカシ

ログラミングは楽しいところから先。

というこのブログのコンセプトに則り。
まだボタンをペムペム押すだけの機能しかないドムドムに、
最初に取り付ける機能としてコレをチョイスしてみました。

3軸加速度センサー表示機能
ドムドムその6:3軸加速度センサーを組み込もう

タッチスクリーンと並ぶiPhone/iPod touchの顔とも言える機能。
それがこの3軸加速度センサー、平たく言うと傾きセンサーです。

・X軸 iPhoneを立てて持って、左右方向に力が入ると反応(右がプラス、左がマイナス)
・Y軸 iPhoneを立てて持って、上下方向に力が入ると反応(上がプラス、下がマイナス)
・Z軸 iPhoneを立てて持って、前後方向に力が入ると反応(前がプラス、後がマイナス)

この3軸に加速(Gですね。F1とかでお馴染みの)がかかるとそれを感知します。
数字は+1~-1まで、加速が大きくなると数字も大きくなります。

地球には重力(上から下への力)が常に働いていますので、
iPhoneを立てて構えると、Y軸のマイナスの力が何にもしなくてもかかっています。

同様に、iPhoneのディスプレイを上に向けて机の上に置くと、
Z軸のマイナスの力がかかるわけです。

ではでは。
コレを測定する機能。
作ってみようじゃないですか。

ドムドムその6:3軸加速度センサーを組み込もう

まずはラベルを追加します。
何気なく引いていた線が役に立つ時が来ましたね。

線をガイドラインとして、6つラベルを追加してください。
左半分は項目名ですので、表示されているテキストを修正、
右半分は実際の数字を表示しますので、インスペクタで文字の右寄せをしておきましょう。

ドムドムその6:3軸加速度センサーを組み込もう
<クリックで拡大>

次がヘッダーファイルへのアウトレットの追加です。
プログラムと連動するのは右3つのラベルだけですので、ここでは3つ追加してください。
ここではdispX, dispY, dispZの名前で追加しました。

ドムドムその6:3軸加速度センサーを組み込もう

Interface Builderでアウトレットの接続をします。
ラベルが小さいので接続ミス注意です。

ドムドムその6:3軸加速度センサーを組み込もう
<クリックで拡大>

ヘッダーに戻っておまけ変数を少々付け足します。
測った加速度をとりあえず入れておくためのバケツです。

double accelX, accelY, accelZ;

double型で3つの変数を宣言しています。
加速度は0.123214みたいな形で計測されますので、
数値型の中でも少数格納OKのdouble型を使います。

ドムドムその6:3軸加速度センサーを組み込もう
<クリックで拡大>

で、コレが今回のキモ。ソースコードファイルの該当部分です。
大きくは2つに分かれています。

- (void)viewDidLoad { }
Viewが読み込まれた後に実行されるメソッド

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { }
コレこそまさに3軸加速度センサーメソッド

の2つです。

- (void)viewDidLoad {
[super viewDidLoad];
// 加速センサーのインスタンスを*accelerometerとして取得
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
// 計測時間間隔を設定
accelerometer.updateInterval = 0.02;
// 加速センサーの値を受け取るデリゲートを自分自身に設定(とりあえずこう書いておいてください)
accelerometer.delegate = self;
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
// 加速度を変数に格納
accelX = acceleration.x;
accelY = acceleration.y;
accelZ = acceleration.z;

// 変数の値をラベルに格納
dispX.text = [NSString stringWithFormat:@"%1.2f", accelX];
dispY.text = [NSString stringWithFormat:@"%1.2f", accelY];
dispZ.text = [NSString stringWithFormat:@"%1.2f", accelZ];
}

※stringWithFormat:@”%1.2f” ←コレ
accelX,accelY,accelZの、それぞれの数字のフォーマットを設定しています。

“%f”が基本形。この場合は数字を実数(小数OK)にしろっていう意味です。
“%8f”など、頭に数字を付けると、この桁数で残りは丸めてくれます。
“%08f”など、数字の前にゼロを付けると、足りない桁はゼロ埋めしてくれます。
“%8.2f”など、点+数字を付けると、小数点以下の桁も設定できます。

つまり今回のケースでは、
数字のフォーマットを「整数部分1桁、少数部分2桁」にしているわけです。

さーて、ここまでの準備はできましたか?

2009.11.9 hogefoobarさんよりご指摘内容を追記

3軸センサーのコードを足した時に、
domdomViewControler.hに
@interface domdomViewController : UIViewController{
から
@interface domdomViewController : UIViewController<UIAccelerometerDelegate> {
に修正しないと、ワーニングが表示されます。

それでは「ビルドして進行」、機能リリースです!

2009.11.9 hogefoobarさんよりご指摘内容を追記

シミュレーターでは加速度センサーが働いてくれませんので、
ここからは実機を使って確認していきます。

実機への登録方法はこちらをご覧ください。
実機ダヨ!全員集合!Provisioning Profileの取得

ドムドムその6:3軸加速度センサーを組み込もう

おお~。数字が動いてる~。

机に置いているだけでも、常にZ方向への力はかかっています。
(ぱっと見た感じ重力の力が1.00に設定されているようですね)

コレを使えば、机の水平を調べることもできちゃうわけです。
(X=0,Y=0,Z=-1なら水平、ウチの机少し傾いてますね。。。)

今はまだこの数値を表示しているだけですが、
この数値を何らかの係数として使えば、傾きに応じた様々なアクションを作ることができます。
傾きアクションのコア部分は、もうアナタのものです。

まずはこの数字をいろんな場所で眺めて、
どうすればどのくらいの値になるのか、調べてみてください。

関連する記事:


Advertisement