見出し画像

0秒で組み立てが終わるSlimeVR-Tracker(2024冬版)


0秒目:パッケージから出す

※手数0(記事作成当時、弊しらべ)

ESP32 + IMU + バッテリー + 充電回路
パッケージから出したらそのまま使えます!!
※注文は2営業日まえに済ませておくこと
※ファームウェアは設定と修正をして書き込む
※vscode や PlatformIOは各自用意しよう

ファームウェアの書き込みについて

https://github.com/SlimeVR/SlimeVR-Tracker-ESP/tree/v0.5.1

VERY experimental support!ですがBMI270対応してます。

ビルドとアップロードはPlatformIOつかいます。搭載されているのはm5stack-stamps3なのでm5stack-stamps3と同じ設定でOKです。
PIN_IMU_SDAとPIN_IMU_SCLは8と10。


platformio.ini

[env:m5stack-stamps3]
platform = espressif32 @ 6.7.0
platform_packages =
  framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1
  framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip
board = m5stack-stamps3
framework = arduino
lib_deps =
  ${env.lib_deps}
  https://github.com/FastLED/FastLED.git
build_flags = 
  ${env.build_flags}
  -DARDUINO_USB_MODE=1
  -DARDUINO_USB_CDC_ON_BOOT=1

defines.h

// Set parameters of IMU and board used
#define IMU IMU_BMI270
#define SECOND_IMU IMU
#define BOARD BOARD_CUSTOM
#define IMU_ROTATION DEG_0
#define SECOND_IMU_ROTATION DEG_180
#ifndef IMU_DESC_LIST
#define IMU_DESC_LIST              \
	IMU_DESC_ENTRY(                \
		IMU,                       \
		PRIMARY_IMU_ADDRESS_TWO,   \
		IMU_ROTATION,              \
		PIN_IMU_SCL,               \
		PIN_IMU_SDA,               \
		PRIMARY_IMU_OPTIONAL,      \
		PIN_IMU_INT                \
	)                              \
	IMU_DESC_ENTRY(                \
		SECOND_IMU,                \
		SECONDARY_IMU_ADDRESS_ONE, \
		SECOND_IMU_ROTATION,       \
		PIN_IMU_SCL,               \
		PIN_IMU_SDA,               \
		SECONDARY_IMU_OPTIONAL,    \
		PIN_IMU_INT_2              \
	)
#endif
#elif BOARD == BOARD_CUSTOM
// Define pins by the examples above
  #define PIN_IMU_SDA 8
  #define PIN_IMU_SCL 10
  #define PIN_IMU_INT 255
  #define PIN_IMU_INT_2 255
  #define PIN_BATTERY_LEVEL 6
  #define LED_PIN 255
  #define LED_INVERTED false
  #ifndef BATTERY_SHIELD_RESISTANCE
    #define BATTERY_SHIELD_RESISTANCE 0
  #endif
  #ifndef BATTERY_SHIELD_R1 
    #define BATTERY_SHIELD_R1 100
  #endif
  #ifndef BATTERY_SHIELD_R2
    #define BATTERY_SHIELD_R2 100
  #endif

バッテリー駆動するために

M5Capsuleはバッテリー駆動時はWAKEBUTTONを押してる間にG46をハイレベルにしないとWAKEBUTTON離したら電源落ちます。
setup()直後にG46をハイレベルにする処理を追加してください。

main.cpp

