雑食エンジニアの気まぐれレシピ

日ごろ身に着けた技術や見知った知識などの備忘録的なまとめ.主にRaspberry Piやマイコンを使った電子工作について綴っていく予定.機械学習についても書けるといいな.

PlatformIOでhapStak開発

前々からハプティクス系に興味があったのですが,ちょうどよいデバイスを見つけたので購入しました.
触感デバイス開発/体感モジュール“hapStak” | Bit Trade One, LTD
Foster電機さんのFOSTER ACOUSTICHAPTIC®-639897というアクチェータを組み込んだ触覚開発デバイスです.なんとこのアクチェータは,かのPS5のコントローラ"DualSense"に搭載されているアクチェータの姉妹型番なのです!
このデバイスで何ができるのかについてはサンプルデモを実装した下記が分かりやすいかと思います.
ms-my.facebook.com

今年10月に発売したばかりで,まだ情報が出そろっていなさそうなので,色々手探りしながらその過程を残していければと思います.
(故に認識違いも多いかもしれません.お気づきの方はご指摘いただけると幸いです.)

まずは,PlatformIOでサンプルコードを動かすまでの流れを残しておきます.

f:id:shikky_lab:20211123160215j:plain
hapStakとM5stack Atom

はじめに

実はオーディオ系をいじること自体が初めてなので,自分の整理も兼ねてhapStakの構成をまとめてみます.
まず,hapStakにはアナログ版とデジタル版があります.
触感デバイス体感モジュール“hapStak“ アナログ版 - スイッチサイエンス
触感デバイス開発モジュール“hapStak“ デジタル版 - スイッチサイエンス

アナログ版はオーディオアンプ&オーディオジャックが搭載されているため,ジャックに挿すだけでスピーカ替わりに使用することができます.
デジタル版はマイコンとつなぐための変換基板が搭載されており,マイコンから簡単に制御できるような構成となっています.
今回私が購入したのはデジタル版になります.

hapStakデジタル版は

  • ①Foster電機さんの振動アクチェータ
  • マイコン用信号変換基板
  • ③MDFケース

の三つがセットになった製品です.

①のアクチェータは言葉を選ばずに言えばスピーカと同じで,入力された信号に応じて振動します.そのため, アナログ版のように直接スピーカのように使用することもできます.音声信号なので信号線は2本で,そこに交流信号が流れます.

②のマイコン用信号変換基板は,マイコンからの信号入力(I2S)を受けて,上記交流信号に変換しています.I2Sというのは3本の信号線を使って音楽信号を伝送する規格らしいです.これはまだ全然理解してないので,これから勉強していきます(購入時点ではI2Cと勘違いしてたのはナイショ) . 対応マイコンにはM5Stack AtomとArduinoMKRZeroがあり,この変換基板に直接重ねる形で結合できます.つまりI2S信号が出せるマイコンならどれでも操作可能なのですが,これらのマイコン使えば直接挿せるので楽ですよ,というハナシです.

③は言わずもがなですが,はめ込みで作るMDFのケースです.図面も公開されているので自作することもできます.ただ正直,組付けはかなり難しいし,コネクタは後から抜き差しできないし,なのであまりいい設計ではない気がします・・・.

なお当然ですが,マイコンは別売りです.今回はM5Stack ATOM Matrixと,ATOM用のバッテリを用意しました.
ATOM Matrix - スイッチサイエンス
ATOM TailBAT - スイッチサイエンス
上述の通り重ねる形でぶっ挿すので,コネクタ等は不要です.

サンプルプログラムの実行

まずは記サンプルを動かすところまで進めます.
ADACHACY-hapStak/Samples/HapstackTest at master · bit-trade-one/ADACHACY-hapStak · GitHub

  1. PlatformIOにて,BoardにM5Stack-ATOMを選択してプロジェクト作成 f:id:shikky_lab:20211123165027p:plain
  2. ADACHACY-hapStak/Samples/HapstackTest at master · bit-trade-one/ADACHACY-hapStak · GitHub のサンプルコードをすべてsrc以下に配置
  3. PlatformIOのLibrariesより,"M5Atom", "FastLED"の二つを検索し,Add to Projectで先ほど作成したプロジェクトに追加する.
  4. これでビルドに成功するはずなので,M5Stack ATOMに書き込む.

