見出し画像

Oculus Quest用1軸触覚デバイスHitHapの作り方

Oculus Quest専用の触覚デバイスを作りました。棒が物に当たる時の力覚再現デバイスです。基本的に棒状の物体で叩く・切る時の力覚を想定しています。

WiFi経由でQuestと通信、モバイルバッテリーで電力供給するため下の画像のような構成で使用します。

パソコンにつなぐ必要がないので、歩き回るのに支障ない仕様です。

ここではこのデバイスの作り方を書きたいと思います。

3Dプリントのパーツと一般に流通しているパーツで作っているので3Dプリンターを持っていれば1万円未満で製作可能だと思います。(ある程度工具は必要になるので環境によっては、もう少しかかるかもですが...)


・コンテンツはまだありません。簡単なサンプルはありますが基本的に開発者向けです。
・説明は記載しますが、3Dプリントパーツの取扱い(サポートの除去など)に慣れが必要なため、不慣れな方には組立難易度は高めかもしれません。
・あくまでDIYデバイスです。製作中使用中の事故やケガ、デバイスの故障などの責任は負いかねます。
・基本的に電気・ソフトは初心者、独学なので間違いやレベルの低い箇所など多々あると思います。どんどん指摘などおねがいします。

部品表

部品表です。個別パーツの3Dデータは部品表からダウンロードできます。3Dプリントの場合stlデータ、CADで編集したい場合はstepデータをダウンロードしてご使用ください。

3Dプリント用のstlデータを一括でダウンロードしたい場合は以下のリンクよりどうぞ

1. 概要

技術的な概要です。

Oculus Questとデバイスの通信はWiFi経由で行うとスムーズになるという情報を得たので、WiFiモジュールを備えたマイコンESP32を使用します。

通信にはOSC通信を使用し、Unityで作成したQuest上のアプリからESP32にサーボモータの角度を送ります。

2. 環境

*パーツの3Dプリントが最も時間がかかるため3Dプリントを進めておくことをおすすめします。

開発環境は以下です。必要に応じてインストールしてください。

・Questコンテンツ作成側:Unity 2019.1.8f1

・ファーム(ESP32 Devkit C):Platform IO IDE (Visual Studio Code)

また、GitHubでUnityプロジェクトとファームウェアを公開しています。ご利用ください。

3. Unityからサーボモータを動かす

ひとまずPC上のUnityプロジェクトからWiFi経由でESP32と通信し、サーボモータを動かせる状態を作ります。

これはサーボモータのキャリブレーションも兼ねているのでメカ組立の前に必ず行ってください。

ファームウェア

ESP32 Devkit Cにファームウェアを焼き込み、OSC通信およびサーボモータを動かすことができるようにします。

GitHubからダウンロードしたHitHap のHitHapFirmwareフォルダをVScodeのPlatform IO IDEから開いてください。

以下2箇所を自分の環境のものに書き換えてください 
1. main.cppの12,13行目のSSIDとPasswordの*部分を自分の環境のものに変更

char ssid[] = "*********";          //your network SSID
char pass[] = "*********";          //your network password

2. ESP32 Devkit CをUSBケーブルでPCに繋ぎ、platformio.ini の16,17行目upload_port, monitor_portを自分の環境のものに変更

upload_port = COM7
monitor_port = COM7


このportはwindowsの場合デバイスマネージャーより確認できます。

Macの場合、ESP32 Devkit Cを接続するだけでは認識されないことがあり、ドライバを入れる必要があるようです。自分の環境ではこのドライバ↓をPCに入れることで認識するようになりました

このドライバを入れるとPlatformIO のホーム画面Devicesにport名が表示されるのでplatformio.ini の16,17行目のCOMの代わりににコピペするとESP32 Devkit Cに接続できるようになります。

この段階ではライブラリが無いというエラーが出るかもしれませんがplatformio.iniファイルにビルド時に依存ライブラリをダウンロードするようにしてあります。
Build→Upload and Monitorをしてください。

Terminalが開かれ、正しくWiFiに接続されればネットワークの情報が表示されます。

ここで表示されるIP addressをあとでUnity側で指定します。

Unity

ダウンロードしたHitHap/HitHapUnity/HitHap.unitypackageをUnityプロジェクトにインポートしてください。

また、以下のAssetを使用します。
ダウンロード、インポートしてください

Oculus Integration

UniRx

uOSC 
凹みさん作成のUnity向けOSC実装です。以下リンクに従ってReleaseされているunity packageを今回のUnity プロジェクトにインポートしてください。

サーボモータを動かす(兼キャリブレーション)
サーボモータとESP32 Devkit Cをジャンパーワイヤー(オスーメス)で接続します。モバイルバッテリーまたはPCをESP32 Devkit CにUSBケーブルで接続してください。

Unity で/Assets/Scenes/ServoCallibrationを開いてください。
ServoClientのuOSC Client コンポーネントのAddressを、PlatformIO IDEでファームウェア焼きこみの際にTerminalに出てきたIP Addreassに変更。

この状態でPCをESP32が接続されているのと同じWiFiに接続しUnity 上で Sceneを再生してください。

正しく通信できればサーボモータが初期位置に回転します。

サーボホーンを下画像のようにニッパーなどで加工してください。回転中心側から数えて3個目の穴までは使用するので4個目の穴を基準にカットしてください。(切るとき破片が吹き飛ぶのでお気を付けて)

先ほど回転させて止まったサーボの位置が変化しないよう保持したまま、サーボホーンを画像のように左向きに文字と並行方向に取付けサーボモータ付属のネジで固定します。

以上で、通信の確認・キャリブレーションが終了です。

4. メカ組立て

HitHapを組立てます。部品の3Dプリントの材料にはABSなど柔軟性があり加工性が良い材料を使用してください。

プリントが終了したらサポート・ラフトを除去します。

このデバイスはリンク機構を使用しています。各軸も3Dプリントで製作していますが、プリント精度やサポートの残りなどにより軸が軸穴に入りにくいことがあります。必要に応じて棒やすりなどで軸穴を削り軸が通るようにしてください。

Link2個を1セットとして使用しServoHornLinkとTopWingLinkを挟み込むようにM2-L6のセルフタッピングねじで固定します。この時リンクを動かしてみて動きがスムーズであることを確認してください。

ServoHornLinkとBottomWingもLinkで挟み込むようにネジで固定します。

TopWingLinkとTopWingをネジで固定。

ServoHornLinkをServoHornにネジ2本で固定します。

上記で組んだ機構をまるごとMainBodyLに取り付けます。TopWingLingとBottomWingの軸を同時に入れるので各リンクを折らないように注意してください。ここでMainBodyLにサーボモータを付けるにはサーボモータ付属のネジを使用します。

MainBodyL/R両方の先端部分にスポンジを貼り付けます。幅5~10mm程度にスポンジを切って4箇所貼り付けてください。

MainBodyLにMainBodyRを取り付けます。サーボモータのケーブルを挟まないように注意してはめ合わせ3箇所ネジで固定します。

ESP32 Devkit CをMainBodyにはめます。ケーブルが抜けないように折り畳みながらピンヘッダを穴にはめ込みます。穴が小さいのでサポートが残りやすいです。必要に応じて直径1.5mmほどの穴をピンバイスであけてください。

ESP32 Devkit Cがはめ込んだ後、カバーを取り付けます。ねじで4箇所固定してください。

Questのコントローラーを押し込みます。筐体をたわませてそれをベルクロ(マジックテープ)で締め付けることでコントローラーを固定します。

これで組立ては終了です。

5. Quest側コンテンツ作成

UnityプロジェクトでAssets/Scenes/SimpleSampleを開いてください。Cubeが置いてある空間のみあるので、Assets/Oculus/VR/Prefabs/OVRCameraRigをシーンに追加して適当な位置に配置してください。

Scene内のOVRCameraRig内のRightControllerAnchorの子としてOVRControllerPrefabを配置することでControllerが表示されます。また同じ階層にAssets/Prefabs/Stickを追加します。

ここでStick下のServoClientのuOSC ClientのAddressをサーボモータキャリブレーション時と同様にIP Addressの指定をします。

以上でサンプルは完成です。このSceneをOculus Questに入れて動作確認をしてください。

6. まとめ

長くなりましたがQuest用触覚デバイスの作り方でした。

まだまだ荒いプロトタイプといった感じのデバイスですが、ハードウェア的にもソフトウェア的にもアップデートして行きたいと思います。

大変かもしれませんが、よかったら作ってみてください。

もし何か質問やリクエストなどありましたらTwitterでお願いします。


サポートは開発・勉強用に使用させていただきます。