Micropython + lvgl
For information abound Micropython lvgl bindings please refrer to lv_bindings/README.md
See also Micropython + LittlevGL blog post.
Build Instructions
sudo apt-get install build-essential libreadline-dev libffi-dev git pkg-config libsdl2-2.0-0 libsdl2-dev pythongit clone --recurse-submodules https://github.com/littlevgl/lv_micropython.gitcd lv_micropythonmake -C ports/unix/./ports/unix/micropython
For ESP32 port
Please set ESPIDF parameter for the esp-idf install dir.
It needs to match Micropython expected esp-idf, otherwise a warning will be displayed (and build will probably fail)
For more details refer to Setting up the toolchain and ESP-IDF
When using IL9341 driver, the width height and color need to be set to match ILI9341. This can be done from the command line. Here is the command to build ESP32 + LittlevGL which is compatible with ILI9341 driver:
make -C ports/esp32/ ESPIDF=~/esp/projects/lv_mpy_deps/esp-idf -j4 LV_CFLAGS="-DLV_HOR_RES=240 -DLV_VER_RES=320 -DLV_COLOR_DEPTH=16" deploy
This make command will create ESP32 port of Micropython, and will try to deploy it through USB-UART bridge.
LV_CFLAGS are used to override width height and color, for ILI9341 compatibility.
For JavaScript port
You need Emscripten installed and working. There are lots of guides about that on the web, but here's the official one.
Once you have Emscripten working, you also need to install the clang package:
cd <path to emsdk>./emsdk install clang-e<sdk version>-64bit # for example: clang-e1.30.0-64bit./emsdk activate clang-e<sdk version>-64bit
Now you can build the JavaScript port.
cd <path to lv_micropython>. ./emsdk_env.shgit checkout lvgl_javascriptgit submodule update --init --recursive(can be very important!)cd ports/javascriptmake- Run an HTTP server that serves files from the current directory.
- Browse to
/lvgl_editor.htmlon the HTTP Server.
Super Simple Example
First, LittlevGL needs to be imported and initialized
import lvgl as lv
lv.init()
Then display driver and input driver needs to be registered. Refer to Porting the library for more information. Here is an example of registering SDL drivers on Micropython unix port:
import SDL
SDL.init()
# Register SDL display driver.
disp_drv = lv.disp_drv_t()
lv.disp_drv_init(disp_drv)
disp_drv.disp_flush = SDL.monitor_flush
disp_drv.disp_fill = SDL.monitor_fill
disp_drv.disp_map = SDL.monitor_map
lv.disp_drv_register(disp_drv)
# Regsiter SDL mouse driver
indev_drv = lv.indev_drv_t()
lv.indev_drv_init(indev_drv)
indev_drv.type = lv.INDEV_TYPE.POINTER;
indev_drv.read = SDL.mouse_read;
lv.indev_drv_register(indev_drv);
Here is an alternative example, for registering ILI9341 drivers on Micropython ESP32 port:
# Import ESP32 driver (advnaces tick count and schedules tasks)
import lvesp32
# Import ILI9341, initialize it and register it to LittlevGL
import ILI9341 as ili
d = ili.display(miso=5, mosi=18, clk=19, cs=13, dc=12, rst=4, backlight=2)
d.init()
disp_drv = lv.disp_drv_t()
lv.disp_drv_init(disp_drv)
disp_drv.disp_flush = d.flush
disp_drv.disp_fill = d.fill
lv.disp_drv_register(disp_drv)
Now you can create the GUI itself
# Create a screen with a button and a label
scr = lv.obj()
btn = lv.btn(scr)
btn.align(lv.scr_act(), lv.ALIGN.CENTER, 0, 0)
label = lv.label(btn)
label.set_text("Button")
# Load the screen
lv.scr_load(scr)
More information
More info about LittlevGL:
- Website https://littlevgl.com
- GitHub: https://github.com/littlevgl/lvgl
More info about lvgl Micropython bindings:
Discussions about the Microptyhon binding: https://github.com/littlevgl/lvgl/issues/557
More info about the unix port: https://github.com/micropython/micropython/wiki/Getting-Started#debian-ubuntu-mint-and-variants