ディープラーニングを用いて約1.8万円の低コスト筋電義手を作りました

前回掲載したディープラーニングを応用した筋電義手の記事を予想外に多くの方にご覧いただき、非常に驚いています。こうやって皆さんに反応をもらえると非常に励みになりますね、本当にありがとうございます!
今回は開発した筋電動作推定システムを簡易的なロボットアームに適用することで、低コストの筋電義手を作成したので報告させていただきます。(といっても、快適に使用するには程遠いですが、、、、)
また、前回の記事でいただいたコメントに対する捕捉情報についても述べていきたいと思います。

実際の動作とコストについて

実際に動いているときの動画です。
前回の記事と同様に、手を握った時・反った時・屈曲した時・無造作時の4種類の筋電位パターンをディープラーニングを用いて分類し、分類結果に応じてロボットアームを動かしています。



コストの内訳としては、
・ラズパイ:約5500円
・MyoWare:約5500円
・ロボットアーム:約5500円
・その他(圧着端子、ADコンバータ等):普通に買えば1500円くらい?
となっており、概算して約1.8万円です。

メカ・エレキ・ソフト設計

本当は自分で機械・機構設計に挑戦したかったのですが、
「まずは義手という形で見せられるようにしたい」という思いから、
簡単に制御できるSainSmart社のロボットアームを購入してみました。
5000円程度で3軸のロボットアームが買えるなんてお手軽ですね。
jp.sainsmart.com


ただ、今回は
・2軸で十分
・デフォルトの手首軸(真ん中の軸)回転方向が実際の手首の回転方向と異なる
ことから、所望の軸構成となるように分解・組み換えを行いました。
f:id:mou-tsukareta:20190824143650j:plain


回路に関して、前回はモータの電源をラズパイから供給していました。
しかし、今回は2軸構成となりさすがに電力不足となることが予想されたため、ACアダプタ→5Vレギュレータからモータの電源を供給することにしました。
f:id:mou-tsukareta:20190825041225j:plain


ソフトに関しては、推定した動作に応じて2軸のサーボをそれぞれ制御するだけの単純なものです。
また、ハンドの開閉状態とパルス幅の関係性がわからなかったため、自分で動作させて確認しました(どこかで公開されてるんでしょうか)。結果として、0[deg]で完全に閉じた状態となり、角度をマイナスに変化させるほどハンドが開いていきました。そこで、今回は余裕を持たせて-15[deg]を閉じた状態、-50[deg]を開いた状態としました。

補足情報

●パッドの張り方、体調等によるゲイン調整について
これに関しては、パッドが大体の位置に貼れていれば調整は必要ないです。
また、体調に関しても今のところ影響なしです。
ちなみに、今回の動画は前回から1カ月以上たってから撮影していますが、当時からディープラーニングに関するゲインは一切変えておらず、またパッド位置も前回の動画を参考に適当な位置に貼っただけで問題なく動作しました。


●ネットワークの層数について
今は中間2層でやってますが、コメントいただいた通り中間1層でも行けるかもしれません。
時間とやる気があれば試してみたいと思います。


●ラグについて
手を動かしてから実際に動作するまでのラグタイムですが、ラズパイの処理能力よりも推定アルゴリズムそのものによるところが支配的です。
前回の記事でも説明しましたが、現状の推定アルゴリズムは手を動かしてから2[s]の間の筋電データを用いるため、最低でも2[s]はラグが発生します。推定に用いるデータ区間を短くすることでラグは有意に減少しますが、各動作の波形の特徴も減少するために認識率が低下してしまいます。
ちなみに、以前フォワードプロパゲーション部の処理時間を計測したときは、0.3[s]~0.5[s]程度だったと記憶しています。
(大体の値を知りたかっただけなので、正確な値をメモし忘れてました、、、、)


●推定する動作の種類について
コメントとは直接関係ないですが、前述のラグと関連して自分の中でメモしておきたいトピックです。
今は4種類の動作を推定していますが、これを更に増やせるか?という問題です。
試しに「手を開く」動作を追加して推定してみましたが、認識率が下がりました。
動作の種類が増えるほど似たような特徴を持つ波形が増えるため、認識率が下がっているのだと考えられます。
これを解決する手段としては、「パッドを貼る位置やセンサの増幅率を試行錯誤することで、各動作がより特徴的となる条件を見つける」、「推定に用いるデータ区間を長くすることで、各動作の特徴をより捉えやすくする」ことが考えられます。後者に関してはラグタイムの増加につながるため、あまり好ましくなさそうです。
これも時間とやる気があれば、改善していきたいです。

今後について

今後の開発の余地は以下のような部分だと考えています。
・より装着しやすいようにするための機械・機構設計
・小型化のためのCPU変更、基板設計
ラグタイムを減らすためのパッド位置、増幅率の試行錯誤
・低コスト化のための筋電位センサの自作
特に、CPU変更と筋電位センサ自作をうまくできれば、コストも1万円以内に抑えられるのではと考えています。

ラズパイでディープラーニングと筋電位センサを用いた筋電義手(プロトタイプ)作りました

最近、以前から興味のあった筋電位センサを触っています。
また、ディープラーニングの勉強も始めたのですが、
ディープラーニングの仕組みを理解する中で「ディープラーニングって筋電位センサに応用できるんじゃ?」と閃きました。
そこで色々試してみたところ、簡単な動作推定を行うことに成功したので、まとめてみます。
タイトルにある通り、ラズパイを使ってます。

実際の動作

実際に動いているときの動画です。
手を握った時、反った時、屈曲した時の3パターン(厳密には無動作時を併せて4パターン)における筋電位パターンをディープラーニングを用いて分類し、分類結果に応じてサーボモータを動かしています。

筋電位センサ(自作)

※この項で紹介するセンサは最終的には使いませんでした。
筋電位センサは全くのド素人なので、まずはコチラのサイトで紹介している筋電位センサを自作してみました。
www.f.waseda.jp


実際にPCのマイクアンプに入力すると、力を入れるごとに確かに筋電位波形が確認できました。
そこで、今度はAD変換ICを介してラズパイでセンサ値を読み取ろうとしたのですが、
力を入れた時と入れないときの違いが全く出ませんでした。
この理由として、前述の自作筋電位センサは神経が発する表面電位を計装アンプ(LT1167)により増幅していますが、
これを更にPCのアンプ・フィルタが増幅・フィルタリングしてくれているため、うまく波形を確認できたと考えられます。
つまり、前述の自作筋電位センサ単体では筋電位をセンシングすることは難しく、PCありきのセンサになっている、という事です。
実際に、ステレオプラグ→USB変換アダプタを用い、マイク端子を介さずにUSBを介することで自作筋電位センサをPCに接続したときの挙動を実験したところ、力を入れても波形を確認することができませんでした。
よって、自作筋電位センサの使用は今回は見送ることにします。

筋電位センサ(市販:MyoWare)

自作の筋電位センサは諦めて、市販の筋電位センサMyoWareを使用することにしました。
www.switch-science.com


結果論になりますが、センサ値が上手く取れなければディープラーニングも意味をなさないため、この選択は正解だったと思います。
併せてMyoWare専用のパッドも買ったのですが、こちらは自分的には買う必要はないかなという印象です。

www.switch-science.com

理由として、専用パッドの粘着性があまりに強いのか傷つきやすかったり、パッドを貼る箇所の自由度が低いことが挙げられます。
実際、MyoWareの写真を見てもらえればわかるかと思いますが、デフォルトのパッドは基板直下の2つとケーブルでつながった1つの計3つです。実際に腕に着けてみると、基板自体にパッドがついているせいなのか何か違和感があり、パッドが腕からとれやすかったりします。


