Skocz do zawartości

ESP32 S3 7cali 800x480 LVGL demo PlatformIO VSCODE


Pomocna odpowiedź

Napisano

Jest taki bardzo fajny zestaw:

00.thumb.jpg.08829f1d0db65aea1314c414815c3c22.jpg

01.thumb.jpg.64d8190723f40e5cecd5f9504d1178b9.jpg

02.thumb.jpg.9400de4bdae1b2bc07b1bfa7c2fb9386.jpg

05.thumb.jpg.d3b2ba77e05e81e6316a76947f00f6d6.jpg

 

 

Producenci procesora Xtensa wydali wersję S3, która posiada sporo portów GPIO, co w odróżnieniu od poprzednich wersji pozwala podłączyć na przykład równoległy LCD, czy wyjście VGA (D-SUB).

Skrótowo parametry procesora z zakupionego zestawu ESP32-8048S070:

8MB PSRAM (Pseudo Static RAM)

- 16MB External Flash

- 2 rdzenie 32bitowe 240MHZ (Xtensa to nie jest ARM)

- interfejs LCD - podobnie jak w bardziej wypasionych ARM'ach od STM (np STM32F746i)

- WiFi

 

W obecnej chwili ten devboard można kupić nieco poniżej 170 zł włącznie z wysyłką.

 

Wyświetlacz jest w rozdzielczości 800x480 i pracuje z odświeżaniem 30FPS - podobnie jak zestawy STM z wyświetlaczami o takich rozdzielczościach (F769i, F469i).

 

Skompilowany i uruchomiony program:

11.thumb.jpg.0d81c8ec1b407bc9a11e0e9e905c0655.jpg

 

Jeżeli mowa o odświeżaniu, to należy wyjaśnić pewne "oszustwo" czy niesprecyzowanie dotyczące właśnie różnych sytuacji z FPS'ami w demach LVGL i innych. Często w benchmarku widać, że podawany FPS jest o wiele wyższy od faktycznej częstotliwości odświeżania ekranu. Dzieje się tak dlatego, ponieważ jest to odnoszone do czasu renderowania aktualnie potrzebnych danych. Co to znaczy: Jeżeli mam na przykład LCD 800x480, ale obracam wektorem, który mieści się w obszarze np 128x128 pikseli, wówczas renderowany obszar jest o wiele mniejszy od całego ekranu i jego obsłużenie zajmuje przykładowo około 1/250 sekundy. Wówczas benchmark podaje np 256FPS, co tak naprawdę do końca zgodne z prawdą nie jest.

Producent posiada wiele różnych wersji dla tego procesora, z wyświetlaczami 4,5,7 cali, rezystywne, pojemnościowe, bez modułu dotyku, a każda wersja ma swoją paczkę oprogramowanych przykładów, schematy, dejtaszity etcetera.

Zakupiony zestaw posiada zaprogramowane demo LVGL działające na nim. Przykłady dla zestawu są wydane dla frameworka Arduino. Z dwóch powodów przykład z LVGL został przeportowany do VSCODE:

- nie chciał się poprawnie skompilować w Arduino IDE

- VSCODE daje o wiele większy komfort programowania (kolorowanie składni, schematy kolorów środowiska, automatyczne "dostrajanie" środowiska do użytego procesora/boarda/zestawu). Poza tym w PlatformIO zmiana używanego procesora np na i386 odbywa się tak "magicznie", tzn framework zacznie coś szukać, sprawdzać, pomieli i za kilkadziesiąt sekund mamy ściągnięty i gotowy do pracy cały tool-chain dla danej platformy.

Mega podziękowania dla mojego przyjaciela Proteus'a za pomoc w portowaniu projektu do PlatformIO VSCODE oraz za zgłębianie dokumentacji, i możliwości Xtensy S3. 

Link do playlisty jego jego bojów z ESP32.

 

Link do dema LVGL na opisywanym zestawie:

 

 

 

Link do githuba z portowanym demem LVGL do PlatformIO w  Visual Studio Code:

https://github.com/wegi1/ESP32_S3_7INCH_LVGL_DEMO.git

  • Lubię! 2
  • 7 miesiące później...
Dnia 10.03.2024 o 20:56, virtualny napisał:

Link do githuba z portowanym demem LVGL do PlatformIO w  Visual Studio Code:

https://github.com/wegi1/ESP32_S3_7INCH_LVGL_DEMO.git

Cześć,

 

Próbowałem to skompilować bo też kupiłem ten wyświetlacz ale biorąc kod żywcem z githuba kompilacja wywala się na linijkach:

  ledcSetup(0, 300, 8);
  ledcAttachPin(TFT_BL, 0);

 

Spróbował byś to zbudować u siebie?

13 minut temu, rade napisał:

Próbowałem to skompilować bo też kupiłem ten wyświetlacz ale biorąc kod żywcem z githuba kompilacja wywala się na linijkach:

  ledcSetup(0, 300, 8);
  ledcAttachPin(TFT_BL, 0);

 

Spróbował byś to zbudować u siebie?

U siebie używam takiej konfiguracji (inny ekran, ale zasady te same):

    // Prepare and then apply the LEDC PWM timer configuration
    ledc_timer_config_t ledc_timer = {
        .speed_mode = LEDC_MODE,
        .timer_num = LEDC_TIMER,
        .duty_resolution = LEDC_DUTY_RES,
        .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz
        .clk_cfg = LEDC_AUTO_CLK};
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

    // Prepare and then apply the LEDC PWM channel configuration
    ledc_channel_config_t ledc_channel = {
        .speed_mode = LEDC_MODE,
        .channel = LEDC_CHANNEL,
        .timer_sel = LEDC_TIMER,
        .intr_type = LEDC_INTR_DISABLE,
        .gpio_num = LEDC_OUTPUT_IO,
        .duty = LEDC_DUTY, // Set duty to 0%
        .hpoint = 0};
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));

 

#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_OUTPUT_IO 6 // Define the output GPIO
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits
#define LEDC_DUTY (0)                   
#define LEDC_FREQUENCY (4000)           // Frequency in Hertz. Set frequency at 4 kHz

Pytanie czy menuconfig masz dobrze ustawiony...

6 minut temu, H1M4W4R1 napisał:

U siebie używam takiej konfiguracji (inny ekran, ale zasady te same):

    // Prepare and then apply the LEDC PWM timer configuration
    ledc_timer_config_t ledc_timer = {
        .speed_mode = LEDC_MODE,
        .timer_num = LEDC_TIMER,
        .duty_resolution = LEDC_DUTY_RES,
        .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz
        .clk_cfg = LEDC_AUTO_CLK};
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

    // Prepare and then apply the LEDC PWM channel configuration
    ledc_channel_config_t ledc_channel = {
        .speed_mode = LEDC_MODE,
        .channel = LEDC_CHANNEL,
        .timer_sel = LEDC_TIMER,
        .intr_type = LEDC_INTR_DISABLE,
        .gpio_num = LEDC_OUTPUT_IO,
        .duty = LEDC_DUTY, // Set duty to 0%
        .hpoint = 0};
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));

 

#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_OUTPUT_IO 6 // Define the output GPIO
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits
#define LEDC_DUTY (0)                   
#define LEDC_FREQUENCY (4000)           // Frequency in Hertz. Set frequency at 4 kHz

Pytanie czy menuconfig masz dobrze ustawiony...

Wnioskując po tym, że nie wiem o czym mówisz to pewnie nie 😛pierwszy raz widzę frazę "menuconfig" w kontekście LVGLa

Aczkolwiek w Twojej odpowiedzi brakuje kontekstu, jak się ma problem z kompilacją bez jakichkolwiek zmian( zakładam, że to powinno się skompilować i uruchomić) do kodu który wkleiłeś. Wyjaśnisz o czym mówisz? Szukałem odwołań do tych define w tym kodzie i nic takiego nie ma.

(edytowany)
1 godzinę temu, rade napisał:

kompilacja wywala się na linijkach:

  ledcSetup(0, 300, 8);
  ledcAttachPin(TFT_BL, 0);

Od wersji 3.x ESP32 core zmieniła się składania niektórych poleceń związanych LED Control (LEDC)

zamiast  

  ledcSetup(0, 300, 8);
  ledcAttachPin(TFT_BL, 0);

wstaw

ledcAttach(TFT_BL, 300, 8); 

 

Edytowano przez jand
  • Pomogłeś! 2
(edytowany)
1 godzinę temu, jand napisał:

Od wersji ESP32 core 3.x zmieniła się składania niektórych poleceń związanych LED Control (LEDC)

zamiast  

  ledcSetup(0, 300, 8);
  ledcAttachPin(TFT_BL, 0);

wstaw

ledcAttach(TFT_BL, 300, 8); 

 

Dzięki za podpowiedź. 

Dobra wiadomość jest, że się skompilowało i uruchamia, nawet dotyk reaguje, zła , że nie działa podświetlenie i nic nie widać 😄 

Co musiałem dodatkowo zmienić to inicjalizację GFXa, bo konstruktory w wersji 1.5.0 się różnią, no i GFXa wziąć ostatnią wersję czyli 1.5.0:

Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel(
    41 /* DE */, 40 /* VSYNC */, 39 /* HSYNC */, 42 /* PCLK */,
    14 /* R0 */, 21 /* R1 */, 47 /* R2 */, 48 /* R3 */, 45 /* R4 */,
    9 /* G0 */, 46 /* G1 */, 3 /* G2 */, 8 /* G3 */, 16 /* G4 */, 1 /* G5 */,
    15 /* B0 */, 7 /* B1 */, 6 /* B2 */, 5 /* B3 */, 4 /* B4 */,
    0 /* hsync_polarity */, 180 /* hsync_front_porch */, 30 /* hsync_pulse_width */, 16 /* hsync_back_porch */,
    0 /* vsync_polarity */, 12 /* vsync_front_porch */, 13 /* vsync_pulse_width */, 10 /* vsync_back_porch */);
Arduino_RGB_Display *gfx = new Arduino_RGB_Display(
    800 /* width */, 480 /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */);

 

EDIT:

No nie działa podświetlenie bo w przykładzie jest zły pin wybrany. Jak się ustawi tak: ledcWrite(TFT_BL, 255); to będzie już działało 😉

Edytowano przez rade
3 godziny temu, rade napisał:

Aczkolwiek w Twojej odpowiedzi brakuje kontekstu, jak się ma problem z kompilacją bez jakichkolwiek zmian( zakładam, że to powinno się skompilować i uruchomić) do kodu który wkleiłeś.

ESP lubi co chwila zmieniać coś w kodzie, podesłałem to co jest zgodne z wmiarę najnowszymi wersjami IDF'a, a menuconfig często powoduje problemy, bo np. PSRAM jest wyłączony i podwójne buforowanie daje panic error, a często nawet program potrafi się nie skompilować poprawnie 😄 

(edytowany)
5 godzin temu, rade napisał:

w przykładzie jest zły pin wybrany. Jak się ustawi tak: ledcWrite(TFT_BL, 255); to będzie już działało

W przykładzie jest wszystko w porządku, tyle że dostosowane do starej wersji core, gdzie w funkcji ledcWrite() jako pierwszy parametr podawało numer kanału, a nie numer nóżki.

Ponieważ w starej i nowej wersji typy parametrów funkcji są te same (choć znaczenie inne), to kompilator nie protestował.

Edytowano przez jand

Wczoraj to trenowałem z i2c kiedyś wystarczył 
 

#include "driver/i2c.h"

Teraz trzeba dołączyć nagłówki specyficzne do tego co z tym sprzętem chcemy robić na przykład
 

#include "driver/i2c_master.h"

Struktury również zostały mocno przebudowane pod nowe wersje bibliotek, moim zdaniem na lepsze.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...