Съдържание:

Да намериш своя път с GPS: 9 стъпки
Да намериш своя път с GPS: 9 стъпки

Видео: Да намериш своя път с GPS: 9 стъпки

Видео: Да намериш своя път с GPS: 9 стъпки
Видео: My job is to observe the forest and something strange is happening here. 2024, Юли
Anonim
Да намериш пътя си с GPS
Да намериш пътя си с GPS

Бързо упражнение за разбиране и прилагане на GPS данни

  • Необходимо време: 2 часа
  • Цена: $ 75 - $ 150

За производителите стана доста евтино да се включат висококачествени геопространствени данни в проекти за електроника. И през последните няколко години модулите на приемника на GPS (глобална система за позициониране) са станали много по -разнообразни, мощни и лесни за интегриране с дъски за развитие като Arduino, PIC, Teensy и Raspberry Pi. Ако сте мислили да изграждате около GPS, сте избрали подходящ момент да започнете.

Стъпка 1: Как работи

GPS модул е малък радиоприемник, който обработва сигнали, излъчвани на известни честоти от флота от спътници. Тези спътници се въртят около Земята в приблизително кръгови орбити, предавайки изключително прецизни данни за местоположението и часовника на земята отдолу. Ако земният приемник може да „види“достатъчно от тези спътници, той може да ги използва, за да изчисли собственото си местоположение и надморска височина.

Когато пристигне GPS съобщение, приемникът първо проверява своята времева отметка за излъчване, за да види кога е изпратено. Тъй като скоростта на радиовълна в космоса е известна константа (в), приемникът може да сравнява времето за излъчване и приемане, за да определи разстоянието, което сигналът е изминал. След като установи разстоянието си от четири или повече известни спътника, изчисляването на собствената му позиция е сравнително прост проблем за 3D триангулация. Но за да стане това бързо и точно, приемникът трябва да може бързо да разпределя числа от до 20 потока данни наведнъж. Тъй като GPS системата има публикувана цел да бъде използваема навсякъде по Земята, системата трябва да гарантира, че поне четири спътника - за предпочитане повече - се виждат по всяко време от всяка точка на земното кълбо. В момента има 32 GPS спътника, изпълняващи щателно хореографиран танц в рядък облак с височина 20 000 километра.

Стъпка 2: Факт на фен

GPS не би могъл да работи без теорията на относителността на Айнщайн, тъй като трябва да се направи компенсация за 38 микросекунди, които орбиталните атомни часовници печелят всеки ден от разширението на времето в гравитационното поле на Земята.

Стъпка 3: Първи стъпки

Приготвяме се да започнем
Приготвяме се да започнем

Какъвто и да е вашият проект, GPS е лесен за интегриране. Повечето приемни модули комуникират с ясен сериен протокол, така че ако можете да намерите резервен сериен порт на платката на контролера, трябва да отнеме само шепа кабели за осъществяване на физическата връзка. И дори ако не, повечето контролери поддържат емулиран „софтуерен“сериен режим, който можете да използвате за свързване към произволни щифтове.

За начинаещи, Ultimate GPS Breakout модулът на Adafruit е добър избор. На пазара има много конкурентни продукти, но Ultimate е солиден изпълнител на разумна цена, с големи отвори, които лесно се запояват или свързват към макет.

Първо, свържете земята и захранването. От гледна точка на Arduino, това означава свързване на един от GND пиновете на микроконтролера към GND на модула и +5V щифта към VIN на модула. За да управлявате трансфера на данни, трябва също да свържете TX и RX щифтовете на модула към Arduino. Ще избирам произволно щифтове 2 (TX) и 3 (RX) на Arduino за тази цел, въпреки че пинове 0 и 1 са специално проектирани за използване като „хардуерен сериен порт“или UART. Защо? Тъй като не искам да губя единствения UART, който тези AVR процесори от нисък клас имат. UART на Arduino е здраво свързан към вградения USB конектор и обичам да го поддържам свързан с компютъра си за отстраняване на грешки.

Стъпка 4: Пръст в потока от данни

Пръст в потока от данни
Пръст в потока от данни

В момента, в който включите захранването, GPS модул започва да изпраща парчета текстови данни в своята TX линия. Може все още да не вижда нито един сателит, още по -малко да има „поправка“, но кранът за данни се включва веднага и е интересно да се види какво излиза. Първата ни проста скица (по -долу) не прави нищо друго освен да показва тези необработени данни.

#Включете #дефинирайте RXPin 2

#дефинирайте TXPin 3#дефинирайте GPSBaud 4800

#define ConsoleBaud 115200

// Серийната връзка с GPS устройствотоSoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Пример за GPS 1");

Serial.println ("Показване на необработените данни от NMEA, предавани чрез GPS модул.");

Serial.println ("от Mikal Hart"); Serial.println ();

}

void loop ()

{if (ss.available ()> 0) // Когато всеки знак пристигне …

Serial.write (ss.read ()); // … запишете го в конзолата

}

ЗАБЕЛЕЖКА: Скицата определя приемащия щифт (RXPin) като 2, въпреки че по -рано казахме, че предавателният (TX) щифт ще бъде свързан към пин 2. Това е често срещан източник на объркване. RXPin е приемният щифт (RX) от гледна точка на Arduino. Естествено, той трябва да бъде свързан към предавателния (TX) извод на модула и обратно.

Качете тази скица и отворете Serial Monitor на 115, 200 бода. Ако всичко работи, трябва да видите плътен, безкраен поток от текстови низове, разделени със запетая. Всеки ще изглежда нещо като второто изображение в началото на абзаца.

Тези отличителни струни са известни като NMEA изречения, наречени така, защото форматът е изобретен от Националната морска асоциация по електроника. NMEA дефинира редица от тези изречения за навигационни данни, вариращи от съществените (местоположение и време) до езотеричните (съотношение сигнал / шум на сателита, магнитна дисперсия и т.н.). Производителите са противоречиви относно това кои видове изречения използват техните приемници, но GPRMC е от съществено значение. След като вашият модул получи корекция, трябва да видите доста голям брой тези GPRMC изречения.

Стъпка 5: Намиране на себе си

Не е тривиално да конвертирате суровия изход на модул в информация, която вашата програма може да използва. За щастие, вече има някои страхотни библиотеки, които да направят това вместо вас. Популярната GPS библиотека Adafruit на Limor Fried е удобен избор, ако използвате техния Ultimate breakout. Написано е, за да активира функции, уникални за Ultimate (като вътрешно регистриране на данни) и добавя някои свои силни камбани и свирки. Любимата ми библиотека за синтактичен анализ - и тук, разбира се, съм напълно безпристрастен - е тази, която написах, наречена TinyGPS ++. Проектирах го да бъде изчерпателен, мощен, кратък и лесен за използване. Нека го вземем за въртене.

Стъпка 6: Кодиране с TinyGPS ++

От гледна точка на програмиста, използването на TinyGPS ++ е много просто:

1) Създайте обект GPS.

2) Насочете всеки знак, който пристига от модула към обекта, като използвате gps.encode ().

3) Когато трябва да знаете вашата позиция или надморска височина или час или дата, просто попитайте gps обекта.

#включи #включи

#дефинирайте RXPin 2

#дефинирайте TXPin 3

#дефинирайте GPSBaud 4800

#define ConsoleBaud 115200

// Серийната връзка с GPS устройствотоSoftwareSerial ss (RXPin, TXPin);

// Обектът TinyGPS ++

TinyGPSPlus gps;

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Пример за GPS 2");

Serial.println ("Прост тракер, използващ TinyGPS ++.");

Serial.println ("от Mikal Hart");

Serial.println ();

}

void loop () {

// Ако са пристигнали някакви знаци от GPS, /

/ изпратете ги до обекта TinyGPS ++

while (ss.available ()> 0)

gps.encode (ss.read ());

// Нека покажем новото местоположение и надморската височина

// винаги когато някой от тях е актуализиран

if (gps.location.isUpdated () || gps.altitude.isUpdated ())

{

Serial.print ("Местоположение:");

Serial.print (gps.location.lat (), 6);

Serial.print (",");

Serial.print (gps.location.lng (), 6);

Serial.print ("Надморска височина:");

Serial.println (gps.altitude.meters ());

}

}

Второто ни приложение непрекъснато показва местоположението и височината на приемника, използвайки TinyGPS ++, за да помогне при анализирането. В истинско устройство можете да регистрирате тези данни на SD карта или да ги покажете на LCD. Вземете библиотеката и скицирайте FindingYourself.ino (по -горе). Инсталирайте библиотеката, както обикновено, в папката Arduino libraries. Качете скицата на вашия Arduino и отворете Serial Monitor на 115, 200 бода. Трябва да виждате вашето местоположение и надморска височина в реално време. За да видите къде точно стоите, поставете някои от получените координати на географска ширина/дължина в Google Maps. Сега свържете лаптопа си и отидете на разходка или шофиране. (Но не забравяйте да държите очите си на пътя!)

Стъпка 7: „ЧЕТВЪРТОТО РАЗМЕР“

Докато свързваме GPS с местоположението в космоса, не забравяйте, че тези спътници също предават часове и дати. Средният GPS часовник е точен до една десетмилионна от секундата, а теоретичната граница е още по-висока. Дори ако имате нужда само от вашия проект, за да следите времето, GPS модулът може да е най -евтиното и лесно решение.

За да превърнете FindingYourself.ino в супер точен часовник, просто променете последните няколко реда така:

