質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

解決済

ArduinoでOSC通信を行いたい

mememe0331
mememe0331

総合スコア54

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

1回答

0評価

0クリップ

611閲覧

投稿2021/12/03 03:33

前提・実現したいこと

マイコンのM5stack を用いて、鬼ごっこを行うプログラムを作りたいです。

このサイトを参考にして作りました。
https://fabcross.jp/category/make/sorem5/20210512_social_distance_onigokko.html

発生している問題・エラーメッセージ

OSC通信を実現することができていなくて、困っています。

・oni側は、RSSIの値を受信しない
・run側は、RSSIの値を送信しない

この問題を解決したいのですが、
この操作を行う関数の説明がインターネット上で見つけられなくて、
どのように直せばいいのか分かりません。

何か分かることがありましたら、教えていただけますと幸いです。

該当のソースコード

c++(oni)

#include <Arduino.h> #include <M5Stack.h> #include <Ethernet.h> #include <ArduinoOSCWiFi.h> #include <ArduinoOSCEther.h> #include <ESP8266Audio.h> bool ONI = true; const int THRESH = -20; //タッチ判定をするRSSI値の閾値です。 //Wi-Fi用の設定を以下に書きます passだけ設定してください const char *ssid = "m5_oni"; // SSID const char *pass = "onigokko1204"; // passwordは自由に設定してください const int incomingPort = 7070; // 受信ポート番号 const int outgoingPort = 8080; // 送信ポート番号 const IPAddress ipServer(192, 168, 1, 1); // server IPアドレス const IPAddress ipGateway(192, 168, 1, 1); // gateway IPアドレス const IPAddress subnet(255, 255, 255, 0); // サブネットマスク const IPAddress ipClient(192, 168, 1, 255); // client IPアドレス const char *host = "192.168.1.255"; #include "AudioFileSourceSD.h" #include "AudioFileSourceID3.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2S.h" AudioGeneratorMP3 *mp3; AudioFileSourceSD *file; AudioOutputI2S *out; AudioFileSourceID3 *id3; void playMP3(const char filename[]) //音を出すための関数です。 { file = new AudioFileSourceSD(filename); id3 = new AudioFileSourceID3(file); out = new AudioOutputI2S(0, 1); out->SetOutputModeMono(true); out->SetGain(1.0); mp3 = new AudioGeneratorMP3(); mp3->begin(id3, out); while (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); } } void rcv_rssi(const OscMessage &msg) //RSSIを受信した時に起動する関数です。 { int rssi = msg.arg<int>(0); M5.Lcd.setCursor(0, 195); M5.Lcd.printf("rssi: %d", rssi); //受信したRSSI値を画面に表示します if (rssi > THRESH) //RSSI値が閾値以上だった場合 { if (ONI) { OscWiFi.send(host, outgoingPort, "/oni", 1); //runに通知して、 OscWiFi.post(); ONI = false; playMP3("/run.mp3"); //runに変化します。 M5.Lcd.drawJpgFile(SD, "/run.JPG"); M5.Lcd.setCursor(0, 20); M5.Lcd.printf("ssid: %s", ssid); M5.Lcd.setCursor(0, 65); M5.Lcd.printf("incomingPort: %d", incomingPort); M5.Lcd.setCursor(0, 105); M5.Lcd.printf("outgoingPort: %d", outgoingPort); M5.Lcd.setCursor(0, 155); M5.Lcd.printf("run!!!"); } else { OscWiFi.send(host, outgoingPort, "/oni", 0); OscWiFi.post(); ONI = true; playMP3("/oni.mp3"); M5.Lcd.drawJpgFile(SD, "/oni.JPG"); M5.Lcd.setCursor(0, 20); M5.Lcd.printf("ssid: %s", ssid); M5.Lcd.setCursor(0, 65); M5.Lcd.printf("incomingPort: %d", incomingPort); M5.Lcd.setCursor(0, 105); M5.Lcd.printf("outgoingPort: %d", outgoingPort); M5.Lcd.setCursor(0, 155); M5.Lcd.printf("Oni deeeeesu!!!"); } } } void setup() { M5.begin(); M5.Power.begin(); M5.Lcd.clearDisplay(); M5.Lcd.drawJpgFile(SD, "/oni.JPG"); M5.Lcd.setTextColor(GREEN, BLACK); M5.Lcd.setTextSize(2); WiFi.softAP(ssid, pass); delay(100); WiFi.softAPConfig(ipServer, ipGateway, subnet); M5.Lcd.setCursor(0, 20); M5.Lcd.printf("ssid: %s", ssid); M5.Lcd.setCursor(0, 65); M5.Lcd.printf("incomingPort: %d", incomingPort); M5.Lcd.setCursor(0, 105); M5.Lcd.printf("outgoingPort: %d", outgoingPort); M5.Lcd.setCursor(0, 155); M5.Lcd.printf("Oni deeeeesu!!!"); delay(1000); playMP3("/oni.mp3"); OscWiFi.subscribe(incomingPort, "/rssi", rcv_rssi); //この記述で、runからRSSI値が送られてきた時にrcv_rssi関数が起動するようになります。 } void loop() { OscWiFi.parse(); //何もない場合はrunからの通信を待ち続けます。 }

c++(run)

#include <Arduino.h> #include <M5Stack.h> #include <ArduinoOSCWiFi.h> #include <ArduinoOSCEther.h> #include <ESP8266Audio.h> // Wi-Fiの設定です passだけ設定してください const char *ssid = "m5_oni"; const char *pwd = "onigokko1204"; //oniで設定したものと同じものを使ってください const IPAddress ip(192, 168, 1, 201); const IPAddress gateway(192, 168, 1, 1); const IPAddress subnet(255, 255, 255, 0); // for ArduinoOSC const char *host = "192.168.1.255"; //念の為同じネットワーク内の全員に送信します const int incomingPort = 8080; // 受信ポート番号 const int outgoingPort = 7070; // 送信ポート番号 #include "AudioFileSourceSD.h" #include "AudioFileSourceID3.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2S.h" AudioGeneratorMP3 *mp3; AudioFileSourceSD *file; AudioOutputI2S *out; AudioFileSourceID3 *id3; void playMP3(const char filename[]) //音を出すための関数です { file = new AudioFileSourceSD(filename); id3 = new AudioFileSourceID3(file); out = new AudioOutputI2S(0, 1); out->SetOutputModeMono(true); out->SetGain(1.0); mp3 = new AudioGeneratorMP3(); mp3->begin(id3, out); while (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); } } void rcv_oni(const OscMessage &msg) //タッチの通知が来たときに起動する関数です { int oni = msg.arg<int>(0); if (oni == 1) //「あなたが鬼です!」という通知が来たら、 { playMP3("/oni.mp3"); //鬼に変化します M5.Lcd.drawJpgFile(SD, "/oni.JPG"); M5.Lcd.setCursor(0, 20); M5.Lcd.printf("ssid: %s", ssid); M5.Lcd.setCursor(0, 65); M5.Lcd.printf("incomingPort: %d", incomingPort); M5.Lcd.setCursor(0, 105); M5.Lcd.printf("outgoingPort: %d", outgoingPort); M5.Lcd.setCursor(0, 155); M5.Lcd.printf("Oni deeeeesu!!!"); } else { playMP3("/run.mp3"); M5.Lcd.drawJpgFile(SD, "/run.JPG"); M5.Lcd.setCursor(0, 20); M5.Lcd.printf("ssid: %s", ssid); M5.Lcd.setCursor(0, 65); M5.Lcd.printf("incomingPort: %d", incomingPort); M5.Lcd.setCursor(0, 105); M5.Lcd.printf("outgoingPort: %d", outgoingPort); M5.Lcd.setCursor(0, 155); M5.Lcd.printf("run!!!"); } delay(5000); } void setup() { M5.begin(); M5.Power.begin(); M5.Lcd.clearDisplay(); M5.Lcd.drawJpgFile(SD, "/run.JPG"); M5.Lcd.setTextColor(GREEN, BLACK); M5.Lcd.setTextSize(2); #ifdef ESP_PLATFORM WiFi.disconnect(true, true); delay(1000); WiFi.mode(WIFI_STA); #endif WiFi.begin(ssid, pwd); WiFi.config(ip, gateway, subnet); while (WiFi.status() != WL_CONNECTED) { delay(500); } M5.Lcd.setCursor(0, 20); M5.Lcd.printf("ssid: %s", ssid); M5.Lcd.setCursor(0, 65); M5.Lcd.printf("incomingPort: %d", incomingPort); M5.Lcd.setCursor(0, 105); M5.Lcd.printf("outgoingPort: %d", outgoingPort); M5.Lcd.setCursor(0, 155); M5.Lcd.printf("run!!!"); delay(1000); playMP3("/run.mp3"); OscWiFi.subscribe(incomingPort, "/oni", rcv_oni); //この記述で、oniから通知が来た時にrcv_oni関数が起動するようになります。 } void loop() { int rssi = 0; for (int i = 0; i < 100; i++) { rssi += WiFi.RSSI(); } rssi = rssi / -100; M5.Lcd.setCursor(0, 195); M5.Lcd.printf("rssi: %d", rssi); OscWiFi.send(host, outgoingPort, "/rssi", rssi); //何もない時はRSSI値を送り続けます OscWiFi.post(); delay(200); }

試したこと

OSC通信を調べる

補足情報(FW/ツールのバージョンなど)

VScodeのArduinoとPlatformIOを使用
マイコン M5stack ESP32

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2021/12/03 04:38

あなたのいうOSC通信とはなんのことでしょうか
mememe0331

2021/12/03 04:44

OSC通信はWi-Fiを経由してデータを送受信する仕組みのことです。 今回は、oniをWi-Fiのアクセスポイントとして、runがWi-Fiに接続します。 1.runがoniに逐次RSSI値を送信 2.RSSIが一定値以上になった時、oniがrunにタッチされた判定を送信 3.oniとrunの役割交代 この操作を行う通信のことを示しています。 分かりづらくて、すみません。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。