@zumisio

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

M5stack C PLusの内蔵IMUでOSC通信をおこなう

M5stack C PLusの内蔵IMUでOSC通信

M5stack C PLusの内蔵IMUでOSC通信をしたいです!
サンプルコードでIMUは正常に作動しましたが、OSC通信がうまくいかないです!

ArduinoOSCはダウンロードしてます.
https://github.com/hideakitai/ArduinoOSC

OSCサンプルデータとIMUデータを一緒にしたいです.

wifiルータで使用します.

IMUサンプルコード


#include <M5StickCPlus.h>

float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;

float pitch = 0.0F;
float roll  = 0.0F;
float yaw   = 0.0F;


void setup() {
  M5.begin();  //Init M5StickC Plus.  
  M5.Imu.Init();  //Init IMU.  
  M5.Lcd.setRotation(3);  //Rotate the screen. 
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(80, 15); //set the cursor location.  
  M5.Lcd.println("IMU TEST");
  M5.Lcd.setCursor(30, 30);
  M5.Lcd.println("  X       Y       Z");
  M5.Lcd.setCursor(30, 70);
  M5.Lcd.println("  Pitch   Roll    Yaw");
}


void loop() {
  static float temp = 0;
  M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  M5.IMU.getAccelData(&accX,&accY,&accZ);
  M5.IMU.getAhrsData(&pitch,&roll,&yaw);
  M5.IMU.getTempData(&temp);
  M5.Lcd.setCursor(30, 40);
  M5.Lcd.printf("%6.2f  %6.2f  %6.2f      ", gyroX, gyroY, gyroZ);
  M5.Lcd.setCursor(170, 40);
  M5.Lcd.print("o/s");
  M5.Lcd.setCursor(30, 50);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", accX, accY, accZ);
  M5.Lcd.setCursor(170, 50);
  M5.Lcd.print("G");
  M5.Lcd.setCursor(30, 80);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", pitch, roll, yaw);

  M5.Lcd.setCursor(30, 95);
  M5.Lcd.printf("Temperature : %.2f C", temp);
  delay(100);
}

↓がOSCのサンプルデータ(WiFiAP)とM5stackCPlusのIMUのサンプルデータをあわせたものになります.
WiFi ssid psはちゃんと書いています.

IMUサンプルコードとOSC(WiFiAP)

#include <ArduinoOSCWiFi.h>
#include <M5StickCPlus.h>


//加速度
float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;

float pitch = 0.0F;
float roll  = 0.0F;
float yaw   = 0.0F;

//wifi
const char* ssid = "esp-wifi";//自身のwifi
const char* pwd = "0123456789";//パスワード
const IPAddress ip(192, 168, 0, 201);//ipアドレス
const IPAddress gateway(192, 168, 0, 1);//gateway
const IPAddress subnet(255, 255, 0, 0);//subnet

// for ArduinoOSC
const char* host = "192.168.0.200";//PCのIPアドレスですか?
const int recv_port = 54321;
const int bind_port = 54345;
const int send_port = 55555;
const int publish_port = 54445;
// send / receive varibales
int i;
float f;
String s;

void onOscReceived(const OscMessage& m) {
    Serial.print(m.remoteIP());
    Serial.print(" ");
    Serial.print(m.remotePort());
    Serial.print(" ");
    Serial.print(m.size());
    Serial.print(" ");
    Serial.print(m.address());
    Serial.print(" ");
    Serial.print(m.arg<int>(0));
    Serial.print(" ");
    Serial.print(m.arg<float>(1));
    Serial.print(" ");
    Serial.print(m.arg<String>(2));
    Serial.println();
}



