Obecné zásady práce s Pythonem
Pro další vývoj ovládacího programu satprowler jsem se rozhodl přejít na programovací jazyk Python. Důvody k této změně jsou následující:
- V Pythonu lze programovat samostatná vlákna, tedy je možné paralelní programování.
- V Pythonu jsou psány pluginy do Enigmy linuxových satelitních přijímačů. Pokud v budoucnu budu chtít, aby můj pozicionér komunikoval s přijímačem, bude potřeba takový plugin napsat. Takže bych se programování v Pythonu stejně nevyhnul.
- Python prochází bouřlivým vývojem. Stal se velice módním jazykem, který vstoupil do povědomí široké veřejnosti. Lze tedy předpokládat, že případný budoucí uživatel mé konstrukce bude základy Pythonu ovládat.
Znám i pár důvodů, proč přechod na Python není dobrý nápad. Jako zastánce klasických programovacích jazyků Pascal nebo C++ se nedokážu smířit s některými „zjednodušeními“ jazyka Python, které podle mého názoru naopak psaní programů dost komplikují. Především v oblasti hledání a odstraňování chyb. Druhý důvod je, že časté vydávání nových verzí Pythonu komplikuje zpětnou kompatibilitu napsaných programů. Těžko říct, jak bude Python vypadat za pár let. Ovšem pokrok se zastavit nedá.
Pro použití Pythonu není potřeba počítač Raspberry Pi nijak vybírat. Stále je rozhodující 40 pinový konektor GPIO, aby byl k dispozici dostatečný počet linek pro komunikaci s pozicionérem. Je tedy možné použít Raspberry Pi 3 nebo cokoli novějšího. Uvedení Raspberry Pi do provozu se ale od mých prvních článků mírně změnilo.
Jako operační systém stále používám linux Raspbian, kterému se dnes říká prostě Raspberry Pi OS. Jeho aktuální verzi lze stáhnout tady. Dnes už je vhodné použít 64 bitovou verzi, obzvláště ve spojení s novějšími Raspberry Pi 4 nebo 5. Pro naše použití ovládání pozicionéru stačí verze Lite. Pro starší verze Raspberry Pi 3 by dávalo smysl použít i 32 bitovou verzi „Legacy“ Lite, ale nezkoušel jsem to.
Pro nahrání OS na SD kartu používám program Raspberry Pi Imager, aktuálně verzi 1.8.5. Můžete si ho stáhnout tady. Zde upozorňuji na zcela zásadní změnu oproti starším verzím OS. Autoři značně přitvrdili v bezpečnostních opatřeních. Takže různé postupy, jak po prvním spuštění Raspberry Pi zprovoznit SSH terminál, už nefungují. K tomu jsou v programu Imager nabídky, kde si zvolíte, co se má aktivovat a s jakým uživatelským heslem. Pokud nepotřebujete mít kopii OS ve svém počítači, program Imager si jej umí sám stáhnout z webu. Já jsem aktuálně použil verzi Raspios-bullseye-arm64-lite.img z 5.12.2023 („Legacy“ verze).
Obr. 1 - Nastavení programu Imager
Pro SSH komunikaci s Raspberry Pi stále používám terminál PUTTY. Stáhnout si ho můžete zde. I tento program prošel svým vývojem, takže doporučuji použít nejnovější verzi. Ty starší mají problém s moderním šifrováním. Já aktuálně používám verzi 0.76. Pokud neznáte IP adresu Raspberry Pi ve vaší domácí síti, dá se zjistit třeba programem IP-Scanner. Stáhnout si ho můžete zde. Já jsem použil verzi 2.4.30. Nemusíte ho instalovat, stačí spustit. Raspberry Pi 3 poznáte tak, že MAC adresa začíná čísly B8:27:EB… Po úspěšném připojení se provede první nastavení OS.
sudo raspi-config
Zde obvykle nastavuji:
- 1 System Option, S5 Boot, B1 Console
- 5 Localization: L2 Change Timezone, Europe, Prague
- 5 Localization: L4 Change Wi-fi Country, CZ Czech Republic
- 6 Advanced Options, A1 Expand Filesystem
- a na závěr <Finish>, reboot now? Yes
Následující aktualizace jsou standardní linuxové. Já jsem je naposledy instaloval 4.3.2024.
sudo apt-get update
sudo apt-get upgrade -y
sudo reboot
Python je už součástí OS. Proto si jednoduše nemůžeme vybrat, jakou verzi chceme používat. Pokud nás zajímá aktuální verze, zadejte příkaz:
python3
Tím se spustí interpret jazyka python, který vypíše aktuální informace o verzi. Ukončí se kombinací kláves Ctrl+D. Moje aktuální verze Pythonu je 3.9.2.
Python může používat dnes už rozsáhlou základnu hotových knihoven. Správu těchto knihoven (instalačních balíčků a závislostí na dalších potřebných balíčcích a aktualizacích) provádí program PIP. Obvykle se tedy začíná jeho instalací. Protože v našem projektu budeme používat jen několik základních knihoven, nepotřebujeme používat program PIP a instalaci balíčků provedeme ručně.
Jako webový server budeme používat už hotový Framework Flask. Domovskou stránku projektu najdete tady a uživatelskou příručku najdete tady. Pro jeho instalaci a instalaci podpůrných knihoven zadejte tyto příkazy:
sudo apt-get install python3-flask -y
sudo apt-get install python3-flask-socketio
Pro komunikaci s GPIO porty budeme používat knihovnu pigpio. Tu nainstalujeme příkazem
sudo apt-get install python3-pigpio
Dokumentaci k této knihovně najdete tady. Instalace balíčku spustí daemona, tedy samostatný program, který běží na pozadí jako služba. Tento daemon se jmenuje pigpiod. Po každém restartu Raspberry Pi je potřeba jej znovu spustit. Toho dosáhneme úpravou konfiguračního souboru /etc/rc.local třeba textovým editorem nano.
sudo nano /etc/rc.local
Na jeho konec před příkaz exit 0 dopíšeme název daemona, tedy pigpiod .
Obr. 2 - Trvalé spuštění daemona pigpiod
Soubor uložíme kombinací kláves Ctrl+O a editor nano ukončíme kombinací kláves Ctrl+X. Pro jistotu Raspberry Pi naposledy restartujeme.
sudo reboot
Tím je Raspberry Pi připraveno na spouštění programu v Pythonu.
Komunikovat s Raspberry Pi budeme prostřednictvím webového serveru Flask. Tento program má svoje zákonitosti, které musíme dodržet. První z nich je adresářová struktura. Pro práci s adresáři a soubory používám ftp klienta Filezilla. Stáhnout si ho můžete tady. Já používám aktuálně verzi 3.66.5. Po připojení vytvoříme v adresáři /home/pi/ podadresář s názvem našeho projektu, tedy satprowler. V tomto adresáři musí být následující podadresáře:
- static pro statické objekty
- static/css pro styly
- static/img pro obrázky
- static/js pro podporu javascriptů
- template pro stránky html
Až se budeme probírat zdrojovými texty konkrétního projektu, budou rozmístěny včetně všech podpůrných souborů v této adresářové struktuře. Hlavní program satprowler.py je umístěn v hlavním adresáři satprowler. Je to vlastně postup, jak spustit webový server Flask, doplněný rutinami pro práci s pozicionérem.
Obr. 3 – Adresářová struktura projektu
V tuto chvíli bychom už mohli adresářovou strukturu naplnit soubory aktuálního projektu.
Program lze spouštět dvěma způsoby.
1) Dočasné spuštění pro testy:
- Připojení terminálu putty, terminál se automaticky nastaví do domovského adresáře uživatele pi /home/pi/
- Přesun do podadresáře projektu příkazem
cd satprowler
- Spuštění webového serveru příkazem
python3 satprowler.py
Takto spuštěný program běží pouze tak dlouho, dokud se neukončí připojení terminálu putty nebo dokud se neukončí program satprowler kombinací kláves Ctrl+C. Veškeré zprávy včetně chybových vypisuje program do terminálu. Proto se tento způsob používá pro testování a ladění programu.
2) Trvalé spuštění programu
Aby program zůstal trvale spuštěný a bylo možné s ním komunikovat kdykoliv, je třeba postupovat následujícím způsobem. Textovým editorem nano otevřeme konfigurační soubor /etc/rc.local
sudo nano /etc/rc.local
a mezi řádky pigpiod a Exit 0 dopíšeme
cd /home/pi/satprowler/
python3 satprowler.py &
Soubor uložíme kombinací kláves Ctrl+O a ukončíme editor nano kombinací kláves Ctrl+X. Po restartu Raspberry Pi už program poběží automaticky bez potřeby terminálu.
sudo reboot
Obr. 4 – Trvalé spuštění webového serveru
V dnešní době je už soubor rc.local v některých distribucích Linuxu postupně nahrazován jinými mechanismy. Proto může být v budoucnu potřeba nahradit popsaný postup automatického spuštění programu nastavením služeb pomocí systemd.
Pozicionér se používá tak, že do webového prohlížeče libovolného počítače zadáme IP adresu vašeho Raspberry Pi s portem, na kterém server poslouchá.
http://192.168.xxx.xxx:8080
Měla by se zobrazit hlavní stránka se všemi ovládacími prvky.
Obr. 5 – Ukázka možného webového rozhraní pozicionéru
Problémy, které zatím nejsou vyřešeny:
Pro zpětnou komunikaci mezi webovým prohlížečem a serverem Flask se používají asynchronní funkce javascriptu. Zdrojové texty některých funkcí jsou umístěny na webech autorů. Dosud se mi je nepodařilo zprovoznit lokálně. To znamená, že k provozu programu je potřeba aktivní připojení do internetu. Bez něj tyto skripty nefungují.