タダから始める昔ながらの IoT
メリークリスマス!彼女や奥様へのプレゼントに IoT 機器とか買っちゃっていませんか?逆に受け取っているなら使い道を問い詰める前に当記事がオススメです。
今年実態がよくわからない IT 流行語をノミネートするとしたら IoT と Deep Learning が上位、むしろトップ1,2を争うのではないかと思われます。どちらも 2014 から衰えることなく伸びています。
その中でも IoT に関して調べてみたことや、実際に体験してみて、今までとこれからをまとめてみたいと思います。
結構長いので、お忙しい方は文章を飛ばしてシェルの入出力や図をナナメ読みして雰囲気を感じていただければと思います。
そもそも IoT とは
まず普通に検索し、内容をまとめてみました。
Wikipedia では、具体的に IP アドレスの存在について触れられています。インターネットに繋がっているだけなら、2000 年ごろとなんら変わりはありません。しかしパソコンではなく、スマートフォンやセンサー、なんらかの機器に限定しています。
他の検索上位記事によると、 IoT は「概念」であると位置づけ、機械同士や機械とヒトの通信を強調しています。たしかにインターネットはヒト同士のコミュニケーションサービスが多く機械同士というのは新しい概念にも見えます。
センサーや機械が安く小さくなったことを IoT 普及の要因に挙げている記事もあります。 IoT には低価格と小型化が欠かせないようです。他の分野でも低価格小型化によるブレークスルーを起こしてきているのでこれは納得感があります。
IoT 向けに格安 SIM を提供しているサービスもありましたが、サービス解説によると IoT 向けシステムやプラットフォームであることを強調しています。すなわち通信するだけでは IoT そのものでないことがうかがえます。
乾電池の出力をリモートコントロールする手法を IoT としている記事もありました。しかし Bluetooth で制御しているだけでインターネットはまったく関係ありません。むしろ格安 SIM サービスでは Bluetooth のような短距離通信は対比として扱われていますが、別の記事にあったように「安くて小さいリモート装置」が多くの人にとっての IoT であることがうかがえます。
というわけで要素をかいつまんでみると、
* インターネットに繋がる
* 価格の絶対値が安く、たかだか数百円
* 装置が手のひらに収まるほど小さい
* 片方が機械。もしくは両方とも機械
* 動作を想像しやすい身近な物
このうちの三つぐらいの要素を持っていたら一般的な IoT であると言っても差し支えなさそうです。
一方で去年の 2014 Advent Calender IoT や今年の内容を見ると、当然エンジニア向けというか、寂しいというか、比較的ハードな内容になってます。 Cerevo さんのとかガチですし、検索で引っかかりやすい内容とはだいぶ毛色が違います。
ここらへんの差異の謎にも迫ってみたいと思います。
とにかく使ってみよう
あーだこーだうんちくが多い割には、具体的な IoT 体験は少ないので、とにかく IoT を触ってみます。
主要な要素であるような、インターネットに繋げる部分は得意ですし、低価格となればケチンボの私にはぴったりです!
あとは身近にある小さな装置を直結させれば良いわけですが、電子工作などは苦手なうえにお金もかかりますし、なによりクリスマスに間に合いそうもありません。
そこでありもののプログラムや装置を流用しつつ、 HTTP を介して、いわゆる API 化してしまい、 curl や wget ないしブラウザでお手軽に確認できるよう目標にして構築してみました。
テンキー編
そのまま PC に接続させるとキーボードドライバが読み込まれてしまい、難なく数値の入力ができてしまいます。
IoT っぽく単なるスイッチとして扱いたいので、ドライバを挿げ替えて、本来の機能の代わりに USB パケットからコードを直接取得するようにします。
さっそく HTTP に乗せて、ボタンを押しつつ curl で確認します。キーを押しながら curl を叩きます。
1 2 3 4 5 6 |
$ curl http://192.168.0.3/tenkey/on 98 $ curl http://192.168.0.3/tenkey/on 90 89 91 $ curl http://192.168.0.3/tenkey/on 97 94 91 |
上から順に、0キーを押しているとき、123を同時押し、369を同時押しで取ってみました。
キーコードは文字でなく、別途定義されているようです。検索したところ http://www.usb.org/developers/hidpage/Hut1_12v2.pdf の p53-59 あたりにありました。テンキーは 84 ~ 99 番の割り当てみたいです。 176 番に「 Keypad 00 」があるのですが、当機器では 98 番を二回押したパケットでゼロ二桁をエミュレートしてました。
他にもいろいろ状態を取得してみると、「123」や「369」のようにタテヨコが並んだ状態は正確に取得できますが、236や356などL 字型に押されている状態はエラーになります。これはおそらく電気配線がマトリクス型になるよう二層になっており、矩形に通電すると押されたキーを特定することができなくなってしまうのではないかと考えられます。
FPS などでしゃがんで斜めに移動しつつ武器変更しようとすると反応しないのはたぶん同じ原因ですね!ナナメハダメです。
また、スイッチなので ON/OFF の状態は取得できますが、当然すばやく変化した場合はトリガーを取りこぼします。
取りこぼし対策には、装置側でいくらかバッファを持っておいて、それを取得することです。
1 2 3 4 |
$ curl http://192.168.0.3/tenkey/ascii 0123963856987456 +*-*+66 36987 |
文字に変換、 Enter で改行、 BS で pop にしたのでそれっぽくなりました。コナミコマンド入力に使えそうです。
スイッチとして考え、押されているか、押されていないかを取得できるセンサーと考えたら、テンキーは比較的効率よくまとまった IoT です。
- ネットに繋がる:○
- 安い:○
- 小さい:△
- 機械:△
電波受信機編
本来の機能はワンセグチューナーであり、いわゆるテレビを見るための物らしいですがその機能を一度も使ったことがありません。
しかしこの機器はチューニングした帯域の電波をそのまま PCM で取得する機能を持っています。「 SDR 受信機 」と検索すると、どうやら PCM データを加工するような、そういう遊び方をするほうが多いようです。
ワンセグチューナーなら一部携帯電話にも搭載されていて大変身近な物です。 IoT っぽい感じがするので、テンキーと同じように USB パケットを取得してみます。
1 2 3 4 5 6 7 8 9 10 11 |
$ curl http://192.168.0.3/sdr/buffer 35 60 58 53 63 53 45 57 40 81 52 80 62 63 61 37 44 55 48 76 50 77 55 48 72 38 63 34 51 46 54 86 72 58 62 28 92 9 68 40 41 79 49 63 79 25 92 19 79 43 57 44 51 47 87 42 106 35 73 14 58 24 92 41 92 84 87 41 76 29 73 33 73 41 81 44 92 45 96 47 102 30 94 53 99 51 110 67 104 61 88 48 116 29 93 54 74 59 94 55 93 47 104 33 58 49 54 53 86 60 104 55 98 26 84 39 98 80 105 60 98 60 87 33 76 39 77 22 94 51 98 37 116 7 95 36 97 28 88 50 104 56 98 25 87 5 84 14 78 24 75 34 86 23 127 4 87 -25 81 10 95 16 112 19 110 -29 101 -25 88 5 94 6 100 -3 102 -21 116 -24 81 -40 53 -18 81 -14 104 -34 105 -64 98 -50 79 -41 60 -10 105 -24 109 -42 81 -31 55 -28 60 -33 92 -40 60 -25 48 -38 43 -45 12 -42 62 -37 86 -52 95 -40 77 -84 34 -61 53 -18 79 -44 72 -46 66 -71 26 -75 23 -45 56 -45 59 -74 67 -63 49 -55 19 -56 48 -58 54 -37 69 -60 53 -83 5 -99 |
ひとまず 256 サンプルを数値にして取得してみました。しかし、当機器のサンプリングレートは 8bit/3.3Mhz にも及び、 256 サンプル程度だと 0.000077 秒ぶんしかありません...
何度か取得してみると数値はなんとなく波うってる感じなのでリモート側で、ある程度たたみ込みます。
先ほどの 1024 倍になる 256KiB のサンプルを 1024 個までたたみ込んでみました。それをさらにグラフにしてみます。
とりあえず 90Mhz に設定してみて、
1 2 |
$ curl http://192.168.0.3/sdr/tune/90 90000000 |
画像はブラウザで確認します
とりあえずそれっぽい画像は出ました。大量のデータを畳み込むなら、データに合わせたなんらかの変換が必要ですね。
環境を調整すれば、レーダーのように無接点でも状態を観測できてしまえそうな受信機は夢が広がります。
- ネットに繋がる:△
- 安い:△
- 小さい:○
- 機械:○
日本には電波法というものがあり、特に電波とインターネットの結合は取り扱いに注意が必要です。また未加工ではデータ量が多すぎて IoT とは若干相性が悪いといえるでしょう。
Web カメラ編
ヒトが日ごろから利用する機器にはデジタルカメラが搭載されてますし、これを使わない手はありません。
1 2 3 4 5 6 7 8 |
$ curl http://192.168.0.3/webcam /webcam/width /webcam/height /webcam/capture.png $ curl http://192.168.0.3/webcam/width 640 $ curl http://192.168.0.3/webcam/height 480 |
静止画をさっきのグラフみたいに PNG で取得します。
1 2 3 4 5 6 |
$ wget http://192.168.0.3/webcam/capture.png --2015-12-11 14:41:10-- http://192.168.0.3/webcam/capture.png Connecting to 192.168.0.3:80... connected. HTTP request sent, awaiting response... 200 OK Length: 500943 (489K) [image/png] Saving to: 'capture.png' |
ブラウザで開けばカメラのその瞬間の画像がバッチリ見えます。 F5 連打で動画っぽく見えます。
あまり手入れされていない水槽、メダカとタニシと水草、気温18度ぐらい、湿度62%ぐらいですね、画質が荒いのが難点ですが感度は高そうです。
リモート機器のほうで画像をアスキーアートへの変換を行なってみたかったのですが、実装が間に合わず、手抜きして手元で行うなら次の手順で出来ます。
1 2 3 4 5 6 7 |
sudo apt-get install libaa-bin sudo apt-get install aview sudo apt-get install imagemagick wget http://192.168.0.3/webcam/capture.png convert capture.png aa.pnm aview aa.pnm |
- Google さんはクラウドで画像処理やってますし、リモートでやるのは限界がありそうです。
テンキーはスイッチの On/Off をいくつかの「点」で状態を捉える機器であり、電波は連続した状態を採取し「線」の状態を解釈しますが、カメラは一発で「面」の状態が取れます。カメラは最強クラスのセンサーです。
しかし、その多すぎる情報量を機械で扱うのが困難です。各種組み込み、または外部サービス利用など、扱いやすい状態にすることにひと手間かかってしまいます。
- ネットに繋がる:△
- 安い:○
- 小さい:○
- 機械:○
ディスプレイ編
カメラとは逆にリモートのディスプレイを光らせます。 LED と似たノリで単色の出力を行ってみます。
1 2 3 4 5 |
$ curl http://192.168.0.3/display /display/white /display/black /display/RRGGBB $ curl http://192.168.0.3/display/white |
これで画面が真っ白になり、
1 |
$ curl http://192.168.0.3/display/00FF00 |
緑にしてみました。
そのまんますぎておもろないですが QR コードを出してみたり、文字列を横から流したらちょっとは面白くなりそうです。
デジタルサイネージやテレビのように情報量が多くなるとカメラと同じ問題に当たりそうですが、比較的扱いやすい IoT ではないかと思われます。
- ネットに繋がる:○
- 安い:○
- 小さい:○
- 機械:○
そのほかのモノ編
開発間に合わなかったので試そうとおもっていたことだけになります。
- ゲームパッド
- 昨今のゲームパッドは入力だけでなく、モーターを拡張したバイブ機能もあります。 LED もついてます。
- 入力もテンキーと違って同時押しの問題は起こりません。しかもアナログ入力なので圧力を細かく取得できます。
- スピーカ
- 短めの音であれば POST したものをそのまま鳴らすことが出来るでしょう。
- マイク
- 解析だけならデータは PCM で、電波よりビットレートが低いので同じ戦略でいけそうです。
今回に取り組みにおける課題
- 流行のデバイスを用いていない
- 定価が高い機器を用いている (しかしあまりものなのでタダ!)
- MQTT のような特化したプロトコルではなく HTTP しか試していない
- 機器の使い勝手のみで、具体的な活用方法の検証ができていない
- 既存の製品の再利用でも、意外と開発に時間がかかる
12月の休日の約半分ぐらいを費やして今回実装した API
1 2 3 4 5 6 7 8 9 10 11 |
/tenkey/on /tenkey/ascii /webcam/width /webcam/height /webcam/capture.png /sdr/tune/%f [Mhz] /sdr/buffer /sdr/spectrum /display/white /display/black /display/RRGGBB |
IoT 全般における課題
- 基板むき出し、ハンダ付け、ジャンパ線丸見えなど、未完成品が目立つ
- 大きすぎるデータ量か、それを畳み込むための高性能機器のトレードオフがあり、前提を達成するのが困難
- 屋外での利用は物理的にも倫理的にもリスクが高い
- 低レイヤを制御するため、軽量言語を重視する Web 系技術と縁が遠い
- 指向性のあるレーダーやカメラのように面で状態を捉えられた方が圧倒的に良いが、温度計など一点の状態のみ捉える機器が普及している
- (当記事のように) 体験だけが先行していて、身近な活用方法が乏しい
- (検索上位記事のように) 組み合わせたときの理想も先行していて、近未来間が強い
まとめ
にわかに語られている IoT は意外とチャラいものであり、不要になったノート PC やスマートフォンは最強クラスの IoT であると考えられます。お年玉の使い道を決める前に、まず発掘から初めてみてはいかがでしょうか。
来年に向けて
今回のようにすでにある器機の再発明や新規開発はもちろん、具体的な活用方法が多く現れるのではないかと期待しています。
松澤さんの IoT 機材や、ごとうさんの HTTP2 利用、情報処理に Deep Learning を用いるなど、まだまだ余地は多いです。