2011年5月3日火曜日

Arduino で OSC (応用篇)



以前、Ethernet Shield を使ったOSC の送信を紹介しました。
今回は同じOSC Library から、より実践的なサンプル 「IO_test_arduino」を使ってみましょう。

File > Examples > OSCClass > example_OSC > IO test > IO_test_arduino

このサンプルでは Pot (Potentiometer)、Switch の読み取り(OSC Send)と、LED の点灯(OSC Receive)を行うことが出来ます。

Pot はAnalog 0 に接続したボリューム(半固定抵抗)、Switch はDigital 3 に接続したスイッチです。LED はDigital 2 に接続します。

スイッチは1kΩでプルアップしています。(Arduino の内蔵プルアップ抵抗を使うとより簡単です。)上図では LED を High 出力のときONになるように接続していますが、プログラムではLow 出力のときON となっています。(On/Off が反転しています。)


Network の構成はこうなっています。


あとはOSC の送受信を行えば良いのですが、、、
今回もそのままでは動きませんでした。

1. コンパイルエラーが起きます。 > 前回同様、SPI ライブラリの追加が必要です。
2. OSC 受信ができません。(送信は問題なし)

OSC のアドレスを宣言する箇所と、loop の中で OSC アドレスを比較している箇所を抜き出します。

OSC アドレス宣言部

char *topAddress="/ard";
char *subAddress[3]={ "/led" , "/switch" , "/pot" };

受信OSC アドレス比較部

//osc arrive check
if ( osc.available() ) {
//toplevel address matching
if( !strcmp( recMes.getAddress(0) , topAddress ) ){
//second level address matching
if( !strcmp( recMes.getAddress(1) , subAddress[0] ) ){
ledProcess();
}
}
}


strcomp で文字列比較を行っていますが、getAddress(0)、getAddress(1) には"/" が付いていません。
手抜きですが、以下のようにしました。

OSC アドレス宣言部(修正後)

char *topAddress="/ard";
char *topAddress2="ard";
char *subAddress[3]={ "led" , "/switch" , "/pot" };

受信OSC アドレス比較部(修正後)

//osc arrive check
if ( osc.available() ) {
//toplevel address matching
if( !strcmp( recMes.getAddress(0) , topAddress2 ) ){
//second level address matching
if( !strcmp( recMes.getAddress(1) , subAddress[0] ) ){
ledProcess();
}
}
}


これで ledProcess() が呼ばれるようになります。
スケッチのダウンロードはこちらから。(サンプルスケッチの改変です。私の権利主張はしません。)

Pd extended と通信している様子です。Pot を回す、Sw を押すとき、それぞれ OSC が送られます。また、/ard/led にOSC を送るとled が点灯・消灯します。

0 件のコメント:

コメントを投稿