RaspberryPiで作る、WebSocketセンサーサーバ:デブコミュLTネタ
先日、古巣のCYBIRDさんのエンジニアの社内LTイベント「デブコミュ」にお呼ばれしてきた。というよりは半ば強引に参加させてもらった。イベント的には非常に熱量のある良いものだった。エンジニアが活き活きとやってて、ホント楽しかった。
その時の発表資料(作成:2時間)と、コード(作成:3時間)をまとめたので公開しておこうと思う。
【作ったもの】
RaspberryPiに接続したセンサーの情報を、WebSocket経由でPushするサーバと、それを利用したサンプルJavaScript。
【どうして作ろうと思ったの?】
面倒なハードウェア系の処理のコードを最小限にして、それをWebSocket経由で利用できれば、JavaScriptなどからでも簡単にセンサー情報を利用したアプリケーションが作れるのではないかと思い。センサーを扱いやすくして、センサーアプリケーションを少しでも作りやすくするための環境のプロトタイプとして。
【資料など】
当日の資料とコードは、それぞれ色々な環境にアップロードしてある。
当日の発表資料(一部更新・変更あり)
コード
応用例
jsdo.it
【参考にしたもの】
LeapMotion。JavaScriptから利用するのはLeap.jsを使うのだが、実際はLeapMotionのデバイスコントローラがWebSocketサーバーとなっていてJSONでデータが提供される。この方法を真似させてもらった。
【説明】
資料とコードを読んでもらうのが一番いいとして、読んだところで大したこと書いていない気もするので簡単に説明を。
サーバーの環境設定
RaspberryPiでI2Cを有効にする。手順はこんな感じ。
PythonからI2Cを使えるようにする
sudo apt-get install python-smbus
Tornadeのインストール
sudo pip install Tornado
サーバーの起動
TornadeをインストールしたRaspberryPi上で、githubに載せているsensor_server.pyをroot権限で実行すると8080ポートにWebSocketサーバーが立ち上がる。
sudo ./sensor_server.py
Ctrl-Cでサーバー停止。
接続テスト
githubのsensor_test.htmlの中のIPアドレス部分をRaspberryPiのIPアドレスに変更して、その後ブラウザでsensor_test.htmlを開く。
うまくセンサーから情報が取得できれば、
temperature:
25.753529411764706
gyro_x:-579
gyro_y:23
gyro_z:-107
accel_x:-996
accel_y:-80
accel_z:15480
rotate_x:-0.29548859803721206
rotate_y:3.681349152747009
のように数値が表示され、細かく変化し続けているのがわかるはずだ。
WebSocket
今更ながら、WebSocketはこういう用途に使うのにもとても良い。Pushができるので、サーバーからクライアントへもその逆も、リアルタイムにデータを送ることができる。データがPushされて来た時も、イベントハンドラで拾えばいいだけなので、実装も書きやすい。
ハードウェアをラップする
WebSocketに限らないが、今後はこのようにハードウェアを直接コントロールするのではなく、比較的簡単にデータだけが提供されるようなスタイルが増えてくると思う。そうなれば、書き慣れた言語で簡単にセンサー情報が扱えるようになるので、もっともっと多くの有用なアプリケーションが出てくるのではないかと期待できる。
また、個人としてもそういうものが作れたらいいな、と思っている。
最後に
RaspberryPiは何台か持ってるんだけど、ほんの少し小さいというだけで、Model A+がとてもかわいい。ああかわいい。ああ、もう、かわいいったら!