2012-12-29[n年前へ]
■Rubyで(が)動くデジカメを作る!? キックオフ編
Rubyで(が)動くデジカメ作りに挑戦してみました。コンパクトデジカメ用の特殊ファームウェア(CHDK)に組み込み向けRuby(mruby)を組み込んでみようという試みです。CHDKというコンパクトデジカメ用ファームウェアは、機能拡張用の簡易スクリプト作成言語として、すでにBasicとLuaをサポートしているので、そこに(さらに)Rubyを追加する作業に果たして意味があるだろうか…?という疑問もあるだろうと思いますが、ひとまず挑戦してることにしました。
そこで、まずはCHDKのMain.c中にあるcore_spytask()に、液晶画面に対して"Hello! Ruby!"を出力するmrubyコードを埋め込もう、という作戦を考えてみました。たとえばこんな具合のコードをcore_spytask()に書き入れて、arm-elf-gccでmrubyをビルドした上で(libmruby.aとlibmruby-core.aを作成し)、CHDK のビルド時にlibmruby.aとlibmruby-core.aをリンクしよう、という流れです。(main.cにmrubyをリンクするなら、Makefile中にlibmruby.aとlibmruby-core.aを追加するだけで良いといった理由もあります)
char osd_buf[30]; mrb_value v; mrb_state *mrb = mrb_open(); char code[] = "def hello\n" " \"Hello, Ruby!\"\n" "end"; mrb_load_string(mrb, code); v=mrb_funcall(mrb, mrb_top_self(mrb), "hello", 0); mrb_close(mrb); sprintf(osd_buf, "%s", v ); draw_txt_string(2, 2, osd_buf, conf.osd_color);
トライした結果は、mruby コードをCHDKに埋め込んんだソースはコンパイルできたけれど、arm-elf-gccでのlibmruby.a自体のビルドに挫折した…というものでした(作業に成功したかと一瞬思ったのですが…寝て起きたら動かない…というわけで、ありがちな幻を見ていたようです)。
しかし、失敗はしましたが、コンパイル済みライブラリを誰かが作成したならばコンパクトデジカメのファームにmrubyを組み込むことは容易にできそうだ、という感触を持ちました。
今日は、mruby組み込み挑戦コードをこんな風に書き換えて、そのコードをビルドしたファームでコンパクトデジカメを起動してみました。その起動スクリーンショートが右上の写真です。
printf(osd_buf, "Alas! I have no Ruby now!", v );これはもちろん、オスカー・ワイルドが書いた深紅のルビーを持っていた王子と空飛ぶツバメの物語(「幸福の王子」)の言葉です。