実はMyoWareにはもう一つオプションがあり、デフォルトのパッド端子の他に、基板右下に設けられたR,E,M端子を用いることもできます。私は写真のように、R,E,M端子にピンソケットをはんだ付けして、オスピン端子を片側に圧着したワニ口クリップを差し込みました。
f:id:mou-tsukareta:20190717024635j:plain
f:id:mou-tsukareta:20190717024612j:plain


この方法ならば、自分の好きな位置にパッドを貼れますし、パッドも自分が好きなものを選ぶことができます。
今回のパッドは、前述の自作筋電位センサを作った時に使っていたオムロンのパッドが良い感じなのでこれを使うことにします。

akizukidenshi.com
akizukidenshi.com
akizukidenshi.com
akizukidenshi.com

回路

以下の回路図の写真の通り、AD変換モジュールにはMCP3208を用いました。
f:id:mou-tsukareta:20190717024723j:plain

ラズパイからMCP3208およびMyoWareに5Vを供給しています。
疑似差動入力は用いず、MyoWareの信号端子をMCP3208のCH0に接続しています。

ディープラーニング入門

私はディープラーニングについてもド素人です。
なのでどう勉強するかから考えたのですが、書店で色々探して吟味したところ、「はじめてのディープラーニング」が最も分かりやすく応用も効きやすそうな内容だったため、これで勉強することにしました。1週間もかからずに理解できる内容と思います。

ツール等に頼らずディープラーニングの仕組みを理解しながら学べる内容になっており、またソースコードも比較的短いものばかりのため、解説文が理解できなくともコードを読めば簡単に原理を理解できます。
私もこれを読む前は「ディープラーニング」と聞くと難しく抽象的なことをやってるのかなと思っていたのですが、これを読んだ後はあくまで「多層ニューラルネットの出力誤差を最急降下法を用いて重みとバイアスにフィードバックする」アルゴリズムでしかないことがわかりました(間違ってたらごめんなさい)。

ディープラーニング(データ解析)

筋電位センサ特有の前処理で、ある意味一番重要な処理だと思います。
実際の筋電位センサの出力波形は下図に示すような筋電位の強さに応じた電圧です(横軸[s],縦軸[V])。
ちなみに、サンプリング周期は0.005[s]で2[s]の区間を切り取っています。
f:id:mou-tsukareta:20190717024806j:plain

同じ動作でも力の入れ方によって、筋電圧の強度は変わるため、これをそのままディープラーニングに学習させてもうまくいかないことは明白です。
そこで、上図の筋電位波形を見てみると、動作によって波形の"感じ"が異なることがわかります。掲載は割愛しますが、同じ動作であれば毎回おなじ"感じ"になります。
この"感じ"を数値として表現するために、FFT高速フーリエ変換)を行います。
フーリエ級数展開ググると色々出てきますが、この世の様々な波形は色々な周波数(早い・遅い振動の周期)の波が合成されたものになっています。そこで、周波数解析を行うことで、対象となる波形にどれくらいの周波数の波がそれぞれどれくらい含まれているのかを知ることができます。この周波数解析をコンピュータ上で行うために離散化させたものがFFTです。
実際に前述の屈曲動作時における波形にFFTをかけると、下図のようになります(横軸[Hz]、縦軸[スペクトル強度])。
f:id:mou-tsukareta:20190717024823j:plain

このとき、FFTを施す前の波形は2[s]の区間をサンプリング周期0.005[s]で記録したものでした。これはデータ数400となります。
この時系列データに対してFFTを施すと、200[Hz](=1/サンプリング周期=1/0.005)の区間を周波数間隔0.5[Hz](区間/データ数=200/400)で離散化した周波数データとなります。これもデータ数400となります。
この事実はFFTをかけたときの図を見てもらえるとわかると思います。

ディープラーニング(データ取得)

今回は、10秒間隔でディスプレイに「力をいれてください」という文字列を表示させ、文字が表示されたら力を5秒入れるということを繰り返すことで、各動作における複数のデータを取得しました。
この方法であれば、出力結果を10秒間隔で切り出せばそれぞれの動作を切り出せるのでお勧めです。
実際は、10秒間隔の先頭2秒を切り出し、それぞれにFFTを施しました。
f:id:mou-tsukareta:20190717024902j:plain

もう一つのミソとして、AD変換の周期があります。
サンプリング周期は極めて正確にしたいので、今回はsignal.setitimerを使いました(ググればいろいろ出てきます)。
これを用いることで、signal.signalで設定した関数を定周期で起動することができます。
今回はサンプリング周期0.005[s]で処理時間計測してみました(結果を残し忘れました、、、、)が、ほとんど誤差なく起動できていましたので、問題ないと思います。

ディープラーニング(学習)

前述したとおり、2[s]の区間をサンプリング周期0.005[s]で記録した時系列データにFFTをかけると、200[Hz]の区間を0.5[Hz]間隔で記録したデータ数400の周波数データとなります。これを1つの学習用データとして、更にそれぞれのデータの末尾に実際の動作(握り、反り、屈曲、動作無し)に応じた分類用の数値(0,1,2,3)を付与します。
この手順で各動作につき5つのデータを用意し、計20個のデータを学習用データとして用意しました。
今回実装したディープラーニングの構成は以下になります。
・エポック数:1000
・学習係数:0.01
・入力層のニューロン数:400(=データ数)
・中間層のニューロン数:400×3=1200
・中間層数:2
・出力層のニューロン数:4(=分類数)
・中間層の活性化関数:ReLu
・出力層の活性化関数:ソフトマックス関数
・損失関数:交差エントロピー誤差
・最適化アルゴリズム:AdaGrad
・バッチサイズ:8
・中間層のドロップアウト率:50%

この学習によって得られた重みとバイアスはCSVファイルに記録しておきます。

ディープラーニング(推定)

CSVデータに記録した学習済みの重み・バイアスをロードし、リアルタイムに推定を行います。
やり方としては、リアルタイムに最新の筋電位データ(今回はサンプリング周期0.005[s]で2[s]の区間の400個のデータ)を常にバッファしておき、任意の推定周期でバッファリングしている筋電位データをFFT→フォーワードプロパゲーションを行うことで、リアルタイムに動作を推定することができました。この推定結果に応じてサーボモータへのパルス幅を変更してあげれば、簡単な筋電義手のできあがりです。

システムまとめ

以上を簡単に図としてまとめました。
f:id:mou-tsukareta:20190717095017j:plain
f:id:mou-tsukareta:20190717095031j:plain

感想

今回強く感じたのは、ディープラーニングが非常に容易に実装できる技術であるにもかかわらず、想像以上の威力を発揮してくれたことです。
今後はこれを様々なロボットや装置の操作用インタフェースとして応用していきたいと思います。

スマホ操作ロボット~実動作確認~

3DCADによるメカ設計に続き、スマホ操作ロボットの制作を行いました。
メカ設計からパズドラをプレイするプログラム作成まで一通りを自作し、動作確認まで一通り完了いたしましたので、報告いたします。
f:id:mou-tsukareta:20190616003221j:plain

実際の動作


パズドラのドロップをカメラ画像から認識し、ルート解析結果に従ってアクチュエータ制御を行ってドロップ操作してます。

メカ設計

Fusion360で設計を行いました。
動作機構はコチラの動画を参考にさせていただきました。
www.youtube.com

ざっくり書くと、ラックアンドピニオン動作のために2個のステッピングモーター、タップ用の直動動作のためにソレノイドを取り付けています。
金属部品は全てボール盤で穴あけ加工、タップ切り、仕上げまで行っています。
詳細は以前の記事で書いてます。


