Skocz do zawartości

Chiński ekran przemysłowy/IoT czyli ZX3D95CE01S-TR-4848 i prób kilka...


H1M4W4R1

Pomocna odpowiedź

Coś innego niż example też uruchamia 😉 

IMG_0998.thumb.JPG.34b4b2be160ea90d0480489e946d064e.JPG

Prosty przyciskowy ekran zrobiony w SquareLine Studio. Działa jak marzenie... no prawie. Działałby jak marzenie, gdyby przy każdym eksporcie nie trzeba było sortować plików do odpowiednich folderów i modyfikować CMakeList'y dla IDF, ale jakoś da się to przeżyć i całkiem szybko można zrobić jakieś ładne UI...

Teraz target to dodać główny ekran i zrobić komunikację po UART z modułem sterującym urządzeniem docelowym. Potem pozostanie zrobić intro, wygaszacz ekranu i panel ustawień... Proste... Niby tak, ale rzeczywistość pokaże jak to się skończy... Pewnie sto rzeczy po trasie się wysypie.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Cóż jeżeli gabaryty nie są determinujące, za trochę więcej można kupić prawdziwy przemysłowy panel 4,3", Dostaje się standardowe porty komunikacyjne w tym Ethernet i programuje się to graficznie w darmowym oprogramowaniu dla paneli HMI.

Tutaj Link. https://pl.aliexpress.com/item/1005005538482946.html?spm=a2g0o.order_list.order_list_main.143.75111c24TQLVi3&gatewayAdapt=glo2pol

AMSAMOTION43cal.thumb.jpg.3f20d3eadd25c669101d265f50c3c546.jpgEaseBild.thumb.png.80d9fa8b7410751a453790d34c54137e.png

PS. Głównym problemem z Chińskimi panelami, np. WEINTEKami na rynek Chiński jest taki, że oprogramowanie aby się prawidłowo zainstalowało, musi mieć w Windowsie zmieniony region na Chiny, co nam niestety miesza w komputerze, no i oprogramowanie mamy po Chińsku. Rozgryzałem takie panele, da się, ale prawdziwa droga krzyżowa i w sumie dwa programy na kompie jeden po naszemu, aby łatwiej pisać soft, drugi, po Chińsku aby przekompilować program dla Chińskiej wersji regionalnej i panelu.

Edytowano przez BlackJack
Link do komentarza
Share on other sites

Dnia 1.05.2024 o 19:07, BlackJack napisał:

programuje się to graficznie w darmowym oprogramowaniu dla paneli HMI.

Idealny argument by tego nie kupować. LVGL daje mi pełen dostęp na niskim poziomie i mogę robić co chcę, a nie męczyć się z jakimś przekombinowanym softem.

A wszystkie HMI tego typu DWIN czy NEXTION to przerost formy nad treścią, gdzie to co mogę zrobić kodem w 10min muszę klikać kilka godzin w sofcie…

Poza tym ekran musiał być kwadratowy i mały, więc gabaryty też były problemem 😉 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dnia 18.05.2024 o 16:33, H1M4W4R1 napisał:

Idealny argument by tego nie kupować. LVGL daje mi pełen dostęp na niskim poziomie i mogę robić co chcę, a nie męczyć się z jakimś przekombinowanym softem.

A wszystkie HMI tego typu DWIN czy NEXTION to przerost formy nad treścią, gdzie to co mogę zrobić kodem w 10min muszę klikać kilka godzin w sofcie…

Ciekawa argumentacja przyznam.🤔

Cóż dla mnie darmowe oprogramowanie, które w przypadku HMI WEINTEKA daje ponad 100 zaimplementowanych protokołów większości producentów, plus Freeprotocol dla nie zimplementowanych jest niezłym przerostem formy nad treścią, który osobiście kupuję. Dochodzi do tego język makr, MQTT, VNC w nowszych JAVA Script, wbudowane serwery danych i 800 stron instrukcji dalej. I najważniejsze, to zestandaryzowane rozwiązania, przeskoczysz na HMI innego producenta, ogólna idea ta sama, co najwyżej makijażowe różnice, aby po sądach się nie ciągać.

Czy soft jest przekombinowany? A co dzisiaj nie jest? Dla mnie kwestia nauczenia się, ale którego softu i ideologii z nim związanej nie trzeba się nauczyć, aby sprawnie się nim posługiwać? Wiadomo każdy lubi to co ma, ale czy to argument, przeciwko innym rozwiązaniom? Tak naprawdę wszystko rozbija się o kasę i czas który trzeba na to poświęcić. 

Mówisz: " to co mogę zrobić kodem w 10min muszę klikać kilka godzin w sofcie…" Szczerze ile ci zajęło opanowanie tego kwadracika na tym ekranie?

Cytuję "Po czterech godzinach walki z wgrywaniem softu, różnymi wersjami IDF i platformą producenta udało mi się na niego wgrać demo LVGL 😄 " Wgrałeś demo, a reszta? Na panelu HMI, zakładając że nie implementujesz jakiegoś niestandardowego protokołu, który trzeba rozgryzać, miałbyś co najmniej 50%, jeżeli nie całą działająca aplikację.

Oczywiście to tylko taka moja prywatna luźna opina. Mam szacunek dla ludzi, którzy lubią przedzierać się z maczeta przez dżunglę niskopoziomowego softu. Ale ja jakoś z tego wyrosłem, ale tez się starzeję niestety. Cóż powodzenia, jestem ciekaw końcowego efektu, i ilości czasu który na to poświęcisz jeśli to nie tajemnica. A ja tymczasem wracam do mojego HMI, bo klient na maszynę czeka..

PS. Kwadratowy HMI 3,2" 320x240 który pasuje do puszki instalacyjnej, też mam. Jak znajdę czas dam zdjęcie.

 

Link do komentarza
Share on other sites

13 godzin temu, BlackJack napisał:

Czy soft jest przekombinowany? A co dzisiaj nie jest?

Młotek 😉 Chociaż pewnie i to ktoś przekombinował...

13 godzin temu, BlackJack napisał:

Cytuję "Po czterech godzinach walki z wgrywaniem softu, różnymi wersjami IDF i platformą producenta udało mi się na niego wgrać demo LVGL 😄 " Wgrałeś demo, a reszta? Na panelu HMI, zakładając że nie implementujesz jakiegoś niestandardowego protokołu, który trzeba rozgryzać, miałbyś co najmniej 50%, jeżeli nie całą działająca aplikację.

Właściwie to nie... Bo 2h to było głównie setupowanie Toolchain'a w IDE (CLion) do automatycznej kompilacji i wgrywania na ESP... A, że IDF siedzi sobie w venv Pythona to było trochę problemów ze skryptami, które musiałem ustawić jako setup środowiska programistycznego. Teraz mogę sobie kliknąć ESP-IDF5.2 i kompiluję na 5.2, a jak coś nie działa to jednym klikiem zmieniam na 4.4.5 i kompiluję na tą wersję. (A pozostałe 2h to było testowanie chińskiego szajsu 8MS, które jest dedykowane temu HMI).

Btw. napisanie dwóch głównych paneli z pełną obsługą zajęło jakieś 30 minut (głównie przez brak Copilota... przydałoby się dokupić licencję) 😉 [Został jeszcze panel kontrolny, ale do tego muszę zrobić customowe screeny kontrolujące, ale najpierw czekam na nowy sterownik, by już testować na właściwym sprzęcie, a nie na pająku].

13 godzin temu, BlackJack napisał:

i ilości czasu który na to poświęcisz jeśli to nie tajemnica.

Jakieś 25-30h licząc wszystko (soft, PCB, aktualizację softu do sterownika, konfigurację środowisk, analizę wyprowadzeń HMI i przygotowanie dwóch prototypów).