if (gps.time.isUpdated ()) {

char buf [80];

sprintf (buf, "Времето е%02d:%02d:%02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

Стъпка 8: Намерете своя път

Да намериш своя път
Да намериш своя път

Нашето трето и последно приложение е резултат от лично предизвикателство да напишете четлива скица на TinyGPS ++, в по -малко от 100 реда код, която да насочи потребителя до дестинация, използвайки прости текстови инструкции като „запази направо“или „обърни наляво“.

#включи #включи

#дефинирайте RXPin 2

#дефинирайте TXPin 3

#дефинирайте GPSBaud 4800

#define ConsoleBaud 115200

// Серийната връзка с GPS устройствотоSoftwareSerial ss (RXPin, TXPin);

// Обектът TinyGPS ++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Този пример показва основна рамка за това как можете да използвате курса и разстоянието, за да насочите човек (или дрон) до дестинация. Тази дестинация е Айфеловата кула. Променете го според изискванията

Най-лесният начин да получите координатата lat/long е да щракнете с десния бутон върху дестинацията в Google Maps (maps.google.com) и да изберете „Какво има тук?“. Това поставя точните стойности в полето за търсене

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Пример за GPS 3");

Serial.println ("Не толкова изчерпателна система за насочване");

Serial.println ("от Mikal Hart");

Serial.println ();

}

void loop () {

// Ако някакви знаци са пристигнали от GPS, // ги изпратете до обекта TinyGPS ++ while (ss.available ()> 0) gps.encode (ss.read ());

// На всеки 5 секунди прави актуализация

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Установяване на текущото ни състояние

двойно разстояниеToDestination = TinyGPSPlus:: distanceBetween

gps.location.lat (), gps.location.lng (), EIFFEL_LAT, EIFFEL_LNG);

двоен курсToDestination = TinyGPSPlus:: courseTo

gps.location.lat (), gps.location.lng (), EIFFEL_LAT, EIFFEL_LNG);

const char *directionToDestination = TinyGPSPlus:: кардинал (courseToDestination);

int courseChangeNeeded = (int) (360 + courseToDestination - gps.course.deg ()) % 360;

// отстраняване на грешки в Serial.print ("DEBUG: Course2Dest:");

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

Serial.print (gps.course.deg ());

Serial.print ("Dir2Dest:");

Serial.print (directionToDestination);

Serial.print ("RelCourse:");

Serial.print (courseChangeNeeded);

Serial.print ("CurSpd:");

Serial.println (gps.speed.kmph ());

// В рамките на 20 метра от местоназначението? Бяха тук

if (distanceToDestination <= 20.0)

{Serial.println ("ПОЗДРАВЛЕНИЯ: Пристигнахте!");

изход (1);

}

Serial.print ("DISTANCE:"); Serial.print (distanceToDestination);

Serial.println ("метри до края.");

Serial.print ("ИНСТРУКЦИЯ:");

// Стои неподвижно? Просто посочете в коя посока да тръгнете

ако (gps.speed.kmph () <2.0)

{

Serial.print ("Глава");

Serial.print (directionToDestination);

Serial.println (".");

връщане;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Продължавайте напред!");

иначе ако (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Завийте леко наляво.");

иначе ако (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Извийте леко надясно.");

иначе ако (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Завийте наляво.");

иначе ако (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Завийте надясно.");

иначе

Serial.println ("Обърнете се напълно.");

}

}

На всеки 5 секунди кодът улавя местоположението и курса на потребителя (посоката на движение) и изчислява лагера (посоката към дестинацията), като използва метода TinyGPS ++ courseTo (). Сравняването на двата вектора генерира предложение да продължите направо или да завиете, както е показано по -долу.

Копирайте скицата FindingYourWay.ino (по -горе) и я поставете в IDE на Arduino. Задайте дестинация на 1 или 2 километра, качете скицата на вашия Arduino, пуснете я на вашия лаптоп и вижте дали тя ще ви отведе там. Но по -важното е, че изучете кода и разберете как работи.

Стъпка 9: Отидете по -нататък

Творческият потенциал на GPS е огромен. Едно от най-удовлетворяващите неща, които някога съм правил, е кутия за пъзели с GPS, която се отваря само на едно предварително програмирано място. Ако вашата жертва иска да затвори съкровището вътре, тя трябва да разбере къде е това тайно място и физически да донесе кутията там. Популярна идея за първи проект е някакво устройство за регистриране, което записва минута по минута позиция и надморска височина на, да речем, турист, който върви по Trans-Pennine Trail. Или какво ще кажете за един от тези подли магнитни тракери, които агентите на DEA в Breaking Bad залепват по колите на лошите? И двете са напълно осъществими и вероятно биха били забавни за изграждане, но ви насърчавам да мислите по -обширно, извън нещата, които вече можете да купите в Amazon. Там е голям свят. Разходете се възможно най -далеч.

Препоръчано: