どうもこんばんわ。マコピーことマコピーです。
この記事は
Perl Advent Calendar 2014の9日目の記事です。
YAPC::Asia 2014で話したことの復習です
そういえばスライドに書きはしたんですが、詳細なコードなどを晒していなかったのでここいらでまとめてみようかという感じになりました。
何をしたか
ミクさんの紙を切り貼りしてネギふりをしました。Perlで。
どうやってしたか
材料は以下のものになります。
- Arduino(DuemilanoveでもUnoでもLeonardoでもなんでも) 大体以下を読めば良い
PerlでFirmataプロトコルをしゃべるためのモジュールです。
FirmataはArduinoみたいなマイコンとPCなどのデバイスや他のマイコン同士で通信しあうモジュールで、
ArduinoだとArduino IDEにサンプルコードがはじめからついてくるのでここからはじめるのがお勧めです。
- GROVEベースシールド
GROVEシステムというのを使うのでArduinoとGROVEを統合するのに必要です。
- GROVEサーボ用ケーブル+サーボモータ
サーボモータは任意の角度にすることが出来るモータのことでミクさんの腕に使っています。
そんなわけで僕はGROVEスターターキットプラスについてきたやつを使っているのですが、スイッチサイエンスには在庫がないみたいです。
ケーブルはあったので以下のやつを使うのと
秋月電子で以下のサーボモータを買って組み合わせれば出来ると思います。
- GROVE LEDモジュール
GROVE - LED - スイッチサイエンス
こういうのですね。
どこに使われているかというと、ミクさんの目です。
配線
FritzingにGROVEあるやろって思ったけれど無かったので写真で説明します。
まあこんなかんじでArduinoとGROVEベースシールドをガッチャンコした後に、
サーボをD3に、LEDをそれぞれD2とD5につなぎました。
そのあとお好きな絵を貼った厚紙にこのように雑に張り付けることで完成です。
実装
実装は大きく分けて2つからなります。
です。
何故このようにプロセスを2つに分けているかの理由を説明します。
Webインターフェイス部分はWebSocketを使っているのですが、コネクションを維持しないといけない関係上、この部分は必然的にAnyEventの上で動くことになります。
ですが、Device::Firmataは普通のブロッキングIOなモジュールなのでここに入れてしまうと問題が起きそうです。
この2つを同時に起動するためにProcletを使っています。
また、この間のプロセス間通信は多分別のものを最適なんでしょうけれど、たまたまRedisがローカルのサーバに立っていたので慣れているRedisに書き込むことにしました。
実際のコードは以下のリポジトリにあげてあります。
WebSocketのメッセージをそのままモデル層に投げててそのまま言われたメソッドを実行するというだいぶ雑な感じです。
Webアプリケーションなのでこのまま自宅の一角において誰かに使ってもらうことも出来る事は出来るのですが、こういう雑な作りなのと、この回路のせいで家が燃える可能性も考えてやめにしました。