(技術メモ)openFrameworks for iOSで方位磁石を使う / 磁石に反応させる

iPhoneに磁石を近づけると何か反応する,というインタラクションを作るためのメモ.

まず,iPhone3 以降のiPhoneには方位磁石が内蔵されており,CoreLocation.Frameworkというフレームワークを使えば周囲の磁力の変化を計測できる.
i pod touchには残念ながらこの機能は搭載されておらず,新しくても古くてもtouchではコンパスは使えない.

あと最も注意すべきこととして,iPhoneに強い磁石をくっつけたりすると多分壊れる.実験等を行う場合は磁力に注意.

appleがiOS環境のわかりやすいExampleを公開している
https://developer.apple.com/library/ios/samplecode/Teslameter/Listings/ReadMe_txt.html
objectiveCで作りたい人であればこれを参考にすればOK.

このプログラムの肝は

// Compute and display the magnitude (size or strength) of the vector.
//      magnitude = sqrt(x^2 + y^2 + z^2)

CGFloat magnitude = sqrt(heading.x*heading.x + heading.y*heading.y + heading.z*heading.z);

 [magnitudeLabel setText:[NSString stringWithFormat:@”%.1f”, magnitude]];

という部分.ようするにx y z の値を二乗ずつして足してスカラー値を取得している.iPhoneのマイクの辺りに磁石を近づけるとこのmagnitudeが大きく減少したり上昇したりする.

 

さて,ここからはこの機能をOFで使うにはどうするか.

結論としてはOFのExampleに方位磁石を使うものがあるので,それを修正するだけでOK.

使うexampleは「CoreLocationExample」というもの.これを見るとofxiOSCoreLocationというCoreLocationの機能をOF上で使うためのライブラリの使い方が分かる.

あとは

float magnitude = sqrt(coreLocation->getCompassX()*coreLocation->getCompassX() + coreLocation->getCompassY()*coreLocation->getCompassY() + coreLocation->getCompassZ()*coreLocation->getCompassZ());

みたいなかんじで計算すればiOS用のexampleと同様に磁力の変化が計測できる.

注意点として,ofxiOSCoreLocation.mmにあるように

 * ——————– note ———————–

 *

 * To get the compass to work on 3GS+ phones you’ll need to double clock on the iPhone oF target from the targets

 * dropdown in the grops & files menu. Make sure ‘All Configurations’ is selected, and then find the option called

 * ‘Preprocessor Macros’. Add to that: OF_TARGET_BUILD_SDK_IS_3_PLUS

 * ————————————————-

ビルドのターゲットを3GS以上にしないと正常に作用しないようです.

libpd/pd-for-ios settings

It’s pretty simple to do. exampleを動かすだけならとても簡単です

Mac OSX 10.9.2
Xcode version 5.1

reference : https://github.com/libpd/pd-for-ios/wiki/ios

These steps will show you how to set up a new Xcode project with libpd.

In order to set up Pd for iOS, open a shell, go to the directory where you want to put your iOS Xcode projects, and perform the following steps:

git clone git://github.com/libpd/pd-for-ios.git
cd pd-for-ios
git submodule init
git submodule update

 
↑Just downloading a zip file will not work well. You have to  use git and update submodule.
I’ve succeed to install example projects in my i Pod Touch.

 

Add libraries for Processing on ADT Eclipse + libpd + processing project

Eclipse上でProcessing + libPdのプロジェクトをつくっている時でも,processing用に書かれた外部ライブラリを使用することができる.
You can use external libraries for Processing when you create a project for Processing + libPd in Eclipse.

http://techbooster.org/android/environment/4897/

http://memomemoandroid.blogspot.com.es/2013/06/jar.html

この二つの記事を参考にしたらできた.ありがとうございます.
These two libraries were helpful (but in Japanese).

1.外部ライブラリのjarがある場所を把握.Macだったらlibraries のなかの各ライブラリフォルダの中にあるはず.
2.Eclipseでプロジェクトフォルダを右クリック,“Properties”,プロパティ画面が表示されたら、“Java Build Path”を選択し、“Add External JARs…”
3.順序及びエクスポートタブを選択、追加したjarのチェックする

1.Figure out the position of Jar file of the external file.
2.Right click of your project folder on Eclipse, “Properties”, then choose “Java Build Path” and “Add External JARs…”.
3.Choose “Order and Export” tab, check added jar files

 

あとはメインになっているjavaプログラムのなかでimportして,Processingと同様に使える.ただしoscP5等一部のライブラリはマニフェスト内のパーミッションを変更しないと動かないので注意.

After that you can import and declare the libraries in your java program as well as Processing IDE. But please take care about that some libraries need permissions in manifest xml.

 

create new project on ADT Eclipse + libpd + processing

eclipse上で右クリックでプロジェクトをコピー&ペーストするとはじかれる.どうも設定上同じワークスペースに同じ情報を持ったプロジェクトは置けないことになっているらしい.
It is repelled when you copy and paste a project just by right-clicking in eclipse on. It seems to be impossible that the project with the same information is placed in the same workspace.

http://kyokomi-android.doorblog.jp/archives/6835616.html

こちらにプロジェクトコピーのやり方が丁寧に書いてある...けどうまくいかなかったので,ワークスペースにプロジェクトを新規作成することにしたら案外そっちの方がうまくいった.
This site shows the way of copy carefully (in Japanese)… but I couldn’t succeed in this way, then I decide to create a new project and it turned out to be easier in the end.

 

やり方は

1.File – New- android application projectでプロジェクトを新規作成
2.プロジェクト名やパッケージネームを他の物とかぶらない好きなものにする.アクティビティネームとか色々好きなように.
3.プロジェクトが作成されたら右クリック- properties に行って,右下のadd Library – addのところでPdCore とPdCoreP5を追加して,OK
4.resフォルダのなかにrawフォルダを作成,そのなかにpdのパッチが圧縮されたzipファイルを入れる
5.メインアクティビティになってるjavaファイルを書き換える.PdP5Sample.javaをコピペするとしたら,最初のpackageのところと,public classの名前と zipIdのところが自分が設定したパッケージ名等になるように変更が必要

これだけで動いた.
使うライブラリとかクラスの数が知れているのであればこうやってプロジェクトを新規作成した方が早そう.

 

1.Create a new project in File – New- android application project
2.Name project name etc.. as you like.
3.Once the project is created, right click – properties. And add “PdCore” and “pdCoreP5” library by pressing addLibrary – add.
4.Create raw folder in res folder, and add zip file that includes pd patch file
5.Rewrite a Java file for main activity. For example you copy and paste “PdP5Sample.java”, you have to modify package name, public class name, zipId according to your settings.

That’s all.
If you don’t use many libraries or classes, creating a new project seems to be easier than copying a project.