Оглавление:

Регистратор GPS Arduino: 3 шага
Регистратор GPS Arduino: 3 шага

Видео: Регистратор GPS Arduino: 3 шага

Видео: Регистратор GPS Arduino: 3 шага
Видео: DIY Radar With Ultrasonic Sensor And Chat-GPT Generated Arduino Code | Coders Cafe 2024, Июль
Anonim
Регистратор GPS Arduino
Регистратор GPS Arduino
Регистратор GPS Arduino
Регистратор GPS Arduino

Привет, народ, Меня очень волнуют небольшие проекты, которые позволяют людям действительно понимать намного больше технологий, которые у нас есть каждый день.

Этот проект посвящен выходу GPS и регистрации SD. Я многому научился, просто создавая эти штуки.

После этого урока вы получите множество идей, а по ссылке, которую я предоставлю, вы получите больше информации.

Итак, что это то? Просто: это GPS-трекер, который регистрирует координаты (включая высоту), скорость и дату / время на microSD.

Что тебе понадобится:

- Arduino Nano (я на самом деле использовал UNO для создания скетча, но они такие же!) - Окончательный выход для GPS от Adafruit - Разрыв карты MicroSD - Инструменты для пайки (все, что вам нужно для пайки) - Универсальный стрипборд (я использовал а 5х7см) - Провода

Все эти компоненты довольно дешевы, за исключением модуля GPS. Это около 30-40 долларов и это самая дорогая часть. Даже новый набор паяльника может стоить дешевле.

Существует также щит Adafruit с модулями GPS и SD-карты вместе. Если вы хотите его использовать, имейте в виду, что он создан для Arduino UNO, поэтому вам понадобится UNO, а не Nano. Но в скетче разницы нет.

Поехали дальше…

Шаг 1: Подключение компонентов

Соединение компонентов
Соединение компонентов
Соединение компонентов
Соединение компонентов
Соединение компонентов
Соединение компонентов
Соединение компонентов
Соединение компонентов

Что ж, после того, как у вас есть компоненты, вам нужно будет их соединить. Здесь вы можете найти довольно наглядные схемы фритзинга. Впрочем, вот распиновка тоже:

MicroSD прорыв

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (если вы используете экран, он встроен в D10)

Разрыв GPS

Вин -> 5VGnn -> GnnRx -> D2Tx -> D3

Небольшие заметки об этом модуле: эти два маленьких мальчика общаются с Arduino разными путями. GPS использует последовательный порт TTL, тот же тип, который мы используем, когда общаемся с Arduino через Serial Monitor, поэтому мы должны объявить через библиотеку новый серийный номер (Tx и Rx), потому что GPS хочет использовать 9600 по умолчанию, и мы тоже хочу его использовать. Модуль GPS всегда и постоянно передает данные в потоковом режиме, если он подключен. Это сложная часть, с которой приходится иметь дело, потому что, если мы прочитаем предложение и затем напечатаем его, мы можем потерять следующее, которое тоже необходимо. Мы должны помнить об этом при кодировании!

MicroSD обменивается данными через SPI (последовательный периферийный интерфейс), еще один способ связи с платой. Такие модули всегда используют CLK на D13, DO на D12 и DI на D11. Иногда эти соединения имеют разные имена, например CLK = SCK или SCLK (последовательные часы), DO = DOUT, SIMO, SDO, SO, MTSR (все они обозначают главный выход) и DI = SOMI, SDI, MISO, MRST (главный вход). Наконец, у нас есть CS или SS, который указывает контакт, на который мы отправляем то, что хотим записать на MicroSD. Если вы хотите использовать два разных модуля SPI, вам просто нужно различать этот вывод, чтобы использовать их оба. Например, ЖК-экран И MicroSd, как тот, который мы используем. Он также должен работать с двумя разными ЖК-дисплеями, подключенными к разным базовым станциям.

Припаяйте эти детали вместе на плате, и все готово для загрузки эскиза!

