Hlavní navigace

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.

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?

6. 5. 2013 11:38

Petr Burda (neregistrovaný)

Ahoj,
jsem moc rád, že něco takového vzniklo, ale měl bych jednu výtku.

Na tento díl, 4. díl, jsme čekali skoro měsíc a je v postatě o ničem.
Pocopil bych tu délku trvání, kdybys čekal na nějaké díly, ale zdde jsi jen popsal instalaci programu.

Myslím si, že bych to chtělo pokračování seriálu vydávat častěji. :)



22. 6. 2013 17:51

Kvadroptérá je jistě velice komplexním zařízením, které co do vývoje klade nároky na znalosti z mnoha oborů a jako dlouholetý vývojář elektroniky si myslím, že není v silách jednotlivce v rozsahu jak ho pojal autor projekt dotáhnout do smysluplného konce v rozumném časovém horizontu při domácích technologických podmínkách.
Tím bych ale velmi nerad shazoval již odvedenou práci. Možná by spíš stálo za to napsat pořádné zadání projektu a vytvořit webovou komunitu, kde by se projekt rozdělil dle zad…

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?