
ハンダ付けとか工作とかなしで自作トラッカーを作る方法【M5CapsuleをSlimeVR-Trackerにするメモ】
上を購入
パソコンにUSBで接続
下を書込
クリップで止める
※公式のファームウェアがBMI270に対応してるのでそっちのリポジトリつかってね。(2024/08/15 追記)
この処理を追加しないとバッテリー駆動ができなくなります。main.cppの変更
void setup()
{
// set the "hold" (GPIO46) pin to a high level (1)
pinMode(G46, OUTPUT);
digitalWrite(G46, HIGH);
お手軽にストラップに止めるならこんな感じ pic.twitter.com/xsevRNdfxG
— めんたいづくし (@d52425) February 22, 2024
以下読む必要なし
自作トラッカーを自作せず(ハードウェア部分)に動かすためのメモ
ファームウェアのダウンロードから設定の変更点、快適に使うためのなにか
ハードウェア
M5Capsuleの特徴と仕様
多用途性:IMU、MIC、赤外線、ストレージ、時計、ブザー、Proto拡張等の多様な機能。
拡張の柔軟性:ProtoコネクタとTFカード スロットを通じたセンサや拡張ボードの接続。
音声認識と音声処理::SPM1423マイクセンサによる音声認識、録音、ウェイクアップ機能を搭載し、音声制御や音声分析に最適。
姿勢制御とモーション追跡:高性能BMI270 IMUによる正確な姿勢制御とモーショントラッキング機能を備え、バーチャルリアリティやゲームコントロールなどの用途にも最適。
時刻および低消費電力管理:RTC8563リアルタイムクロックによる高精度な時刻と日付情報の取得や、スケジュール起動機能を搭載。
データ収集とストレージ:TFカードスロットにより、データロギングとイベント記録用のストレージ容量を拡張。
6軸姿勢センサ:BMI270
バッテリー容量:250 mAh
製品寸法:40 x 24 x 16.2 mm
製品重量:18.5 g
自作トラッカーとしてはIMU、バッテリー、充電機能を使います。
基本機能のみのファームウェア
platformio.ini に追加
[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduino
defines.hの変更箇所抜粋
#define IMU IMU_BMI270
#define SECOND_IMU IMU
#define BOARD BOARD_CUSTOM
#define IMU_ROTATION DEG_270
#define SECOND_IMU_ROTATION DEG_270
#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
IMUの指定、PRIMARY_IMU_ADDRESS_TWOへ変更
BOARDは、 BOARD_CUSTOMにしてI2Cの設定、INTとLEDはいったん無効
バッテリーの抵抗値はR1、R2ともに100kΩ
IMU_ROTATIONと装着方向について
装着方向を「前」にするならDEG_0に変更します。接続後にマウントキャリブレーションするのならDEG_270のままでもいいかも。
main.cppの変更
void setup()
{
// set the "hold" (GPIO46) pin to a high level (1)
pinMode(G46, OUTPUT);
digitalWrite(G46, HIGH);
この処理を追加しないとバッテリー駆動ができなくなります。
USB接続時は自動的に電源が入ります。
バッテリー駆動時はWAKE(正面のボタン)を押すと電源が入り、RST(上部のボタン)を押すと電源が切れます。
便利そうかなと思って追加した機能入り
1.ledManagerをRGBLEDに対応させる
2.充電時(USB接続時)にデータ送信を止める
ledManagerをRGBLEDに対応させる
M5CapsuleのRGBLEDを操作するためのライブラリを追加します。lib_deps以降をplatformio.iniに追記。
platformio.ini に追加
[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduino
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
}
FastLEDのヘッダーのincludeと設定。
setup() on() off() が実行されたときにFastLED関連の処理を追加。
エラーの種類やステータスで色を変えるなどもできるけど変更箇所が多くなるので動作状況が分かるように最低限の変更ですませます。
充電時(USB接続時)にデータ送信を止める
バッテリー駆動時はボタンでオンオフができるけどUSB接続時は常にトラッカーとして機能してしまうのでWAKEボタンを2秒間の長押しでディープスリープするようにします。
(バッテリー駆動時にWAKEボタンに当たって誤動作を防ぐための長押し)
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();
}
クラスとかに書き出したほうがいいかも。
ちゃんと動くのでこれで良しとしよう。
体に装備する方法
M5Capsuleの背面のM3ネジで固定するクリップを3Dプリンタで作りました。極低頭ネジ必須です。それでも少しストラップにとめるときに引っかかりを感じるかも。
軽いのでザムストとかサポーターに挟むもいいし、腰はベルトやパンツに挟んでもいい。余談ですが体中にサポーターつけてると満身創痍に見えます。

エクストラ課題。。。
1.稼働時間の延長(標準:推定2時間)
2.追加センサー(センサーが合計2つ)を手軽に扱えるようにするには
3.タコ足センサー🐙(3~4つ)(5つ以上)
(センサー周りの処理が整理されて複数センサーの可能性が上昇中)
4.1つ3500円たくさん買うとそれなりのお値段になる
5.ビルド済みのファームウェア+書き込み専用アプリとか需要あるかな
追伸
もしファームウェアに変更部分、書き込み方わかんない、クリップほしい、お腹すいたとか、なんか要望あればぜひご連絡ください。