void setup() 
//M5stack
{
  M5.begin();  //Init M5StickC Plus.  初始化 M5StickC Plus
  M5.Imu.Init();  //Init IMU.  初始化IMU
  M5.Lcd.setRotation(3);  //Rotate the screen. 将屏幕旋转
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(80, 15); //set the cursor location.  设置光标位置
  M5.Lcd.println("IMU");
  M5.Lcd.setCursor(30, 30);
  M5.Lcd.println("  X       Y       Z");
  M5.Lcd.setCursor(30, 70);
  M5.Lcd.println("  Pitch   Roll    Yaw");
}
//wifi
   Serial.begin(115200);
    delay(2000);

    // WiFi AP Mode
    WiFi.softAPConfig(ip, gateway, subnet);
    WiFi.softAP(ssid, pwd);

    Serial.print("WiFi AP IP = ");
    Serial.println(WiFi.softAPIP());

    // publish osc messages (default publish rate = 30 [Hz])

    OscWiFi.publish(host, publish_port, "/publish/value", i, f, s)->setFrameRate(60.f);

    OscWiFi.publish(host, publish_port, "/publish/func", &millis, &micros)->setIntervalMsec(500.f);

    // subscribe osc messages

    OscWiFi.subscribe(bind_port, "/bind/values", i, f, s);

    OscWiFi.subscribe(bind_port, "/lambda/bind/args", [&](const int& i, const float& f, const String& s) {
        Serial.print("/lambda/bind/args ");
        Serial.print(i);
        Serial.print(" ");
        Serial.print(f);
        Serial.print(" ");
        Serial.print(s);
        Serial.println();
    });

    OscWiFi.subscribe(recv_port, "/lambda/msg", [](const OscMessage& m) {
        Serial.print(m.remoteIP());
        Serial.print(" ");
        Serial.print(m.remotePort());
        Serial.print(" ");
        Serial.print(m.size());
        Serial.print(" ");
        Serial.print(m.address());
        Serial.print(" ");
        Serial.print(m.arg<int>(0));
        Serial.print(" ");
        Serial.print(m.arg<float>(1));
        Serial.print(" ");
        Serial.print(m.arg<String>(2));
        Serial.println();
    });

    OscWiFi.subscribe(recv_port, "/wildcard/*/test", [](const OscMessage& m) {
        Serial.print(m.remoteIP());
        Serial.print(" ");
        Serial.print(m.remotePort());
        Serial.print(" ");
        Serial.print(m.size());
        Serial.print(" ");
        Serial.print(m.address());
        Serial.print(" ");
        Serial.print(m.arg<int>(0));
        Serial.println();
    });

    OscWiFi.subscribe(recv_port, "/need/reply", []() {
        Serial.println("/need/reply");

        int i = millis();
        float f = (float)micros() / 1000.f;
        String s = "hello";

        OscWiFi.send(host, send_port, "/reply", i, f, s);
    });

    OscWiFi.subscribe(recv_port, "/callback", onOscReceived);
}
void loop() 
//M5stack
{
  static float temp = 0;
  M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  M5.IMU.getAccelData(&accX,&accY,&accZ);
  M5.IMU.getAhrsData(&pitch,&roll,&yaw);
  M5.IMU.getTempData(&temp);
  M5.Lcd.setCursor(30, 40);
  M5.Lcd.printf("%6.2f  %6.2f  %6.2f      ", gyroX, gyroY, gyroZ);
  M5.Lcd.setCursor(170, 40);
  M5.Lcd.print("o/s");
  M5.Lcd.setCursor(30, 50);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", accX, accY, accZ);
  M5.Lcd.setCursor(170, 50);
  M5.Lcd.print("G");
  M5.Lcd.setCursor(30, 80);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", pitch, roll, yaw);

  M5.Lcd.setCursor(30, 95);
  M5.Lcd.printf("Temperature : %.2f C", temp);
  delay(100);
}
//wifi

    OscWiFi.update();  // should be called to receive + send osc

    // or do that separately
    // OscWiFi.parse(); // to receive osc
    // OscWiFi.post(); // to publish osc
}

自分で試したこと

ArduinoOSCに入っていたサンプルデータにIMUデータを入れましたがうまくいかないです.
何がいけないのかもわからないです...
相当調べたんですが、事例がないみたいで...
OSC通信をあまり触ったことない初心者です.よろしくおねがいします

0 likes

2Answer

ArduinoOSCに入っていたサンプルデータにIMUデータを入れましたがうまくいかないです.

これを試されたときのソースコードを載せていただけるといいと思います。
そうすれば、他の方も気が付いたことを指摘したり、手元の環境で試すことができますので。
(WiFiのssidやpasswordがあるため載せられないというのがあるのかもしれませんが・・)

また、既にご存じかもしれませんが、おそらくこのライブラリ作られた方のQiitaの記事があったので、参考に載せておきます。
https://qiita.com/hideakitai/items/f50f99e38b520a0ace37

1Like

Comments

  1. @zumisio

    Questioner

    質問にソースコードを追加しました.
    書き込むとエラーがでます.
    ArduinoOSCに入っていたサンプルデータwifiAPベースにM5stackCPlusのIMUのサンプルデータを入れ込んでいるだけです.OSC通信をArduinoでやったことがなく、全然何がだめなのかわからない状態です.
    初心者で申し訳無いです...

質問にソースコードを追加しました.
書き込むとエラーがでます.

とりあえず、以下で書き込みまではできました。
変更点は、// ここをコメントアウトと書いたところをコメントアウトしたのみです。
追加された箇所がsetuploopの関数内に入っていなかったのが原因かと思います。
こちらでいかがでしょうか。

注意点

  • M5StickCしか手持ちにないので、#include <M5StickCPlus.h>#include <M5StickC.h>に変えています
  • 動作確認まではできていないのでご注意ください(書き込みできるところまでしか確認できていません)
#include <ArduinoOSCWiFi.h>
#include <M5StickC.h>


//加速度
float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;

float pitch = 0.0F;
float roll  = 0.0F;
float yaw   = 0.0F;

//wifi
const char* ssid = "esp-wifi";//自身のwifi
const char* pwd = "0123456789";//パスワード
const IPAddress ip(192, 168, 0, 201);//ipアドレス
const IPAddress gateway(192, 168, 0, 1);//gateway
const IPAddress subnet(255, 255, 0, 0);//subnet

// for ArduinoOSC
const char* host = "192.168.0.200";//PCのIPアドレスですか?
const int recv_port = 54321;
const int bind_port = 54345;
const int send_port = 55555;
const int publish_port = 54445;
// send / receive varibales
int i;
float f;
String s;

void onOscReceived(const OscMessage& m) {
    Serial.print(m.remoteIP());
    Serial.print(" ");
    Serial.print(m.remotePort());
    Serial.print(" ");
    Serial.print(m.size());
    Serial.print(" ");
    Serial.print(m.address());
    Serial.print(" ");
    Serial.print(m.arg<int>(0));
    Serial.print(" ");
    Serial.print(m.arg<float>(1));
    Serial.print(" ");
    Serial.print(m.arg<String>(2));
    Serial.println();
}



void setup() 
//M5stack
{
  M5.begin();  //Init M5StickC Plus.  初始化 M5StickC Plus
  M5.Imu.Init();  //Init IMU.  初始化IMU
  M5.Lcd.setRotation(3);  //Rotate the screen. 将屏幕旋转
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(80, 15); //set the cursor location.  设置光标位置
  M5.Lcd.println("IMU");
  M5.Lcd.setCursor(30, 30);
  M5.Lcd.println("  X       Y       Z");
  M5.Lcd.setCursor(30, 70);
  M5.Lcd.println("  Pitch   Roll    Yaw");
//}     // ここをコメントアウト
//wifi
   Serial.begin(115200);
    delay(2000);

    // WiFi AP Mode
    WiFi.softAPConfig(ip, gateway, subnet);
    WiFi.softAP(ssid, pwd);

    Serial.print("WiFi AP IP = ");
    Serial.println(WiFi.softAPIP());

    // publish osc messages (default publish rate = 30 [Hz])

    OscWiFi.publish(host, publish_port, "/publish/value", i, f, s)->setFrameRate(60.f);

    OscWiFi.publish(host, publish_port, "/publish/func", &millis, &micros)->setIntervalMsec(500.f);

    // subscribe osc messages

    OscWiFi.subscribe(bind_port, "/bind/values", i, f, s);

    OscWiFi.subscribe(bind_port, "/lambda/bind/args", [&](const int& i, const float& f, const String& s) {
        Serial.print("/lambda/bind/args ");
        Serial.print(i);
        Serial.print(" ");
        Serial.print(f);
        Serial.print(" ");
        Serial.print(s);
        Serial.println();
    });

    OscWiFi.subscribe(recv_port, "/lambda/msg", [](const OscMessage& m) {
        Serial.print(m.remoteIP());
        Serial.print(" ");
        Serial.print(m.remotePort());
        Serial.print(" ");
        Serial.print(m.size());
        Serial.print(" ");
        Serial.print(m.address());
        Serial.print(" ");
        Serial.print(m.arg<int>(0));
        Serial.print(" ");
        Serial.print(m.arg<float>(1));
        Serial.print(" ");
        Serial.print(m.arg<String>(2));
        Serial.println();
    });

    OscWiFi.subscribe(recv_port, "/wildcard/*/test", [](const OscMessage& m) {
        Serial.print(m.remoteIP());
        Serial.print(" ");
        Serial.print(m.remotePort());
        Serial.print(" ");
        Serial.print(m.size());
        Serial.print(" ");
        Serial.print(m.address());
        Serial.print(" ");
        Serial.print(m.arg<int>(0));
        Serial.println();
    });

    OscWiFi.subscribe(recv_port, "/need/reply", []() {
        Serial.println("/need/reply");

        int i = millis();
        float f = (float)micros() / 1000.f;
        String s = "hello";

        OscWiFi.send(host, send_port, "/reply", i, f, s);
    });

    OscWiFi.subscribe(recv_port, "/callback", onOscReceived);
}

void loop() 
//M5stack
{
  static float temp = 0;
  M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  M5.IMU.getAccelData(&accX,&accY,&accZ);
  M5.IMU.getAhrsData(&pitch,&roll,&yaw);
  M5.IMU.getTempData(&temp);
  M5.Lcd.setCursor(30, 40);
  M5.Lcd.printf("%6.2f  %6.2f  %6.2f      ", gyroX, gyroY, gyroZ);
  M5.Lcd.setCursor(170, 40);
  M5.Lcd.print("o/s");
  M5.Lcd.setCursor(30, 50);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", accX, accY, accZ);
  M5.Lcd.setCursor(170, 50);
  M5.Lcd.print("G");
  M5.Lcd.setCursor(30, 80);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", pitch, roll, yaw);

  M5.Lcd.setCursor(30, 95);
  M5.Lcd.printf("Temperature : %.2f C", temp);
  delay(100);
//}     // ここをコメントアウト
//wifi

    OscWiFi.update();  // should be called to receive + send osc

    // or do that separately
    // OscWiFi.parse(); // to receive osc
    // OscWiFi.post(); // to publish osc
}

※参考:書き込み時のログ

構成をロード中…
パッケージを初期化中…
ボードを準備中…
検証中…
マイコンボードに書き込んでいます...
esptool.py v3.0-dev
Serial port COM3
Connecting...
.
.
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 94:b9:7e:93:3e:9c
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 4096.0 kbit/s)...
Hash of data verified.
Compressed 17120 bytes to 11164...
Writing at 0x00001000... (100 %)
Wrote 17120 bytes (11164 compressed) at 0x00001000 in 0.1 seconds (effective 951.1 kbit/s)...
Hash of data verified.
Compressed 775792 bytes to 444344...
Writing at 0x00010000... (3 %)
Writing at 0x00014000... (7 %)
Writing at 0x00018000... (10 %)
Writing at 0x0001c000... (14 %)
Writing at 0x00020000... (17 %)
Writing at 0x00024000... (21 %)
Writing at 0x00028000... (25 %)
Writing at 0x0002c000... (28 %)
Writing at 0x00030000... (32 %)
Writing at 0x00034000... (35 %)
Writing at 0x00038000... (39 %)
Writing at 0x0003c000... (42 %)
Writing at 0x00040000... (46 %)
Writing at 0x00044000... (50 %)
Writing at 0x00048000... (53 %)
Writing at 0x0004c000... (57 %)
Writing at 0x00050000... (60 %)
Writing at 0x00054000... (64 %)
Writing at 0x00058000... (67 %)
Writing at 0x0005c000... (71 %)
Writing at 0x00060000... (75 %)
Writing at 0x00064000... (78 %)
Writing at 0x00068000... (82 %)
Writing at 0x0006c000... (85 %)
Writing at 0x00070000... (89 %)
Writing at 0x00074000... (92 %)
Writing at 0x00078000... (96 %)
Writing at 0x0007c000... (100 %)
Wrote 775792 bytes (444344 compressed) at 0x00010000 in 7.4 seconds (effective 836.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 1536.0 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
IntelliSense configuration already up to date. To manually rebuild your IntelliSense configuration run "Ctrl+Alt+I"
0Like

Comments

  1. @zumisio

    Questioner

    ありがとうございます!書き込みまで出来たのですが、どのソフトでもosc受信できないです...

Your answer might help someone💌