の画面タッチでLチカ - OSC
iPhoneをタッチしたら、Lチカするプログラムを作成します。
構成
iPhone ->(OSC)-> Max ->(シリアル通信)->Arduino->Lチカ
通信メッセージ
iPhone -> "touch/panel/down" -> Max -> "down" -> 1 -> Arduino -> LED点灯
iPhone -> "touch/panel/up" -> Max -> "up"-> 0 -> Arduino -> LED消灯
環境
of_v0.9.3_ios_release
Xcode v7.3.1
Max/Msp 7
iPhone 6
Arduino v1.69
openFrameworks
まずはofから。iPhoneのプログラムを記述します。
projectGeneratorで、Addonsに ofxOsc を入れてプロジェクトを作成します。
作成できたらofApp.h
を以下のようにします。
#pragma once
#include "ofxiOS.h"
#include "ofxOsc.h"
//#define HOST "localhost"
#define HOST "192.168.100.101"
#define PORT 12345
class ofApp : public ofxiOSApp {
public:
void setup();
void update();
void draw();
void exit();
void touchDown(ofTouchEventArgs & touch);
void touchMoved(ofTouchEventArgs & touch);
void touchUp(ofTouchEventArgs & touch);
void touchDoubleTap(ofTouchEventArgs & touch);
void touchCancelled(ofTouchEventArgs & touch);
void lostFocus();
void gotFocus();
void gotMemoryWarning();
void deviceOrientationChanged(int newOrientation);
private:
ofxOscSender sender;
bool touch_down;
};
#define HOST
は使用しているネットワークを指します。
MacからiPhoneのシュミレーターで確認する場合、IPアドレスか"localhost"
で構いません。
実機のiPhoneからであれば、IPアドレスを記述します。
また、PORTは1024~65535番の範囲で記述します。
0~1023番はサーバのアプリケーションで使用するポートとして登録されているので、被らないようにします。
ofxOscSender sender;
はOSCメッセージを送信するインスタンス、bool touch_down
はiPhoneをタッチしたか否かを判定するために使用します。
続いてofApp.mm。
iPhoneをタッチした際にOSCメッセージが送られるようにします。
特に記述していないところは省略しました。
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
ofBackground(0, 0, 0);
sender.setup(HOST,PORT);
ofSetFrameRate(10);
touch_down = false;
}
//--------------------------------------------------------------
void ofApp::draw(){
ofSetColor(255, 255, 255);
if(touch_down == true){
ofSetColor(255,255,255);
ofDrawCircle(ofGetWidth()/2, ofGetHeight()/2, 10);
}
}
//--------------------------------------------------------------
void ofApp::touchDown(ofTouchEventArgs & touch){
ofxOscMessage m;
m.setAddress("touch/panel");
m.addStringArg("down");
sender.sendMessage(m);
touch_down = true;
}
//--------------------------------------------------------------
void ofApp::touchUp(ofTouchEventArgs & touch){
ofxOscMessage m;
m.setAddress("touch/panel");
m.addStringArg("up");
sender.sendMessage(m);
touch_down = false;
}
sender.sendMessage(m);
によってm.setAddress();
とm.addStringArg();
の
引数がMaxに送られます。
今回はiPhoneの画面に指を置いた際に"touch/panel/up"が送信され、画面から指を離した際に"touch/panel/down"が送信されます。
また視覚的にタッチしているか否かが分かるようにするため、タッチをした際に画面中央に円が描かれるようにしています。
Max
udpreceive
udpreceive
の引数にofで設定したポート番号を記述します。
route
route
は「route
のインレットの最初の引数」と「route
の引数」が合致した場合、合致した次のインレットの引数の値を出力します。(説明難しい)
ofから送られてくるメッセージは"touch/panel/up"もしくは"touch/panel/down"です。
"touch/panel/down"->route touch/panel/
->合致->"down"
"touch/panel/up"->route touch/panel/
->合致->"up"
となり、"up"もしくは"down"が出力されます。
sel
sel down up
ではupとdownを数値の0,1に置き換えています。
文字列だとserial: doesn't understand
というエラーが出てしまうので、upやdownから数値に置き換える必要があります。
serial
serial c 9600
のcはポートを、9600は通信速度を指しています。
- ポートがcの理由
serial
にprint
メッセージを繋げます。
print
をクリックすると、PCとシリアル通信が出来るデバイスの一覧がMax consoleに出力されます。
ArduinoをPCに接続しprint
を押すと、私のPCでは
と出力されます。これでArduinoのportはcだとわかりました。
使用環境によって、aだったりbだったりするので確認をしましょう。
Arduino
osc_01.ino
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
if(Serial.available()>0){
int c = Serial.read();
Serial.println(c);
if(c == 1 ){
digitalWrite(13,HIGH);
}else if(c == 0){
digitalWrite(13,LOW);
}
}
}
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
if(Serial.available()>0){
int c = Serial.read();
Serial.println(c);
if(c == 1 ){
digitalWrite(13,HIGH);
}else if(c == 0){
digitalWrite(13,LOW);
}
}
}
Serial.begin();
の引数はMaxのserial
で設定した、通信速度と同じです。
iPhoneをタッチするとMaxからは0,1の値が送信されるので、Arduinoにプログラムを書き込むことでLEDがチカチカするようになります。
コンパイルの順番によってはうまくいかなかったりしますが、Arduinoに書き込んでからMaxを立ち上げ、ofをコンパイルすると上手くいくかもしれません。
参考
openFramewoks – OSC (Open Sound Control) を利用したネットワーク連携
Port Number
Author And Source
この問題について(の画面タッチでLチカ - OSC), 我々は、より多くの情報をここで見つけました https://qiita.com/akspect/items/2703d7be4e5f35690522著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .