見出し画像

SlimeVR TrackerにOLED(ディスプレイ)をつけてみる

用意するもの

  • SlimeVRTracker
    (今回はM5Stamp C3 + BNO085をつかってます。)

  • OLED モジュール
    (SSD1306を使ってますI2C接続のものなら他のものでも)

トラッカーは自作するか購入するかして
OLEDはアマゾンで5個とか3個セットで売ってます。
今回使ってるのがSSD1306の0.96インチ 128X64。

(運動準備)さてファームウェアをもちょもちょ

トラッカー自作してるならば環境は揃ってるはず。
無いのならVSCODEやらPlatformIOやら入れましょう。

さきにハードウェアではSSD1306をI2Cにつなぎましょう。
(ハードはこれだけ。。。)

まずはライブラリの追加
platformio.ini の今使ってるenvに lib_deps = を追記

[env:esp32-c3-devkitm-1]
platform = espressif32 @ 5.1.1
board = esp32-c3-devkitm-1
framework = arduino
lib_deps =
  https://github.com/SlimeVR/CmdParser.git
  adafruit/Adafruit SSD1306 @ ^2.5.7

ここからは main.cpp
ライブラリヘッダのincludeから

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

次はvoid setup()の上に
OLEDの解像度はココで指定

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void loop_display();

void setup()

次はsetup()内に display で始まる2行を追記

    Serial.println();
    Serial.println();
    Serial.println();

    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.display();
    delay(1000);

    logger.info("SlimeVR v" FIRMWARE_VERSION " starting up...");

あとは loop()の最後にdisplay用のloopを追加

	loop_display();
}

void loop_display() {
}

ここまでコードを追加したら一度ためしに動かしてみる。
buildしてuploadで下のようにみんな大好き「adaなんたら」がでてたらOK

スプラッシュ・スクリーン??

(ちょっと休憩)ディスプレイで何を見たいか???

トラッカーも無線機器なので参考にするならスマホのステータスバーかな
時計、電波、WIFI、バッテリー、通知有無、位置情報オンオフとか

トラッカー独自としては装着部位なんか出るといいかも。そもそもSlimeVRServerから部位情報をトラッカーにおくれるわからない。

まずは、バッテリー残量、WIFIの接続状況なんかだろかね。

WIFI電波強度&バッテリ残量表示

RSSIはWiFi.RSSI()で取得できるのでそのまま表示。
電波マークみたいなのだとかわいいかも。
バッテリー残量はADCの結果を抵抗値等で計算する必要があってそのコードが流用できそうにない書き方(コピペはできるけど関数呼び出して使うとか出来なそうって意味で)なので電圧を表示してお茶を濁します。

void diaplay_loop() {
    float voltage;
    voltage = ((float)analogRead(PIN_BATTERY_LEVEL)) * batteryADCMultiplier;

    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,0);

    display.print("RSSI:");
    display.println(WiFi.RSSI());

    display.print("BAT:");
    display.println(voltage);

    display.println("");

    display.setTextSize(1);
    display.print("IP: ");
    display.println(WiFi.localIP());
    display.println("Mentai is OISHII.");

    display.setCursor(0,0);
    display.display();
}
デシベルとボルト

まとめ

電波やバッテリーのアイコン化したほうがわかりやすいかな。
SlimeVRServer未接続、wifi未接続、について考慮してないです。

使い道がかなり限定される内容ですが誰かの参考になれば幸いかもです


この記事が気に入ったらサポートをしてみませんか?