前回はESP32とタッチパネル向けのLVGLアプリ開発環境を構築しました。これてESP32の活用の幅が大きく広がったと思います。ですが、他にもまだ活用したいものがあります。
それはESP32のようなマイコンではなく、より高性能なシングルボードコンピュータのラズベリーパイです。といっても最近のRaspberry Pi 5や4とかRaspberry Pi Zeroとかではなくて、Raspberry Pi 3とか2といった(たぶん)大抵の人が使わなくなってしまった古いモデルのラズベリーパイです。
最近のRaspberry Pi OSは要求するリソースも増えてきて、メモリの少ないラスベリーパイ2や3ではブラウザを数ページ開くだけでもスワップ発生でパフォーマンスが低下します。デスクトップマシンとしては力不足な感じです。そのためサーバー用途くらいにしか使わなくなり、やがてそれも必要なくなってホコリをかぶった状態のまま放置されているものが結構あるのではないでしょうか。
こんなラズベリーパイでもまだまだ現役で使うことは可能です。その方法はベアメタル環境で使うことです。
ベアメタルとはLinuxなどのOSを使わずに、直接ラズペリーパイのハードウェアを制御して動かすことを言います。アセンブラやクロスコンパイラで作ったバイナリを直にあるいはFreeRTOSなどの上で動かしてデバイスを制御するので、様々なプロセスが動いているLinuxと違い遅延のない高速な動作が可能です。ESP32などのマイコンボードと同じような使い方です。
もちろん欠点もあります。それはハードウェアを直接制御してしまうのでラズベリーパイのモデルごとに実行させるバイナリが異なることです。つまりRaspberry Pi 3向けにつくったバイナリはRaspberry Pi 2では動かない(32ビットで作れば動くこともありますが)ということです。開発環境もそれぞれ別に用意する必要があります。また、ハードウェアに関する知識も必要になってきてアプリ開発の敷居が高いということもあります。
ただ、ハードウェアを扱うのに必要な処理をライブラリにまとめてくれている使いやすい開発環境もあります。今回使うのはそんな開発環境の一つでCircleといいます。初代ラスベリーパイからラズベリーパイ5まで対応していて、数多くのライブラリが提供されています。ドキュメントも充実していますのでベアメタルの入門用としても最適です。
さらに嬉しいことに、数多くの描画ライブラリがあるにも関わらずLVGLまでもサポートしてくれています。ベアメタル環境で数多くのウィジェットが使えるのはとてもありがたいです。
そこで前回と同じく、LVGLのデモや自作のプログラムがコンパイルできる環境を構築したいと思います。対象とするのは手持ちのRaspberry Pi 2と3です。Pi2に32ビット、Pi3に64ビットのバイナリを作成する環境を作ります。使用するOSはUbuntuです。単純に開発環境の構築が簡単だからです。
まずは分かりやすいようにUbuntuのホームディレクトリにraspi2とraspi3フォルダを作って、それぞれの下にRaspberry Pi 2とRaspberry Pi 3向けの環境を構築していきます。
1.最初にArm GNU ToolchainというArmのコンパイラを含む開発ツールをダウンロードします。ダウンロードはこちらから。
Raspberry Pi 2用 arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz
Raspberry Pi 3用 arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz
ダウンロードしたら、それぞれのフォルダの下に解凍します。
2.解凍したツールチェーンのbinディレクトリをパスに追加します。.bashrcなどに記述するといいでしょう。
- PATH=$PATH:~/raspi3/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin:~/raspi2/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi/bin
3.Circleのリポジトリを入手します。ターミナルを開きraspi2とraspi3それぞれのフォルダに移動して以下のように入力してください。
- git clone --recurse-submodules https://github.com/rsta2/circle.git
4.Raspberry Pi 2の32ビットバイナリ作成環境を作ります。raspi2フォルダのcircleの下に移動したら、以下のコマンドを入力します。
- ./configure -r 2 -p arm-none-eabi- --multicore
- ./makeall
5.circleの下のbootフォルダに移動してmakeと入力します。
6.LVGLのコンパイルを行います。circleの下のaddon/lvglへ移動してmakeと入力します。コンパイルが終了したらその下のsampleに移動してmakeと入力します。
7.FAT32でフォーマットしてあるSDカードを用意して、上記sampleフォルダの中にあるkernel7.imgをSDカードに書き込みます。
8.circleの下のbootにあるbootcode.binとstart.elfをSDカードに書き込みます。このSDカードをRaspberry Pi 2に差し込んだら、ディスプレイとマウスをつなぎ電源を入れるとLVGLのデモが起動します。
画面上のウィジェットはマウスで操作できます。
9.次はRaspberry Pi 3の64ビットバイナリ作成環境を作ります。ターミナルを開きraspi3フォルダのcircleの下に移動したら、以下のコマンドを入力します。
- ./configure -r 3 -p aarch64-none-elf- --multicore
- ./makeall
10.circleの下のbootフォルダに移動してmakeと入力します。続いてcircleの下のaddon/lvglへ移動してmakeと入力し、コンパイルが終了後にsampleの下に移動してmakeと入力します。
11.SDカードにsampleフォルダの中にあるkernel8.imgとbootフォルダの中にあるbootcode.binとstart.elfを書き込みます。このカードをRaspberry Pi 3に差し込んで、ディスプレイとマウスをつないで電源を入れればデモが始まります。
circleの下のaddon/lvglにあるlv_conf.hのオブションを変更してmakeで再コンパイルしてから、addon/lvgl/sampleの下のkernel.cppの93行目のデモのエントリを書き換えてmakeとすればその他のデモを実行することができます。
addon/lvgl/lvgl/examplesの下のウィジェットサンプルも実行できます。addon/lvglのlv_conf.hの1061行目LV_BUILD_EXAMPLESを1に変更してmakeし、sampleのkernel.cppに #include "../lvgl/examples/lv_examples.h" を追加して94行目のエントリをlv_example_textarea_2();などに書き換えてmakeし、出来上がったバイナリをSDカードに書き込めば実行できます。
kernel.cppの94行目のエントリを書き換えれば、自作のルーチンも動かすことが出来ます。LVGLなら見栄えも操作性もいいアプリケーションが作れますし、ラズベリーパイならマイコンよりも複雑で規模の大きなアプリが作成できるので色々なことに利用できそうです。
LVGLではありませんが、他にCircleのサンプルプログラムがcircleの下のsampleにあります。各サンプルフォルダに移動してmakeすればバイナリを作成できます。
今回は試しませんでしたが、Raspberry Pi 3は32ビットでも動作するので、32ビットのバイナリ作成環境も構築できます。
ベアメタルによって古いラズベリーパイにも利用価値が出てきました。Raspberry Pi Zeroシリーズにも負けないスペックなのでまだまだ活用できます。数は多くないのですが、ネットで探せばベアメタル環境で動作するアプリも色々あります。PCやMSXなどエミュレータもいくつかあります。電源オンですぐ起動するので、実機を使っている感覚です。
このようにラズベリーパイ単体で利用するのも十分楽しいのですが、高速動作を生かしてPCの周辺デバイスを作っている事例もあり、それらを見ていると創作意欲がわいてきます。いつかこの環境で何か作ってみたいですね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます