Edited at

Arduino Ethernet Shield2でのOSC設定

More than 3 years have passed since last update.


経緯

ArduinoでOSCを使ってMaxやoFとの連携を図ろうとEthernetShield2を購入したがEthernet2.hをインクルードするとエラーを吐いてコンパイル通らない。

ArdOSCやOSCuinoを調べながら試してみたが、Ethernet.h使用の記事は見つかったが2のはなかった。


使ったもの


  • Arduino IDE 1.7.9 (Arduino.org:このサイトじゃないと最新版DLできない)

  • OSCライブラリ(github)

  • Arduino UNO

  • Arduino Ethernet Shield2

  • Mac osx10.10.5(DHCP手入力でIP設定しました)


コード

setup()前の設定

#include <OSCMessage.h>

#include <SPI.h>
#include <Ethernet2.h>
#include <EthernetUdp2.h>

byte mac[] = {
0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF //シールドに記載されているMacアドレス
};
IPAddress ip(192, 168, 1, 177);            //環境に合わせて設定を
IPAddress gateway(192, 168, 1, 1); //環境に合わせて設定を
IPAddress subnet(255, 255, 0, 0); //環境に合わせて設定を

unsigned int localPort = 8888;
byte destIP[] = {192, 168, 1, 10};     //相手のIPアドレス
int destPort = 9001;                                 //sendポート

EthernetUDP Udp;
EthernetServer server(23);                    //Exampleであったので書いてあるがよくわかr

setup()、loop()の設定

void setup() {

// UDPなどの初期設定
Ethernet.begin(mac, ip, gateway, subnet);
Udp.begin(localPort);

Serial.begin(9600);

Serial.println(Ethernet.localIP()); //IP取れてるか確認用
}

void loop() {
EthernetClient client = server.available(); //どっかでこれやってないとうまくいかないってのを読んだ気がする

OSCMessage meg("/test"); //OSC送信内容初期設定

int a = 0;
meg.add(a); //Sendしたい内容を設定
Udp.beginPacket(destIP, destPort); 
meg.send(Udp);
Udp.endPacket();

     a++;

delay(10);

}

これでMax/msp側で受信を確認。ArduinoからSendしたかったのでRecieveはまだ調べてないです。

とりあえずこれでEthernetSheild2でもOSC使えそうなこと確認できました。

他にもやり方あったり、なんかこここうしたらなどあれば是非コメントください。


追記

OSCアドレスのルート分ける方法

void loop() {

EthernetClient client = server.available(); //どっかでこれやってないとうまくいかないってのを読んだ気がする

OSCMessage meg("/{test0,test1,test2}"); //OSC送信内容初期設定 {}でアドレスパターン分け

int a = 0;
Udp.beginPacket(destIP, destPort); 
if(a>0){
meg.setAddress("/test0");
meg.add(a); //Sendしたい内容を設定
}
if(a>10){
meg.setAddress("/test1");
meg.add(a); //Sendしたい内容を設定
}
if(a>20){
meg.setAddress("/test2");
meg.add(a); //Sendしたい内容を設定
}
meg.send(Udp);
Udp.endPacket();

     a++;

delay(10);

的な感じでとりあえず通る気がします。

Send内容に関しては簡略化しているのでちょっと試してないです。すみません。ただアドレスの振り分け方、setAddressで切り替えっていうのは問題なく使えました。