Arduino gps трекер для машины. Лучшие GPS-трекеры для машины (маяки)

Сегодня мы сделаем GPS Tracker на основе Arduino MKR FOX 1200, который отправляет точный GPS-данные через сеть Sigfox.

Это становится еще актуальней для многих стран в связи усилением контроля за любыми ввозимыми техническими устройствами, а особенно связанными с GPS.

Шаг 1. Что нам пригодится

Набор деталей для этого урока не велик:

  • Arduino MKR Fox 1200 × 1
  • Модуль GPS (на выбор, но мы использовали реплику ublox NEO6m (ATGM332D) × 1
  • Транзистор общего назначения NPN (мы использовали BC548) × 1
  • Резистор 1 кОм × 1

Шаг 2. Информация о проекте

Трекер использует GPS-модуль ATGM332, чтобы получить GPS-положение с большей точностью, чем услуги определения местоположения, предоставляемые Sigfox. Затем данные позиции отправляются как «строка» через сеть Sigfox и, наконец, доставляются по электронной почте.

Arduino MKR FOX 1200

Плата похожа на Arduino Zero, которая основана на SAM D21 и включает модуль ATA8520 Sigfox. Это плата с низким энергопотреблением, которая поставляется вместе с платой с бесплатной подпиской на один год в сеть Sigfox (до 140 сообщений в день), а также бесплатным доступом к службе геолокации Spot"it .

GPS-модуль ATGM332

Этот недорогой маломощный GPS-модуль очень хорошо подходит для Arduino MKR FOX 1200, поскольку он работает только с 2,7 В (номинальный 3,3 В).

Первоначально должен был быть куплен модуль NEO6m2, который имеет режим ожидания, но пришлось использовать NEO6. Фактически это был модуль ATGM332. В результате у него не было режима ожидания, поэтому нужно было использовать транзистор для включения модуля GPS, когда это необходимо, и выключить его, чтобы сэкономить аккумулятор. Наша цель - иметь информацию о местоположении довольно редко, то есть 4 сообщения в час, поскольку Sigfox позволяет только 140 сообщений в день.

Мы используем библиотеку TinyGPS (https://github.com/mikalhart/TinyGPS) для декодирования кадров GPS.

Транзисторный переключатель

Нужно было включить и выключить GPS, когда это необходимо. Модули реле слишком громоздки и мощны, если нужно только переключить нагрузку 3 В и несколько миллиампер. Кроме того, для большинства модулей реле требуется 5 В. Таким образом, транзистор будет лучшим решением. Кроме того, MKR FOX 1200 обеспечивает только 7 мА на пине ввода/вывода.

Подойдет транзистор BC548 NPN. Когда нулевой сигнал подается на базу транзистора, он выключается, действуя как открытый выключатель, и ток коллектора не течет. При положительном сигнале, подаваемом на базу транзистора, он становится «включенным», действующим как замкнутый переключатель, и максимальный ток цепи протекает через устройство.

Шаг 3. Схема соединения

Единственным источником питания являются две 1,5-вольтовых батареи AA, которые питают Arduino MKR FOX 1200. Модуль GPS получает питание от платы Arduino.

Arduino MKR FOX 1200 взаимодействует с модулем GPS, используя второй последовательный порт через контакты 13 и 14, называемые Serial1 в коде. Выход TX-данных модуля GPS подключается к последовательному входу данных (контакт 13) платы Arduino.

Кроме того, плата Arduino использует PIN2 для включения и выключения модуля GPS, как объясняется выше.

Шаг 4. Код проекта

Код нашего проекта вы можете скачать или скопировать ниже:

#include #include #include //incluimos TinyGPS #define WAITING_TIME 15 #define GPS_PIN 2 #define GPS_INFO_BUFFER_SIZE 128 bool debug = false; TinyGPS gps;//GPS Object //GPS data variables int year; byte month, day, hour, minute, second, hundredths; unsigned long chars; unsigned short sentences, failed_checksum; char GPS_info_char; char GPS_info_buffer; unsigned int received_char; bool message_started = false; int i = 0; // GPS coordinate structure, 12 bytes size on 32 bits platforms struct gpscoord { float a_latitude; // 4 bytes float a_longitude; // 4 bytes float a_altitude; // 4 bytes }; float latitude = 0.0f; float longitude = 0.0f; float altitud = 0; //////////////// Waiting function ////////////////// void Wait(int m, bool s) { //m minutes to wait //s slow led pulses if (debug) { Serial.print("Waiting: "); Serial.print(m); Serial.println(" min."); } digitalWrite(LED_BUILTIN, LOW); if (s) { int seg = m * 30; for (int i = 0; i < seg; i++) { digitalWrite(LED_BUILTIN, HIGH); //LED on delay(1000); digitalWrite(LED_BUILTIN, LOW); //LED off delay(1000); } } else { int seg = m * 15; for (int i = 0; i < seg; i++) { digitalWrite(LED_BUILTIN, HIGH); //LED on delay(1000); digitalWrite(LED_BUILTIN, LOW); //LED off delay(3000); } } } /////////////////// Sigfox Send Data function //////////////// void SendSigfox(String data) { if (debug) { Serial.print("Sending: "); Serial.println(data); if (data.length() > 12) { Serial.println("Message too long, only first 12 bytes will be sent"); } } // Remove EOL //data.trim(); // Start the module SigFox.begin(); // Wait at least 30mS after first configuration (100mS before) delay(100); // Clears all pending interrupts SigFox.status(); delay(1); if (debug) SigFox.debug(); delay(100); SigFox.beginPacket(); SigFox.print(data); if (debug) { int ret = SigFox.endPacket(true); // send buffer to SIGFOX network and wait for a response if (ret > 0) { Serial.println("No transmission"); } else { Serial.println("Transmission ok"); } Serial.println(SigFox.status(SIGFOX)); Serial.println(SigFox.status(ATMEL)); if (SigFox.parsePacket()) { Serial.println("Response from server:"); while (SigFox.available()) { Serial.print("0x"); Serial.println(SigFox.read(), HEX); } } else { Serial.println("Could not get any response from the server"); Serial.println("Check the SigFox coverage in your area"); Serial.println("If you are indoor, check the 20dB coverage or move near a window"); } Serial.println(); } else { SigFox.endPacket(); } SigFox.end(); } ////////////////// Convert GPS function ////////////////// /* Converts GPS float data to Char data */ String ConvertGPSdata(const void* data, uint8_t len) { uint8_t* bytes = (uint8_t*)data; String cadena ; if (debug) { Serial.print("Length: "); Serial.println(len); } for (uint8_t i = len - 1; i < len; --i) { if (bytes[i] < 12) { cadena.concat(byte(0)); // Not tested } cadena.concat(char(bytes[i])); if (debug) Serial.print(bytes[i], HEX); } if (debug) { Serial.println(""); Serial.print("String to send: "); Serial.println(cadena); } return cadena; } ////////////////////////// Get GPS position function///////////////////// String GetGPSpositon() { int messages_count = 0; String pos; if (debug) Serial.println("GPS ON"); digitalWrite(GPS_PIN, HIGH); //Turn GPS on Wait(1, false); while (messages_count < 5000) { while (Serial1.available()) { int GPS_info_char = Serial1.read(); if (GPS_info_char == "$") messages_count ++; // start of message. Counting messages. if (debug) { if (GPS_info_char == "$") { // start of message message_started = true; received_char = 0; } else if (GPS_info_char == "*") { // end of message for (i = 0; i < received_char; i++) { Serial.write(GPS_info_buffer[i]); // writes the message to the PC once it has been completely received } Serial.println(); message_started = false; // ready for the new message } else if (message_started == true) { // the message is already started and I got a new character if (received_char <= GPS_INFO_BUFFER_SIZE) { // to avoid buffer overflow GPS_info_buffer = GPS_info_char; received_char++; } else { // resets everything (overflow happened) message_started = false; received_char = 0; } } } if (gps.encode(GPS_info_char)) { gps.f_get_position(&latitude, &longitude); altitud = gps.altitude() / 100; // Store coordinates into dedicated structure gpscoord coords = {altitud, longitude, latitude}; gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths); if (debug) { Serial.println(); Serial.println(); Serial.print("Latitud/Longitud: "); Serial.print(latitude, 5); Serial.print(", "); Serial.println(longitude, 5); Serial.println(); Serial.print("Fecha: "); Serial.print(day, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year); Serial.print(" Hora: "); Serial.print(hour, DEC); Serial.print(":"); Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); Serial.print("."); Serial.println(hundredths, DEC); Serial.print("Altitud (metros): "); Serial.println(gps.f_altitude()); Serial.print("Rumbo (grados): "); Serial.println(gps.f_course()); Serial.print("Velocidad(kmph): "); Serial.println(gps.f_speed_kmph()); Serial.print("Satelites: "); Serial.println(gps.satellites()); Serial.println(); } gps.stats(&chars, &sentences, &failed_checksum); if (debug) Serial.println("GPS turned off"); digitalWrite(GPS_PIN, LOW); //GPS turned off pos = ConvertGPSdata(&coords, sizeof(gpscoord)); //Send data return pos; } } } pos = "No Signal"; } //////////////////SETUP/////////////////// void setup() { if (debug) { Serial.begin(9600); while (!Serial) {}// wait for serial port to connect. Needed for native USB port only Serial.println("Serial Connected"); } //Serial1 pins 13-14 for 3.3V connection to GPS. Serial1.begin(9600); while (!Serial1) {} if (debug) { Serial.println("GPS Connected"); } pinMode(GPS_PIN, OUTPUT); //pin de interruptor del GPS if (!SigFox.begin()) { Serial.println("Shield error or not present!"); return; } // Enable debug led and disable automatic deep sleep if (debug) { SigFox.debug(); } else { SigFox.end(); // Send the module to the deepest sleep } } //////////////////////LOOP//////////////////////// void loop() { String position_data; position_data = GetGPSpositon(); SendSigfox(position_data); Wait(WAITING_TIME, false); }

Шаг 5. Отправка информации GPS через Sigfox

Мы хотел отправить информацию GPS с использованием данных типа float, но когда мы попытались, то всегда получали нулевые значения.

Поиск в Интернете привел на этот проект на GitHub - https://github.com/nicolsc/SmartEverything_SigFox_GPS от Николя Лискони. Он использует AT-команды для отправки любого типа данных и конвертирует "float" в "hex". Тем не менее у Arduino MKR FOX 1200 нет режима AT, и мы не смогли заставить её работать.

Было сделано несколько десятков тестов и, изменив код Николя, был найден способ отправить «строку», которая была проанализирована платформой Sigfox «float: 32», и ее можно было бы использовать напрямую без какого-либо преобразования.

Данные Sigfox ограничены 12 байтами. Данные, которые отправляются в сеть SigFox:

  • Широта, float: 32 типа (float:32type), 4 байта.
  • Долгота, float: 32 типа (float:32type), 4 байта.
  • Высота, float: 32 типа (float:32type), 4 байта.

Шаг 6. Конфигурация обратного вызова Sigfox

Конфигурация пользовательского обратного вызова Sigfox:

Lat::float:32lng::float:32 alt::float:32

Вы получите электронное письмо:

Чтобы легко видеть позицию, мы включили URL-адрес в Карты Google, используя полученную информацию:

И, наконец, результат работы нашего Arduino GPS-трекера:

На этом всё, желаю вам отличных проектов!

Тарас Каленюк

Время на чтение: 3 минуты

А А

GPS трекер

Ардуино – это возможность для каждого создать сложные вещи просто. А также своего рода конструктор, как для взрослых, так и для детей. С помощью Arduino воплощаются мечты, создаются и оживают роботы.

Ардуино обладает большим выбором плат, предназначенных для выполнения разного объема и вида работ. Самые популярные из них – Arduino Uno, Ardino Mega, Arduino Nano и Arduino Leonardo. Также есть еще большой выбор вариантов для конкретных случаев.

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

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

Цель создания GPS трекера

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

Геотрекеров сейчас великое множество, однако, как говорит пословица – «Хочешь сделать что-то хорошо – сделай это сам». При наличии понимания как должно это работать, или при желании разобраться во всем самому, шанс создать выглядит предпочтительным.

К тому же в каждом из нас живет параноик. Иногда он тише, иногда громче. Доверия чужим «жучкам» нет. Лучше сделать самому и точно знать, что прослушивать его будешь только ты, а не пять соседних держав.

Работа

Для создания GPS трекера Arduino были изучены всевозможные материалы в интернете. И принято решение остановиться на таких запчастях:

  • модуль Sim808 – для использования сим-карты;
  • GPS и GSM антенны;
  • непосредственно плата Arduino nano и переходники к ней, для скрепления всего со всем.

Схема, найденная в интернете, оказалась невероятно проста. В качестве учебного занятия в будущем после ознакомления с Arduino самостоятельно имеет смысл создать еще один GPS/GSM трекер со своим ребенком.

Подключив схему Ардуино к модулю сим, подключаем антенны, и обеспечиваем всё это зарядом батареи на 12В. И это всё. Гениально и просто. Далее при помощи Ардуино и имеющегося скретча прошиваем получившийся аппарат и вуаля – готово.

Результаты

Можно рассчитывать, что пока маяк Ардуино находится внутри машины, с ней ничего не произойдет. Данные о геолокации автомобиля приходят по мановению руки прямо на телефон. Если произойдет угон, вы тут же сможете получить данные о местонахождение вашего авто. Однако чаще всего, вы просто наблюдаете за передвижениями жены от дома до магазина и обратно. Но в полезности аппарата сомневаться не приходится.

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

В интернете существуют статьи про более сложные системы и платы, но целесообразности их использования или замены на них того что есть нет. Как говорится «зачем исправлять то, что и так работает».

Из замечаний стоит отметить, что просветы между точками геолокации машины слишком высоки, хотя в этом виновата программная часть. У покупных китайских аналогов есть возможности записи голосов вокруг, и в целом они выглядят намного компактнее того что сделано при помощи Ардуино.

Судя по отзывам у китайских аналогов и проблем с частотой записи нет, и даже обрывы связи незаметны у некоторых моделей. Хотя по цене они выходят также как то, что сделано из Ардуино. Из этого вытекает рекомендация – если вы не инженер в душе, и тяги к изобретениям у вас нет, проще всё-таки купить готовый китайский продукт, чем делать крупногабаритное свое.

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

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

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

Шаг 1: Модуль автотрекера




Показать еще 3 изображения




Модуль дисплея состоит из нескольких основных компонентов, которые можно заказать на Ибэе:

  • GPS модуль NEO6M от компании Ublox (на фото)
  • Магнитометр LSM303DLHC (на фото)
  • Графический дисплей LCD5110 (на фото)
  • Кастомная печатная плата Arduino
  • Литиевый аккумулятор (на фото)

Для питания я использовал 3,7 В литий-ионный аккумулятор. Такие обычно используют для некоторых смартфонов и планшетов, они бывают разных размеров и емкости. Я припаял разъем JST2.0 для подключения аккумулятора, но какой использовать пока не решил.

Вы можете также использовать аккумуляторы типоразмера 18650.
Я купил зарядное устройство на 1А для литий-ионных аккумуляторов с USB разъемом. К нему я прикрепил коннектор JST2.0 для заряда этих аккумуляторов.

Внимание! Стандартный USB порт на компьютере выдает только 0,5 А, поэтому процесс заряда от компьютера будет идти дольше. Заряд займет меньше времени, если использовать источник питания на 1 или 2А, например, USB-адаптер переменного тока.

Схема платы Arduino приложена. Питание регулируется 3,3 В регулятором. S1 – кнопка выключателя.
Buz1,2 – контакты для зуммера, не используются.
Коннектор, помеченный nrf24L01, также не используется.
Коннектор USB-BUB, используется для загрузки скетчей на Arduino.
На фото с дисплеем показана «стрелка», показывающая на предмет и расстояние до него.

Принцип действия:
Модуль GPS постоянно измеряет широту и долготу места нахождения автотрекера. При нажатии кнопки эти данные сохраняются на EEPROM. Таким образом, сохранено место положения вашей машины.
А теперь, допустим, вы вышли из магазина и вспоминаете, где вы оставили свой автомобиль. Включите трекер машины, но не нажимайте на кнопку. Модуль GPS высчитает ваши координаты и вычислит расстояние до сохраненного места положения машины и направление, в котором она стоит. На дисплей будет выведена информация о расстоянии до машины и стрелка будет показывать направление, в котором машина находится.

Шаг 2: Скетчи Arduino

Скетч для автотрекера: файл ArduinoCarTracker.zip

У меня установлен «стандартный» штыревой контакт USB-BUB, поэтому нужен USB-BUB адаптер или аналог (PL2303)
GPS: TinyGPS++ библиотека ссылка
LSM303DLHC: файл Compass.zip

CALIBRATE (Калибровка): эта программа аналогична программе Serial Calibrate в Примерах, но вместо отображения последних считанных данных, она отображает на LCD5110 дисплее максимальные и минимальные считанные данные с каждой оси магнитометра. Эти значения можно использовать для калибровки указания курса и примера маршрута, проведя акселерометр LSM303 через все возможные координаты.

Я изменил программу так, чтобы максимумы и минимумы выводились на дисплей. Запустите программу на модуле трекера. Запустите программу, и медленно и аккуратно поворачивайте и наклоняйте модуль во всех направлениях. Запишите максимумы и минимумы, отображенные на дисплее, и вставьте их в программу, заменяя значения в следующих строках:
compass.m_min = (LSM303::vector){-433, -600, -546};
compass.m_max = (LSM303::vector){+570, +488, +579};
это должно повысить точность компаса.

Когда я качал обновления для Arduino, мне пришлось обновить также библиотеки Adafruit_GFX и Adafruit_PCD8544. Вот ссылки:
Adafruit_GFX
Adafruit_PCD8544
Резюме скетча автотрекера:

Кроме функций setup и loop, я прописал шесть функций:

void setSetPoint(); // установка SetPoint, сохранение координат широты и долготы в EEPROM
void getGPS(); // получение текущих данных GPS
void calculate(); // вычисление дистанции и направления
int getHeading(); // получение данных направления с компаса
byte getPostion(int); // вычисление позиции с помощью направления
void displayDirection(); // выводит данные на дисплей
Блок команд setup() — считывание в EEPROM заданных координат, запуск GPS, компаса, запуск дисплея.
Блок цикличных команд loop() – получение текущих координат с GPS, высчитывание расстояния и направления до заданной точки, вывод на дисплей значения расстояния и стрелки, показывающей направление.
Другие программы для Arduino:
Compass: простой компас, указывающий на север и показывающий направление на дисплее.
GPStoLCD: вывод GPS координат на дисплей.

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

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

В этом проекте мы покажем вам как связать Arduino Uno с GPS модулем, а получаемые данные по долготе и широте отобразим на ЖК-дисплее.

Основные комплектующие

Нам для проекта нужны:

  • Arduino Uno
  • Модуль GPS NEO-6m
  • ЖК-дисплей
  • 10K резистор

Информация о GPS

Что такое GPS?

Глобальная система позиционирования (GPS) - это спутниковая навигационная система, состоящая по меньшей мере из 24 спутников. GPS работает в любых погодных условиях в любой точке мира 24 часа в сутки без абонентской платы или платы за установку.

Как работает GPS?

Спутники GPS обходят Землю два раза в день на точной орбите. Каждый спутник передает уникальный сигнал и параметры орбиты, которые позволяют устройствам GPS декодировать и вычислять точное местоположение спутника. GPS-приемники используют эту информацию и трилатерацию для расчета точного местоположения пользователя. По сути, GPS-приемник измеряет расстояние до каждого спутника на количество времени, которое требуется для приема передаваемого сигнала. При измерениях расстояния от нескольких спутников приемник может определить положение пользователя и отобразить его.

Чтобы вычислить ваше двумерное положение (широта и долгота) и направление движения, GPS-приемник должен быть зафиксирован на сигнал от не менее 3 спутников. При наличии 4 или более спутников приемник может определить ваше трехмерное положение (широта, долгота и высота). Как правило, приемник GPS будет отслеживать 8 или более спутников, но это зависит от времени суток и того, где вы находитесь на земле.

Как только ваша позиция будет определена, модуль GPS может рассчитать и другую информацию, такую ​​как:

  • скорость;
  • азимут, пеленг;
  • направление;
  • расстояние до отключения;
  • расстояние до пункта назначения.

Какой сигнал?

Спутники GPS передают по меньшей мере 2 маломощных радиосигнала. Сигналы движутся по прямой видимости, то есть они будут проходить сквозь облака, стекло и пластик, но не будут проходить через большинство твердых объектов, таких как здания и горы. Однако современные приемники более чувствительны и обычно могут отслеживать и сквозь дома.

Сигнал GPS содержит 3 различных типа информации:

  • Псевдослучайный код - это I.D. код, который идентифицирует, какой спутник передает информацию. Вы можете видеть, с какого спутника вы получаете сигналы на странице информации о спутниках на вашем устройстве.
  • Данные эфемерид необходимы для определения местоположения спутника и дают важную информацию о состоянии спутника, текущую дату и время.
  • Данные альманаха сообщают GPS-приемнику, где каждый спутник GPS должен быть в любое время в течение дня и отображать информацию о орбите для этого спутника и каждого другого спутника в системе.

GPS модуль NEO-6M и Arduino UNO

Внешне GPS модуль выглядит так:

Плата Ардуино Уно вам, скорее всего, уже знакома:

Подключение модуля GPS и Arduino UNO

Подключите четыре контакта к Arduino следующим образом:

GND → GND
TX → Цифровой вывод (D3)
RX → цифровой вывод (D4)
Vcc → 5Vdc

Предлагаем использовать внешний источник питания для питания модуля GPS, потому что минимальная потребляемая мощность для работы модуля Arduino GPS составляет 3,3 В, а Arduino не способен обеспечить такое напряжение. Для обеспечения напряжения используйте USB TTL:

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

Подключение Arduino UNO и ЖК-дисплея JHD162a

Теперь нам необходимо соединить Ардуино и ЖК-дисплей, мы взяли LHD162a:

Перечень соединений ниже, это LCD → Arduino :

VSS → GND
VCC → 5V
VEE → 10K резистор
RS → A0 (аналоговый пин)
R/W → GND
E → A1
D4 → A2
D5 → A3
D6 → A4
D7 → A5
LED+ → VCC
LED- → GND

Скетч и библиотеки

Дополнительно нам понадобятся некоторые библиотеки:

Больше различных библиотек вы можете найти на нашем сайте в разделе .

Скетч для Arduino GPS вы можете скачать или скопировать ниже:

#include #include #include float lat = 28.5458,lon = 77.1703; // создать переменную для объекта широты и долготы SoftwareSerial gpsSerial(3,4);//rx,tx LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); TinyGPS gps; // создать gps объект void setup(){ Serial.begin(9600); // соединяем serial //Serial.println("Полученный сигнал GPS:"); gpsSerial.begin(9600); // подключаем gps датчик lcd.begin(16,2); } void loop(){ while(gpsSerial.available()){ // проверка gps данных if(gps.encode(gpsSerial.read()))// шифровать gps данные { gps.f_get_position(&lat,&lon); // получить широту и долготу // отобразить позицию lcd.clear(); lcd.setCursor(1,0); lcd.print("GPS Signal"); //Serial.print("Position: "); //Serial.print("Latitude:"); //Serial.print(lat,6); //Serial.print(";"); //Serial.print("Longitude:"); //Serial.println(lon,6); lcd.setCursor(1,0); lcd.print("LAT:"); lcd.setCursor(5,0); lcd.print(lat); //Serial.print(lat); //Serial.print(" "); lcd.setCursor(0,1); lcd.print(",LON:"); lcd.setCursor(5,1); lcd.print(lon); } } String latitude = String(lat,6); String longitude = String(lon,6); Serial.println(latitude+";"+longitude); delay(1000); }

В Visual Studio мы создали приложение в котором можно найти текущее местоположение GPS. Оно работает только тогда, когда подключено последовательно к ПК или ноутбуку:

Если вы хотите внести некоторые изменения в приложение, вы можете сделать это открыв sln-файл в Visual Studio (2012 и выше), или вы можете напрямую установить и использовать его.

На этом пока всё. Хороших вам проектов.

После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой GPS-tracker с отправкой координат по GPRS на сервер.
Используется Arduino Mega 2560 (Arduino Uno), SIM900 - GSM/GPRS модуль (для отправки информации на сервер), GPS приёмник SKM53 GPS.

Всё закуплено на ebay.com, в сумме около 1500 р (примерно 500р ардуина, немного меньше - GSM модуль, немного больше - GPS).

GPS приемник

Для начала нужно разобраться с работой с GPS. Выбранный модуль - один из самых дешевых и простых. Тем не менее, производитель обещает наличие батарейки для сохранения данных о спутниках. По даташиту, холодный старт должен занимать 36 секунд, однако, в моих условиях (10 этаж с подоконника, вплотную зданий нет) это заняло аж 20 минут. Следующий старт, однако, уже 2 минуты.

Важный параметр устройств, подключаемых к ардуине - энергопотребление. Если перегрузить преобразователь ардуины, она может сгореть. Для используемого приемника максимальное энергопотребление - 45mA @ 3.3v. Зачем в спецификации указывать силу тока на напряжении, отличном от требуемого (5V), для меня загадка. Тем не менее, 45 mA преобразователь ардуины выдержит.

Подключение
GPS не управляемый, хотя и имеет RX пин. Для чего - неизвестно. Основное, что можно делать с этим приемником - читать данные по протоколу NMEA с TX пина. Уровни - 5V, как раз для ардуины, скорость - 9600 бод. Подключаю VIN в VCC ардуины, GND в GND, TX в RX соответствующего serial. Читаю данные сначала вручную, затем с использованием библиотеки TinyGPS. На удивление, всё читается. После перехода на Uno пришлось использовать SoftwareSerial, и тут начались проблемы - теряется часть символов сообщения. Это не очень критично, так как TinyGPS отсекает невалидные сообщения, но довольно неприятно: о частоте в 1Гц можно забыть.

Небольшое замечание относительно SoftwareSerial: на Uno нет хардверных портов (кроме соединённого с USB Serial), поэтому приходится использовать программный. Так вот, он может принимать данные только на пине, на котором плата поддерживает прерывания. В случае Uno это 2 и 3. Мало того, данные одновременно может получать только один такой порт.

Вот так выглядит «тестовый стенд».

GSM приемник/передатчик


Теперь начинается более интересная часть. GSM модуль - SIM900. Он поддерживает GSM и GPRS. Ни EDGE, ни уж тем более 3G, не поддерживаются. Для передачи данных о координатах это, вероятно, хорошо - не будет задержек и проблем при переключении между режимами, плюс GPRS сейчас есть почти везде. Однако, для каких-то более сложных приложений этого уже может не хватить.

Подключение
Модуль управляется также по последовательному порту, с тем же уровнем - 5V. И здесь нам уже понадобятся и RX, и TX. Модуль - shield, то есть, он устанавливается на ардуину. Причем совместим как с mega, так и с uno. Скорость по умолчанию - 115200.

Собираем на Mega, и тут нас ждет первый неприятный сюрприз: TX пин модуля попадает на 7й пин меги. На 7м пину меги недоступны прерывания, а значит, придется соединить 7й пин, скажем, с 6м, на котором прерывания возможны. Таким образом, потратим один пин ардуины впустую. Ну, для меги это не очень страшно - всё-таки пинов хватает. А вот для Uno это уже сложнее (напоминаю, там всего 2 пина, поддерживающих прерывания - 2 и 3). В качестве решения этой проблемы можно предложить не устанавливать модуль на ардуину, а соединить его проводами. Тогда можно использовать Serial1.

После подключения пытаемся «поговорить» с модулем (не забываем его включить). Выбираем скорость порта - 115200, при этом хорошо, если все встроенные последовательные порты (4 на меге, 1 на uno) и все программные работают на одной скорости. Так можно добиться более устойчивой передачи данных. Почему - не знаю, хотя и догадываюсь.

Итак, пишем примитивный код для проброса данных между последовательными портами, отправляем atz, в ответ тишина. Что такое? А, case sensitive. ATZ, получаем OK. Ура, модуль нас слышит. А не позвонить ли нам ради интереса? ATD +7499… Звонит городской телефон, из ардуины идет дымок, ноутбук вырубается. Сгорел преобразователь Arduino. Было плохой идеей кормить его 19 вольтами, хотя и написано, что он может работать от 6 до 20V, рекомендуют 7-12V. В даташите на GSM модуль нигде не сказано о потребляемой мощности под нагрузкой. Ну что ж, Mega отправляется в склад запчастей. С замиранием сердца включаю ноутбук, получивший +19V по +5V линии от USB. Работает, и даже USB не выгорели. Спасибо Lenovo за защиту.

После выгорания преобразователя я поискал потребляемый ток. Так вот, пиковый - 2А, типичный - 0.5А. Такое явно не под силу преобразователю ардуины. Нужно отдельное питание.

Программирование
Модуль предоставляет широкие возможности передачи данных. Начиная от голосовых вызовов и SMS и заканчивая, собственно, GPRS. Причем для последнего есть возможность выполнить HTTP запрос при помощи AT команд. Придется отправить несколько, но это того стоит: формировать запрос вручную не очень-то хочется. Есть пара нюансов с открытием канала передачи данных по GPRS - помните классические AT+CGDCONT=1,«IP»,«apn»? Так вот, тут то же самое нужно, но слегка хитрее.

Для получения страницы по определенному URL нужно послать следующие команды:
AT+SAPBR=1,1 //Открыть несущую (Carrier) AT+SAPBR=3,1,"CONTYPE","GPRS" //тип подключения - GPRS AT+SAPBR=3,1,"APN","internet" //APN, для Мегафона - internet AT+HTTPINIT //Инициализировать HTTP AT+HTTPPARA="CID",1 //Carrier ID для использования. AT+HTTPPARA="URL","http://www.example.com/GpsTracking/record.php?Lat=%ld&Lng=%ld" //Собственно URL, после sprintf с координатами AT+HTTPACTION=0 //Запросить данные методом GET //дождаться ответа AT+HTTPTERM //остановить HTTP

В результате, при наличии соединения, получим ответ от сервера. То есть, фактически, мы уже умеем отправлять данные о координатах, если сервер принимает их по GET.

Питание
Поскольку питать GSM модуль от преобразователя Arduino, как я выяснил, плохая идея, было решено купить преобразователь 12v->5v, 3A, на том же ebay. Однако, модулю не нравится питание в 5V. Идем на хак: подключаем 5V в пин, с которого приходит 5V от ардуины. Тогда встроенный преобразователь модуля (существенно мощнее преобразователя ардуины, MIC 29302WU) сделает из 5V то, что нужно модулю.

Сервер

Сервер написал примитивный - хранение координат и рисование на Яндекс.картах. В дальнейшем возможно добавление разных фич, включая поддержку многих пользователей, статус «на охране/не на охране», состояние систем автомобиля (зажигание, фары и пр.), возможно даже управление системами автомобиля. Конечно, с соответствующей поддержкой трекера, плавно превращающегося в полновесную сигнализацию.

Полевые испытания

Вот так выглядит собранный девайс, без корпуса:

После установки преобразователя питания и укладывания в корпус от дохлого DSL модема система выглядит так:

Припаивал провода, вынул несколько контактов из колодок ардуины. Выглядят так:

Подключил 12V в машине, проехался по Москве, получил трек:


Точки трека достаточно далеко друг от друга. Причина в том, что отправка данных по GPRS занимает относительно много времени, и в это время координаты не считываются. Это явная ошибка программирования. Лечится во-первых, отправкой сразу пачки координат со временем, во-вторых, асинхронной работой с GPRS модулем.

Время поиска спутников на пассажирском сидении автомобиля - пара минут.

Выводы

Создание GPS трекера на ардуино своими руками возможно, хотя и не является тривиальной задачей. Главный вопрос сейчас - как спрятать устройство в машине так, чтобы оно не подвергалось воздействиям вредных факторов (вода, температура), не было закрыто металлом (GPS и GPRS будут экранироваться) и не было особенно заметно. Пока просто лежит в салоне и подключается к гнезду прикуривателя.

Ну и ещё нужно поправить код для более плавного трека, хотя основную задачу трекер и так выполняет.

Использованные устройства

  • Arduino Mega 2560
  • Arduino Uno
  • GPS SkyLab SKM53
  • SIM900 based GSM/GPRS Shield
  • DC-DC 12v->5v 3A converter
Понравилась статья? Поделитесь с друзьями!