前提・実現したいこと
マイコンのM5stack を用いて、鬼ごっこを行うプログラムを作りたいです。
このサイトを参考にして作りました。
https://fabcross.jp/category/make/sorem5/20210512_social_distance_onigokko.html
発生している問題・エラーメッセージ
OSC通信を実現することができていなくて、困っています。
・oni側は、RSSIの値を受信しない
・run側は、RSSIの値を送信しない
この問題を解決したいのですが、
この操作を行う関数の説明がインターネット上で見つけられなくて、
どのように直せばいいのか分かりません。
何か分かることがありましたら、教えていただけますと幸いです。
該当のソースコード
c++(oni)
1#include <Arduino.h> 2#include <M5Stack.h> 3#include <Ethernet.h> 4#include <ArduinoOSCWiFi.h> 5#include <ArduinoOSCEther.h> 6#include <ESP8266Audio.h> 7 8bool ONI = true; 9const int THRESH = -20; //タッチ判定をするRSSI値の閾値です。 10 11//Wi-Fi用の設定を以下に書きます passだけ設定してください 12const char *ssid = "m5_oni"; // SSID 13const char *pass = "onigokko1204"; // passwordは自由に設定してください 14const int incomingPort = 7070; // 受信ポート番号 15const int outgoingPort = 8080; // 送信ポート番号 16 17const IPAddress ipServer(192, 168, 1, 1); // server IPアドレス 18const IPAddress ipGateway(192, 168, 1, 1); // gateway IPアドレス 19const IPAddress subnet(255, 255, 255, 0); // サブネットマスク 20const IPAddress ipClient(192, 168, 1, 255); // client IPアドレス 21 22const char *host = "192.168.1.255"; 23 24#include "AudioFileSourceSD.h" 25#include "AudioFileSourceID3.h" 26#include "AudioGeneratorMP3.h" 27#include "AudioOutputI2S.h" 28 29AudioGeneratorMP3 *mp3; 30AudioFileSourceSD *file; 31AudioOutputI2S *out; 32AudioFileSourceID3 *id3; 33 34void playMP3(const char filename[]) //音を出すための関数です。 35{ 36 file = new AudioFileSourceSD(filename); 37 id3 = new AudioFileSourceID3(file); 38 out = new AudioOutputI2S(0, 1); 39 out->SetOutputModeMono(true); 40 out->SetGain(1.0); 41 mp3 = new AudioGeneratorMP3(); 42 mp3->begin(id3, out); 43 while (mp3->isRunning()) 44 { 45 if (!mp3->loop()) 46 mp3->stop(); 47 } 48} 49 50void rcv_rssi(const OscMessage &msg) //RSSIを受信した時に起動する関数です。 51{ 52 int rssi = msg.arg<int>(0); 53 54 M5.Lcd.setCursor(0, 195); 55 M5.Lcd.printf("rssi: %d", rssi); //受信したRSSI値を画面に表示します 56 57 if (rssi > THRESH) //RSSI値が閾値以上だった場合 58 { 59 if (ONI) 60 { 61 OscWiFi.send(host, outgoingPort, "/oni", 1); //runに通知して、 62 OscWiFi.post(); 63 ONI = false; 64 playMP3("/run.mp3"); //runに変化します。 65 66 M5.Lcd.drawJpgFile(SD, "/run.JPG"); 67 M5.Lcd.setCursor(0, 20); 68 M5.Lcd.printf("ssid: %s", ssid); 69 M5.Lcd.setCursor(0, 65); 70 M5.Lcd.printf("incomingPort: %d", incomingPort); 71 M5.Lcd.setCursor(0, 105); 72 M5.Lcd.printf("outgoingPort: %d", outgoingPort); 73 M5.Lcd.setCursor(0, 155); 74 M5.Lcd.printf("run!!!"); 75 } 76 else 77 { 78 OscWiFi.send(host, outgoingPort, "/oni", 0); 79 OscWiFi.post(); 80 ONI = true; 81 playMP3("/oni.mp3"); 82 83 M5.Lcd.drawJpgFile(SD, "/oni.JPG"); 84 M5.Lcd.setCursor(0, 20); 85 M5.Lcd.printf("ssid: %s", ssid); 86 M5.Lcd.setCursor(0, 65); 87 M5.Lcd.printf("incomingPort: %d", incomingPort); 88 M5.Lcd.setCursor(0, 105); 89 M5.Lcd.printf("outgoingPort: %d", outgoingPort); 90 M5.Lcd.setCursor(0, 155); 91 M5.Lcd.printf("Oni deeeeesu!!!"); 92 } 93 } 94} 95 96void setup() 97{ 98 M5.begin(); 99 M5.Power.begin(); 100 M5.Lcd.clearDisplay(); 101 M5.Lcd.drawJpgFile(SD, "/oni.JPG"); 102 M5.Lcd.setTextColor(GREEN, BLACK); 103 M5.Lcd.setTextSize(2); 104 105 WiFi.softAP(ssid, pass); 106 delay(100); 107 WiFi.softAPConfig(ipServer, ipGateway, subnet); 108 M5.Lcd.setCursor(0, 20); 109 M5.Lcd.printf("ssid: %s", ssid); 110 M5.Lcd.setCursor(0, 65); 111 M5.Lcd.printf("incomingPort: %d", incomingPort); 112 M5.Lcd.setCursor(0, 105); 113 M5.Lcd.printf("outgoingPort: %d", outgoingPort); 114 M5.Lcd.setCursor(0, 155); 115 M5.Lcd.printf("Oni deeeeesu!!!"); 116 delay(1000); 117 playMP3("/oni.mp3"); 118 119 OscWiFi.subscribe(incomingPort, "/rssi", rcv_rssi); //この記述で、runからRSSI値が送られてきた時にrcv_rssi関数が起動するようになります。 120} 121 122void loop() 123{ 124 OscWiFi.parse(); //何もない場合はrunからの通信を待ち続けます。 125}
c++(run)
1#include <Arduino.h> 2#include <M5Stack.h> 3#include <ArduinoOSCWiFi.h> 4#include <ArduinoOSCEther.h> 5#include <ESP8266Audio.h> 6 7// Wi-Fiの設定です passだけ設定してください 8const char *ssid = "m5_oni"; 9const char *pwd = "onigokko1204"; //oniで設定したものと同じものを使ってください 10const IPAddress ip(192, 168, 1, 201); 11const IPAddress gateway(192, 168, 1, 1); 12const IPAddress subnet(255, 255, 255, 0); 13 14// for ArduinoOSC 15const char *host = "192.168.1.255"; //念の為同じネットワーク内の全員に送信します 16const int incomingPort = 8080; // 受信ポート番号 17const int outgoingPort = 7070; // 送信ポート番号 18 19#include "AudioFileSourceSD.h" 20#include "AudioFileSourceID3.h" 21#include "AudioGeneratorMP3.h" 22#include "AudioOutputI2S.h" 23 24AudioGeneratorMP3 *mp3; 25AudioFileSourceSD *file; 26AudioOutputI2S *out; 27AudioFileSourceID3 *id3; 28 29void playMP3(const char filename[]) //音を出すための関数です 30{ 31 file = new AudioFileSourceSD(filename); 32 id3 = new AudioFileSourceID3(file); 33 out = new AudioOutputI2S(0, 1); 34 out->SetOutputModeMono(true); 35 out->SetGain(1.0); 36 mp3 = new AudioGeneratorMP3(); 37 mp3->begin(id3, out); 38 while (mp3->isRunning()) 39 { 40 if (!mp3->loop()) 41 mp3->stop(); 42 } 43} 44 45void rcv_oni(const OscMessage &msg) //タッチの通知が来たときに起動する関数です 46{ 47 int oni = msg.arg<int>(0); 48 if (oni == 1) //「あなたが鬼です!」という通知が来たら、 49 { 50 playMP3("/oni.mp3"); //鬼に変化します 51 52 M5.Lcd.drawJpgFile(SD, "/oni.JPG"); 53 M5.Lcd.setCursor(0, 20); 54 M5.Lcd.printf("ssid: %s", ssid); 55 M5.Lcd.setCursor(0, 65); 56 M5.Lcd.printf("incomingPort: %d", incomingPort); 57 M5.Lcd.setCursor(0, 105); 58 M5.Lcd.printf("outgoingPort: %d", outgoingPort); 59 M5.Lcd.setCursor(0, 155); 60 M5.Lcd.printf("Oni deeeeesu!!!"); 61 } 62 else 63 { 64 playMP3("/run.mp3"); 65 66 M5.Lcd.drawJpgFile(SD, "/run.JPG"); 67 M5.Lcd.setCursor(0, 20); 68 M5.Lcd.printf("ssid: %s", ssid); 69 M5.Lcd.setCursor(0, 65); 70 M5.Lcd.printf("incomingPort: %d", incomingPort); 71 M5.Lcd.setCursor(0, 105); 72 M5.Lcd.printf("outgoingPort: %d", outgoingPort); 73 M5.Lcd.setCursor(0, 155); 74 M5.Lcd.printf("run!!!"); 75 } 76 delay(5000); 77} 78 79void setup() 80{ 81 M5.begin(); 82 M5.Power.begin(); 83 M5.Lcd.clearDisplay(); 84 M5.Lcd.drawJpgFile(SD, "/run.JPG"); 85 M5.Lcd.setTextColor(GREEN, BLACK); 86 M5.Lcd.setTextSize(2); 87 88#ifdef ESP_PLATFORM 89 WiFi.disconnect(true, true); 90 delay(1000); 91 WiFi.mode(WIFI_STA); 92#endif 93 WiFi.begin(ssid, pwd); 94 WiFi.config(ip, gateway, subnet); 95 while (WiFi.status() != WL_CONNECTED) 96 { 97 delay(500); 98 } 99 100 M5.Lcd.setCursor(0, 20); 101 M5.Lcd.printf("ssid: %s", ssid); 102 M5.Lcd.setCursor(0, 65); 103 M5.Lcd.printf("incomingPort: %d", incomingPort); 104 M5.Lcd.setCursor(0, 105); 105 M5.Lcd.printf("outgoingPort: %d", outgoingPort); 106 M5.Lcd.setCursor(0, 155); 107 M5.Lcd.printf("run!!!"); 108 delay(1000); 109 playMP3("/run.mp3"); 110 111 OscWiFi.subscribe(incomingPort, "/oni", rcv_oni); //この記述で、oniから通知が来た時にrcv_oni関数が起動するようになります。 112 113} 114 115void loop() 116{ 117 int rssi = 0; 118 for (int i = 0; i < 100; i++) 119 { 120 rssi += WiFi.RSSI(); 121 } 122 rssi = rssi / -100; 123 M5.Lcd.setCursor(0, 195); 124 M5.Lcd.printf("rssi: %d", rssi); 125 OscWiFi.send(host, outgoingPort, "/rssi", rssi); //何もない時はRSSI値を送り続けます 126 OscWiFi.post(); 127 delay(200); 128}
試したこと
OSC通信を調べる
補足情報(FW/ツールのバージョンなど)
VScodeのArduinoとPlatformIOを使用
マイコン M5stack ESP32
回答1件
あなたの回答
tips
プレビュー