Как вы можете видеть на скетче, я припаял несколько гнездовых соединителей dupont вместо прямого компонента, потому что в будущем я, возможно, захочу повторно использовать компонент или изменить его.

Я также спаял модуль GPS с разъемами в неправильном направлении, это была моя вина, и я не хотел этого делать, но он работает, и я не хочу рисковать, чтобы сломать его, пытаясь отпаять этих маленьких ублюдков! Просто припаяйте правильно и все будет хорошо!

Вот несколько полезных видео по пайке: Руководство по пайке для начинающих Видео о демонтаже

Youtube канал Adafruit, много интересного!

При пайке старайтесь использовать ровно столько металла, сколько вам нужно, иначе вы напутаете. Не бойтесь этого делать, возможно, начните с чего-нибудь не такого дорогого, а потом продолжайте паять разные вещи. Правильный материал также имеет значение!

Шаг 2: набросок

Сначала, конечно, мы импортируем библиотеки и создаем их объекты для работы: SPI.h предназначен для связи с модулями SPI, SD - это библиотека MicroSD, а Adafruit_GPS - это библиотека модуля GPS. SoftwareSerial.h предназначен для создания последовательного порта с помощью программного обеспечения. Синтаксис: «mySerial (TxPin, RxPin);». Объект GPS необходимо указать на серийный номер (в скобках). Вот ссылки на библиотеки для Adafruit GPS breakout, MicroSD breakout (чтобы выполнить чистую работу, вы также должны отформатировать SD с помощью этого программного обеспечения из ассоциации SD) и Программная последовательная библиотека (она должна быть включена в IDE).

ПРИМЕЧАНИЕ. Я столкнулся с проблемой при попытке добавить много информации в один файл или при использовании более двух файлов в скетче. Я не форматировал SD с помощью этого программного обеспечения, возможно, это решит проблему. Кроме того, я попытался добавить в устройство еще один датчик, BMP280 (модуль I2C), но безуспешно. Похоже, использование модуля I2C сводит скетч с ума! Я уже писал об этом на форуме Adafruit, но до сих пор не получил ответа.

#include "SPI.h" #include "SD.h" #include "Adafruit_GPS.h" #include "SoftwareSerial.h" SoftwareSerial mySerial (3, 2); Adafruit_GPS GPS (& mySerial);

Теперь нам нужны все наши переменные: две строки предназначены для чтения двух предложений, которые нам нужны для вычисления кучи полезной информации от GPS. Символ предназначен для хранения предложений перед их синтаксическим анализом, числа с плавающей запятой предназначены для вычисления координат в градусах (при отправке GPS используются координаты в градусах и минутах, они нужны нам в градусах, чтобы можно было читать в Google Earth). ChipSelect - это контакт, на который мы подключаем CS карты MicroSD. В данном случае это D4, но если вы используете SD-экран, вам нужно будет указать здесь D10. Переменная файла - это та, которая хранит информацию о файле, который мы используем во время скетча.

Строка NMEA1;

Строка NMEA2; char c; float deg; float degWhole; float degDec; int chipSelect = 4; File mySensorData;

Теперь мы объявляем пару функций fo, чтобы сделать скетч более элегантным и менее беспорядочным:

В основном они делают то же самое: читают предложения NMEA. clearGPS () игнорирует три предложения, а readGPS () сохраняет два из них в переменных.

Давайте посмотрим, как: Цикл while контролирует наличие новых предложений NMEA в модуле и считывает поток GPS, пока он не появится. Когда появляется новое предложение, мы выходим из цикла while, где предложение фактически читается, анализируется и хранится в первых переменных NMEA. Сразу же делаем то же самое для следующего, потому что GPS постоянно транслирует, он не ждет, когда мы будем готовы, у нас нет времени сразу его распечатать

Это очень важно! Ничего не делайте, пока не заполните оба предложения, иначе второе в конечном итоге будет испорчено или просто неверно.

Получив два предложения, мы печатаем их в сериале, чтобы контролировать, как все идет хорошо.

