Archive for 6月 2021
How to run LVGL on M5Stack ( ESP32 )
LVGL を M5Stack ( ESP32 ) で動かす方法。 2021.06.18
LVGL ( Light and Versatile Graphics Library ) は 綺麗な表示と多彩な機能の
グラフィックライブラリです。
lv_demo_widgets:このデモから 必要な表示を取り出して使用する事ができます。
1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.15
3. 開発環境:Board Manager:ES32 Arduino 1.0.6
4. Library:m5stack / M5Stack
5. Library:LVGL ( LittleVGL ):lv_arduino
6. Library:TFT-eSPI:ESP32で使用します。
7. Library:LGFX;LovyanGFX:高速化が可能です。
8. HARD :M5Stack, ESP32
.
準備:
LVGL Libray Install:これで LVGL を使用する事ができます。
_ Arduio IDE の ライブラリマネージャを開き 🔴「lv_arduino」を Install します。
_ 「lv_arduino」には Arduino IDE 開発環境で動作する「lvgl」が含まれています。
_ 注意:lv_exsample , lvgl は、Arduino IDE 開発環境では使用できません。
.
_ 資料:
1. Espressif (ESP32) — LVGL documentation v7.11.0-dev
_
2. ESP32 Modules Now Support LittlevGL and μGFX Jan 4,2019
_ espressif は LittlevGL and μGFX をサポートするようになりました。( ESP-IDF )
3. ESPRESSIF : LVGL Graphics Library Document があります。
4. 注意:lvgl/lv_port_esp32 : 開発環境は ESP-IDFで Arduino IDEでは使用出来ません。
.
デモを動かしてみます。
_ 動かして 表示や操作のイメージを体験し LVGL の機能を把握できます。
1. LVGL_Core2
2. LVGL_ESP32_Test_1
3. LVGL_Core2 M5Stack版
4. lv_demo_widgets
5. lv_demo_benchmark ( + LovyanGFX )
6. LVGL_Sin_Cos_Graph
✳️ M5Core2 Demo:LVGL ForumのHow-toにあるスケッチはタッチ操作で動作します。
_ 以下の場所で Down Load できます。
_ M5Core2 slow fps. Scrol slider breaks when moving horizontally
_ DownLoad:LVGL_Core2.zip:DL後 pdfを削除しzipを解凍します。
M5StackのDemo:
✳️ LVGL_ESP32_Test_1:Arduino forumにある Bodmer氏(TFT-eSPIの作成者)作成の
_ 「LVGL_ESP32_Test_1」があります。
_ 構成は ESP32 + TFT Touch Display + TFT-eSPI Library で動作します。
_ Real-world LVGL demo example? で DownLoadできます。
_ その「LVGL_ESP32_Test_1」を M5Stackに移植しました。表示サイズは 240×320 です。
_ DownLoad:LVGL_ESP32_Test_1_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
_ タッチ操作はできませんが Slider , Button, Color_Picker を表示します。
_ ESP32 + TFT Touch Panel Display では タッチ操作で動作しています。
_ スケッチは 解りやすく参考になり Slider や Button の追加が出来る様になります。
_ 3.5″ 320×480 SPI ILI9488 Touch Display と ESP32 で構成した例です。
_ 既にある Slider, Button をコピーして配置。Sliderは 幅を変更すると縦方向を表示します。
✳️ M5Core2 DemoをM5stackへ移植;M5Stackの A,B,C Button で Tabを操作します。
_ DownLoad:LVGL_M5Stack_ver.zip:DL後 pdfを削除しzipを解凍します。
Core2のタッチパッド:
_ my_touchpad_read の M5.Touch.getPressPoint(); で x,y を読んでいます。
_ data point は x,y。dada state は LV_INDEV_STATE_PR を取得します。
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data){ TouchPoint_t pos = M5.Touch.getPressPoint(); bool touched = ( pos.x == -1 ) ? false : true; if(!touched) { data->state = LV_INDEV_STATE_REL; } else { data->state = LV_INDEV_STATE_PR; /*Set the coordinates*/ data->point.x = pos.x; data->point.y = pos.y; } return false; }
my_touchpad_readの中のタッチパッド(x,y)を M5Stackの A,B,C Button に置き換えます。
A Button は Tab1を選択、B Button は Tab2を選択、C Button は Ta3を選択します。
int xp=10, yp=10; bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data){ // A Button --------------------------------------------------------- if (M5.BtnA.wasPressed()){ // tab 1 : A Button data->point.x = xp; data->point.y = yp; // mouse position x,y data->state =LV_INDEV_STATE_PR; M5.update(); return false;} // B Button --------------------------------------------------------- if (M5.BtnB.wasPressed()){ // tab 2 : B Button data->point.x = screenWidth/2; data->point.y = yp; data->state =LV_INDEV_STATE_PR; M5.update(); return false;} // C Button --------------------------------------------------------- if (M5.BtnC.wasPressed()){ // tab 3 : C Button data->point.x = screenWidth -10; data->point.y = yp; data->state =LV_INDEV_STATE_PR; M5.update(); return false;} // No button operation ---------------------------------------------- data->state =LV_INDEV_STATE_REL;M5.update(); return false; }
Button入力と処理の流れ:
my_touchpad_readから data(x,y) と LV_INDEV_STATE_PR を setup内の
indev_drv.read_cb = my_touchpad_read; に送られタッチパッドの様に動作します
void setup() { // Initialize the (dummy) input device driver lv_indev_drv_t indev_drv; lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = my_touchpad_read; // *** lv_indev_drv_register(&indev_drv); }
✳️ lv_demo_widgets:
lvgl/lv_demosに「lv_demo_widgets」があり LGVL の多様な機能を見ることができます。
_ 「lv_demo_widgets」をM5Stackへ移植し、デモを見る事ができます。
_ DownLoad:lv_demo_widgets_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
.
_ M5Stack Core2 用の lv_demo_widgets で タッチ操作で動きます。
_ DownLoad:lv_demo_widgets_M5Core2.zip:DL後 pdfを削除しzipを解凍します。
.
✳️ lv_demo_benchmark:
_ ベンチマークテストを M5Stack と M5Stack + LovyanGFX で実施しました。
_ LovyanGFX ( LGFX ) は 高速化に効果があります。
_ 結果:
_ M5Stack only :FPS = 42 , Opa. speed = 88%
_ M5Stack + LGFX:FPS = 47 , Opa. speed = 87%
_ DownLoad:lv_demo_benchmark_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
_ DownLoad:lv_demo_benchmark_LGFX_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
Library と Display 命令 ( インスタンス ) について。
_ M5Stackで、Display 命令を M5.Lcd や tft で記述します。
_ M5Stack:M5.Lcd
#include <lvgl.h>; #include <M5Stack>; #include "lv_demo_benchmark.h" // M5.Lcd.setRotation(1);
.
_ TFT-eSPI:tft
#include <lvgl.h> #include <TFT_eSPI.h> #include "lv_demo_benchmark.h" TFT_eSPI tft = TFT_eSPI();
.
_ M5Stack + TFT-eSPI:tft
#include <lvgl.h>; #include <M5Stack>; #include "lv_demo_benchmark.h" TFT_eSPI tft = TFT_eSPI();
.
_ LovyanGFX:tft
#define LGFX_USE_V1 #define LGFX_AUTODETECT #include <lvgl.h>; #include <LovyanGFX.hpp>; static LGFX tft; #include "lv_demo_benchmark.h" // tft.setRotation(1);
✳️ LVGL_Sine_Cos_Graph:
_ akirahitosi氏 作製の LVGLでの随時更新の有るグラフ描画 2021/05/20
_ を M5Stackへ移植しました。akirahitosi氏に感謝致します。
_ DownLoad:LVGL_Sin_Cos_Graph_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
_ 横軸は 200msec とかの時間軸になっています。
_ この様な高速表示が必要なLibraryは LovyanGFX を使用すると滑らかに表示します。
_ 画面サイズの大きい物を使用する場合は 特に効果があります。
_ M5Stack + LovyanGFX + 3.5″ 320×480 SPI ILI9488 Display を使用した例
_ 上は M5Stack。下は M5Stack + LovyanGFX で高速で滑らかに表示します。
感想:
LVGLは 2018年から登場しました。LVGL Forumでは レベルの高い人が回答しています。
LVGLに対する Arduino IDE, ESP32, M5Stackに関する情報は 現在少ないです。
中国サイトを検索すると、情報があり若い人への積極的な取り組みがされています。
情報源として日本国内は少なく LVGL Forum や 中国サイトがあります。
:
M5Stack社は LVGLを基に UiFlow へ移植(移植中)を進めています。
その為に LVGLの表示や機能は 制限されたり遅れる事になります。
M5Stack Forumにおける LVGLの質問への回答は UiFlowにより積極的ではありません。
一方 TTGO社では TWatchのタッチパネルの為に LGVLを採用し積極的です。
seeed社は Wio Terminal での説明や githubに 移植した LVGLのSampleがあり積極的です。
seeed社でのLVGLの説明は丁寧で技術的にも読み応えのある内容です。
:
使用する条件は Arduino IDE, ESP32, M5Stack です。
よって LVGLのDocumentが基本ですが 書かれている内容が全て動作するとは限りません。
動かない情報もありますので、切り分けて進めた方が良いかと思います。
:
何も解らず始めています。初めての LVGLで 説明が不十分な点もあるかと思います。
LVGLは 命令数が非常に多く大変ですが 表現力は多彩で 高機能を期待できます。
LVGLの 一つの表示だけでも、これまでのDraw命令の方法で作ると大変です。
LVGLは 一つの表示だけでも、さらに多彩な表現ができ 驚きます。
備忘録として、デモを体験する事を目指しました。画像から何かが得られたらと思います。
デモの次の課題は メーターとか1つの表示と、その入力は どの様にするかです。
ハードのスイッチやデジタル、アナログ信号を接続できると 反応があり楽しくなるかと思います。
LovyanGFX で動作させる方法は LVGL with M5Stack Part 2 をご覧下さい。
.
.
M5Stack , ESP32 , LVGL , LittleVGL , LGFX , LovyanGFX , lv_arduino , lv_demo_widgets ,
lv_demo_benchmark ,