Popis ovládacího programu ver.1.0.1
Dlouho jsem přemýšlel, jak podrobně tady rozebírat napsaný program. Nakonec jsem se rozhodl, že to nebudu přehánět. Kdo programovat v javascriptu pro node.js neumí, tady se to určitě nenaučí. Kdo to umí, žádné triviální podrobnosti nepotřebuje. U této první verze udělám výjimku a popis trochu víc rozeberu, aby byly jasné postupy a závislosti, které budou platné i pro ostatní verze.
Javascript jako programovací jazyk není typu kompilátor, ale interpret. To znamená, že si neschovávám zdrojové texty pro sebe a zde nezveřejňuji jen nesrozumitelné spustitelné soubory. Všechny napsané programy jsou čistě textové soubory čitelné pro každého, kdo tento jazyk ovládá. Teprve node.js si tyto texty překládá do spustitelné formy v okamžiku, kdy je má provádět. Proto vše, co zde najdete, můžete studovat a následně i upravovat podle své potřeby. Byl bych rád, kdybych měl od vás nějakou zpětnou vazbu. Proto žádám každého, kdo se pustí do nějakých úprav, aby mi o tom napsal. I já se rád něčemu přiučím. Děkuji.
První zkušební verzi 1.0.1 si můžete stáhnout na stránce Soubory ke stažení / pro HW verze 1.x. Způsob jejího použití je popsán na konci stránky Příprava Raspberry Pi. Pro její funkčnost je potřeba programem npm nainstalovat knihovny onoff a socket.io.
Projekt se skládá z těchto částí:
- adresář js, zde jsou moje soubory s funkcemi v javascriptu
- adresář pict, zde jsou obrázky použité na webové stránce
- soubor favicon.ico, ikona programu která se zobrazuje v prohlížeči
- soubor index.html, základní webová stránka, která se zobrazí v prohlížeči
- soubor satprowler.js, základní program pro node.js
Webový server nepoužívá standardní webový port 80, ale 8080. Komu by to vadilo, může si číslo portu změnit v souboru satprowler.js. Já jsem chtěl komunikaci s Raspberry Pi nějak odlišit. Proto je potřeba do webového prohlížeče zadat adresu v tomto formátu.
http://192.168.xxx.xxx:8080
Kde xxx je podle nastavení vaší domácí sítě koncové dvojčíslí IP adresy Raspberry Pi. Po připojení se v prohlížeči zobrazí následující okno.
Obr. 1 Obrazovka programu SatProwler
Stisknutím libovolného tlačítka s šipkou se rozběhne příslušný motor. Po jeho uvolnění se motor zase zastaví. Pokud stisknete tlačítko, ujedete myší mimo něj a myš pustíte, motor zůstane zapnutý. Zastavíte jej kliknutím na stejné tlačítko. Je to sice softwarová chyba, ale tímto způsobem jde ověřit, že oba motory mohou běžet současně.
Původně to bylo vše, co jsem od prvního testu požadoval. Prověřit ovládání motorů a směr pohybu. Pak jsem ale přidal i prověření vstupních signálů z čidel. Po uvolnění libovolného tlačítka se hodnoty všech čítačů zobrazí v okně terminálu.
Hodnota reprezentující stav koncových spínačů je nejprve true. Po sepnutí se změní na false, po rozepnutí se vrátí na true. Během testování jsem zjistil, že se spínače nulových bodu sepnou a rozepnou při různých hodnotách čítače impulzů. Proto zřejmě původní řídící jednotka při hledání nulového bodu přejede a pak se o kousek vrátí. Je to vidět na videu na stránce Úvod. Spínač tedy má nějakou hysterezi a správný nulový bod je v okamžiku rozepnutí spínače. Toto pravidlo budu ve svých programech také dodržovat. Dále je nutné počítat s tím, že se jedná o mechanické spínače se zákmity (opakované rozpojení / spojení vlivem pružnosti kontaktů). Tuto vlastnost ve verzi 1.0.1 neřeším.
Vlastně zatím netuším, proč mají oba motory dva snímače otáček. SatProwler verze 1.0.1 při počítání vstupních impulzů z motorů sčítá impulzy kanálu A i B do jednoho čítače. Tím se zdvojnásobuje počet impulzů a tedy i teoretická přesnost nastavení pozice. Jestli je tomu tak i ve skutečnosti se teprve ukáže. Stejnosměrný motor má určitou setrvačnost a zastavit jej s přesností na 1 impulz asi nebude jednoduché.
Pro celou dráhu azimutu v rozsahu od -90° do +90° mé zařízení napočítalo přibližně 36000 impulzů (18000 impulzů každý kanál), což znamená 200 impulzů (100 impulzů každý kanál) na 1 stupeň. To odpovídá přesnosti 0.01 stupně na impulz, jak je uvedené v originální uživatelské příručce. Pro celou dráhu elevace v rozsahu od 10° do 50° mé zařízení napočítalo přibližně 32000 (2 x 16000) impulzů, to znamená 800 (2 x 400) impulzů na 1 stupeň. To odpovídá přesnosti 0.0025 stupně na impulz, jak je uvedené v originální uživatelské příručce.
Webový prohlížeč zatím komunikuje s webovým serverem jednosměrně. To znamená, že na server pošle příkaz, ale nedostane zpět potvrzení, že jej server přijal a provedl. K odeslání příkazu se používají funkce RelayOn a RelayOff. První funkce je příkaz k sepnutí, druhý k rozepnutí relé. Kterého relé (dvojice relé při změně směru) se příkaz týká je definováno číslem v závorce. Způsob odeslání příkazu na server řeší moje knihovna "js/driverfce.js".
Další knihovna "https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" zajišťuje síťovou komunikaci. Bohužel se mi tuto knihovnu zatím nepodařilo umístit lokálně na SD kartu Raspberry Pi, proto je při testování potřeba přístup do internetu. Toto je celá výkonná část souboru index.html. Vše ostatní se už týká jen standardu html nebo vzhledu stránky.
Soubor satprowler.js obsahuje celý serverový program. Nejprve deklaruji proměnné pro stav čítačů a definuji výchozí hodnoty. Čítače nastavím na imaginární hodnotu 5000 a stav spínačů na true. Pak se načte knihovna onoff, která přímo ovládá piny GPIO portu. Následně se definují parametry jednotlivých pinů. Kdo použije jiné piny GPIO portu, musí je tady opravit. Nesmí ale zapomenout na to, že všechny vstupy potřebují mít aktivní pullup odpory. Knihovna onoff je neumí zapnout, proto se musí opravit čísla pinů i v souboru config.txt ve spouštěcí oblasti SD karty, jak je popsáno na stránce Příprava Raspberry Pi a pak Raspberry Pi restartovat.
Funkce xxx.watch definují zpracování přerušení vyvolané změnou hodnoty na vstupních pinech GPIO portu. Zatím je zde pouze přičtení nebo odečtení 1 v čítači impulzů podle směru otáčení motoru. U proměnné orgAZ a orgEL se jen změní hodnota na false nebo true podle stavu spínače. Ale při změně na true se vynuluje hodnota čítačů. Od této chvíle by už měly počítat správnou hodnotu aktuální pozice. Následuje funkce, která před ukončením programu uvolňuje použitá přerušení počítače Raspberry Pi. Funkce process.on('SIGINT', unexportOnClose); naopak definovaná přerušení aktivuje.
Následuje vytvoření a spuštění vlastního webového serveru. Zde je popsáno, jak má reagovat na požadavky webového klienta. Řádek http.listen(8080); definuje, na kterém portu bude server poslouchat. Zde si můžete nastavit standardní port 80 nebo cokoliv jiného.
Zbytek je popis toho, co server dělá po přijetí požadavku na ovládání GPIO portů. Pomocí knihovny onoff nastavuje požadované výstupní hodnoty. Zde musíme dát pozor na to, aby se zapnutí / vypnutí relé pro změnu směru otáčení provádělo pouze ve chvíli, kdy je motor v klidu.
Program má z profesionálního pohledu spoustu nedostatků. Ale jeho určení není pro běžné užívání. Jde jen o testování funkčnosti hardware. Přesto by šel po opatrném najetí na koncové spínače už využít k opakovanému ručnímu nastavení na pozice družic, u kterých si hodnoty čítačů poznamenáme na kus papíru. Tím by šlo prověřit, s jakou přesností lze opakovaně vyhledat určitou pozici. Jako měřící přístroj by sloužil satelitní přijímač a jeho ukazatel síly signálu z družice.