今回加工時にタップを何本か折ってしまったのですが、ボール盤のチャックにタップを固定して、手で回しながらクレ556をいれつつ作業するととてもきれいに仕上がりました。
仕上げには水やすり(240→400→600→1000→1500の順に使用)、ピカール剤を使いました。
f:id:mou-tsukareta:20190616003515j:plain


また、タップ部分にはソレノイドの先端にタッチペンの先を付けていたのですが、認識してくれませんでした。
そこで、100均の吸振素材にアルミホイルを巻き付けたものを取り付け、更にクリップ付きのジャンパ線をソレノイドの鉄心に取り付けたところ、うまくいきました。
f:id:mou-tsukareta:20190616003116j:plain
f:id:mou-tsukareta:20190616003139j:plain

なお、シャフト、シャフトホルダ、スライドユニットはAmazonの激安品を使ってますが、動作させるだけなら問題なさそうです。
今は少し振動が大きいですが、この辺の部品をもっと高価なものに変えたらよりスムーズに動くような気がします。

エレキ設計

以前の記事ステッピングモーターの駆動回路を紹介しましたが、これをもう一軸増やしてます。ソレノイドに関しては、5Vレギュレータから電源を供給し、ステッピングモータと同様にトランジスタ(2SD1415)で駆動してます。
f:id:mou-tsukareta:20190616003212j:plain

制御設計

以前の記事では回転角度で制御してましたが、今回はパルス数(各層への電流の切り替え回数で制御してます。
ステッピングモーターがある任意の位置にいるときを0パルス位置(原点位置)として、そこから何パルス動作させたかによって位置を相対的に制御しています。
また、タップ時にはソレノイドの機械的な遅れがあるため、ソレノイドに電圧印加後少しスリープ待ちさせて位置決めしてます。

画像処理

あらかじめ各色ドロップがどれくらいのRGB値を持つのかを記録しておき、これを用いたしきい値判定により、ドロップ色の認識を行っています(実際はキャリブレーション用のプログラム・画像を用意して、自動でしきい値用のRGB値をcsvファイルに取得・記録するようにしてます)。
パズドラ特有の問題として、ドロップの背景まで含めてしまうとキャリブレーションがうまくいかないため、ドロップの中心からある一定の幅の画素だけしか認識に使わないようにしています。
f:id:mou-tsukareta:20190616003204j:plain

ルート解析

Pythonなので想像よりもかなり楽に実装できました(逆に思いもよらないバグもありましたが、、、)。
解析アルゴリズムとしてはビームサーチというのを実装してみました。
リファクタリングはかなりしましたが、ラズパイの限界なのか計算速度が遅く、現状演算に数秒~十数秒かかってしまってます。
また、コンボ数ではなく消えるドロップ数を評価値にしてるため、コンボは少し少な目になってしまってます。
言葉で説明するのがめんどくさいので、実装アルゴリズムの超概要を図で示します。
f:id:mou-tsukareta:20190616003154j:plain


また、同一の盤面状況を無駄に繰り返さないよう、ゾブリストハッシュで取り除いてます。
具体的なアルゴリズムは、
①オフラインでハッシュ値を用意する。
 ハッシュ値の種類としては、あるマスにあるドロップ色があった場合のハッシュ値(つまり30マス×6色=300通りのハッシュ)と、操作位置に対応するハッシュ値を用意する(30マス=30通り)。
②ある盤面状況のハッシュ値は、全マスのドロップ色に対応する30個のハッシュ値と現在操作位置に対応するハッシュ値、計31個のハッシュ値をXORすることで得られる
③ある盤面からある操作によって盤面が変化したときのハッシュ値は、移動先・移動元の2つのマスについて移動前後に存在するドロップ色のハッシュ値(計4個)を元の盤面ハッシュにXORし、さらに移動前後の操作位置のハッシュ値(計2個)をXORすることで得られる。

感想とまとめ

想像してたよりすんなり動いてくれました。
確実に動くので作ってて楽しいです。

ラズパイへのOpenCV導入メモ

ラズパイで画像処理をやろうと思って、書籍などを参考にしながらOpenCVを導入していたのですが、なかなかうまくいきませんでした(うまくいったと思ったらcv2.imshowでエラーがでたり、、、)

結局、以下のサイト様の内容にたどり着き、うまくいきました。
qiita.com

ただ、そのままではうまくいかなかったので、
成功したときのターミナルへのコマンドを載せときます。
変更点は、cmakeのオプションを追加してます。
ちなみにSDカードフォーマットして、NOOBS再インストールしてからやりました(色々試行錯誤した後の状態でやったら、競合のせいかうまくいきませんでした)。
ちなみにmakeコマンドが完了するのに5時間くらいかかりました、、、、

$ sudo apt-get update 
$ sudo apt-get dist-upgrade 
$ sudo apt-get install build-essential cmake pkg-config  
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev  
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev  
$ sudo apt-get install libxvidcore-dev libx264-dev  
$ sudo apt-get install libgtk2.0-dev  
$ sudo apt-get install libatlas-base-dev gfortran  
$ cd ~  
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip  
$ unzip opencv.zip  
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip  
$ unzip opencv_contrib.zip  
$ cd ~/opencv-3.1.0/  
$ mkdir build  
$ cd build  
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules -D BUILD_EXAMPLES=ON -D ENABLE_PRECOMPILED_HEADERS=OFF..  
$ make
$ sudo make install  
$ sudo ldconfig

Maker Faire Kyoto2019と近況

5/4-5/5に開催されたMaker Faire Kyoto2019に出展者として参加してきました。
自分の作った物を外部に公開するのは初めての機会で、
慣れないことも多々ありましたが(特に画像・音声認識関連技術の展示方法は今後の課題)、
非常に有意義な時間を過ごすことができました。

f:id:mou-tsukareta:20190519202042j:plain

皆さんにたくさんの温かい言葉をかけていただき、
またアドバイスもいただいて、より一層創作意欲が高まりました。
本当に参加してよかったと感じています。
展示を見ていただいた方々、お話をしてくださった方々、本当にありがとうございました。
今後も可能であれば、このような機会を通じて交流させていただければなと思っております。


肝心の電子工作の進捗についてですが、
今はドローンとスマホ操作ロボットの開発を進めています。
記事にまとめられるだけの成果をあげられていないので、キリが良いところまで進んだら記事にしたいと思います。


また、長い間更新無しというのも寂しいので、今後はもう一つの趣味である寺社仏閣巡りについて、
自分の勉強もかねて少しずつ記事を書いたりしたいなと思っています。

スマホ操作ロボット~3Dモデルでのメカ設計とX軸の動作確認~

ラズパイによるステッピングモータの動作確認が上手くいったため、真の目的であるスマホ操作ロボットの制作に取り掛かりました。
今回は、3Dモデルによるメカの設計とX軸の動作確認まで実施したので紹介いたします。

メカ設計

実際に各部品をモデリングして、
動作させたのが以下の動画になります。
vimeo.com



自分でモデリング・部品加工を行う必要があるのは以下の部品です。
f:id:mou-tsukareta:20190421022530j:plain



市販の部品は以下になります。
なお、X-Y軸用のステッピングモータ(秋月のST-42BYG020)とタッチ動作用の直動ソレノイド(ZHO-0420S-05A4)は3Dモデルが存在しないため、自分でモデリングを行いました(githubに上げています)。
f:id:mou-tsukareta:20190421022548j:plain
ステッピングモータの3Dモデル
ソレノイドの3Dモデル



ここからは、市販部品が必要な部分についてどのような部品選定を行ったかについて説明します。



上下の板は市販のスライドレールによって接続しています。
f:id:mou-tsukareta:20190421023054j:plain
スライドレールは自分でモデリングするのが難しいので、モノタロウやMISUMIからモデルを入手できる商品を使うのがいいと思います。
今回はこれを使ってます。
www.monotaro.com


X-Yの直動動作は、価格の面からステッピングモータによるラックアンドピニオン方式とします。
f:id:mou-tsukareta:20190421022628j:plain
ラックとピニオンギアに関しても、市販のものを使います。
今回は3Dモデルを入手できるこれを使ってます。
www.monotaro.com
www.monotaro.com



Y軸方向の機構には、リニアブッシュとシャフトホルダとシャフトに市販のものを使います。
f:id:mou-tsukareta:20190421022652j:plain
今回は3Dモデルを入手できるこれを使ってます。
jp.misumi-ec.com
jp.misumi-ec.com



直動方向のソレノイドです。
固定用の冶具は自作する必要があります。
f:id:mou-tsukareta:20190421022706j:plain
今回はこちらを使っています。
akizukidenshi.com

X軸の動作確認

実際にX軸の機構に必要な部品の加工・組み立てを行い、ラズベリーパイから制御を行って動作確認しました。
制御プログラムは以前のステッピングモータの動作確認用に作った物を一部流用して反復動作するようにしています。
vimeo.com


動き的には問題ないですが、ちょっと音がうるさいですね(;^ω^)

最後に

以上のように、メカ設計は終了してX軸方向の動作確認も完了しました。
今後も引き続き、Y軸方向の組み立て・動作確認を行っていく予定です。

AIドアマンブラッシュアップ(電池ボックス(秋月のBH-441A150)&サーボモータ(SG-5010)をFusion360でモデル化する)

以前の制御基板に続き、AIドアマンのブラッシュアップを行いました。
今回は、電池ボックスとサーボモータと制御基板を1つにまとめることを考えました。

構成部品のモデル化

構成部品をそれぞれモデル化します。
電池ボックスもサーボモータも、ノギスによる実測値でモデル化しました。
制御基板は前回作成した基板に合わせています。
f:id:mou-tsukareta:20190310224550j:plain

f:id:mou-tsukareta:20190310224604j:plain

f:id:mou-tsukareta:20190310224556j:plain

モデルファイルを公開したかったのですが、やり方がわからないので諦めました(笑)
そのうち公開に挑戦するかもです。
githubで公開しましたー!
電池ボックスのモデル
サーボモーターのモデル

構体のモデル化

モデル化した構成部品を基にして、
それぞれを1つにまとめられるような形状のモデルを作成します。
今回は、サーボモータを中心にして、両サイドに電池ボックスと制御基板を配する形状にしました。
f:id:mou-tsukareta:20190310224621j:plain

また、モーターを壁に固定する方法として、構体と壁に取り付けたフックをワイヤで引っ張って固定することにしました。
このため、背面にはワイヤを通すために穴を設けています。
f:id:mou-tsukareta:20190310224631j:plain

組み合わせたらこんな感じです。
f:id:mou-tsukareta:20190310224613j:plain

実際の動作

実際に3Dプリントで構体を作成し、
電池ボックス、モーター、制御基板を組み合わせてみました。
f:id:mou-tsukareta:20190310230004j:plain


実際のモデルと電池ボックス、制御基板が逆なのは寝ぼけていて取付方向を間違えたからです(笑)。
また、モーターは前面から入れる設計だったのですが、何を勘違いしたのか背面から入れるものと思い、背面をカットしてしましました(笑)
取り付け順は電池ボックス→サーボモータ→制御基板の順です。


そして、実際にドアに取り付けるとこんな感じになります。
フックは100均の粘着型のもの、ワイヤも100均のテグスを使っています。
f:id:mou-tsukareta:20190310225941j:plain

そして、これが実際にドアに取り付けて動作させたときの動画です。
vimeo.com


以前よりもだいぶブラッシュアップできたので、これでひとまず完成とします。