脳波でテレビの電源を消す(NextMind)

NextMindのBMI機器を使って、LGのwebOS TVを操作する

前回は↓

filot-nextd2.hatenablog.com

 

環境

  • Unity(2020.2.1f1)
  • Node-Red(1.2.7)
  • Node.js(14.15.4)

Node-Redの環境を以前別のPC上に構築していたので、

今回はそちらからGETする。

 

BMI機器 -> Unity -> Node-Red -> TV

といった感じ。

 

 

※Unity、Node-redのインストール方法は割愛

 

Unity側

  1. Developers resources | NextMind Dev Kit からダウンロードできるNextMindSDK_Full.unitypackageをインポートする

  2. Hierarchy ウィンドウ上で右クリック->NextMind->NeuroManagerを選択
  3. NeuroManagerのInspectorウィンドウで、NeuroManager->Scene ConfigrationのSimulate device、Simulate focusのチェックを外す
  4. NextMindSDKフォルダ内の、ConnectedDeviceStatus PrefabをHierarchy ウィンドウ上にドラッグ
  5. Hierarchy ウィンドウ上で右クリック->3D Object->Sphereを選択
  6. SphereにNeuroTagコンポーネントを設定
  7. 以下のFixを選択すると、Materialに Neuro Tag Material_unlitが設定される

    f:id:filot_nextd2:20210115175126p:plain

  8. NextMindSDKフォルダ内の、TriangleFeedback PrefabをSphereの子階層にドラッグ
  9. http request用に、Hierarchy ウィンドウ上でGameObjectを作成(名前をHttpRequestとかにする)
  10. 作成したGameObjectに、HttpRequest用のscriptをアタッチする
    using System.Collections;
    using UnityEngine;
    using UnityEngine.Networking;
    
    public class HttpRequest : MonoBehaviour
    {
        private const string URL = "http://xxx.xxx.xxx.xxx:xxxx/turnoff";
    
        public void OnTriggerd()
        {
            StartCoroutine("OnSend", URL);
        }
    
        IEnumerator OnSend(string url)
        {
            UnityWebRequest webRequest = UnityWebRequest.Get(url);
            yield return webRequest.SendWebRequest();
    
            if (webRequest.isNetworkError)
            {
                Debug.Log(webRequest.error);
            }
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
            }
        }
    } 
  11. SphereのNeuroタグコンポーネント->Tracking Events->Ontriggerd()に、HttpRequest.Ontriggerdを設定
  12. Hierarchy上の各オブジェクトのTransformを変更し、以下のように見えやすくする

    f:id:filot_nextd2:20210115182025p:plain

Node-Red側

  1.  node-red-contrib-lgtvパレットをインストール
  2. 追加されたlgtvパレットからcontrolノードを追加
  3. controlノードのプロパティ「Host」に、使用するTVのIPアドレスを入力

    f:id:filot_nextd2:20210115193321p:plain



  4. connectボタンをクリックすると、テレビに接続確認画面が表示されるので、はいを選択
  5. Node-redの画面で追加->完了ボタンをクリック
  6. templateノードを設定

    f:id:filot_nextd2:20210115192506p:plain
    今回はテレビの電源をOFFする

  7. http in ノードを追加する

    f:id:filot_nextd2:20210115193007p:plain

  8. あとはノードを並べて繋げてf:id:filot_nextd2:20210115193116p:plain
  9. できあがり

さて、さっそく試す

f:id:filot_nextd2:20210115200233p:plain

これが

f:id:filot_nextd2:20210115200316p:plain

こうなる。

 

テレビの電源消しただけだけど、脳で操る感覚、凄く楽しい。

 

さて、次は何を動かそうか。。。

 

 

NextMindのBMI機器で遊ぶ

NextMindのBMI機器が届いた。

 

www.next-mind.com

 

早速触ってみる。

 

セットアップ

f:id:filot_nextd2:20210112131629j:plain

f:id:filot_nextd2:20210112130758j:plain

f:id:filot_nextd2:20210112131654j:plain

↑この後ろの突起を後頭部に付けて、視覚野の電波(VEP)を拾い、

機械学習でデコードし、結果、何を見ているかを判断するとのこと。

 

セットアップは簡単で、

  1. https://www.next-mind.com/developer/

  2. ↑からNextMindSDKをダウンロード
  3. あとはインストーラーを通せばOK

とても簡単。

 

が、その後の、計測するためのキャリブレーションと操作が、少し難しい。

何が難しいかというと、

 

キャリブレーション

f:id:filot_nextd2:20210112133340p:plain

 

↑後頭部に十分フィットしてるか確認するのだが、画像にあるPerfectの状態を保つためには、装着用バンドをかなり締めなければならない。

結果、突起の圧が増すため、長時間付けるのは難しかった(体感だと、頑張っても30分とか、、)

装着に苦戦するのは、東洋人は後頭部が、西洋人と比べて絶壁気味の人が多いからだろうか。。。

 

操作 (※動画をポップアウトすると様子が分かる)

 

↑注視していると、周りをまわっている3つの四角形が中心に集まり、

三角形になる、その状態が選択されている状態として認識されるとのこと。

これ、ただ見ているだけではうまくいかないこともあり、

コツをつかむために練習が必要になる。、、コツは人による?

 

慣れたところで、サンプルを試してみる。

 

サンプル (※動画をポップアウトすると様子が分かる)

 

 

流石に選択迄に数秒必要だが、用途によっては十分だと思う。

これが$399。BMI(BCI)も、一般に知られるようになると嬉しい。

 

unitypackageの形でSDKを操作可能なので、

次回はそれを試す。

3Dプリンターで樹脂交換に困った

昨年FLASHFORGE Adventure3を購入しました!
初心者でも綺麗に作れて良い感じです

f:id:filot_nextd2:20210105131140p:plainf:id:filot_nextd2:20210105131229j:plain

 

 

樹脂交換の状況

さて、表題の件についてです
初期で付属している赤いフィラメントは全く問題なく取り付けれたので樹脂交換もすぐできるかと思ってたのですが困ったことになりました

樹脂交換をしようとするとフィラメントを押し出すホイールのところで詰まってるような動きをします
メニューに「樹脂交換」という項目があるので難しい操作はないはずですが壊れそうな怖い音がします

 

赤いフィラメントはホイールの上からヘッドまで続いています

赤色が透けて見えるので外から確認可能です
フィラメント取り付け箇所に下から新しいフィラメントを入れて押し出すようになるはずなのですが、、

ちなみにロードができない状況ですが、アンロードは問題なくできました

 

問い合わせ


とりあえずお問い合わせします


検索すると電話番号とメールアドレスがでてきました

FLASHFORGEの各種お問い合わせと連絡先について | FLASHFORGE JAPAN | 3Dプリンター

 

残念ながら営業時間外だったのでメールで問い合わせましたが、アフターサポートにはシリアルナンバーが必要とのこと
シリアルナンバーは下記内容場所に記載があるそうです
【重要】アフターサポートにSN番号が必要になります。 | FLASHFORGE JAPAN | 3Dプリンター

 

知らずにメールしてしまい、お問い合わせフォームを教えてもらいました

こちらがそのフォームのリンクです

サポート | FLASHFORGE JAPAN | 3Dプリンター


サポートを待ってる間に対処法がないか検索してみたらでてきました!
この内容と同じ状況です!

qiita.com

※お問い合わせ後にサポートしていただいた内容も同じでした

フィラメントの除去

qiita記事を参考にしてフィラメントの先を確認して切断してみます

ツールを準備
  • 六角レンチ
  • ピンセット
  • ニッパー

六角レンチは付属されているので付属品を利用します

あとは抑えたりスプリングを持っておくためにピンセットと詰まってるフィラメントを切るためにニッパーを使いました
今回、フィラメントがつかめるギリギリのところで引っかかっていたので引き出すためにピンセットより力の入るペンチの方が便利かもしれません

f:id:filot_nextd2:20210105135247j:plain

記事の通りに作業を行う

f:id:filot_nextd2:20210106111847p:plain

六角レンチで青いところを外します

特に問題なく外せました

緑色のスプリングが落ちないように注意して外して中を見ると
確かに赤いフィラメントの最後の部分が曲がってました(赤い丸の箇所)

フィラメントが少しだけ出てるので、切れる長さになるまでピンセットでひっぱります

曲がってる箇所を切って元にもどしてネジをはめます

はめるときは特に支えもなく指で抑えながらできました

樹脂交換

電源を入れて樹脂交換開始です

ちゃんとホイールも動いて問題なく取り付け完了できました!

フィラメントの色が変わるまで押し出し

フィラメントの色を黒に変更したので、手動をつかってひたすら押し出します

f:id:filot_nextd2:20210105140032j:plain

押し出されたフィラメントが黒になったので

そこで終了して樹脂交換完了です!

ちゃんと黒で出力されています

f:id:filot_nextd2:20210105140153j:plain f:id:filot_nextd2:20210105140346j:plain

次回からフィラメントの残量を注意しておかないと、、、

 

 

おまけ

樹脂を接着する際にコンビニでプラスチック用の接着材を買って使ってみました
くっつけた次の日に手でひっぱたら取れてしまいました。。。

ネットで探してみたらこちらを発見

しっかりくっついて良い感じです!
一応人体に影響はないようですが手袋して使ってます

f:id:filot_nextd2:20210105141000j:plain




 

 

 

パリティミラーで時計を表示する

パリティミラーを触ってみました



パリティミラーとは空中に映像を表示させるディスプレイのことで
パリティ・イノベーションズさんの製品です


画像のようにパリティミラーと表示する対象物光源が必要となります
公式から画像をお借りしてきました

f:id:filot_nextd2:20201209181819j:plain

 

実物はこんな感じです
カメラの焦点が合わずぼやけた感じに見えます

f:id:filot_nextd2:20201209183046j:plain

手前にある青いシールは向きを示すものでこちらが手前になるようにセットします
シールは簡単に外れるので注意が必要です
サイズは150mm角のものを購入しました


ミラーの素材はアクリルで切断可能だそうですがそのまま使います
また特殊インクを利用してるそうなので汚れに注意です


画面に時計を表示したディスプレイを写してみました

目視だと立体的に見えますが、撮影はちょっと難しいですね


パリティミラーにはつるつるした面とザラザラした面があります
どちらを上にするかで表示が変わるそうです

f:id:filot_nextd2:20201209190740j:plain

上の画像はつるつるした面を上にしてセットしています
パリティミラーの面自体のムラが少なく見えるとのこと

 

f:id:filot_nextd2:20201209190749j:plain

こちらはザラザラした面を上にしてセットしています
より高コントラストで映像が表示されます



時計表示に使ったものはこちらです
・パリティミラー

・Airbar

・高輝度ディスプレイ

・ガムテープ
・ボード
後はwindowsのPCを繋ぎました

f:id:filot_nextd2:20201209191459j:plain


PCの上にディスプレイを乗せてボードで囲みました
後日3Dプリンターを使って周りの筐体を作ってみたいです

ちょっと崩れてるとこですがこんな感じです

f:id:filot_nextd2:20201209192149j:plain


角度が難しかったですが、綺麗に映像が表示できました
もっとエフェクトとか追加してどう見えるのか試してみたいです


 







 

OculusQuestでオリジナルハンドジェスチャを使う

※以下を参考
https://www.downtocode.com

そこそこな力技。

 

ざっくりやり方

・OculusHandComponentを継承。以下継承したBP上で実施。


・全ての手のBoneのLocation(Vector)を取得し、ジェスチャ名(String)とLocation(Vector、配列)の構造体を.savに保存。イベントは好きなインプットアクションに設定。

f:id:filot_nextd2:20201202130321p:plain

 

・Editor上で好きにジェスチャーを登録


・Recognized用のTimerを設置、Timer毎にBoneのLocation(Vector)を取得し、ジェスチャー判定する。あとはイベント飛ばすなどしてお好きに。

f:id:filot_nextd2:20201202130621p:plain

f:id:filot_nextd2:20201202130652p:plain

 

以上。

 

 

 

頑張ればモーション登録もできそう。

visual studio 2017でコンソールプロジェクト作成方法

