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, µs)->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通信をあまり触ったことない初心者です.よろしくおねがいします