A wolę programowanie, bo wszystko mam w jednym okienku i nie muszę skakać po różnych miejscach...

Przykładowo w SquareLine Studio, by obsłużyć kliknięcie przycisku muszę dodać przycisk (okej, to do zaakceptowania), ale przycisk nie ma defaultowo podpiętego eventu kliknięcia, więc każdy przycisk muszę edytować i dodać mu taki event ręcznie, potem ustalić, że mam wykonywać funkcję i wpisać nazwę funkcji... To jest przesada...

    lv_obj_t * icon = lv_img_create(main_screen);

    lv_img_set_src(icon, &logo);
    // lv_obj_set_pos(icon, 0, 0); // default
    lv_obj_set_align(icon, LV_ALIGN_CENTER);
    lv_obj_add_flag(icon, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_event_cb(icon, onAdminMenuActivated, LV_EVENT_PRESSED, NULL);

By uzyskać m/w tyle kodu 😄 (to akurat ikonka do klinięcia, a nie przycisk, ale to tylko różnica w jednej linijce).

P.S.

A przekombinować też potrafię 😉 Zwłaszcza w projektach hobbystycznych.

  • Lubię! 1
Link do komentarza
Share on other sites

Dnia 29.04.2024 o 21:10, H1M4W4R1 napisał:

Potem pojawił się kolejny problem - sterowniki. Oprogramowanie producenta obsługiwało wyłącznie ekrany -AR oraz -UR, a ten był -TR. Trzeba było więc znaleźć odpowienie oprogramowanie... [I nie są one kompatybilne, a potrafią zrobić potem problemy z bootowaniem, ale to raczej poniedziałek po 8h pracy był większym czynnikiem wpływającym na to].

Szukając informacji natknąłem się na notkę na Githubie. Zacytuję, może się przyda:

Cytat

AR version ZX3D95CE01S-AR-4848 which includes >speaker, microphones, audio- and RS485 chip.
UR version ZX3D95CE01S-UR-4848 which instead is equipped with an USB connector and the RS485 chip.
T version which is equipped only with the RS485 chip. Can't find any active direct purchase links atm.
T version is identified as WT32S3-86S instead of the previous used WT32S3-86V
TR version ZX3D95CE01S-TR-4848 which instead is equipped with an temperature/humidity sensor (SHT20) and the RS485 chip.
TR version is identified as WT32S3-86S instead of the previous used WT32S3-86V

Źródło: https://github.com/HASwitchPlate/openHASP/discussions/435#discussion-4911489
Jest też tam PDF z dokumentacją ZX3D95CE01S-TR-4848, może też ci się przyda.

 

Dnia 29.04.2024 o 21:10, H1M4W4R1 napisał:

Pierwsza jego propozycja to było Raspberry Pi z ekranem HDMI, no ale pchać malinkę do sterowania kilkoma paskami LED'ów to przesada...

Gdybym musiał użyć czegoś bardziej do prostych E-kiosków i podobnych, to i tak RPi Zero to byłby max. Bardziej coś słabszego, może nawet coś od Olimex (jak tańsze, droższe jednak ostatnio od RPi Zero W).
Budowa Linuxa przez Buildroot, z minimum zależności.

 

Dnia 29.04.2024 o 21:10, H1M4W4R1 napisał:

Ten ekran ma całkiem niezłą jasność i rozdzielczość. Jedyne do czego można się przyczepić to lekkie lagi przy elementach przewijanych, ale to ESP32... nie ma co oczekiwać 240Hz.

Tak, wiem że niecelowa pomyłka, ale czasami też mam wrażenie jakby ESP32 działało z 240Hz 🐢(jestem Espressifobem🤗)

Link do komentarza
Share on other sites

Dawno mnie tu nie było... 😄 

Czas na mały update:

Ekran działa należycie wraz z płytą główną urządzenia.

obraz.thumb.png.1c9ea02dd158a16117d4cfab25179273.png

Główny sterownik odpowiadający za zarządzanie urządzeniem

Złącza RJ45 zostały wybrane przez klienta (przewód RJ bardzo dobrze przechodzi przez tunel montażowy. Tranzystory na płytce to 60N02, działają całkiem sprawnie dla tych akceptowalnie niskich obciążeń (około 2A na paski LED'ów)

Dodatkowo stabilizator liniowy został zastąpiony przetwornicą impulsową (TD1509PR R), która sprawuje się bardzo dobrze (pod warunkiem, że ma duże pole na odprowadzanie ciepła, ale o tym za chwilę).

Płytka posiada wyprowadzenia na taśmę RGB (prawy dolny róg), dwie taśmy LED (prawy bok), dwa wentylatory (zastosowałem złącza KF2510, aczkolwiek nie było ich w bibliotece, więc na płytce są modele XH2.54).

Po lewej stronie są złącza do debugowania.

Interfejs UART jest wspólny dla ekranu (górny RJ45) oraz dla debugowania oraz może być użyty do wgrania oprogramowania przez bootloader UART. Na dole znajduje się złącze RJ45 dla przycisku dotykowego (taki klasyczny montowany do świateł na wzór tego poniżej).

duzy-panel-dotykowy-86x86mm-szklany-dzwonek-czarny.thumb.jpg.da1216082b38d0ed59626fc93574ed66.jpg

Przykład przycisku dotykowego (panel klienta ma cztery wbudowane przyciski, aczkolwiek nie mogę znaleźć zdjęcia)

Sercem całego projektu jest STM32F103CBT6 (był tańszy niż C8), ma jeszcze 10 lat wsparcia, więc raczej przeżyje cykl sprzedażowy tego produktu.

Ale nie o tym tutaj powinniśmy mówić... chyba...

Ciąg dalszy o ekranie

Programowanie ekranu przechodziło bez większych problemów (no może poza tym, że ESP32 ma strasznie zasobożerny system wyświetlania logów), a chińczyk nie wyprowadził złącza JTAG, więc trzeba było się męczyć z debugowaniem przez konsolę... Okazało się, że przy uruchamianiu UART'u występował stack overflow, który naprawił się po zwiększeniu rozmiaru stosu dla zadania od transmisji UART.

Reszta to zwykłe stukanie kodu LVGL z tym, iż pod koniec klient określił dokładną szatę graficzną. Na szczęście był tak miły i podesłał wartości dla RGB565, z którego ekran korzysta (inaczej mogłoby być zaskoczenie, że kolorki się rozjechały...)

a.thumb.png.6e70f7a251c8bb7aa887858c1bf7ab21.png

Design panelu dotykowego

Niestety znów chiński design dał o sobie znać, a raczej brak złącza do baterii podtrzymującej RTC. Niestety w takim przypadku trzeba będzie dodać zegar do głównego modułu, ale to już w następnej wersji. Obecnie zegar i data zostały zastąpione logo (synchronizacja przez WiFi nie wchodzi w grę, gdyż klienci rzadko udostępniają sieć urządzeniom zewnętrznym).

Paski ustawień mają powiększone pole reakcji (jak ktoś da radę trafić w 4 pikselowy pasek na ekranie o przekątnej 4" z rozdziałką 480x480 to powinien mieć szacunek na dzielni). Uznałem to za problem, więc paski mają wirtualne 44 piksele wysokości.

void onMenuScreenPressed(lv_event_t *e)
{
    // Get pointer
    const lv_indev_t *    indev      = lv_indev_get_act();
    const lv_indev_type_t indev_type = lv_indev_get_type(indev);
    if (indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD)
        return;

    // Get point
    lv_point_t p;
    lv_indev_get_point(indev, &p);

    // Check if point is in the light bar
    if (p.y >= LIGHT_BAR_Y - BAR_DEAD_ZONE && p.y <= LIGHT_BAR_Y + BAR_HEIGHT + BAR_DEAD_ZONE) { onLightBarChanged(e); }
    // Check if point is in the fan bar
    else if (p.y >= FAN_BAR_Y - BAR_DEAD_ZONE && p.y <= FAN_BAR_Y + BAR_HEIGHT + BAR_DEAD_ZONE)
    {
        onFanSpeedBarChanged(e);
    }
}

Detekcja jest banalna - po prostu analizujemy wysokość punktu, w którym wystąpił dotyk oraz jego pozycję w osi X. Oczywiście taki dotyk działa na całej szerokości ekranu, ale dało to efekt uboczny, który pozytywnie wpływa na UX, więc został 😉

Komunikacja z urządzeniem zewnętrznym

Do komunikacji z głównym PCB używam prostego systemu komendowego np.

// Zapytaj o aktualną prędkość wentylatorów
FAN_SPEED=?
  
// Zwróć informację o prędkości wentylatorów  / Ustaw prędkość wentylatorów
FAN_SPEED=40 // 40% ;)

System prosty i skuteczny, więc nie ma co przekombinowywać.

Algorytm do analizy komendy też jest do bólu uproszczony:

parsed_cmd_t cmd_parse(uint8_t *data)
{
    parsed_cmd_t cmd = {
        0
    };
    uint8_t *ptr = data;

    cmd.name = ptr; // Save pointer to name start

    // Find name
    while (*ptr != '=' && *ptr != '\0')
        ptr++;

    // Terminate name string
    if (*ptr == '=') { *ptr++ = '\0'; }

    // Check for GET type
    if (*ptr == '?')
    {
        cmd.type = CMD_GET;
        ptr++;
    }
    else
    {
        cmd.type = CMD_SET;

        // Parse CMD text value to uint32_t
        cmd.cmdValue = strtoul((char *) ptr, NULL, 10);
    }

    // Terminate value string (if any) at CR LF
    while (*ptr != '\r' && *ptr != '\n' && *ptr != '\0') { ptr++; }
    *ptr = '\0';

    return cmd;
}

System przetwarzania po prostu podmienia wartość uint32 pod danym wskaźnikiem w strukturze ustawień.

// Macro used to define commands (makes it way faster)
#define COMMAND(name, pointer) { .commandName = (uint8_t*) name, .settingsPointer = &pointer }

// List of all available commands
command_definition_t availableCommands[] = {
    COMMAND(LED_CMD, settings.ledStatus),
    COMMAND(FAN_SPEED_CMD, settings.fanSpeed),
    COMMAND(LIGHT_VALUE_CMD, settings.lightValue),
   	// ...
};

typedef struct
{
    uint32_t red;
    uint32_t green;
    uint32_t blue;
} color_t;

typedef struct
{
    uint32_t saved;
    uint32_t fanSpeed;
    uint32_t lightValue;

  	// ...
  
    color_t activeColor;
    color_t inactiveColor;
} settings_t;

Kolory mają osobne komendy dla każdej barwy (co by nie komplikować systemu) 😉

Zasilanie ekranu i problemy z temperaturami...

Do zasilania ekranu służy dodatkowa przetwornica (z 12 na 5V... taka dla zasady i bezpieczeństwa).

obraz.thumb.png.0b353edfc67c0ebae05ef62568cf3030.png

Płytka przetwornicy

Niestety w trakcie testów płytka osiągała 45-50 stopni Celsjusza, co nie było zbyt dobrym rezultatem. Przyczyną okazały się małe wymiary PCB, co niestety jest dość trudne do obejścia, aczkolwiek implementacja radiatora w postaci profilu aluminiowego przyniosła dostateczną redukcję temperatury do akceptowalnych wartości. Planuję jeszcze przetestować drobne zmiany w samym projekcie PCB, które razem z radiatorem powinny zmniejszyć temperaturę do wartości zbliżonych do otoczenia.

Ostateczny rezultat na test benchu u klienta

2.thumb.jpg.3a05758ad76ceecfa57a221e00f92e95.jpg

Projekt w trakcie testów - czujnik PIR służy do detekcji obecności osoby w pomieszczeniu

Morał

Jeżeli masz czas i chęci to za śmieszne pieniądze możesz rozwiązać wiele problemów - ten ekran był tańszy od ekranu HDMI dla malinki (musiał być kwadratowy), a w dodatku bardziej energooszczędny. Problemem była tylko konieczność nauki LVGL oraz FreeRTOS, aczkolwiek to są umiejętności przydatne w przyszłości. Klient jest zadowolony z rezultatu, więc raczej ja też nie mam co narzekać. Wystarczy poczekać i bierzemy się za implementację RTC do kolejnej iteracji.

  • Lubię! 2
Link do komentarza
Share on other sites

Czemu tak późno trafiłem na ten wpis? Fajny ekran, próbowałeś uruchomić LVGL9? Co do kopiowania plików z SLS lub EEZ studio, wkurzało mnie że za każdym razem SLS kopiuje pliki CMakelist przez co kompilacja wydłuża się nie potrzebnie, wziąłem i napisałem swoją kopiarkę, która kopiuje tylko to co trzeba i jest dużo lepiej i szybciej.

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

2 godziny temu, _LM_ napisał:

Czemu tak późno trafiłem na ten wpis?

Chyba forum wstrzymało publikację i Treker dopiero go zaakceptował 😉 

2 godziny temu, _LM_ napisał:

próbowałeś uruchomić LVGL9?

Nie, w repo od "producenta" było LVGL8 i wolałem mieć coś, co zadziała niż odkrywać koło na nowo 😉 Nie ma co się męczyć, chociaż v9 też pewnie by zadziałało.

2 godziny temu, _LM_ napisał:

Co do kopiowania plików z SLS lub EEZ studio, wkurzało mnie że za każdym razem SLS kopiuje pliki CMakelist przez co kompilacja wydłuża się nie potrzebnie, wziąłem i napisałem swoją kopiarkę, która kopiuje tylko to co trzeba i jest dużo lepiej i szybciej.

Ja kopiowałem ręcznie (nie było tego dużo podczas testów), ale to ustawianie eventów tak mnie wkurzyło, że sobie darowałem...

Ale CLion + Copilot miażdżą SquareLine studio w rezultatach - po prostu jest to kilkanaście razy szybsze (zwłaszcza jak AI samo podpowiada 95% kodu i robi to prawidłowo).

  • Lubię! 1
Link do komentarza
Share on other sites

32 minuty temu, H1M4W4R1 napisał:

Ale CLion + Copilot miażdżą SquareLine studio w rezultatach

Możesz pokazać jakieś GUI wygenerowane przez copilot? 

 

Edytowano przez _LM_
Link do komentarza
Share on other sites

33 minuty temu, H1M4W4R1 napisał:

ustawianie eventów tak mnie wkurzyło, że sobie darowałem...

Tak, bywa to uciążliwe, myślę że będę musiał coś zaradzić w drugiej wersji kopiarki 😄

Link do komentarza
Share on other sites

1 godzinę temu, _LM_ napisał:

Możesz pokazać jakieś GUI wygenerowane przez copilot? 

Copilot nie generuje UI tylko kod na podstawie tego co wpisujesz, więc znacząco skraca wpisywanie tego samego lub podobnego (np. dodawanie kolejnych screenów do LVGL).

Mając ekran menu z ikonką dodanie wygaszacza z tą samą ikonką to było tylko kilka kliknięć w klawisze i tabulator ("użyj podpowiedzi") 😉 

Link do komentarza
Share on other sites

Dnia 27.07.2024 o 14:03, BlackJack napisał:

Jaki jest pobór prądu takiego HMI własnej roboty?

I znów nie dostałem powiadomienia... widocznie forum mnie bardzo nie lubi...

Jakieś 250mA przy 5.1V na całość 😉 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.