Jak jsem vytvořil vlastní GPS sledovací zařízení na motovýlety

Tento projekt začal tím, že jsem si chtěl zaznamenávat jízdy na motorce. Rád jezdím na výlety nebo se jen tak projíždět a napadlo mě, že by bylo super si ty trasy nějak vizualizovat a dostat k tomu i nějaké statistiky. Začal jsem tak na telefonu používat aplikaci Geo Tracker. Ukázalo se, že rychle vybíjí telefon, a tak jsem si řekl proč si neudělat nějakou vlastní aplikaci, to přece zvládnu a udělám si zajímavý projekt.
Jak to funguje
Na obrázku níže je popsán princip celé aplikace, která je rozdělená do třech částí:

Samotné sledovací zařízení (tracker)
GitHub: https://github.com/jsfraz/trek-tracker
Rozdíl mezi pojmy GPS a GNSS
- GPS (Global Positioning System) - satelitní navigace vlastněná USA a provozovaná Vesmírnými silami Spojených států amerických
- GNSS (Global Navigation Satellite System) - služba umožňující za pomoci družic autonomní prostorové určování polohy s celosvětovým pokrytím (americký GPS, ruský GLONASS, evropský Galileo atd.)
Zařízení se skládá z Raspberry Pi Zero WH, GNSS modulu Waveshare LC76G (pro získávání dat o poloze), USB LTE modemu pro přístup k internetu (je potřeba SIM karta), vlastního HAT plošného spoje (k připojení Raspberry Pi GPIO headeru, navrženo pomocí aplikace Fritzing a vyrobeno v Číně) a nabíječky do auta. Další součástky jsou tlačítko pro vypnutí/zapnutí, piezo pro signalizaci chyb, 2x20 pinová dutinková lišta pro připojení HATu k Raspberry Pi headeru, krátký kabel USB-A samec na Micro USB samec (připojení nabíječky), krátký kabel USB-A samice na Micro USB samec (připojení LTE modemu), dvoulinkový kabel od nabíječky a dva očkové konektory pro připojení k baterii motorky.
Neméně důležitá je také krabička (s jejím modelováním mi pomohl kamarád), kterou lze vytisknout na 3D tiskárně. Model se také nachází na GitHubu.
Princip zařízení je takový, že na Raspberry Pi běží jako služba Python skript, který každou vteřinu (vždy když GNSS modul odešle přes sériový port data) odešla získaná data ze satelitů o aktuální poloze, rychlosti a času přes websocket (obousměrný komunikační tunel přes HTTP protokol) na server, kde se uloží do databáze. Díky tomu lze pak ve webové aplikaci zobrazovat aktuální polohu a prohlížet si i její historii.
Zde je ukázka hlavní smyčky programu která odesílá data na server:
Hlavní smyčka programu
Po sestavení celého zařízení to vypadá nějak takhle (a ne, není to bomba):

Ukázka sestaveného GPS trackeru, krabička vložená pod sedačkou
- 1 Raspberry Pi
- 2 GNSS modul
- 3 USB LTE modem
- 4 vlastní HAT
- 5 nabíječka do auta
Prázdné místo v krabičce jsem vyplnil bublinkovou fólií.
Serverová aplikace (server)
GitHub: https://github.com/jsfraz/trek-server
Pro hosting serverové části projektu potřebujete veřejnou IP adresu!
Aplikace běžící na VPS serveru komunikuje s databází a vystavuje HTTP API endpointy pro klientskou aplikaci.
Webová aplikace (klient)
GitHub: https://github.com/jsfraz/trek-client
Pro hosting webové aplikace je potřeba vlastnit doménu!
Webová aplikace pro interakci uživatele se systémem - zobrazení polohy v časovém rozmezí nebo za celou dobu, živé sledování polohy, statistiky o rychlosti a ujeté vzdálenosti.
Ukázka webového rozhraní
Instalace
Postup instalace je popsán na GitHub Wiki každého projektu. Nejdříve je třeba nainstalovat a nakonfigurovat serverovou část, poté webovou, do které se uživatel přihlásí výchozími admin uživatelskými údaji definovanými při instalaci serveru. Po přihlášení přidá v administraci nové zařízení a tím získá API klíč, který použije při konfiguraci zařízení po dokončení jeho instalace.
Zkouška v praxi
Jako první jsem se rozhodl vyzkoušet tracker ve městě (obrázky výše). S výsledkem jsem spokojen. Na mapě jsou krásně vidět jednotlivé body vteřinu po vteřině i s rychlostí a časem. Jedinou nevýhodou je to, že zaznamenaná poloha není na 100% přesná - občas je na mapě vidět jako kdybych jel po chodníku, ale s tím že poloha není přesná na milimetr se počítá.
Větší problém nastal když jsem se rozhodl nahrát si trasu z Dolní Moravy přes Polsko do Hradce Králové a místy nebylo dostatečné pokrytí operátora:


Porovnání zaznamenané polohy VS plánovaná trasa
Pomocí slideru lze porovnat záznam s plánovanou trasou:


Problém je v tom že aby bylo možné data odeslat na server tak je potřeba internetové připojení, které v odlehlých částech nebo na hranicích chybí nebo je slabé. Další podmínkou je GNSS signál, ale pokud má modul výhled na oblohu tak by neměl být problém. Problém s internetovým připojením se dá vyřešit ukládáním dat do paměti dokud nebude internet opět dostupný a bude možné chybějící data odeslat na server.
Závěr
Myslím si, že první verze funguje dost dobře, server, web i tracker. Jediný problém je stav kdy pro tracker není dostupný internet. To se chystám v další verzi opravit. Možná jsem si nevybral nejideálnější nebo nejmenší hardware, protože Raspberry Pi má jako každý jiný počítač operační systém, což je o vrstvu komplikací navíc. Mohl jsem použít i jiný protkol pro přenos dat, například MQTT které se hojně využívá v IoT. I přes to že tahle první experimentální verze má nějaké mouchy si myslím, že je dost dobrá a účel jednoduchého hobby projektu který zvládne doma skoro každý splnila.