void setup()
{
    // set the "hold" (GPIO46) pin to a high level (1)
    pinMode(G46, OUTPUT);
    digitalWrite(G46, HIGH);

バッテリー残量について

ピンアサインを見たところG6にADC-BATが割り当てられてるので
#define PIN_BATTERY_LEVEL 6
になるのはすぐに分かるのですがR1とR2の値を指定しないといけないので回路図をみます。探すのはVBAT_IN、G6が接続されてる部分です。
BATTERY_SHIELD_RESISTANCEにあたる部分は無いので0、BATTERY_SHIELDのR1R2は回路図R4R5の100(100kΩ)に設定します。

回路図抜粋

充電中について

USBからの充電なのでTrackerとして動いてしまうのでENとGNDをつなぐストロングスタイルもありなのかも。ちゃんとするならディープスリープ使ったほうがいいと思うのでWAKEボタンを2秒間の長押しでディープスリープするようにします。
※充電中はバッテリー残量が正確に表示されません。

ちょっとぼけてるけどRst ENとGNDをつなぐならここ

main.cppのloop()の変更

void loop()
{
    bool buttonState;
    static bool buttonPressed = false;
    static unsigned long buttonPressedTime = 0;

    buttonState = digitalRead(GPIO_NUM_42);
    if (buttonState == LOW) {
        if(!buttonPressed) {
            ledManager.on();
            buttonPressedTime = millis();
            buttonPressed = true;
        }
    } else {
        buttonPressed = false;
    }

    if (buttonPressed && (millis() - buttonPressedTime >= 2000)) {
        ledManager.off();
        esp_deep_sleep_start();
    }

ledManagerをRGBLEDに対応させる

M5CapsuleのRGBLEDを操作するためのライブラリを追加します。lib_deps以降をplatformio.iniに追記。

LEDManager.cppには FastLEDのヘッダーのincludeと設定。
setup() on() off() が実行されたときにFastLED関連の処理を追加。
エラーの種類やステータスで色を変えるなどもできるけど変更箇所が多くなるので動作状況が分かるように最低限の変更ですませます。

platformio.ini にライブラリを追加

lib_deps =
  ${env.lib_deps}
  https://github.com/FastLED/FastLED.git

LEDManager.cppに追加するコード例

#include <FastLED.h>

#define PIN_LED    21   // 本体フルカラーLEDの使用端子(G21)
#define NUM_LEDS   1    // 本体フルカラーLEDの数
CRGB leds[NUM_LEDS];

#define FLED_STANDBUY 0x808080 // おおむね白
#define FLED_ON       0x800080 // 紫
#define FLED_OFF      0x000000 // 黒(消灯)
namespace SlimeVR {
void LEDManager::setup() {
    FastLED.addLeds<WS2812B, PIN_LED, GRB>(leds, NUM_LEDS);
    leds[0].setColorCode(FLED_STANDBUY);
    FastLED.show();
#if ENABLE_LEDS
    pinMode(m_Pin, OUTPUT);
#endif
    // Do the initial pull of the state
    update();
}

void LEDManager::on() {
    leds[0].setColorCode(FLED_ON);
    FastLED.show();
#if ENABLE_LEDS
    digitalWrite(m_Pin, LED__ON);
#endif
}

void LEDManager::off() {
    leds[0].setColorCode(FLED_OFF);
    FastLED.show();
#if ENABLE_LEDS
    digitalWrite(m_Pin, LED__OFF);
#endif
}

ストラップとホルダーなんか

M5Capsuleの背面のM3ネジで固定するクリップを3Dプリンタで作りました。極低頭ネジ必須です。それでも少しストラップにとめるときに引っかかりを感じるかも。

クリップ型


作って(使って)みた感想

環境
・M5Capsule(M5Stamp S3搭載)
・SlimeVR-Tracker-ESP v0.5.1 ちょっとカスタム
・SlimeVR-Server v0.13.2

SlimeVR-TrackerはオープンソースでDIYなのでハードウェア、ソフトウェアともにもちょもちょしないといけなくてハードル高いかもしれないんですがM5Capsuleをつかえばハードウェアの工作しなくていいので入門用にはいいかもです。

M5CapsuleでSlimeVR-Trackerの次
PCBから自作してトラッカー作る道もあるしフィンガートラッキングもリリースされそうな予感。
M5Stack製品に興味がでたならカメラやディスプレイで遊ぶのもおもしろいしスーパーカワイイロボットだって作れちゃいますよ。

いいなと思ったら応援しよう!