モノdeサバイ部 #1に行って来ました / ArduinoとJavaの素敵な関係

atnd登録したその日に注文して、ほとんど未開封のArduinoとワクドキの心をセットにして、5月3日に行われたモノdeサバイ部 #1に行って来ましたよ!
ハッシュタグは #monobu1 、USTも最後の成果発表だけはしてたっぽいですがURLは不明です。。
MG Waveさんに集結した大きな子供達
詳細はatndを見てもらうと分かるんですが、この勉強会はArduino+Rubyでなんかやろうぜワークショップ、だと信じていたのですが、それは化けの皮で実体は
@mgwsuzukiさんが特製shield
作ってくれたから、
これでお前らハッカソンしろ!
というワンダーランドでございました。




驚きですよ、なんせこれですからね。僕が今お借りしているのはNo.3のナンバリングがされてるものです。鈴木さんがご自分で設計&制作された基板の上に、赤外線入出力と、ボタン2個、おまけに光学センサー付きの憎いやつ。裏側の回路とハンダ付けの精細さがプロの仕事を物語っております。で、これを制御する6種類のコマンドを含んだスケッチもありますよ〜というお膳立て。ここまでの用意があれば、PPMってなに?( ゚д゚)ポカーン な自分でも前半の講義を聞いてちょっと頑張ればナニモノカが出来る、という完璧な準備でした。オーガナイズしてくださった宮里さん&鈴木さん、本当にありがとうございましたm(_ _)m

機材の関係もありペアプロで、ということで僕は @sleepycat_zzzさんとペアになりました。いやー、おいらペアプロやったことなかったのでゴメンナサイ。なんか、どうやればいいのか全く分からず、各自モクモクな流れになっちゃいました。。

何をやっていたかというと

まず二人でPPMの勉強からはじめました。自宅から持ってきたリモコンのデータの解析は機器の都合上鈴木さんがやってくださったので、それを見ながらパルスをダンプしたものを解析して、16進数でどう表されているか?というデコードの部分をお勉強。赤外線受光部に向けて、リモコンのボタンを押すとパルスのOnOffのマイクロ秒がダンプが取れるので、それをこんな感じでメモってみて、あーこういうコードを送ってるのね、というのをまず理解しました。アナログな入出力でデジタル信号を送ってるのがオモシレーって話ですね。それを元にデコーダを書こうかなと思ったのですが、僕は(rubyで書くの面倒いという理由だけで)断念し、結局これを@sleepycat_zzzさんがあとでモクモクの時にチャレンジしていた模様です。

その後、何をやろうか二人で一致した目的を相談することもなく(^^ゞ、だらっと各自モクモクし始めました。@sleepycat_zzzさんは前述のデコーダの部分をRubyで、僕はシリアル制御のためのREST APIを書きたかったので、JavaでArduinoを制御するのを試し始めました。ええ、書き間違いではないです。「Ruby x Arduino ワークショップ」に来ているにもかかわらず、Javaで書いてます:)

以下MacのJDK1.6or1.7で動かすまでのメモです。

Javaでシリアル通信するために、RXTXというライブラリをこちらから落として入れておいて下さい。READMEにあるように、jarとjnilibを/Library/Java/Extensions/を入れればいいのですが、どうやら64bitOSだとjnilibがうまく動かないっぽいので、こちらにあるファイルで上書きしちゃいました。この辺りはこちらのブログを参考にさせて頂きました。
Eclipseで、mavenプロジェクトでやるのであれば、pom.xmlのdependenciesに
  <dependency>
   <groupid>org.rxtx</groupid>
   <artifactid>rxtx</artifactid>
   <version>2.1.7</version>
  </pre>
を追加すればgnu.io.*クラス群を使ってコンパイルは出来るはずなのですが、この状態であんまり見たことのない「アクセス制限: 型 SerialPort は必須ライブラリー /Library/Java/Extensions/RXTXcomm.jar で制限されているためアクセスできません」とかいうエラーが出て来ました。
これはこちらのブログでご指摘のとおり、ビルド・パスの構成 → ライブラリータブのJREシステム・ライブラリーのアクセスルールを編集 → 追加で、「gnu/**」を「アクセス許可」、などとすると上手くビルドできるようになると思います。

Javaでシリアル通信

で、いくつかチョロチョロとシリアル通信のサンプルプログラムを書いて見たところ、上手く動いているようです。やったね。
1回シリアルポートにつながれば、後は普通のストリームのプログラミングなので、例えばIRTXコマンドを書き込むならこんな感じで渡せます。
     out.write("RTX".getBytes("ISO-8859-1"));
     out.flush();
(改行コードの有無とか、文字エンコーディングとか、毎回flushするのかしないのかなどモロモロ試行錯誤したのは省きます)

JavaでRESTサーバを書く

本当は、実験がてらNinja web frameworkで書こうと思ったのですが、何故かmvn archetype:generate が上手く動いてくれず断念しましたorz
代わりにJAX-RSでチョロチョロっとアノテーションを書いて、サーバはもちろんjettyを使ってRESTサーバを仕立てて、あるURLを叩くとLEDランプが付く!というところまで何とか滑りこみで成果発表に間に合わせることができました。これを公開すれば誰かがURLを叩くたびにLEDチカチカ完成!

分かった、ソースはよ

というツッコミがあることは覚悟しているのですが、すみません、なんかシリアル通信の部分が1回投げると掴んだままになってしまうという超致命的なバグなのか動作不良がありまして、サービスとしてはダメダメなのでもうちょっとちゃんと仕立ててからにします。

今後の目標

さて、今回shieldをお借りしている、と冒頭に書きましたが、そう、これワンオフの特注品なので今回は「次回のワークショップまで貸すからなんか作れ」ということでお借りして来ました。やりたい夢広がりんぐなのですが、取り敢えずいま頭に浮かんだものをここに箇条書きに書いておきます。

  • 取り敢えず家にあるリモコンのコードを全部デコードしてみる。でもリビングにMacを置くのが面倒だからこれはどうなのか。。
  • 酔っ払って帰ってきたら、気づくとこんな玩具を買っていたのでこいつを制御してみる。
  • 仕事部屋がLED照明なので、照度センサを使って常に一定の光量になるように自動調光する、とか。これから夏に向けて自然光の光量との兼ね合いが難しくなってくるんですよねぇ。
  • テルミンじゃないけどシンセ作りたいなぁ、とか。
まあ、いろいろです。取り敢えず自分でシールド作れないとどうしようもない気がしますがひとまず妄想だけは。

懇親会

19時まであと15分だけどその間は一串50円でがあったりとか、鈴木さんがシリアルポートについて死ぬほど語るとか、SDNの話が飛び交うとか、いきなりOpenStackのデモが始まるとか、デバイスからクラウドまで相変わらず何だかカオスな懇親会でしたwww。2軒目は禁煙の素敵なバーに連れて行って頂きました。
とっても楽しかったんですが、2時頃に帰ってきて、犬が朝5時半に起こしに来て散歩に行くのだけは辛かったです(^^ゞ

P.S.
あ、FPGAのお話伺うの忘れた。また今度、よろしくお願いします!