【Wio Terminal】LvGLのまともなサンプルプログラム
Wio Terminal と LvGL
Realtek RTL8720DNによりBluetoothとWi-Fiが利用可能、IoTプロジェクトのバックボーンを提供します。
また、 2.4インチ LCD スクリーン、IMU(LIS3DHTR)、マイクロフォン、ブザー、microSDカードスロット、照度センサ、赤外線発光器(IR 940 nm)を搭載し、さらにGroveシステム用の多機能Groveポート2個と、Raspberry Pi 40ピン互換のGPIOを使ってモジュールを追加できます。
(スイッチサイエンス販売ページより)
一方で
個人的には、画面を作る手段といえば
本稿は、
初等画面制御:TFT _eSPI
リンク先にも出てくる語、
TFT_eSPIを基にしたSeeed_Arduino_LCDというライブラリーが提供されています。使い方を詳しく説明することはありませんが、これ自体の導入は必要です。
環境構築
開発環境は
-
からGitHub Seeed_Arduino_LCDをダウンロードする

<> CodeからDownload ZIPで
(https://github.com/Seeed-Studio/Seeed_Arduino_LCD)
-
Arduino に追加するIDE

-
Adafruit Zero DMAを追加する
こちらは

下のAdafruit Zero DMA library by Adafruitを追加する
実用例
基礎となる画面制御の例が示されています。
「
しかし、突然自由を与えられても何を作ればよいのか困る、というのが忌憚ない素直な所感でした。搗てゝ加えて、自由すぎて定型がなく、高級なそれしか知らない身としては頗る不便とも感じました。これをどうにか工夫された先人は数多あるようですが、公式である
高級画面制御:LvGL
Seeed_Arduino_LvGLというライブラリーが提供されています。第三者の作ったものよりも、公式が提供するものを使う方が安心するのは、素人ゆえでしょうか。
LvGL とは何者か
先にも触れた通り、
世に高級なそれらが溢れて猶も淘汰されないのは、
貧弱な環境では、絢爛豪華なものは「狭すぎて入らない」、「重すぎて動かない」という結末になりがちです。従って、性能は慎ましいながらも「軽量で動かしやすい」、「容量が嵩張らない」といったものが台頭するのです。
描画例
組込みシステム向けではありますが、
Wio Terminal におけるLvGL の問題点
例をご覧になればお分かりでしょう、ボタンを押したり、スライダーを滑らせたり、人間の手で操作できる機能が揃っています。これを使えば、実に様々なアプリケーションを作れるでしょう。
而して残念ながら、
そもそもタッチスクリーンではない
上述の通り、


引用:https://www.switch-science.com/products/6360
バージョン互換
先に紹介した描画例にはご親切にプログラムコードも付記されていますが、これらはSeeed_Arduino_LvGLを使う場合、コンパイルエラーとなります。この嘆かわしい実情は、Seeed_Arduino_LvGLに内包されている
こちらはSeeed_Arduino_LvGLのものです。"version": "v7.0.2"とあります。
一方こちらは最新のものです。"version": "9.3.0-dev"とあり(記事投稿時点)、メジャーアップデートを既に
使い方が分かりにくい
どこぞの
単純な話から始めましょう。
void setup() {
/* code */
}
void loop() {
/* code */
}
しかし例のコードはその構造を持ちません。
つまり、これを上手くスケッチと組み合わせる手間があります。しかしその方法がまだわかりません。そこで探してみると、
これで一応実行方法が判明しました。しかし、これらの苦節を経て得られる成果とは即ち、「バージョン互換が無さすぎてコンパイルできない」という失望です。
LvGL が齎すエラーの例
今参看していたv9.3.0ですが、先述の通りSeeed_Arduino_LvGLの内包するv7.0.2です。メジャーアップデートを経ているだけのことはあり、「複数色を用いたグラデーション」を始め、v7.0.2には未実装だった新機能が幾つか在ります。例えばlv_grad_dsc_tという構造体(型)は、v7.0.2には在りません。当然、そうした機能は「無い」ので使えません。
また、バージョンアップによって簡略化された、純粋な改善の跡も見られます。
lv_obj_center(obj);
objectを中央に配置する関数ですが、v7.0.2では下のように記述が煩雑でした。
lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
ここまでは理解の範疇です。
ここからは怨嗟で詭激を禁じ得ませんが、改名された者共のなんと夥多たるや。のべつ幕なしといったように未定義エラーが湧いて出てきます。
その代表格は此奴です。
画面には基礎として大元となる要素が一つあり、この上にボタンやテキストを追加します。何も、無に対してボタンを配置するのではありません。body、rootの名で見ることができます。
このプログラムは、大元の要素をlv_screen_active()で参照しています。こうして、大元の要素の上にlabel(テキストエリアのようなもの)を作っているのです。
このようにlv_screen_active()は重要な関数ですが、こちらv7.0.2には存在しませんので、未定義の関数であるとしてエラーになります。根幹に関わる関数であるだけに、無視することはできません。
このように改名されたのであれば、改名以前は何であったのかを調べる外有りません。しかし、等を躐えるようなことばかり強いられるわりには、吾々は未だ一度たりとも
物知りなサンプルプログラム
敢えて最後まで隠しておいたものですが、Seeed_Arduino_LvGLにもサンプルプログラムがあります。こちらはしっかり動きます。
benchmark

引用:https://files.seeedstudio.com/wiki/Wio-Terminal-LVGL/benchmark.gif
lv_test_stress

引用:https://files.seeedstudio.com/wiki/Wio-Terminal-LVGL/stress.gif
動くのですが、動けばよいという話ではなく、動かし方を知りたいのです。比較的ファイル数が少ないのは後者ですので、こちらを取り挙げます。が、何故かタッチスクリーンに関わっていそうな記述があります。未だにこの意図が分かりません。教えてください。
さて、このプログラムの中でタッチスクリーンの箇所は不要として、他の箇所は一体必要なのか、それとも不要なのか、当初は判別できませんでした。今でこそ、この辺りが必要そうだという見当が付きますが、これは後述の答えを知ってからの事です。
また、このプログラムにおいて、描画の仕組みはlv_demo_stress()によって呼び出されています。
lv_demo_stress()は、obj_test_task_cb()をタスクとして作成しています。
つまりobj_test_task_cb()を見ればよいわけですが、
これら二つのサンプルプログラムは大層なもので結構ですが、単純明快な話から始めて貰わなければ、一体何を言っているのか分かりません。そして、何故か斯様に複雑なものばかりあって、単純なものはないのです。
本題:チュートリアル
実はSeeed_Arduino_LvGLを紹介するページには、lv_arduinoと記されたリンクがあります。

このリンクが示す先は、lv_arduinoというライブラリーです。
これを見てみると、Seeed_Arduino_LvGLと一致しています。
つまり、これに付属したサンプルプログラムならば、動く見込みがあるのです。
サンプルプログラム
こちらは確かに動きます。
こうあるように、画面にHello Arduino! (V7.0.X)と表示されるだけの、単純明快なプログラムです。同梱されている画像にその様子がありますが、古いのかV6.0とあります。

引用:https://github.com/lvgl/lv_arduino/blob/master/extras/img/lvglarduino.jpg
これで、ようやく定型が分かりました。
チュートリアルを終えて
チュートリアルを終え、
なんと、実践せられている先達の記事がございました。
今回の成果は納得できるものではありませんでした。茲に筆を置いたら早速、不倶戴天のSeeed_Arduino_LvGLを除去し、最新の
最新のものを使った記事
Discussion