以前、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 件のコメント:
コメントを投稿