とっても久しぶりにvisual studioを利用したところ、C++でコンソールプロジェクトの作成ができなくて戸惑いました




結論
 visual studio Installer のオプションから落としてくる必要がある




以下、やったことをそのまま(間違いも含めて)記載します

 

  1. [ファイル]->[新規作成]->[プロジェクト] C++の中をみてもコンソールプロジェクトが見つからない

  2. スタートメニューからインストーラーを起動
    f:id:filot_nextd2:20201116111422p:plain:w400

  3. 思ってた画面じゃない
    プロジェクトをインストールしたいけどどこからいくのかわからない
    f:id:filot_nextd2:20201116111644p:plain:w400

  4. 新しいプロジェクト作成の左下にリンクを発見
    f:id:filot_nextd2:20201116113210p:plain:w200

  5. 欲しかったページにたどり着く
    f:id:filot_nextd2:20201116112144p:plain:w400
    (※3の画像の変更からいける)

  6. 右のほうにあるオプションにチェックを入れる
    f:id:filot_nextd2:20201116112527p:plain:w200

  7. .....インストール.....

  8. これで作成できる!
    f:id:filot_nextd2:20201116112654p:plain:w400




オンラインにあるのかと思って探して手間取りました
迷って見つけたこちらは拡張機能でした


f:id:filot_nextd2:20201116114350p:plain:w200
f:id:filot_nextd2:20201116113816p:plain:w400


marketplace.visualstudio.com

APDS9960ジェスチャーセンサーで電源切り替え

 

やりたいこと

ジェスチャーセンサーを利用してスマートコンセントと赤外線LEDの電源切り替え操作をする

 

利用するもの

・APDS9960ジェスチャーセンサー

・Espr Developer Rev.4(2G) : wifi接続用

・Arduino Uno R3 

・Kasa スマートプラグ

(N極対応プラグ変換アダプタ)

・赤外線リモコン - ライト

・赤外線リモコン受信モジュール

・その他抵抗やコンデンサ、ブレッドボードなど


環境

・windows10

・Arduino IDE 1.8.12

・IFTTT

・Kasa Smartアプリ

 

※IFTTTが有料化されてました!

 

接続

f:id:filot_nextd2:20201007171611j:plain

APDS9960ジェスチャーセンサー秋月電子通商で購入しました

センサー基盤裏のJP1とJP2 を結線しておきます

 

ツール

・ユニバーサル基盤に配置する際はmarmeloというエディタを利用しました

配置を反転させるのに便利でした

カラー抵抗早見表も便利でした

 

実装

Arduino Unoでサンプル実行

目的 : 左右上下の手の動きを取得する

Arduino IDEを使って書き込みます

SparkFunのLibが使えるらしいので使います

サンプルも一緒になっているので、そちらを参考にするとジェスチャーによる判定ができます

明るさやRGBを読み取るサンプルも入っているので遊んでみると楽しいです

ジェスチャーのセンサー範囲ですが、おおよそ20cmほどまでのようでした

遮るものがあったりあまり遠くなると判定できません

また、NEARとFARは難しく、反応したりしなかったりでした

ゆっくり動かすと反応しやすいです

手を動かして出力した結果は以下の画像のような感じで出力されます

f:id:filot_nextd2:20201007200817p:plain

Espr Developer Rev.4でWifi接続

シリアル通信を使うため、ATコマンドの確認をします

 ArduinoとEsprDevはTx-Rxとなるように接続します

ArduinoUno EspDeveloper
Rx Tx
Tx Rx

 

SoftwareSerialについてはいろんなところで詳しく書かれているので割愛します

シリアル通信ができ、ATコマンドを打てることが確認できたらOKです

 

私はこちらを参考にさせてもらいました

 

-- 注意点 --
EsprDeveloperには2つのモードがあります
IO0ピンの接続が間違っていると動きません

モード 説明 IO0ピン接続

Flash Boot Mode

(実行モード)

ATコマンドでやりとり、書き込んだスケッチを実行する IO0 ピン HIGH

UART Download Mode

(書き込みモード)

スケッチを書き込み、ファームウェアアップデートを行う IO0 ピン LOW

 

もしEsprDeveloperにスケッチを書き込んだ場合はファームウェアの書き直しが必要になります


ATコマンドについてはこちら

 

ATコマンドが使えればWifi接続も可能なはずです

SSIDを使って接続する場合はこちらの人がスケッチをアップしてくれていました

そのまま動くと思います

 

私はprintlnを使ってATコマンドを書き込み、WPSを利用しました

 コマンドは以下を使っています

wifi変数で利用しているメソッドはESP8266libのメソッドです

AT+UART_DEF
AT+CIPSTA?
AT+CWMODE_CUR=1
wifi.setOprToStation()
AT+WPS=1
wifi.disableMUX
wifi.createTCP

 

IFTTTとスマートプラグ

目的 : RIGHTやLEFTが来た時にスマートプラグの電源を切り替える

先ほど左右のイベントは取得できているので、まずはスマートプラグとIFTTT連携をします

IFTTTのアカウントを作成し、webhookを使ったアプレット作成をします

「If This」を選んで「webhook」を選択し、イベント名を入力してスマートプラグのONとOFFのイベントを追加します

f:id:filot_nextd2:20201007203048p:plain
f:id:filot_nextd2:20201007203052p:plain
f:id:filot_nextd2:20201007203055p:plain

次にスマートプラグの設定をします

スマートプラグのアプリ「Kasa Smart」を入れてアカウントを作成します

プラスアイコンから端末を追加=>スマートプラグ=>スマートプラグ「ライト」/「ミニ」を選択します

特に問題もなく簡単に設定できるので、Kasaの説明書通りに進めて設定してください

スマートプラグの設定をしたらIFTTTの設定をします

「create your own」ページの「Then That」を選択します

そこでスマートプラグの名称で検索してKasaで作成したアカウントで操作するデバイスを選択すればスマートプラグとの連携完了です

maker_webhookページのDocumentationを押下するとWebhookのURLが確認できます

f:id:filot_nextd2:20201008152233p:plain

あとはジェスチャーイベント発生時にこのURLを利用すればONOFFできるようになります

 

 

ジェスチャーのイベントはサンプル実行で取得できていますので

そこにONOFFトリガを追加します

ESP8266libのメソッドであるsendを使って通信しました

 

 

赤外線リモコンとLED照明

目的 : UPやDOWNが来た時に照明のONOFFを切り替える

赤外線の規格は各会社によって異なるようです
なので、実際にリモコン操作をしてフォーマットをみてみます
一旦いろいろ繋げていた物をArduinoUnoから外します

赤外線リモコン受信モジュールとIRemoteというLibを使って規格を調べます

データシートがあるのでInOutをみてArduinoUnoと繋げます

ArduinoUno 赤外線受信モジュール
5V Vcc

11(受信するピン)

Output
GND GND

 

あとはLibのソースをそのまま使います

IRecvDumpを実行してリモコン操作をすればデータが受信できるはずです

シリアルモニタは9600kbpsなので注意してください

 

データが取得できたと思いますので、ジェスチャーイベントが発生した際にIRemoteを使ってsendするだけです

これで照明のONOFFができます 

 

ケース作成 

ケースには3Dプリンタを使いました
モデリングにはFusion360を使ってます

無償版を利用してみましたが、上蓋と土台が接触しているかを確認することができてよかったです

また、初心者でも使いやすかったです

使い方はUdemyで勉強しました

 

実行結果

f:id:filot_nextd2:20201008165137g:plain

UP : 照明OFF

DOWN : 照明ON

RIGHT : スマートプラグOFF

LEFT : スマートプラグON

スマートプラグと携帯電話を繋いでいます
小さくて見えづらいですがONにすると充電中に切り替わります

青く光っているのはジェスチャーが読み取れた場合です
何かわからなかった場合は赤く光るようにしています

 

エラーなどでひっかかったところ

スケッチを書く前段階、環境を設定するまでにひっかかった内容を過去にFacebookにアップしています

ページトップに[困った問題 => 解決法]を書いてます


エラーではありませんが、スケッチでprintlnする際にFマクロを使うとSRAM使用量が少なくなることを初めて知りました

また、赤外線がカメラ越しなら光っていることがわかるということも今回初めて知りました