Programowanie Raspberry Pi: QT + Python/C++

Witam,
Miałem okazję modyfikować ostatnio proste oprogramowanie napisane na Raspberry Pi w Pythonie do sterowania 2 silnikami krokowymi poprzez GPIO. Generalnie udało się to poskładać tak, żeby działało i spełniało swoje zadanie, ale nie jestem zadowolony z tego jak wygląda kod.

Przykładowo: chciałem, żeby po naciśnięciu przycisku “X+” napęd poruszał się tak długo jak przycisk jest wciśnięty. Na zestawie PLC + HMI takie zadanie nie stanowiłoby żadnego problemu, a tutaj miałem problem to wykonać i tymczasowo poszedłem na kompromis i zrobiłem przycisk “X +1mm”. Jak ogarnę jak to wykonać to zrobię modyfikację.

W związku z tym mam pytanie dotyczące tak jak w temacie programowania na Raspberry Pi w Pythonie lub C++ a do tego biblioteka QT - chodzi o dokumentacje, tutoriale, artykuły, wpisy na forach, biblioteki, moduły itd., które dotyczą wykonywania aplikacji sterujących znanych nam automatykom za pomocą języków programowania wysokiego poziomu - czy ktoś zna i mógłby nakierować na takie zasoby?

W szczególności chodzi mi o zagadnienia takie jak:

  • wykonywanie kodu w nieskończonej pętli (OB Main z Siemensa / Programy z Codesys itd.) w poprawny sposób bez nadmiernego obciążania procesora, ale tak, żeby jak najbardziej zbliżyć się do czasu rzeczywistego,
  • sprawdzanie stanu wejść cyfrowych w każdym cyklu,
  • odświeżanie wizualizacji GUI co zadany czas (100ms / 1 s / …),
  • sensowne połączenie wykonywania części kodu przez cały czas w nieskończonej pętli z wykonywaniem kodu w sposób sterowany zdarzeniami (wciśnięcie przycisku, zmiana stanu wejścia cyfrowego),
  • zmienne podtrzymywane.

Generalnie to próbuję i będę próbował rozwiązać te powyżej wymienione problemy. Mam kilka pomysłów, bo robiłem już małe rozeznanie w sieci:

  • pętla while true + sleep(),
  • Multiprocessing,
  • Threading,
  • .txt, JSON, pickle, SQL.

Jednak wiadomo, że istnieje najlepsze i najbardziej optymalne rozwiązanie problemu, którego mogę nie znać, bo zdecydowanie nie jestem ekspertem w programowaniu w Pythonie.

Polecam ci platformę udemy oraz python tego pana.

Wydaje mi się, że ten kurs na Udemy może Cię zainteresować.

Obecnie dobre ceny bo normalnie kolo 300zl ten kurs. Mam od niego Java i C# i dzięki temu piszę wizualizację w tych językach. Wiadomo że zagadnień z plc nie porusza ale podstawa jest dobrze omówiona. Na przykład pętla dzięki której rozwiązał byś problem ze swoim przyciskiem :slightly_smiling_face:

Dzięki za szybką odpowiedź :slight_smile:

No właśnie jak już zauważyłeś na celowniku mam nie podstawowe zagadnienia, a te “smaczki” związane z wykonywanie sterowania.

Odnośnie podstawowej wiedzy jest dość dużo informacji w Internecie. Przerobiłem sobie:

https://docs.python.org/3/tutorial/index.html

Podstawową wiedzę związaną z programowaniem już mam z innych języków w tym z programowania PLC w języku ST.

Temat jest zapewne dość niszowy. Myślę, że najlepszą opcją byłoby dorwać się do jakiegoś gotowego kodu. Planowałem przejrzeć źródła tego projektu (CraftBeerPi):

Haha. Już miałem pisać, że jest w większości napisany w JavaScript (88.7%), bo po prawej stronie jest zakładka Languages, ale w trakcie pisania postu postanowiłem to jeszcze raz zweryfikować i jest tam sporo plików z końcówką .py.
Gdyby ktoś znał inne podobne aplikacje (np. automatyka domowa z czujnikami) z dostępnym kodem źródłowym to bardzo chętnie przyjmę link.

1 polubienie

osobiście skorzystałbym z nodered, ze względu na połączenie wizualizacji ze sterowaniem w ładnej oprawie i możliwością prostego podziału na szybkie i wolne cykle pracy + wbudowana obsługa eventów.
https://nodered.org/

Jeżeli jednak nie nodered i zostajesz przy Pythonie, to polecałbym

  1. Inicjalizacja zmiennych itp.
  2. try -> pętla while / except - obsługa błędów
  3. zakończenie pracy, wyłączenie wyjść cyfrowych itd.

Co do eventów/przerwań zwał jak zwał -> python asyncio, pygame
Co do taktowania - pętla powinna sprawdzać stan asyncio - czy wystąpiła jakaś zmiana (wciśnięcie przycisku etc.) oraz sprawdzać czas od ostatniego wywołania i jeżeli wystąpi więcej niż X (np. 100ms) to wywołać obsługę wizualizacji.
Zmienne podtrzymywane zapisywałbym w pliku .csv -> najszybsza metoda, ewentualnie JSON, ale to nie jest “natywne” dla pythona więc nieco trzeba nakombinować się dookoła, w .csv da się zrobić to samo.

Być może inne dobre rozwiązanie to ROS (robotic operating system) ale sam nigdy nie korzystałem więc ciężko się wypowiedzieć.

Co do wizualizacji tak czy siak polecam node-red ze względu na prostotę opracowania ładnej wizualizacji