ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

Perlで手っ取り早くArduinoを操作するの巻

どうもこんばんわ。マコピーことマコピーです。
この記事は
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 LEDモジュール

GROVE - LED - スイッチサイエンス
こういうのですね。
どこに使われているかというと、ミクさんの目です。

配線

FritzingにGROVEあるやろって思ったけれど無かったので写真で説明します。

まあこんなかんじでArduinoとGROVEベースシールドをガッチャンコした後に、

サーボをD3に、LEDをそれぞれD2とD5につなぎました。

そのあとお好きな絵を貼った厚紙にこのように雑に張り付けることで完成です。

実装

実装は大きく分けて2つからなります。

  • Webインターフェイスと通信してRedisに状態を書き込むAmon2製のアプリケーション
  • 無限ループの中でRedisの値を読み取ってFirmataでArduinoに送り込む部分

です。

何故このようにプロセスを2つに分けているかの理由を説明します。
Webインターフェイス部分はWebSocketを使っているのですが、コネクションを維持しないといけない関係上、この部分は必然的にAnyEventの上で動くことになります。
ですが、Device::Firmataは普通のブロッキングIOなモジュールなのでここに入れてしまうと問題が起きそうです。
この2つを同時に起動するためにProcletを使っています。
また、この間のプロセス間通信は多分別のものを最適なんでしょうけれど、たまたまRedisがローカルのサーバに立っていたので慣れているRedisに書き込むことにしました。

実際のコードは以下のリポジトリにあげてあります。

WebSocketのメッセージをそのままモデル層に投げててそのまま言われたメソッドを実行するというだいぶ雑な感じです。
Webアプリケーションなのでこのまま自宅の一角において誰かに使ってもらうことも出来る事は出来るのですが、こういう雑な作りなのと、この回路のせいで家が燃える可能性も考えてやめにしました。

完成の様子

Perlでミクさんのネギ振り from Makoto Taniwaki on Vimeo.

よく見たら配線間違えていて、右目と左目が逆ですね。

そんな感じで

YAPC中ではできなかった実演でした。
このデモではMacbookにつないでやっていましたが、YAPC中はRaspberryPiを用いてやる予定でした。RaspberryPiでもPerlは動きますよ〜。あとほかにもデモ用のカメラはRaspberryPiに繋いだRasPiCamからストリーミングで見せる予定だったのですがすべておじゃんになってしまいましたね><。
IoTという言葉も出てきてハードウェア界隈盛り上がっていますので、Perlを使って片足を突っ込んでみるのはいかがでしょうか?