組み込みでも使えるオープンソース ~アプリケーション編~
オープンソースと言えばLinuxやWindows用が多いのですが、 本日は非力なマイコンでも実用的に使えるお気に入りのオープンソースをピックアップしてみたいと思います。 あなたはいくつご存じでしょうか?
libpng ~画像コーデックライブラリ~
libpngはお馴染みのPNG画像を圧縮伸長するライブラリです。 libpngではファイルからだけではなくメモリ上の画像データをデコードすることも可能になっていて 組み込みでも簡単に利用することができます。 GUIにたくさん画像を使いたいようなときはとても助かります。
libpngから派生したソフトウェアにはヘッダをインクルードするだけで PNG画像がデコードできるようになっているライブラリもあり、こういったものを利用すると導入の敷居も低くなります。 まだなんとなくBMPのライブラリを使っている人は是非トライしてみて下さい。
zlib ~データ圧縮ライブラリ~
zlibはZIP等でお馴染みの圧縮ライブラリです。 実はPNGはzlibに画像用のヘッダを付け加えたようなフォーマットになっていて、 zlib単体も組み込みで簡単に利用することができます。
ROMがカツカツになっているようなときにこのzlibが使えるかもしれません。.dataセクションを圧縮しておいて起動時に展開するブートローダなんてのも面白そうです。 ただし組み込みなのでzlibのデコーダのサイズの方が圧縮前のデータより大きかった、という事態には気を付けなければなりませんが。
FreeType ~フォントレンダラ~
FreeTypeはフォントデータを画像としてレンダリングするライブラリです。 対応しているフォントの種類も多くTrueTypeのようなアウトラインフォントをラスタライズできるところは強いです。 このFreeTypeは実際のところ単独で直接使うよりも GUIのようなフォントを扱うのライブラリの一部として間接的に使っていることの方が多いかもしれません。
FreeTypeを直接使うときはレンダリング後のフォント画像をフレームバッファに描きこむ部分を作る必要があります。 ここはグラフィックスのスキルが必要なところで、CPUでベタ転送すると動作がモッサリと遅くなってしまったり、 黒背景の上にしか描画できないチープな制限がついてしまったりします。
またフォント形式によっては組版をするときに使う専門的なパラメータを数多く持っていることがあり、 位置や大きさを思いどおりに指定するだけでもちょっとした調べ物が必要になることがあります。
LVGL ~GUIライブラリ~
LVGLはOS無しのベアメタルでも動作するGUIライブラリです。 ちゃんと自前のウインドウシステムを持っていて、OSの助けがなくても綺麗にウインドウの重ね合わせやアニメーションができてイベントも飛んできます。 ウィジェットもボタンだけしかないということはなく、あるべきものはひととおり揃っています。
特に良いと思うところは対象としているマイコンのスペックが決して高くないところで、 グラフィックスであればフルカラーのダブルバッファはもちろんのこと、8ビットカラーのラインバッファでもポーティング可能になっています。これならSPI接続で外付けするグラフィックチップもターゲットに入ります。
アプリケーションの開発に目を向けると、GUIをプログラムするときのAPIはLVGLとターゲットが近いFLTKに似た体系になっていると思います。 まだ試したことはありませんがGUIのデザインをつくるツールとしてSquareLine Studioというものもあるらしく、 開発環境としても有名どころのGUIに肩を並べた感じです。 関連プロジェクトも充実していて、試しに動かしてみるみるところも、Windowsやお手軽評価ボード用にポーティングされた環境を使えば直ぐに始められます。
Lua ~スクリプト言語~
Luaはプログラミング言語です。 組み込みにプログラミング言語なんか必要なと思われるかもしれませんが、 テキスト形式でデータを読み込ませたいときにパーサーの変わりとして使うと 制約だらけのCSVのサブセットよりもユーザーによい経験をしてもらうことができます。
そういう用途であればJSONやXMLも候補に上がるかもしれませんが、 LuaはANSI-C準拠のコンパイラですんなりとコンパイルできるようにコーディングされいて、 ポーティングもmallocシリーズに相当する関数を追加するだけで済むのでとても簡単です。
ただしLuaとCのインターフェースがスタックマシンのようになっていて少し独特です。 ここは分かるまでに少し時間がかかるところかもしれません。
まとめ
今回ピックアップしたオープンソースはライセンスがBSDかそれに類する穏やかなもので 利用や配布に対して過度に神経を尖らせる必要はありません。 RAMが数十kBのようなマイコンではオープンソースを活用する余地は小さいのですが、 マイコン以上Linux未満のところではこれらのソフトが役に立つ機会も十分あり覚えておいて損はないと思います。