IoT演習 ホームページ用レポート
工学部機械工学科3年 03-170219 高木薫
何を作ったか
「Sketch Ring」という、腕の動きを読み取って3次元空間上の軌跡に変換するウェアラブルデバイスを作りました。
構成としては以下のようになっています。
ジャイロセンサの値を読み取ってファイルに書き込み、そのファイルを演習で用意されたサーバ(ラズパイ)に送信します。そしてAndroid上でサーバからファイルをダウンロードして3次元上の軌跡として表示する、という流れです。
これを使えば好きなときに腕を動かしてメモを取り、あとでスマートフォンで見ることができます。3次元のデータなのでこれまでスマホでとっていたような2次元のメモよりも表現の幅が広がります。
腕についているのがArduino、指についているのがジャイロセンサ
Arduinoの基盤を外したところ。基盤には操作ボタン、LED、センサがつけられている。ボタンは3つあり、それぞれ描画開始・停止ボタン、描画ボタン(押している間だけ線として描かれる)、文字送りボタン(次の文字の描画に移る)となっている。
実際に動かしている様子。軌跡をファイルとして保存していつでも見られるようにするモードと、リアルタイムで一文字ずつ表示していくモードがあるが、動画は後者。
製作者について
電子工作は学科の演習でやった程度、サーバ関連・htmlあたりについては素人、プログラミングはスマートフォンアプリを作る等ある程度は経験がある、という感じです。
なぜこのようなものを作ったか
・演習開始当時ウェアラブルデバイスに興味を持っていて、その中でも既存のアクセサリと共存しやすい指輪型デバイスがこれから普及してくるんじゃないかと考えていた
・普段何かふと思いついたことがあってもすぐに忘れてしまうことが多かったのですぐにメモを取ることができるデバイスがほしいと個人的に思っていた
・スマートフォンのメモでは文字や二次元のイラストしかとることができないので3次元のスケッチをデータとして残せたら面白いのではないか
という3つ理由から、今回のIoT演習では「いつでもどこでもスケッチを取ることができる指輪型ウェアラブルデバイス」を作ることを目指しました。
製作の過程
今回の演習でどのようなことをしたか、どのようなことに気をつけたかを書いていきたいと思います。
マイコン選び
IoTなのでWiFiモジュールやそれがついたマイコンを使うことになると思うのですが、Raspberry Piを使うことをおすすめします。理由は単純で、情報がたくさん転がっているからです。自分はArduino YunというArduinoにWifiモジュールやLinuxが搭載されたものを使っていましたがそれほど有名なマイコンでないので何か行き詰ったときに情報を探すのが大変でした。
また、Groveコネクタを使うのであればSeeed Studioが出しているWio Nodeというマイコンがあります(Wio Linkなど他のマイコンもありますがそれらはどうやら技適が通っておらず日本で使用不可能)。しかしそれらはArduinoと同じようにコーディングするのではなく、アプリを使ってスマホと接続しセンサ値を表示するURLを取得してそれを利用するというかたちになります。マイコン内部で色んな処理を行うことはできないので注意してください(間違っていたらごめんなさい)。
Groveシステムについて
Groveとは、Seeed studioというところが開発しているコネクタにケーブルを挿すだけで扱えるセンサーなどがあるモジュールのことです。
メリットとしては
・はんだ付けをする必要が無いので構築が簡単、やり直しが効きやすい
・回路の設計について深く考えなくてよい(たとえばLEDなら基盤に抵抗などもまとめて載っている)
・公式ページ・ライブラリが充実しているので扱いが簡単
デメリットとしては
・使えるセンサなどの種類が限られる
・コネクタ・ケーブルがそこそこの大きさなのでかさばる
・マイコンのコネクタ数には上限がある
・普通のセンサなどに比べて割高
・ラズパイで使う場合使えないものがある?(詳細は他の人が知っているはず)
といった感じです。自分のニーズに合わせて選択すると良いと思います。
自分は使いたいセンサの関係からGroveを基本的には使いませんでしたが、加速度ジャイロセンサはGroveのものが扱いやすかったのでコードを切ってArduinoの基盤に直接つなげるという少し変則的なことをしました。こうすることで見た目がすっきりして、かつライブラリが充実しているGroveセンサを使うことができたのでいい選択だったと思っています。
センサ値を読み取る
自分はGroveシステムの加速度ジャイロセンサを用いたので、公式Wikiに従ってコードを書けばなんの苦労もなくデータを取得できました。ただ単位についてはデータシートにも書いていなかったので自分で調べました。また、加速度ジャイロセンサは静止していてもセンサ値が完全に0にならないことが多いので、最初に静止した状態でのセンサ値を何回か取得してその平均をセンサ値から引くことで校正しています。
センサ値をサーバに送信する
おそらく殆どの人が実装することになる機能だと思います。自分はArduino Yunでセンサ値をcsvファイルにまとめて送信したのでその実装した例を書いておきます。
まずサーバ上に以下のようなcgiを置いておきます。
[upload.cgi]
#!/usr/bin/perl use CGI; use File::Copy; use File::Basename; my $q = new CGI; my $path = '../sensor '; my $newfile = "$path/sketch.csv"; my $fh = $q->upload('upfile'); copy($fh, "$newfile"); undef $q; print "Location: ../upload.html\n\n";
そしてArduinoのスケッチで以下のように書きます。
#include <Bridge.h> Process process; void setup() { Bridge.begin(); } void loop() { String s = "curl -F 'upfile=@hoge.csv' http://iotmlab.ddns.net/~IoT00/cgi/upload.cgi"; process.runShellCommand(s); }
これでサーバの../sensorにファイルがアップロードされるはずです。
(上記のコードでは動作確認していないので動かなかったらごめんなさい)
センサ値から3次元座標を導く
まず結論から述べると、加速度ジャイロセンサの値から各時刻におけるxyz座標を取得することは不可能でした。なぜならxyz座標を求めるには加速度を2回積分する必要がありますが、同時に誤差も積分されて非常に大きな値になってしまうためです。
しかし、ジャイロセンサの値から各時刻においてセンサが向いている向きをある程度の精度で求めることは可能です。そのため自分は完全なxyz座標を取得することを諦め、描画する空間を単位球面上に限定し、センサが向いている角度のみから各時刻におけるxyz座標を算出しました。
Android上でサーバからデータをダウンロードする
サーバのURLからファイル名一覧を読み取りリスト表示し、ファイルが選択されたらそのファイル名をもとにデータをダウンロードして配列に格納、という流れで実装しています。ここらへんは自分が実装する環境に応じて調べるといいと思います。
センサ値を3次元の軌跡へ変換する
まず変換のタイミングですが、今回はAndroid内で処理を行いました。Arduino内で行おうとするとセンサ値を取得する間隔が広くなってしまい精度が落ちます。本来はサーバサイドで行うべきだと思うのですが自分はAndroidの方が慣れているのでこのような形にしました。
ジャイロセンサから各時刻の角速度が取得できますが、xyzそれぞれの値を個別に積分しても正しい角度は出ないので注意が必要です。角速度をω、ジャイロセンサのZ-Y-Zオイラー角をαとすると以下の関係があります。
(出典:岩波書店「岩波講座 ロボット学〈2〉ロボットモーション」(内山 勝, 中村 仁彦))
オイラー角についてなど詳しくは上記の本を参考にすると良いと思います。
軌跡を表示する
Android用のOpenGLで実装しましたが複雑でしかもAndroidでしか使えないのでWebGLとかのほうが良かったかなあと後で思いました。コードについては複雑なので省略します。
今後の展望
小型化、操作性の向上、データの表示方式などを改善できれば普段の生活でも邪魔にならずに使用できるようになるのではないかと考えています。
また、身体が不自由でペンを上手く扱えない方のためのコミュニケーション手段とする、実際のペンに取り付けて描いた文字を手軽にデジタル化する、等の応用例も考えられます。
発表の仕方について
最終発表ではこんなものを作りましたということだけで終わってしまいがちですが、それがどのように面白いのか、なんの役に立つか、ビジネスになるか、というもう一歩先の視点を持つことが非常に重要です。プレゼンでもそういったことを伝えていかないと、せっかくいいものを作っても聞き手の印象に残りません。可能ならば構想の段階からそういった視点を持てるといいですが、それは非常に難しいことなので最初はとりあえず動くものを作ってそこから何ができるか、ということを考えていけば良いのではないかと思います。