Ребятушки всем Привет. Сегодня запилим с вами простенький GPS-трекер на Arduino. Давно хотел сделать что-то подобное. Координаты будут определяться приёмником спутниковой навигации и раз в пять секунд записываться на microSD. Запись трека включается автоматически. Все это дело потом выложим на Google Maps и посмотрим трек.
Что нам понадобиться для того чтобы собрать наш проект:
- Arduino Uno (вообщем-то какой будет ардуино не очень важно, главное чтобы подходил шилд У меня вот такой http://ali.pub/40whof);
- GPS\GLONASS модуль (в моем варианте Neo 6M); Брал тут http://ali.pub/40wfxm
- SD CARD шилд (может быть также любой, хоть самодельный, у меня получился Ethernet шилд c SD CARD модулем); Вот такой http://ali.pub/40wgsj
- Естественно SD карта для записи трэка;
- Картридер;
- PowerBank или любое другое автономное питание.
В моем случае все очень просто. Модули собираются как часы, поэтому особых трудностей не возникло. Для получения данных от GPS модулю используем библиотеку SoftwareSerial и определяем выводы rx/tx на 6 и 7 пин Arduino соответственно. SD карту форматируем под систему FAT16 или FAT32. Это точно и безоговорочно. Arduino не работает с форматами NTFS и др.
Так теперь немного о скетче для Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <SD.h> #include <SPI.h> long startMillis = millis(); static const int RXPin = 6, TXPin = 7; static const uint32_t GPSBaud = 9600; // The TinyGPS++ object TinyGPSPlus gps; // Инициализируем подключение к GPS SoftwareSerial ss(RXPin, TXPin); File GPS_file; const int chipSelect = 4; void setup() { Serial.begin(115200); ss.begin(GPSBaud); // Инициализируем SD карту, для отладки можно раскомментировать. { if (!SD.begin(chipSelect)) { //Serial.println("Card failed, or not present"); // don't do anything more: while (1); } // Serial.println("card initialized."); File GPS_file = SD.open("GPSLOG.csv", FILE_WRITE); // если файл существует if (GPS_file) { // записываем название будущих данных на карту памяти GPS_file.println("Lat, Long, Time"); // закрываем файл GPS_file.close(); } } } void loop() { // Если данные декодированы корректно тогда начинаем запись. while (ss.available() > 0) if (gps.encode(ss.read())) if (millis() - startMillis > 4900) { startMillis = millis(); logGps(); } if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while(true); } } void logGps() // Все закомментированные строки с Serial, нужны для отладки. { GPS_file = SD.open("GPSLOG.csv", FILE_WRITE); if(GPS_file){ //Serial.print(F("Location: ")); //GPS_file.print(F("Location: ")); if (gps.location.isValid()) { /*Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); */GPS_file.print(gps.location.lat(), 6); GPS_file.print(F(",")); GPS_file.print(gps.location.lng(), 6); } else { //Serial.print(F("INVALID")); GPS_file.print(F("INVALID")); } //Serial.print(F(" Date/Time: ")); GPS_file.print(F(", ")); if (gps.date.isValid()) { /*Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.year()); */GPS_file.print(gps.date.month()); GPS_file.print(F("/")); GPS_file.print(gps.date.day()); GPS_file.print(F("/")); GPS_file.print(gps.date.year()); } else { // Serial.print(F("INVALID")); GPS_file.print(F("INVALID")); } // Serial.print(F(" ")); GPS_file.print(F(" ")); if (gps.time.isValid()) { /*if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); */ if (gps.time.hour() < 10) Serial.print(F("0")); GPS_file.print(gps.time.hour()); GPS_file.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); GPS_file.print(gps.time.minute()); GPS_file.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); GPS_file.print(gps.time.second()); GPS_file.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); GPS_file.print(gps.time.centisecond()); } else { //Serial.print(F("INVALID")); GPS_file.print(F("INVALID")); } //Serial.println(); GPS_file.println(); GPS_file.close(); } } |
Понятное дело, что используя библиотеку TinyGps++ можно выводить какие хочешь данные. Скорсть, высоту над уровнем моря и еще кучу всего. Если есть желание то можно прикрутить датчик температуры, влажности, да и вообще что в голову взбредет.
Импорт данных
Скопируйте файл GPSLOG.csv с microSD на свой компьютер.
Зайдите на сервис Google My Maps и нажмите кнопку + создать новую карту в верхнем левом углу экрана.
Откроется карта со слоем, на который можно нанести собственные метки.
Нажмите кнопку импорт
и выберите сохранённый файл GPSLOG.csv
Укажите колонку таблицы с координатами — это столбец с названием Lat, Long. Трекер пишет сначала широту, затем долготу.
Выберите данные, которые будут отображаться как названия маркеров. Вы можете выбрать дату и время создания метки, координаты метки.
Трек готов. Расшарьте свою карту и поделитесь маршрутами путешествий с друзьями.
Ну и вот расшаренная карта из Google Maps специально для вас.
Друзья. Если вам понравилась эта статья, поделитесь ей в социальных сетях. Обязательно напишите комментарий если у вас возникли вопросы. Мне важно ваше мнение. У нас есть групповой чат в Telegram, где вы можете оперативно задать вопрос и узнать о последних новостях. И поддержите проект монеткой на страничке Donate.