void readGPS () {

clearGPS (); while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA1 = GPS.lastNMEA (); while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA2 = GPS.lastNMEA (); Serial.println (NMEA1); Serial.println (NMEA2); } void clearGPS () {while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); w while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); }

Что ж, теперь, когда мы все настроены, мы можем пройти через setup ():

Во-первых: мы открываем связь по Serial 115200 для ПК Arduino и по 9600 для модуля GPS Arduino. Во-вторых: мы отправляем три команды на модуль GPS: первая - отключить обновление антенны, вторая - запросить только строку RMC и GGA (мы будем использовать только те, которые имеют всю информацию, которая вам когда-либо понадобится. a GPS), третья и последняя команда - установить частоту обновления 1 Гц, предложенную Adafruit.

После этого мы устанавливаем вывод D10 на ВЫХОД, если и только если вывод CS вашей модели SD отличается от D10. Сразу после этого установите CS на модуль SD на вывод chipSelect.

Мы запускаем функции readGPS (), которые включают cleanGPS ().

Пришло время что-то записать в файлы! Если файл уже находится на SD-карте, добавьте к ним отметку времени. Таким образом, нам не нужно отслеживать сеансы или каждый раз стирать файлы. Имея метку времени, записанную в функции настройки, мы уверены, что просто добавим разделение в файлы только один раз за сеанс.

ПРИМЕЧАНИЕ: SD-библиотека очень серьезно относится к открытию и закрытию файла каждый раз! Имейте это в виду и закрывайте каждый раз! Чтобы узнать о библиотеке, перейдите по этой ссылке.

Хорошо, у нас действительно все готово, чтобы получить ядро части скетча, связанной с потоком и логированием.

void setup () {

Serial.begin (115200); GPS.begin (9600); // Отправляем команды в модуль GPS GPS.sendCommand ("$ PGCMD, 33, 0 * 6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); задержка (1000); // только если вывод CS вашего SD-модуля не на выводе D10

pinMode (10, ВЫХОД);

SD.begin (chipSelect); readGPS (); если (SD.exists ("NMEA.txt")) {mySensorData = SD.open ("NMEA.txt", FILE_WRITE); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); } если (SD.exists ("GPSData.txt")) {mySensorData = SD.open ("GPSData.txt", FILE_WRITE); mySensorData.println (""); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); }}

Теперь у нас получилась сердцевина скетча.

Это действительно очень просто.

Мы собираемся читать поток GPS с помощью функции readGPS (), чем мы контролируем, есть ли у нас исправление, равное 1, это означает, что мы подключены к спутнику e. Если мы его получим, мы запишем нашу информацию в файлы. В первый файл «NMEA.txt» мы пишем только сырые предложения. Во втором файле «GPDData.txt» мы добавляем координаты (преобразованные с помощью функций, которые мы видели ранее) и высоту. Этой информации достаточно, чтобы скомпилировать файл.kml для создания пути в Google Планета Земля. Обратите внимание, что мы закрываем файлы каждый раз, когда открывали их, чтобы что-то написать!

void loop () {

readGPS (); // Condizione if Che controlla se l'antenna ha segnale. Se si, пройдите con la scrittura dei dati. if (GPS.fix == 1) {// Сохранять данные, только если у нас есть исправление mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // Предварительный файл для файлового формата NMEA mySensorData.println (NMEA1); // Записываем первый файл NMEA в mySensorData.println (NMEA2); // Считываем второй файл NMEA mySensorData.close (); // Файл Чиуде !!

mySensorData = SD.open ("GPSData.txt", FILE_WRITE);

// Преобразование продольной оси convLong (); mySensorData.print (градус, 4); // Вывести координату файла в градиентный файл mySensorData.print (","); // Вычислить девичник для отдельных данных Serial.print (deg); Serial.print (","); // Преобразование широты convLati (); mySensorData.print (градус, 4); // Вывести координату файла в градиентный файл mySensorData.print (","); // Вычислить девичник для отдельных данных Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.высота); mySensorData.close (); }}

Теперь, когда все готово, вы можете загрузить эскиз, собрать устройство и наслаждаться им!

Обратите внимание, что вам нужно использовать его, когда борад GPS обращен к небу, чтобы получить фиксированное значение = 1, или вы можете подключить к нему внешнюю антенну.

Кроме того, имейте в виду, что если есть исправление, красный свет мигает каждые 15 секунд, если вы этого не сделаете, намного быстрее (каждые 2-3 секунды).

Если вы хотите узнать больше о предложениях NMEA, просто следуйте следующему шагу этого руководства.

Шаг 3. Предложения NMEA и файл.kml

Девайс и набросок готовы, работают нормально. Имейте в виду, что для фиксации (для связи со спутниками) точка выхода должна быть обращена в небо.

Когда вы исправили, маленький красный свет мигает каждые 15 секунд

Если вы хотите лучше понять предложения NMEA, вы можете прочитать дальше.

В скетче мы используем только два предложения: GGA и RMC. Это всего лишь пара предложений, которые передает модуль GPS.

Посмотрим, что в этой строке:

$ GPRMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003.1, W * 6A

RMC = Рекомендуемое минимальное предложение C 123519 = Исправление принято в 12:35:19 UTC A = Состояние A = активно или V = Пустота 4807.038, N = Широта 48 градусов 07.038 'N 01131.000, E = Долгота 11 градусов 31.000' E 022.4 = Скорость над землей в узлах 084.4 = Угол пути в градусах Истинно 230394 = Дата - 23 марта 1994 г. 003.1, W = Магнитное отклонение * 6A = Данные контрольной суммы всегда начинаются с *

$ GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M,, * 47

Данные фиксации глобальной системы позиционирования GGA 123519 Исправление получено в 12:35:19 UTC 4807.038, северная широта 48 градусов 07.038 'северной широты 01131.000, восточная долгота 11 градусов 31.000' восточной долготы 1 Качество фиксации: 0 = недействительно; 1 = местоположение GPS (SPS); 2 = местоположение DGPS; 3 = исправление PPS; 4 = кинематика в реальном времени; 5 = плавающий RTK; 6 = оценочный (точный счет) (2.3 признак); 7 = ручной режим ввода; 8 = режим моделирования; 08 Количество отслеживаемых спутников 0,9 Горизонтальное разбавление положения 545,4, M Высота, метры, над средним уровнем моря 46,9, M Высота геоида (средний уровень моря) над эллипсоидом WGS84 (пустое поле) время в секундах с момента последнего обновления DGPS (пустое поле) Идентификационный номер станции DGPS * 47 данные контрольной суммы, всегда начинаются с *

Как видите, там гораздо больше информации, чем то, что вам нужно. Используя библиотеку Adafruit, вы можете вызвать некоторые из них, например GPS.latitude или GPS.lat (широта и широта полушария) или GPS.day/month/year/hour/minute/seconds/milliseconds … Взгляните на Adafruit веб-сайт, чтобы узнать больше. Не все так однозначно, но, следуя некоторым подсказкам в руководстве по модулям GPS, вы сможете найти то, что вам нужно.

Что мы можем сделать с файлами, которые у нас есть? Легко: скомпилируйте файл kml, чтобы показать путь в Google Планета Земля. Для этого просто скопируйте / вставьте код, который вы найдете по этой ссылке (под абзацем Путь), поместите свои координаты из файла GPDData.txt между тегами, сохраните файл с расширением.kml и загрузите его. Гугл Земля.

ПРИМЕЧАНИЕ. Язык разметки.kml прост, если вы уже знаете, что такое язык разметки, не торопитесь, чтобы прочитать предыдущую ссылку и документацию внутри, это действительно интересно!

Использование kml означает знать его теги и аргументы. Я нашел только руководство от Google, которое я связал ранее, и основная часть состоит в том, чтобы определить стиль между тегами и вызвать его с помощью знака #, когда пришло время записывать координаты.

В этот раздел я добавил файл.kml, в который вы можете просто вставить свои координаты. не забудьте вставить с таким синтаксисом: долгота, широта, высота

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