Arduino GPS modul obsahuje integrovaný obvod Neo-6M. Tento komunikační modul od firmy U-blox komunikuje se svým okolím pomocí rozhraní UART a dokáže pracovat s napájecím napětím v rozsahu 3 až 5 Voltů. Co se týká komunikace, tak některé zdroje uvádí nutnost komunikovat v napěťových úrovních 3,3 Voltů, ale z mé zkušenosti lze při napájení 5 Volty bezproblémově komunikovat s GPS modulem pomocí Arduina bez převodníků.
Pro úspěšné propojení GPS modulu Neo-6M s Arduinem stačí propojit celkem čtyři vodiče. Propojíme VCC s 5 V Arduina, RX s pinem D3, TX s pinem D4 a GND se zemí Arduina. Co se týká datových pinů RX a TX, lze využít i jiné volné digitální piny, ale je nutné tuto volbu také provést na začátku programu. Na deskách Mega a Mega 2560 je možné pro pin RX využít pouze tyto piny: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). A na deskách Leonardo a Micro lze pro pin RX využít tyto piny: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu TinyGPS, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven, nastavení propojovacích pinů GPS modulu a inicializaci GPS modulu společně s komunikací po softwarové sériové lince. V podprogramu setup zahájíme nejprve komunikaci po sériové lince pro tištění údajů do počítače a také komunikaci s GPS modulem po softwarové sériové lince. Co se týká rychlosti, standardně je GPS modul Neo-6M nastaven na rychlost 9600, je tedy dobré tuto rychlost neměnit, pokud tak neučiníte v konfiguračním programu od výrobce. Na začátku nekonečné smyčky loop se nachází jako první vytvoření dočasných proměnných pro načtení informací o komunikaci s GPS modulem, které jsou vytištěny po každém běhu na konci smyčky. Následně se dostaneme do for smyčky, v které po dobu jedné vteřiny probíhá kontrola aktivity softwarové komunikace s GPS modulem. Pokud je nějaká aktivita detekována, načteme do pomocné proměnné přijatou zprávu a pomocí funkce gps.encode si zkontrolujeme, jestli neobsahuje platná data. V případě detekování platných dat si pro další práci nastavíme proměnnou označující nová data. Po for smyčce proběhne kontrola proměnné novaData a v případě splnění podmínky se dostaneme na vytištění všech dostupných informací z GPS modulu. Nejprve si vytvoříme pomocné proměnné pro ukládání výsledků a následně jako první načteme GPS pozici do příslušných proměnných ve funkci. V následujícím kódu se nachází vytištění všech dostupných údajů, kdy si vždy nejprve zkontrolujeme, jestli máme platné údaje. Pokud nejsou platné, vytiskneme 0, ale pokud máme platná data, vytiskneme je společně s popiskem, o jaká data se jedná. Po vytištění všech GPS údajů společně s datem a časem si načteme informace o komunikaci GPS modulu s Arduinem, vytiskneme načtené údaje a zkontrolujeme počet detekovaných znaků. Pokud program nedokáže detekovat žádné znaky, je pravděpodobné, že máme modul špatně zapojený a proto vytiskneme tuto informaci uživateli.
// GPS modul NEO-6M
// připojení potřebných knihoven
#include <SoftwareSerial.h>
#include <TinyGPS.h>
// nastavení propojovacích pinů
#define TX 3
#define RX 4
// inicializace GPS a komunikace po softwarové sériové lince
TinyGPS gps;
SoftwareSerial swSerial(RX, TX);
void setup() {
// zahájení komunikace po sériové lince
Serial.begin(9600);
// zahájení komunikace s GPS modulem po softwarové sériové lince
swSerial.begin(9600);
}
void loop() {
// vytvoření dočasných proměnných pro načtení informací o komunikaci s GPS modulem
bool novaData = false;
unsigned long znaky;
unsigned short slova, chyby;
// po dobu jedné vteřiny budeme kontrolovat příjem dat z GPS
for (unsigned long start = millis(); millis() - start < 1000;) {
// kontrola aktivity softwarové komunikace
while (swSerial.available()) {
// vytvoření proměnné pro uložení načtených dat z GPS
char c = swSerial.read();
//Serial.write(c); // pro výpis přijatých dat odkomentujte tento řádek
// dekódování přijaté zprávy s kontrolou platných dat
if (gps.encode(c)) {
// pokud jsou přijatá data platná, nastavíme proměnnou pro tištění dat
novaData = true;
}
}
}
// pokud proběhl příjem nových dat, vytiskneme všechny dostupné informace
if (novaData) {
// vytvoření dočasných proměnných pro načtení dat z GPS modulu
float zSirka, zDelka;
unsigned long stariDat;
int rok;
byte mesic, den, hodina, minuta, sekunda, setinaSekundy;
// načtení GPS pozice do proměnných
gps.f_get_position(&zSirka, &zDelka, &stariDat);
// vytištění informací po sériové lince
Serial.println("::Dostupne GPS udaje::");
Serial.print("Zemepisna sirka: ");
// nejprve zkontrolujeme, jestli máme platné údaje
// (zSirka == TinyGPS::GPS_INVALID_F_ANGLE),
// pokud nejsou validní (platné), vytiskneme nulu,
// v opačném případě vytiskneme obsah proměnné s přesností 6 desetinných míst,
// podobným způsobem se pracuje i s ostatními údaji
Serial.print(zSirka == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : zSirka, 6);
Serial.print(" delka: ");
Serial.print(zDelka == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : zDelka, 6);
Serial.print(" Pocet satelitu: ");
Serial.println(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print("Presnost: ");
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
Serial.print(" Stari dat: ");
Serial.print(stariDat == TinyGPS::GPS_INVALID_AGE ? 0 : stariDat);
Serial.print(" Nadmorska vyska: ");
Serial.print(gps.f_altitude() == TinyGPS::GPS_INVALID_F_ALTITUDE ? 0 : gps.f_altitude());
Serial.print(" Rychlost v km/h: ");
Serial.println(gps.f_speed_kmph() == TinyGPS::GPS_INVALID_F_SPEED ? 0 : gps.f_speed_kmph());
// načtení data a času z GPS modulu do proměnných
gps.crack_datetime(&rok, &mesic, &den, &hodina, &minuta, &sekunda, &setinaSekundy, &stariDat);
// kontrola platnosti dat
if (stariDat == TinyGPS::GPS_INVALID_AGE) {
Serial.println("Nelze nacist datum a cas.");
} else {
// vytvoření proměnné pro vytištění data a času
char datumCas[32];
Serial.print("Datum a cas: ");
// poskládání celé zprávy do proměnné datumCas a poté její vytištění,
// %02d znamená desetinné číslo uvedené za uvozovkami s přesností na 2 číslice
sprintf(datumCas, "%02d/%02d/%02d %02d:%02d:%02d", mesic, den, rok, hodina, minuta, sekunda);
Serial.println(datumCas);
}
}
// načtení a vytištění informací o komunikaci s GPS modulem
gps.stats(&znaky, &slova, &chyby);
Serial.print("Detekovane znaky: ");
Serial.print(znaky);
Serial.print(", slova: ");
Serial.print(slova);
Serial.print(", chyby pri kontrole dat: ");
Serial.println(chyby);
// kontrola chyb při komunikaci skrze detekci přijatých znaků
if (znaky == 0) {
Serial.println("Chyba pri prijmu dat z GPS, zkontrolujte zapojeni!");
}
Serial.println();
}
Po nahrání ukázkového kódu do Arduino desky s připojeným GPS modulem Neo-6M dostaneme například tento výsledek:
::Dostupné GPS udaje::
Zemepisna sirka: 49.2***** delka: 16.5***** Pocet satelitu: 5
Presnost: 690 Stari dat: 418 Nadmorska vyska: 213.40 Rychlost v km/h: 0.11
Datum a cas: 03/07/2017 9:00:00
Detekovane znaky: 956, slova: 4, chyby pri kontrole dat: 0
Arduino GPS modul Neo-6M je zajímavým vstupním modulem, který nám umožňuje obohatit naše zařízení o získávání GPS souřadnic. Můžeme tedy poměrně snadno vytvořit různá zařízení jako například vlastní sledovací zařízení při spojení s GSM modulem či doplnit svoje přenosné měřící zařízení o GPS souřadnice místa měření. Je však důležité zdůraznit, že dodávaná GPS anténa je poměrně velká, citlivá a je nutné ji umístit na viditelném místě s pokud možno přímou viditelností na oblohu. Pokud bychom schovali anténu za silnější materiál nebo ještě hůře kovovou plochu, můžeme mít problémy s navázáním spolehlivého spojení a tedy se získáním GPS souřadnic. Co se týká doby načtení prvních souřadnic, tak ta se v ideálním případě pohybuje okolo 30 sekund od připojení napájení, ale se špatnou viditelností na oblohu se můžeme dostat až na jednotky minut.
Motorizovaný kulový ventil. Má široké uplatnění v různých průmyslových a obytných instalacích. Může být integrován do automatických systémů řízení, kde je možné ovládat průtok dálkově nebo automatizovaně podle předem nastavených podmínek.
Motorizované kulové vently s obvodem CR01, CR02, CR03 nebo CR04 je poměrně jednoduché po elektrické stránce správně zapojit. U ventilu s obvodem CR05 je tomu ale trochu jinak - ventil si sám nehlídá krajní polohy otevření, nebo zavření. Z toho důvodu vznikl tento článek, ukazující některé výhody, použití a především správné zapojení ventilu s obvodem CR05.