Obsługa ekranu LCD na Raspberry Pi

Nie miałem do tej pory żadnych doświadczeń z obsługą wyświetlaczy graficznych na Raspberry Pi, dlatego chciałbym zapytać od której strony to ugryźć.

Wyświetlacz to prosty LCD 320x240 na ILI9341. Jest już podłączony do RasPi przez SPI, system widzi go jako /dev/fb1. Testowo udało mi się na nim wyświetlić konsolę. Moim celem jest jednak generowanie na nim prostego interfejsu graficznego: trochę tekstu, jakieś paski postępu, może jakieś proste grafiki z plików. Nie chcę na tym odpalać pełnego interfejsu okienkowego.

Główne pytanie brzmi tak: czy wśród standardowych bibliotek dostępnych na Linuxa (Raspbian Jessie) znajduje się coś, co pozwalałoby w prosty sposób rysować na wyświetlaczu, wykorzystując pisząc bezpośrednio do framebuffera, z pominięciem całego systemu okienkowego?

Reply to
Atlantis
Loading thread data ...

pod pythonem uzywam Adafruit_ILI9341

formatting link

Reply to
cezar

W dniu 2016-11-15 o 09:22, cezar pisze:

1) Jeśli nie muszę, nie używam Pythona. Preferuję standardowe C, ewentualnie C++. 2) Z tego co widzę, to ta biblioteka dostarcza swój własny sterownik i nie korzysta z framebuffera. Skoro już udało mi się skomunikować wyświetlacz z jądrem Linuksa, to wolałbym iść tą drogą. Szukam biblioteki, która dostarczy mi przynajmniej najbardziej podstawowe funkcje graficzne, ale sama będzie pisała do framebuffera.
Reply to
Atlantis

Ciekawe czy coś znajdziesz, po co ktoś miałby coś takiego tworzyć skoro jest x11?

Reply to
Marek

Tworzono. Najbardziej rozbudowaną był DirectFB. Cairo bodajże do dziś wspiera ten backend. Był port GTK2.

formatting link
Działał pod tym Gimp, Firefox (gdzieś tak do 3.6), webkit. Sam używałem klienta VNC, mplayera, prostych przeglądarek graficznych, pdf (mupdf fbdev), przeglądarki internetowej netsurf, links. Dziś Linux Frame-Buffer jest w kompletnym zamrożeniu. Nie dodaje się już nowych driverów. Zachęca się do przejścia na DRM/KMS, który oferuje pewną formę emulacji fbdev.

Firmy które to wykorzystywały w swoich projektach często tworzyły swoje własne rozwiązania.

Reply to
grapeli23

Ale to na pewno system.okienkowy z menadzerem? Bo to, że można interfejs jednej aplikacji wyświetlić na fbdev to jasne, sdl też. chyba umiał korzystać z fb. Atlatisowi chyba chodziło o środowisko a nie pojedynczy interfejs

Reply to
Marek

Jesli widzisz to jako framebuffer to możesz zainstalować sam serwer X-ów do FB, bez managera okien. Wtedy napiszesz aplikację w czymkolwiek (ja np. w Javie mam dobre doświadczenia ale równie dobrze może być Qt, Python, whatever) i będzie ona dzialać fullscreen. Uzyskasz tanim kosztem efekt całkiem przyzwoity.

Reply to
Sebastian Biały

Dnia 15.11.2016 Marek snipped-for-privacy@fakeemail.com napisał/a:

formatting link

Reply to
grapeli23

W dniu 2016-11-15 o 18:20, Sebastian Biały pisze:

A jak będzie wyglądała kwestia zużycia zasobów? Bo zastanawiam się, czy to przypadkiem nie będzie strzelanie z armaty do komara. Tak naprawdę potrzebuje czegoś bardzo prostego, przypominającego rozwiązania z Arduino. To ma być typowe urządzenie embedded, a wyświetlacz ma zapewniać dostęp do paru podstawowych informacji i ustawień.

Na dobrą sprawę mógłbym sobie napisać funkcję put_pixel() operującą na /dev/fb1 i potem podpiąć do niej jakieś biblioteki z Arduino. Sądziłem po prostu, że może coś takiego już istnieje, biorąc popularność Linuksa w zastosowaniach wbudowanych...

Reply to
Atlantis

Server X na framebuffer to tylko proxy do pamięci z /dev/

Problem w tym że jesli zrobisz to ręcznie czeka Cie rzeźba

*niemiłosierna* z napisaniem każdej kontrolki, systemu eventów itp. Server X do FB jest lightweight. Używałem go na tym cudzie:

formatting link
To jest komputer nieporównywalnie słabszy od Pi. Nie dośc że uciągnął Xy to jeszcze Javę a w środku javy JavaScript (Rhino) w którym była wlaściwa algorytmika sterowania maszyną. GUI na Swing wyszło za darmo bo

*był* serwer X i wyglądało profesjonalnie, cokolwiek to znaczy. Zadziałało od razu, bez marudzenia.

Skoro to maleństwo uciągneło java+X to naprawde, bez obaw o zasoby Pi. Managera okien bym nie stawial jesli ma być embedded, ale Xy jak najbardziej. Jak mówie, Xy to tylko takie proxy do /dev/fb. Może dośc pokręcone, ale co to kogo obchodzi.

Zajedziesz się. Nie warto. Postawienie X fb to kilka chwil i nagle dostajesz dostep do masy softu działającego *wprost*, wliczając to nawet takie cuda jak wxWidgets, QTopia, Qt gdzie można zrobić gui z grubej rury.

Xy istnieją :) To jest Pi więc używanie ręcznie wydziarganych algorytmów rysowania kresek wydaje się być naciągane...

Reply to
Sebastian Biały

Dnia 15.11.2016 Atlantis snipped-for-privacy@wp.pl napisał/a:

Banalny przykład jak bezpośrednio rysować na framebuferze.

formatting link

Reply to
grapeli23

Eh przypomniałeś mi, że mam w szufladzie psiona 5mx pro (wersja 32MB ram!).X był o ile pamietam też na fb. Miałem na tym debiana z apache+mysql+php i fvwm95 (a jak). Pięknie to chodziło. Także obawa, że raspi jest za słabe na X to gruba przesada. Ten Psion to 30Mhz arm z 32 MB ram i z fvwm wraz aplikacjami np. z GTK śmigały.

Reply to
Marek

W dniu wtorek, 15 listopada 2016 09:17:20 UTC+1 użytkownik Atlantis napisał:

=================

Jasne, że jest banalne rozwiązanie. Lazarus. Komponenty wrzucasz na formę na zasadzie "drag and drop". Programujesz w Pascalu. Składnia podobna, tyle że bardziej czytelna. Np. w C masz coś takiego jak a||b, w Pascalu (a or b), w C a&&b, w Pascalu (a and b). Co jest bardziej czytelne? W zasadzie cała filozofia języka C i jego klonów, to tylko marketingowe pieprzenie zapoczątkowane w latach 80'tych, że jest to język wysokiego poziomu o wydajności assemblera. Sranie w banie !! To zależy nie od sposobu zapisu (a:=a+1 vs. a++) lecz od jakości kompilatora. Pascal jest językiem mocno typowanym. I bardzo dobrze!! I zmienna musi być zadeklarowana/zdefiniowana w odpowiednim miejscu. I bardzo dobrze!! Dzięki temu nie ma burdelu i nie da się byle gdzie zdefiniować byle czego i przypisać byle czego do jeszcze bardziej byle czego (np.int a=char b). W Pascalu da się to jasne też zrobić, ale tak, żeby potem nie szukać "gdzie coś spie...liłem". Jak znasz C, to Pascala zrozumiesz w 5 minut. Gorzej w drugą stronę.

Reply to
stchebel

Jak się zna C absolutnie nie ma żadnego powodu by używać Pascala do czegokolwiek. Pascal jest wyłącznie językiem dydaktycznym (podobnie jak logo), powstał tylko w tym celu a wykorzystywanie go w argumentach "wyższości stusowania" poza polami dydaktycznymi to nieporozumienie.

Reply to
Marek

W dniu 2016-11-15 o 21:33, Sebastian Biały pisze:

Pytałem o zużycie zasobów, bo RaspberryPi posiada GPU. Jak rozumiem układ ten nie jest wykorzystywany podczas prostych operacji na framebufferze wyświetlacza podłączonego przez SPI. A jak wygląda sytuacja podczas korzystania z serwera X? System będzie się wspomagał procesorem graficznym, odciążając CPU?

Co mógłbym poczytać, żeby trochę zorientować się w sytuacji? Nigdy nie pisałem niczego pod X-y pod Linuksem. Od czego zacząć? Co zainstalować przez apt-get, żeby nie ściągnął mi się cały system okienkowy? Jak przeprowadzić konfigurację i co najważniejsze - jak napisać i odpalić program rysujący coś na ekranie? Są dostępne jakieś tutoriale?

BTW gdzieś natknąłem się na informację, że OpenGL ES można skonfigurować do pracy bezpośrednio na framebufferze. Czy to też jest sensownym, alternatywnym podejściem?

Reply to
Atlantis

zainstalować

Oczywiście, że są. Pytanie czy chcesz oprócz rysowania prymitywów (pixel, linia, itp) robić jakiś interfejs aplikacyjny (menu itp). Jeśli to drugie to polecam np. gtk. Jest też w wersji skryptowej. Jeśli tylko to pierwsze to wystarczy użyć czystego xlib (apt-get libx11-dev). Możesz wtedy bezpośrednio rysować prymitywy na X serwerze. Kiedyś popełniłem symulator sterownika lcd pod X11 takiego jak ten Twój IL-cośtam. Zamiast testować interfejs graficzny na pic32+lcd kompilowałem sobie cały kod pod x11 podstawiając w kodzie ten driver do x11 zamiast oryginalnej biblioteki lcd (lcd było w okienku, jak każda aplikacja). Odezwij się na priv, to Ci podrzucę ten driver.

Reply to
Marek

Użytkownik "Marek"

Jak się zna C absolutnie nie ma żadnego powodu by używać Pascala do czegokolwiek. Pascal jest wyłącznie językiem dydaktycznym (podobnie jak logo), powstał tylko w tym celu a wykorzystywanie go w argumentach "wyższości stusowania" poza polami dydaktycznymi to nieporozumienie.

Reply to
re

Nie, choć GPU może pracować bez wyświetlacza. Nie wiem jakie ma mozliwości, ale skoro akceleruje dekodowanie mpeg2/4 to powinien dać radę móc coś policzyć ogólnie. Pytaj googla, ja się w małych GPU nie orientuję.

Od nie pisania pod Xy. Weź Qt jesli znasz C/C++. Weź wxWidgets jeśli znasz tylko C. Ostatecznie w pythone sobie zrobisz gui, a jak będziesz chciał szybko i tanio to w swingu w javie.

Zdecyduj w czym bedzie Ci wygodniej. Nie, reczne rysowanie kresek nie jest wygodne. Naprawdę. Ono tylko się wydaje wygodne na początku. Potem to droga przez mękę.

Miliardy. Z powodu szybkości developowania na PC i odpalania na Pi sugerował bym Javę. Wtedy będa pasować książki o pisaniu GUI w Swingu, czyli prawie każda '90<>2010.

Ale co on ma niby dawać? Chcesz jakieś efekty 3D uzyskać?

Reply to
Sebastian Biały

Dlaczego? Atlantis chce coś lekkiego, wyczuwam, że chce wykorzysta8 jakąś grafikę napisaną pod arduino, a tam tylko rysuję się na prymitywach. Podstawi wraper x11 i już ma lekkiego klienta.

Od kiedy w Qt można pisać w C? Nie ma czegoś takiego jak programowanie.C/C++. Albo C albo C++. "Specjalistom" od C++ piszącym de facto w C dziękujemy.

Rotfl, ~ 500 MB jvm w RAMie by narysować parę kresek na pewno go ucieszy :-)).

Reply to
Marek

W dniu 2016-11-17 o 00:32, Marek pisze:

Dokładnie. Na chwilę obecną chodzi mi o prosty program, który będzie pokazywał na wyświetlaczu aktualny status MPD (aktualny utwór, status odtwarzania, głośność, jakiś pasek postępu itp.). Głównie tekst, ewentualnie jakaś prosta ikonka. W przyszłości ewentualnie dodam do tego jakieś menu. Jednak biorąc pod uwagę fakt, że nie mam tam ekranu dotykowego, a do sterowania posłużą dwa przyciski i enkoder obrotowy (ewentualnie pilot), nie potrzebuję złożonego interfejsu graficznego.

Na chwilę obecną byłbym wdzięczny za kilka podstawowych informacji. Pytania pewnie wydadzą się banalne, ale w morzu informacji poświęconych programowaniu interfejsów graficznych pod Linuksem nie mogę się doszukać jednoznacznej odpowiedzi...

1) Co powinienem zainstalować pod Raspbianem Lite, żeby mieć możliwość rysowania na ekranie przez serwer X, jednak żeby nie zaśmiecić sobie za bardzo w systemie. NIE CHCĘ żadnego graficznego ekranu logowania, menadżera okien czy ogólnie rozumianego GUI. Innymi słowy: co wpisać po "sudo apt-get install"? ;) 2) Gdzie znajdę jakieś podstawowe przykłady rysowania w ten sposób na ekranie? Chodzi mi o ogólny szkielet programu, podstawowe funkcje itp. 3) Informacja o tym, z którego framebuffera ma korzystać program ma się znaleźć w jego kodzie, czy należy go odpalić w jakiś specyficzny sposób?
Reply to
Atlantis

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.