画面に何も映らないので不安になりますが,ディスプレイボタンを押すと銃を撃ったような振動が発生します.

デモプログラムの実行

次は,冒頭の動画で使われているデモプログラムを書き込みます.ソースは下記.
ADACHACY-hapStak/hapStakDemo at master · bit-trade-one/ADACHACY-hapStak · GitHub
とはいえ大体の流れはリンク先に置かれているpdfに書かれているので,それに補足するような形で記載していきます.
M5Atomのライブラリ(m5stack/M5Atom@^0.0.5)にて仕様変更があり,サンプルコードのままではディスプレイが正常に表示されないので注意.詳細は後述

  1. PlatformIOにて,BoardにM5Stack-ATOMを選択してプロジェクト作成(先ほどと同じ)
  2. ADACHACY-hapStak/hapStakDemo at master · bit-trade-one/ADACHACY-hapStak · GitHub のサンプルコードをすべてsrc以下に配置*1
  3. PlatformIOのLibrariesより,"M5Atom", "FastLED", "ESP8266Audio"の三つを検索し,Add to Projectで先ほど作成したプロジェクトに追加する.
  4. platform.iniに"lib_ldf_mode=deep+"という行を追加する*2
  5. hapStakDemo.inoのFLG_WRITE_FILESが1になっていることを確認してからAtomに書き込む
  6. 起動してしばらくすると数字の"1"がディスプレイに表示される
  7. FLG_WRITE_FILESを0に変更して,再度書き込む
  8. 遊ぶ

大体こんな感じかと思います.個人的に詰まりポイントは下記.

  • *1.関数が見つからない系の大量のエラー
    • 拡張子をinoにするか,プロトタイプ宣言を書くことで解消する.
  • *2.ESP8266Audio内でHTTPClient.hが見つけられずにコンパイルエラーになる
  • ディスプレイの表示がおかしくなる
    • M5Atom@^0.0.5より,M5.dis.displaybuff()の仕様が変わったらしい.
      • 参考情報:
      • 指摘の通り,setup()関数内で M5.dis.setWidthHeight(5,5); を呼ぶと直る.
      • ただしRGBの順番が変わってしまうので注意(このサンプルでは色にあまり意味がないので問題ないが).
  • FLG_WRITE_FILES=0でビルド⇒書き込みすると動かなくなる
    • 最初は動いていたのだがいつのまにか動かなくなっていた.
    • 原因は音声ファイルが消失していたこと.
      • このデモではFLG_WRITE_FILES=1で書き込んだ際にSPIFFSに音声データを書き込む処理が入る
      • この際,初めに全ファイルを削除してから新しく書き込みを行う
      • VSCode+PlatformIOで開発を行っている場合,シリアルモニタを有効にしていると,ビルド開始時にM5のリセットがかかる.
        • つまり,FLG_WRITE_FILES=0でのビルド中にM5がリセット⇒音声ファイル消去⇒書き込みという流れになってしまっていた.
      • 結局,フラッシュを消す前にボタン押下を待つ処理を入れることで対応.

あと,サンプルのままだと加速度ベースのトリガが何度も反応してしまうので,前の音源の再生中は反応しないように変更しました. 一応もろもろ修正したコードを挙げときます. https://github.com/shikky-lab/HapstakTrial/tree/de9c5e2a3425454c5354ea9799504886779c15fe

おわりに

まだ解決していない問題もありますが,一応サンプルデモが動作しました.調査中の事項については解決次第追記していきます.

はてさて,このデバイスでやりたいことは沢山あるのですが,一番は牽引力錯覚というものです. www.youtube.comCEATECにて㈱ミライセンスさんのブースで見たときからずっと憧れていたのですが,このデバイスがあればできるのでは?と思っています.
(まだ原理をちゃんと理解していないので,本当にできるかは分かっていないのですが・・・.)
しばらくはこれを目指して色々試してみたいと思います.

それでは.