先日入手したWT32-SC01でタッチスクリーンを試すのにかっこいいGUIが作れるLVGLライブラリを使ってみた。このライブラリを使うと画像ファイルなしでもかっこいいGUIが作れるらしい?
Arduino IDEでも使えるようだし、液晶パネルのライブラリは前回使用したTFT_eSPIライブラリをそのまま使えるみたい。TFT_eSPIのタッチパネル対応は抵抗膜方式だけっぽかったのでLVGLライブラリでタッチパネルに対応させるためには別なライブラリを使用することに。
まずはタッチパネルの動作確認から。
WT32-SC01のタッチパネル用ライブラリはArduino-FT6336Uを使ってみた。設定もシンプルで良さそうだったし。
WT32-SC01ではFT6336Uの接続はI2Cのみの接続になっていたので、ライブラリで使われている割り込みPinとリセットPinはTPで出ているだけで未接続だった。なのでタッチパネルに触ったかどうかの判別はポーリングで行うことに。
とりあえずサンプルスケッチで動作確認。
#include "FT6336U.h" #define I2C_SDA 18 #define I2C_SCL 19 FT6336U ft6336u(I2C_SDA, I2C_SCL, -1, -1);
サンプルスケッチの上の方はこんな感じで割り込みPinとリセットPinを無効にしてみた。そんでもってINT_N_PINの判別をなくしてシリアルコンソールで入力を確認できた。
ft6336u.read_td_status()
でタッチパネルに触れている指の数(最大2)がわかるっぽいので、ポーリングだけでも触ったことがわかりそうだから問題なさそう。
タッチパネルがなんとなく動いてそうなことがわかったのでお次はLVGLの設定。LVGLライブラリの設定は結構たいへんだった…
まずはライブラリを入れたあとにlv_conf_template.hをArduinoのlibrariesにlv_conf.hとしてコピーして"#if 0"を"#if 1"に変更したり、DEMOを使えるように#define LV_USE_DEMO_WIDGETSを1に変更したりexampleフォルダをコピーしたりする。詳しくは本家サイト参照
そんでもってサンプルのLVGL_Arduino.inoをいじってタッチパネル部分をFT6336Uに対応させてみた。
先程のサンプルスケッチの上の方をそのまま移植して、
void my_touchpad_read( lv_indev_drv_t * indev_drv, lv_indev_data_t * data ) { uint16_t touchX, touchY; uint8_t touched = ft6336u.read_td_status(); if( touched == 0 ) { data->state = LV_INDEV_STATE_REL; } else { data->state = LV_INDEV_STATE_PR; touchY = 320 - ft6336u.read_touch1_x(); touchX = ft6336u.read_touch1_y(); data->point.x = touchX; data->point.y = touchY; } }
タッチパネルが90°ズレていたのでmy_touchpad_read関数を上のように変更した。
setup内ではtft.setRotation( 1 );をtft.setRotation( 3);に変更して液晶の向きを戻して、tft.setTouch( calData );をft6336u.begin();に変更してTFT_eSPIのタッチパネル機能から別ライブラリのArduino-FT6336Uに変更できた。
TFT_eSPIの設定は前回のものそのままで使用できた。例によってバックライト用の2行も追加しないと画面が真っ暗のままなので注意。
ちなみにタッチスクリーンを使うときは上の方で出てきたlv_conf.hの中の#define LV_TICK_CUSTOMを1に変更する必要があるっぽい。(これをやらないと読み込まれない)
そしてついでにタッチパネルのテストをしたいので#define LV_USE_DEMO_WIDGETSも1にしておいた。
サンプルスケッチのlv_demo_widgets();のコメントアウトを外して書き込めばとりあえずタッチパネルのテストができる。
とりあえずシングルタッチで実装してみたけどスワイプもいい感じに動いてる。ESP32でこんなにきれいなGUIを実装できるなんてLVGLライブラリ恐るべし。
0 件のコメント:
コメントを投稿