ESP32-S3-Touch-LCD-1.28 to mały moduł bazujący na wydajnym układzie ESP32-S3 R2 (dwurdzeniowym Xtensa LX7, do 240 MHz) z wbudowanym WiFi (802.11 b/g/n) i Bluetooth® 5 (LE), wyposażony 1,28-calowy okrągły ekran IPS o rozdzielczości 240×240 px i 65k kolorów, sterowany przez GC9A01 z pojemnościowym panelem dotykowym CST816S. Całość jest do kupienia za około 100 zł:
Na płytce oprócz wspomnianego ekranu mamy:
- wbudowany akcelerometr i żyroskop QMI8658 (6‑osiowe IMU) – pozwalający na detekcję ruchu i gestów
- obsługę baterii Li‑ion 3,7 V przez układ IP5209, interfejs MX1.25 do ładowania i monitorowania baterii
- 2 MB PSRAM oraz 16 MB pamięci NOR‑Flash W25Q128JVSIQ
- Interfejs USB‑C z chipem CH343P - do zasilania, programowania przez UART, i monitorowania przez serial
- 6‑pinowy interfejs GPIO wyprowadzony przez SH1.0, umożliwiający łatwe podłączenie dodatkowych czujników lub modułów
- LDO ME6217C33M5G 3.3V
Schemat:
Wymiary płytki:
Złącze GPIO:
Porównanie dwóch wersji
Na forum omawiałem już pokrewną wersję tej płytki, nie było tam ekranu dotykowego:
Waveshare ESP32-S3-LCD-1.28 czyli malutki okrągły wyświetlacz z czujnikiem inercyjnym QMI8658
Obie płytki są podobne, lecz nie są identyczne.
Dodanie obsługi ekranu dotykowego to nie jest jedyna różnica - zmieniły się też niektóre piny od samego wyświetlacza.
| Funkcja | ESP32-S3-Touch-LCD-1.28 | ESP32-S3-LCD-1.28 | I2C1 SDA | GPIO6 | GPIO6 | I2C1 SCL | GPIO7 | GPIO7 | TP INT | GPIO5 | - | TP RST | GPIO13 | - | IMU INT1 | GPIO4 | GPIO47 | IMU INT2 | GPIO3 | GPIO48 | LCD DC | GPIO8 | GPIO8 | LCD CS | GPIO9 | GPIO9 | LCD CLK | GPIO10 | GPIO10 | LCD MOSI | GPIO11 | GPIO11 | LCD MISO | GPIO12 | - | LCD RST | GPIO14 | GPIO12 | LCD BL | GPIO2 | GPIO40 | BAT ADC | GPIO1 | GPIO1 |
Obie wersje mają wyświetlacz GC9A01, ale wersja dotykowa używa jeszcze kontrolera dotykowego CST816S. Cena natomiast różni się tylko o kilka złotych, więc można od razu wziąć wersję rozbudowaną.
Programowanie z Arduino
Płytkę najłatwiej jest chyba uruchomić w Arduino w ESP-IDF. Opisuje to szczegółowo producent:
https://www.waveshare.com/wiki/ESP32-S3-Touch-LCD-1.28
Programowanie z ESP32_Display_Panel
ESP32_Display_Panel to projekt dostępny za darmo na Githubie i pozwalający programować wygodnie różne płytki z wyświetlaczami, m. in. poprzez PlatformIO. ESP32-S3-Touch-LCD-1.28 nie jest przez niego na ten moment wspierany, ale łatwo jest dodać jego wsparcie.
https://github.com/esp-arduino-libs/ESP32_Display_Panel
Przede wszystkim musimy skonfigurować piny i sterowniki dla naszej płytki. Robi się to w esp_panel_board_custom_conf.h. Trzeba tam wpisać GPIO używane do komunikacji z wyświetlaczem (patrz schemat), z kontrolerem dotykowym (konfiguruje się go osobno) oraz z pobocznymi funkcjonalnościami takimi jak podświetlenie wyświetlacza. Dodatkowo trzeba skonfigurować format pikseli i sam sterownik wyświetlacza.
Poniżej odchudzona konfiguracja specjalnie pod LCD z płytki z tematu:
Kod: C / C++
Te ESP_PANEL_BOARD_LCD_COLOR_INEVRT_BIT to literówka z ich projektu. Potrzebę włączenia lustra (ESP_PANEL_BOARD_LCD_MIRROR_X ) odkryłem eksperymentalnie. Z formatem kolorów podobnie (ESP_PANEL_LCD_COLOR_BITS_RGB565), ale to nie wszystko.
Trochę się z tym nakombinowałem, poniżej zdjęcia artefaktów wynikających ze złej konfiguracji:
Musiałem jeszcze włączyć LV_COLOR_16_SWAP, inaczej barwy nie były poprawne. To wykonuje się w platformio.ini. Załączyłem odpowiednie flagi do BOARD_CUSTOM, na którym operuję.
[spi_qspi_lcd]
build_flags =
; LVGL related:
-DLV_COLOR_16_SWAP=1
;
; Here are the available board envs
;
[env:BOARD_CUSTOM]
build_flags =
${common.build_flags}
; Add custom build flags here:
; ${rgb_mipi_lcd.build_flags}
${spi_qspi_lcd.build_flags}
board = BOARD_CUSTOM
Ostatecznie uruchomiłem demo z kształtami w podstawowych kolorach (to ułatwia diagnozowanie problemów) i poruszającym się napisem:
Podobnie trzeba dodać obsługę ekranu dotykowego - wybrać sterownik i zdefiniować piny. Załączamy ogólne:
ESP_PANEL_BOARD_USE_TOUCH
I w tym konkretnym przypadku wybieramy:
ESP_PANEL_DRIVERS_TOUCH_USE_CST816S
W razie potrzeby ustawiamy też ESP_PANEL_BOARD_TOUCH_BUS_TYPE na I2C oraz adres I2C dotyku.
Obsługa QMI8658
QMI8658A to zintegrowany, niskoprądowy 6-osiowy czujnik ruchu produkowany przez firmę QST (QST Microelectronics). Składa się z:
- 3-osiowego akcelerometru (mierzy przyspieszenie liniowe, czyli też przyśpieszenie ziemskie, więc pozwala określić orientację wyświetlacza)
- 3-osiowego żyroskopu (mierzy prędkość kątową, czyli obroty wokół osi)
Opisywałem to już przy poprzedniej płytce z tej serii:
Waveshare ESP32-S3-LCD-1.28 czyli malutki okrągły wyświetlacz z czujnikiem inercyjnym QMI8658
Teraz bieżąca orientacja wyświetlacza jest pokazywana na ekranie. Spójrzmy jak to działa w praktyce. Moduł położony płasko na stole pokazuje Z zbliżone do -1:
Po przestawieniu na bok Y zaczyna zbliżać się do 1:
Drugi bok - Y bliskie -1:
I analogicznie:
Podsumowanie
Mamy tu zasadniczo wszystko co potrzeba do utworzenia prostego zegarka/smartwatcha DIY - wyświetlacz, ekran dotykowy, WiFi, Bluetooth a nawet i akcelerometr. W przyszłości spróbuję zrobić jakiś projekt oparty o ten moduł.
Zaskoczyła mnie też cena - przy różnicy tych kilku złotych wcale nie opłaca się kupować wersji bez ekranu dotykowego (Waveshare ESP32-S3-LCD-1.28), raczej zawsze lepiej dołożyć i mieć więcej opcji, chociażby na przyszłość.
A jakie jest Wasze zdanie? Co takiego można by zbudować w oparciu o ESP32-S3-Touch-LCD-1.28?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.