Stavíme kvadrokoptéru #4: rozhraní pro testování s PiUI

Adam Štrauch 3. 5. 2013

Po pauze se vrací seriál o stavbě kvadrokoptéry. V minulých dílech jsme se naučili točit s motory a získávat přesné údaje o poloze; nyní se podíváme, jak komunikovat s RaspberryPi a kvadrokoptérou. Článek se nebude zatím věnovat finální podobě ovládání, ale testovacímu rozhraní, které může být velmi snadno upraveno pro jiné účely.

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.

widgety

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.

Našli jste v článku chybu?
Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Podnikatel.cz: Insolvence LevneElektro.cz? Začíná boj o peníze

Insolvence LevneElektro.cz? Začíná boj o peníze

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

Podnikatel.cz: Instalatér, malíř a elektrikář. "Vymřou"?

Instalatér, malíř a elektrikář. "Vymřou"?

Vitalia.cz: 5 pravidel proti infekci močových cest

5 pravidel proti infekci močových cest

120na80.cz: Hrbatá prsa aneb mýty o implantátech

Hrbatá prsa aneb mýty o implantátech

Vitalia.cz: 5 důvodů, proč jet na výlov rybníka

5 důvodů, proč jet na výlov rybníka

Podnikatel.cz: Znáte už 5 novinek k #EET

Znáte už 5 novinek k #EET

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

Podnikatel.cz: Takhle se prodávají mražené potraviny

Takhle se prodávají mražené potraviny

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

Lupa.cz: Aukro.cz mění majitele. Vrací se do českých rukou

Aukro.cz mění majitele. Vrací se do českých rukou

Podnikatel.cz: Dva měsíce na EET. Budou stačit?

Dva měsíce na EET. Budou stačit?

DigiZone.cz: Wimbledon na Nova Sport až do 2019

Wimbledon na Nova Sport až do 2019

Vitalia.cz: Tohle jsou nejlepší česká piva podle odborníků

Tohle jsou nejlepší česká piva podle odborníků

120na80.cz: 3 preventivní vyšetření na odhalení rakoviny

3 preventivní vyšetření na odhalení rakoviny

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír