Tento článek využijí určitě i další uživatelé, kteří mají doma RaspberryPi a kvadrokoptéru nestavějí. Řekneme si něco o PiUI, přizpůsobivém uživatelském rozhraní, kterým budeme ovlivňovat hodnoty PID regulátoru, výkonu motorů a dalších parametrů naší kvadrokoptéry, a najdeme tak přesně ta čísla, které potřebujeme. PiUI není určeno pro real-time řízení, reaguje řádově v sekundách, ale to nám v této fázi projektu nevadí. My spíše potřebujeme měnit jedno či více čísel a sledovat, jak se kvadrokoptéra chová, a je pro nás důležitá hlavně flexibilita PiUI.
PiUI je napsané v Pythonu. Na straně serveru není nic jiného než webový server, který si povídá s aplikací pro operační systém Android. Aplikace je schopná si běžící instanci PiUI najít a připojit se k ní. Když se tak stane, zobrazí se uživatelské rozhraní, které je složeno z předem připravených prvků. Ty můžete snadno poskládat tak, aby rozhraní vyhovovalo tomu, co zrovna děláte. Nejlépe bude si to ukázat, ale nejdříve je třeba PiUI nainstalovat.
Instalace
Instalační proces je jednoduchý, pokud chcete používat Debian a nevadí vám už připravený obraz. V něm je vše pro PiUI připravené. I když jsem ho nezkoušel, mám obavy, že aby začal fungovat s vaší WiFi kartou, budete možná muset provést více úprav, než když se rozhodnete pro čistou instalaci. Za zkoušku ale nic nedáte a obraz najdete na Githubu.
Já používám na Raspberry Pi Arch Linux, což situaci komplikuje ještě o kousek více. Začneme tedy stažením zdrojových kódů:
# cd /usr/src
# git clone https://github.com/dps/piui.git
# cd piui
# python2 setup.py install
Uživatelé Debianu mohou použít pouze „python“. V Arch Linuxu už je nějaký čas jako výchozí Python 3, se kterým PiUI nefunguje. Po instalaci přes setup.py bude možná ještě třeba doinstalovat cherrypy.
# pip install cherrypy
Během instalace se nepřekopíruje statický obsah, takže je třeba mu na jeho místo trochu pomoci. Takto to uděláte na Arch Linuxu:
# cp -a /usr/src/piui/piui/static /usr/lib/python2.7/site-packages/piui-0.0.3-py2.7.egg/piui/
A takto na Debianu:
# cp -a /usr/src/piui/piui/static /usr/local/lib/python2.6/site-packages/piui-0.0.3-py2.6.egg/piui/
Pokud si tento článek čtete s odstupem, dejte si pozor na čísla verzí Pythonu i PiUI v cestách. Nyní by mělo fungovat demonstrační rozhraní.
# python2 piui_demo.py
Pokud vše proběhlo bez problémů, tak na adrese vašeho RaspberryPi a portu 9999 bude poslouchat cherrypy. Nyní je potřeba z portu 9999 udělat 80, v čemž pomůže Nginx.
# pacman -S nginx # Arch Linux
# apt-get install nginx # Debian
V případě Arch Linuxu je ještě třeba říct systemd, že má Nginx spouštět při spuštění systému a také ho nastartovat:
# systemctl enable nginx
# systemctl start nginx
Debian toto udělá automaticky při instalaci balíčku. Dalším krokem je konfigurace Nginx v /etc/nginx/nginx.conf. Soubor najdete na obou distribucích na stejném místě. Konfiguraci nemá smysl kopírovat, protože je součástí zdrojových kódů PiUI, nicméně u Arch Linuxu je třeba nahradit řádek
user www-data;
řádkem
user http;
Nakonec restartujeme:
# systemctl restart nginx # Arch Linux
# /etc/init.d/nginx restart # Debian
Pokud šlo vše dobře a demonstrační rozhraní ještě běží, na ip adrese vašeho Raspberry Pi a portu 80 by se mělo objevit.
Druhá půlka instalace se odehrává na telefonu. Rozhraní můžete používat přímo z webového prohlížeče, ale pamatujte, že v současné podobě nepodporuje konkurenční spojení, a když se k němu připojíte ze dvou míst, začne se chovat divně. Pro přístup z mobilu může být snadnější použít připravenou aplikaci. Aplikace slouží jen pro automatické „nalezení“ IP adresy běžícího rozhraní a pak spustí WebView. V automatickém hledání aplikace naráží, protože je založeno na tom, že je telefon nějakým způsobem schopen resolvovat hostname/doménu „piui“. Může mu v tom pomoci třeba dnsmasq na straně RaspberryPi, pokud funguje jako WiFi Access Point anebo editor souboru /etc/hosts v telefonu. Osobně jsem si zvolil editaci hosts souboru pomocí aplikace Hosts Editor Pro. Aplikace vyžaduje roota. Stejně dobře lze editovat /etc/hosts na telefonu ručně. K tomu taktéž potřebujete roota. Pokud telefon, ať tak či tak, nepřeloží „piui“ na IP adresu, nebude automatické hledání fungovat.
PiUI obsahuje ještě supervisor, který umožňuje provoz více rozhraní na jedné adrese, ale do toho už jsem se nepouštěl. Každopádně pokud jste se drželi rad v této sekci článku, bude vám PiUI fungovat, jak má.
Tvorba rozhraní
PiUI je projekt jednoho člověka, takže není divu, že neoplývá dokumentací. Občas je třeba nahlédnout do kódu, což hostování na GitHubu v mnohém usnadňuje. Většinu věcí ale dokážete udělat, pokud si prostudujete již zmíněný soubor piui_demo.py. Ten obsahuje všechny prvky, které PiUI umí a můžete se odsud odrazit. Pro potřeby ladění kvadrokoptéry není třeba nic složitého:
from piui import PiUi
class QuadroUI(object):
def __init__(self):
self.ui = PiUi()
self.kp = None
self.ki = None
self.kd = None
self.throttle = None
infobox = None
def escs(self):
self.page = self.ui.new_ui_page(title="ESCs", prev_text="Back", onprevclick=self.main_menu)
self.title = self.page.add_textbox("PID regulator", "strong")
self.kp = self.page.add_input("number", "Kp")
self.ki = self.page.add_input("number", "Ki")
self.kd = self.page.add_input("number", "Kd")
self.throttle = self.page.add_input("number", "Throttle")
self.page.add_button("Set parameters", self.on_set_click)
self.infobox = self.page.add_textbox("", "p")
def main_menu(self):
self.page = self.ui.new_ui_page(title="Quadrocopter")
self.list = self.page.add_list()
self.list.add_item("ESCs", chevron=True, onclick=self.escs)
self.ui.done()
def on_set_click(self):
text = []
text.append("Kp: %s" % self.kp.get_text())
text.append("Ki: %s" % self.ki.get_text())
text.append("Kd: %s" % self.kd.get_text())
text.append("Throttle: %s" % self.throttle.get_text())
self.infobox.set_text("<br>".join(text))
print "\n".join(text)
def main():
ui = QuadroUI()
ui.main_menu()
if __name__ == '__main__':
main()
Klíčem je třída, ve které je atribut ui. Přes něj se komunikuje s rozhraním PiUI. Osobně v tom nevidím řešení úplně dle zvyklostí Pythonu, ale ve výsledku se používá docela pěkně. Všechno, co se v rozhraní děje, je reprezentováno metodami. Metoda může být akce na kliknutí na tlačítko nebo stránka, tak jak to je v příkladu výše. Pokud má metoda vytvořit novou stránku, zavolá self.ui.new_ui_page() a dá tak PiUI vědět, že má na druhé straně komunikačního kanálu vytvořit novou stránku. Poté na stránku přidá jednotlivé prvky.
Když příklad spustíte, naběhne webový server podobně jako u pyui_demo.py, a na telefonu, tabletu či v nějakém prohlížeči byste měli mít své rozhraní.
Shrnutí
PiUI sice občas působí nedokončeně, ale svou práci udělá. Své uplatnění najde i jinde než u kvadrokoptér. Prakticky všude tam, kde není třeba, aby mělo rozhraní nějaké speciální vlastnosti, ale je výhodou, že ho lze napsat za 10 minut. Příště se podíváme na PID regulátor.