Implementacja systemu Linux na platformie STM32MP (2). Pierwsza aplikacja

Implementacja systemu Linux na platformie STM32MP (2). Pierwsza aplikacja

Graficzne interfejsy użytkownika są w dzisiejszych czasach nieodłącznym elementem wielu aplikacji. Często same urządzenia mają wbudowany wyświetlacz do komunikacji z użytkownikiem, zatem skorzystanie z systemu okienkowego – zintegrowanego z systemem Linux Embedded – wydaje się bardzo atrakcyjne.

W tej części kursu zajmiemy się napisaniem i uruchomieniem naszej pierwszej, prostej aplikacji wyposażonej w graficzny interfejs użytkownika, dalej nazywany skrótem GUI (ang. Graphical User Interface).

Nasz program zostanie napisany w języku Python, z uwagi na niski próg wejścia dla osób rozpoczynających swoją przygodę z Linuksem w systemach wbudowanych. W następnych odcinkach kursu będziemy się zajmowali pisaniem naszych aplikacji w językach takich jak C i C++. Wtedy również zaczniemy poznawać zasady tworzenia plików Makefile, niezbędnych do budowania aplikacji. Nie wybiegajmy jednak zanadto w przyszłość.

Hello World w Pythonie

Jak już wspomniałem na początku artykułu, w tym odcinku zajmiemy się napisaniem i uruchomieniem prostej aplikacji w Pythonie z obsługą GUI. Nie będziemy jednak musieli tutaj tworzyć żadnych plików (oczywiście poza głównym skryptem) w celu zbudowania naszej aplikacji.

Do opracowywania kodu używam środowiska VSCode z zainstalowaną wtyczką Pythona i – jak napisałem już w pierwszym odcinku naszego cyklu – pracuję na systemie Linux.

Kod zawarty na listingu 1 jest krótki.

import gi

# Ustaw wymaganą wersję GTK na 3.0
gi.require_version(‘Gtk’, ‘3.0’)
from gi.repository import Gtk

# Definiujemy funkcję, która wypisuje “Hello World!” w konsoli, gdy zostanie wywołana
def print_hello(widget):
print(“Hello World!”)

# Definiujemy główną funkcję, która inicjalizuje aplikację GUI
def activate(app):
# Tworzymy główne okno aplikacji i przypisujemy je do aplikacji
window = Gtk.ApplicationWindow(application=app)
window.set_title(“Window”) # Ustawiamy tytuł okna
window.set_default_size(200, 200) # Ustawiamy domyślny rozmiar okna

# Tworzymy pudełko na przyciski i ustawiamy jego orientację na poziomą
button_box = Gtk.ButtonBox.new(Gtk.Orientation.HORIZONTAL)
window.add(button_box) # Dodajemy pudełko na przyciski do okna

# Tworzymy przycisk z napisem “Hello World”
button = Gtk.Button.new_with_label(“Hello World”)
# Łączymy zdarzenie “clicked” przycisku z funkcją print_hello
button.connect(“clicked”, print_hello)
# Łączymy zdarzenie “clicked” przycisku z funkcją zamykającą okno
button.connect(“clicked”, lambda w: window.destroy())
# Dodajemy przycisk do pudełka na przyciski
button_box.add(button)

# Wyświetlamy okno i wszystkie jego elementy
window.show_all()

# Główna funkcja, która inicjalizuje i uruchamia aplikację
def main():
# Tworzymy nową aplikację GTK z unikalnym identyfikatorem aplikacji
app = Gtk.Application.new(“Demo.example”, 0)
# Łączymy sygnał “activate” aplikacji z funkcją activate
app.connect(“activate”, activate)
# Uruchamiamy aplikację.
app.run(None)

# Uruchamiamy główną funkcję, jeśli ten skrypt jest wykonywany bezpośrednio
if __name__ == “__main__”:
main()

Listing 1. Kod aplikacji

Efektem jego działania będzie wyświetlenie na ekranie naszej płytki okienka aplikacji z przyciskiem „Hello World” (rysunek 1).

Rysunek 1. Efekt działania kodu z listingu 1

Po naciśnięciu przycisku w terminalu otrzymamy komunikat „Hello World!” (rysunek 2) a okno zostanie automatycznie zamknięte.

Rysunek 2. Komunikat wyświetlany w terminalu po naciśnięciu przycisku na formatce

Dzianie aplikacji pokazano na fotografiach 1 i 2.

Fotografia 1. Główny ekran systemu operacyjnego
Fotografia 2. Efekt działania aplikacji netdata

Wgrywanie kodu aplikacji na mikrokontroler

Aby wgranie naszej aplikacji na mikrokontroler było w ogóle możliwe, w pierwszej kolejności należy podpiąć zasilanie naszego zestawu ewaluacyjnego, a następnie podłączyć płytkę do Internetu. Ważne jest, by płytka i komputer, na którym pracujemy, były podłączone z tą samą siecią LAN. W moim przypadku zastosowałem bezpośrednie połączenie płytki z routerem za pomocą patchcorda. Osobnym kablem mam podpięty komputer, również do tego samego routera.

Aby uzyskać adres IP naszej płytki na ekranie głównym wyświetlanym przez płytkę, wybieramy zieloną ikonkę „netdata” (rysunek 3).

Rysunek 3. Połączenie z płytką przez ssh

Po jej naciśnięciu pojawi się możliwość włączenia sieci Wi-Fi, jak również zostanie wyświetlony adres IP połączenia sieciowego, co widać na rysunku 4.

Rysunek 4. Kopiowanie skryptu Pythona do pamięci płytki za pomocą polecenia scp

Za pomocą terminalu zainstalowanego na głównym komputerze PC nawiązujemy połączenie z płytką za pomocą narzędzia ssh – stosujemy komendę (rysunek 1):

ssh root@<ip_płytki>

Po poprawnym nawiązaniu połączenia uzyskamy zdalny dostęp do terminalu linuksowego na płytce z poziomu komputera.

W tym momencie możemy wgrać kod naszej aplikacji na płytkę. W tym celu otwieramy drugie okno terminalowe i – podając ścieżkę do miejsca, gdzie zapisaliśmy kod naszej aplikacji – za pomocą komendy:

scp ‘nazwa_pliku’ root@<ip_płytki>:/usr/local

przesyłamy plik do pamięci zestawu uruchomieniowego. Rysunek 2 pokazuje działanie komendy scp w terminalu. Użytkownicy systemów Linux korzystający z tmux nie muszą otwierać dodatkowego okna terminalu, wystarczy dodać nową sesję (rysunek 5).

Rysunek 5. Okno programu tmux

Uruchomienie naszej aplikacji

Korzystając z wcześniej nawiązanego połączenia ssh z naszą płytką, po poprawnym wgraniu kodu aplikacji, przyszedł nareszcie czas na jej uruchomienie. Używamy w tym celu komendy:

python3 /usr/local/’nazwa_pliku’.py

Jako nazwę pliku podajemy nazwę naszej aplikacji, w moim przypadku jest to po prostu main.py. Widok wpisanego polecenia można zobaczyć na rysunku 6.

Rysunek 6. Komenda uruchamiająca skrypt na płytce ewaluacyjnej

Po naciśnięciu klawisza Enter komenda zostanie wykonana – program uruchomi się, wyświetlając na ekranie płytki okienko, widoczne na fotografii 1.

inż. Wiktor Hubaj

Artykuł ukazał się w
Elektronika Praktyczna
styczeń 2025
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik marzec 2025

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2025

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna marzec 2025

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich kwiecień 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów