【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
を基にしたSeeed_Arduino_LCD
というライブラリーが提供されています。使い方を詳しく説明することはありませんが、これ自体の導入は必要です。
環境構築
開発環境は
-
から Seeed_Arduino_LCD
をダウンロードする
<> Code
からDownload ZIP
で
(https://github.com/Seeed-Studio/Seeed_Arduino_LCD)
-
に追加する
-
Adafruit Zero DMA
を追加する
こちらは
下のAdafruit Zero DMA library by Adafruit
を追加する
実用例
基礎となる画面制御の例が示されています。
「
しかし、突然自由を与えられても何を作ればよいのか困る、というのが忌憚ない素直な所感でした。搗てゝ加えて、自由すぎて定型がなく、高級なそれしか知らない身としては頗る不便とも感じました。これをどうにか工夫された先人は数多あるようですが、公式である
Seeed_Arduino_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 */
}
しかし例のコードはその構造を持ちません。
つまり、これを上手くスケッチと組み合わせる手間があります。しかしその方法がまだわかりません。そこで探してみると、
これで一応実行方法が判明しました。しかし、これらの苦節を経て得られる成果とは即ち、「バージョン互換が無さすぎてコンパイルできない」という失望です。
が齎すエラーの例
今参看していた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