【Raspberry Pi Pico入門 – 応用編】OSCの送信

2025年7月28日Raspberry Pi Pico入門,応用編Arduino,OSC,Raspberry Pi Pico

概要

「OSC」とは元々MIDIの大体として電子楽器間の高速通信のために作られたプロトコルですが、かなり柔軟なルールでデータをやり取りできるので最近では電子楽器に限らず色々な通信に使われています。
メタバースプラットフォームのVRChat・ClusterではOSCの送受信に対応しているので、ゲーム内にトリガーを置いて電子回路を動かしたり、電子回路のボタンでゲーム内のギミックを制御できたりします。

通信方法はUDPなので、有線LAN・無線LANを使用します。今回は無線LANを使用して通信してみます。

実行環境

IDE:Arduino IDE 2.3.5
MCU:WeMos D1 mini(clone)

回路

【Raspberry Pi Pico入門 – 4】スイッチのON/OFFを検出で使用した回路を流用します。
プルアップ抵抗のありなしはどちらでも構いません。

ライブラリのインストール

「ArduinoOSC」というライブラリをインストールします。
詳細なインストール方法は【Raspberry Pi Pico入門 – 9】NeoPixelを制御してみるを参照してください。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。
ポート番号はVRChat・Clusterのデフォルト設定に合わせて設定しています。
※VRChat・Clusterはデフォルトでポート9000で受信し、ポート9001で送信しています。

#include <ArduinoOSCWiFi.h>

// WiFi設定
const char* ssid = "************";         // Wi-FiのSSID
const char* pwd = "*************";         // Wi-Fiのパスワード

// ArduinoOSC
const char* host = "192.168.***.***";  // 送り先のIPアドレス
const int recv_port = 9001;            // 自分の受信ポート番号
const int send_port = 9000;            // 送り先の受信ポート番号

// GPIO
const int SW_PIN = 16;

void setup() {
  // GPIO 初期化
  pinMode(SW_PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);

  // WiFi 初期化
  WiFi.begin(ssid, pwd);
}

void loop() {
  // ボタンが押されている
  if (digitalRead(SW_PIN) == LOW) {
    digitalWrite(LED_BUILTIN, HIGH);                   // LED点灯
    OscWiFi.send(host, send_port, "/send", "Hello!");  // OSC送信
    delay(100);                                        // OSC送信待ち、チャタリング防止
    while (digitalRead(SW_PIN) == LOW) {
      // ボタンを離すまで待機
      delay(10);
    }
  } else {
    digitalWrite(LED_BUILTIN, LOW);  // LED消灯
  }
}

今回はPCを相手にOSC通信をしてみます。そのため送り先IPアドレスはPCのものを設定します。
IPアドレスの確認方法は以下を参考にするか、「IPアドレス 確認」等でググってください。

動作確認

以下のページからOSCのデータを受信するソフトをダウンロードします。
※このページではWindows版を使用して解説します

ダウンロードが完了したら起動して「Protokol」をインストールします。

インストールが完了したらスタートページから起動します。

起動したら「OSC」タブをクリックし、以下の内容で設定します。
うまくいくとCONNECT | ENDPOINT([::]:9000)と表示されます。

Enabledチェックを入れる
PORT9000

この状態で回路のタクトスイッチを押すと、”Hello!”という文字列を受信します。

解説

コードの解説

サンプルコードで重要な部分はOscWiFi.send(host, send_port, "/send", "Hello!");です。
その他はWi-Fiに接続したり確認用LEDを制御するコードです。

OSCのデータはIPアドレス、ポート番号、階層構造のラベリング、データの4種類から成り立っています。
IPアドレスとポート番号は、マンションで例えるならIPアドレスはマンションの住所、ポート番号はマンションの何号室かだと思ってください。
階層構造のラベリングは、URLのようにデータに階層構造を持たせてラベリングすることができます。何を設定するべきかは受信側の仕様によって変わってきます。今回の動作確認で使用したProtokolでは、どんなラベリングでも受信して設定したラベリングを表示します。
データはOSCで送りたいデータです。詳細は後述。

OscWiFi.send()の各引数の意味は以下です。

No.サンプルコードでの値内容
1host送り先のIPアドレス
2send_port送り先のポート番号
3"/send"階層構造のラベリング
4"Hello!"データ

OSCで送ることができるデータ

OSCが扱えるデータ形式は4種類です。

  • 整数(INT32)
  • 実数(FLOAT) →Protokolでは「DOUBLE」と表示されていますが中身はFLOATです。
  • 文字列(STRING)
  • byte配列(byte[]) →ArduinoOSCの解説に記載がないので使えないかも

OscWiFi.send()の引数の4つ目以降にカンマ区切りでデータを追加することで複数のデータを送ることができます。ArduinoOSCでは引数の形式を自動で判定して送信してくれます。

OscWiFi.send(host, send_port, "/send", "Hello!", 58, 3.141592);