Оглавление:

Найти свой путь с помощью GPS: 9 шагов
Найти свой путь с помощью GPS: 9 шагов

Видео: Найти свой путь с помощью GPS: 9 шагов

Видео: Найти свой путь с помощью GPS: 9 шагов
Видео: Полезная функция Google карт 2024, Ноябрь
Anonim
В поисках пути с помощью GPS
В поисках пути с помощью GPS

Быстрое упражнение по пониманию и применению данных GPS

  • Требуемое время: 2 часа
  • Стоимость: 75–150 долларов.

Для производителей стало довольно дешево включать высококачественные геопространственные данные в проекты электроники. А за последние несколько лет модули приемников GPS (Global Positioning System) стали намного более разнообразными, мощными и легко интегрируемыми с платами разработки, такими как Arduino, PIC, Teensy и Raspberry Pi. Если вы думали о строительстве на основе GPS, вы выбрали подходящее время для начала.

Шаг 1. Как это работает

Модуль GPS - это крошечный радиоприемник, который обрабатывает сигналы, передаваемые на известных частотах множеством спутников. Эти спутники вращаются вокруг Земли по примерно круговым орбитам, передавая на землю чрезвычайно точные данные о местоположении и часах. Если наземный приемник может «видеть» достаточно этих спутников, он может использовать их для расчета своего местоположения и высоты.

Когда приходит сообщение GPS, приемник сначала проверяет метку времени его широковещательной передачи, чтобы узнать, когда оно было отправлено. Поскольку скорость радиоволны в космосе является известной константой (c), приемник может сравнивать время вещания и приема, чтобы определить расстояние, которое прошел сигнал. Как только он определил расстояние от четырех или более известных спутников, вычисление своего собственного положения становится довольно простой задачей трехмерной триангуляции. Но для того, чтобы делать это быстро и точно, приемник должен уметь быстро обрабатывать числа из 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 начинает посылать фрагменты текстовых данных по своей линии передачи. Возможно, он еще не видит ни одного спутника, а тем более не имеет «исправления», но сборщик данных включается сразу, и интересно посмотреть, что получится. Наш первый простой эскиз (ниже) ничего не делает, кроме отображения этих необработанных данных.

#include #define RXPin 2

# определить TXPin 3 # определить GPSBaud 4800

#define ConsoleBaud 115200

// Последовательное соединение с устройством GPS SoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println («Пример 1 GPS»);

Serial.println («Отображение необработанных данных NMEA, переданных модулем GPS.»);

Serial.println ("Микал Харт"); Serial.println ();

}

пустой цикл ()

{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.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Последовательное соединение с устройством GPS SoftwareSerial ss (RXPin, TXPin);

// Объект TinyGPS ++

TinyGPSPlus gps;

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println («Пример 2 GPS»);

Serial.println («Простой трекер с использованием TinyGPS ++.»);

Serial.println ("Микал Харт");

Serial.println ();

}

void loop () {

// Если какие-либо символы пришли из GPS, /

/ отправляем их объекту TinyGPS ++

в то время как (ss.available ()> 0)

gps.encode (ss.read ());

// Давайте отобразим новое местоположение и высоту

// всякий раз, когда любой из них был обновлен

если (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-карту или отображать их на ЖК-дисплее. Возьмите библиотеку и сделайте набросок FindingYourself.ino (вверху). Установите библиотеку, как обычно, в папку с библиотеками Arduino. Загрузите скетч в 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 строк кода, который направит пользователя к месту назначения с помощью простых текстовых инструкций, таких как «держитесь прямо» или «поверните налево».

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Последовательное соединение с устройством GPS SoftwareSerial ss (RXPin, TXPin);

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

беззнаковый длинный lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823 # define EIFFEL_LNG 2.29438

/ * В этом примере показана базовая структура того, как вы можете использовать курс и расстояние, чтобы направить человека (или дрон) к месту назначения. Это место назначения - Эйфелева башня. При необходимости измените его

Самый простой способ получить координаты широты и долготы - это щелкнуть правой кнопкой мыши пункт назначения на Картах Google (maps.google.com) и выбрать «Что здесь?». Это поместит точные значения в поле поиска

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println («Пример 3 GPS»);

Serial.println («Не очень исчерпывающая система навигации»);

Serial.println ("Микал Харт");

Serial.println ();

}

void loop () {

// Если какие-либо символы пришли от GPS, // отправляем их объекту TinyGPS ++ while (ss.available ()> 0) gps.encode (ss.read ());

// Каждые 5 секунд выполняем обновление

если (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = миллис ();

Serial.println ();

// Установить наш текущий статус

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

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

двойной courseToDestination = TinyGPSPlus:: courseTo

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

const char * directionToDestination = TinyGPSPlus:: cardinal (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 метров от пункта назначения? Были здесь

если (distanceToDestination <= 20.0)

{Serial.println («ПОЗДРАВЛЯЕМ: вы прибыли!»);

выход (1);

}

Serial.print ("РАССТОЯНИЕ:"); 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 (см. Выше) и вставьте его в среду разработки Arduino. Установите пункт назначения на расстоянии 1 км или 2 км, загрузите эскиз на свой Arduino, запустите его на своем ноутбуке и посмотрите, приведет ли он вас туда. Но что еще более важно, изучите код и поймите, как он работает.

Шаг 9: Идем дальше

Творческий потенциал GPS огромен. Одна из самых приятных вещей, которые я когда-либо создавал, - это ящик-головоломка с поддержкой GPS, который открывается только в одном заранее запрограммированном месте. Если ваша жертва хочет запереть сокровище внутри, она должна выяснить, где находится это секретное место, и физически принести туда ящик. Популярная идея первого проекта - это какое-то устройство регистрации, которое поминутно фиксирует положение и высоту, скажем, туриста, идущего по Транс-Пеннинской тропе. Или как насчет одного из тех хитрых магнитных трекеров, которые агенты DEA в «Во все тяжкие» прикрепляют к машинам плохих парней? Оба варианта полностью осуществимы, и, вероятно, их будет интересно построить, но я призываю вас мыслить шире, помимо вещей, которые вы уже можете купить на Amazon. Это большой мир. Бродите как можно дальше и шире.

Рекомендуемые: