Точний GPS приймач на ардуїно. Працюючий модуль із підключеним дисплеєм та отриманими координатами. Як працює GPS

Вам потрібне джерело точного часу від GPS? Ця стаття покаже вам, як використовувати модуль GPS для отримання часу, дати та координат, і як показати їх на LCD індикаторі за допомогою Arduino.

Що необхідно?

  • комп'ютер із встановленою Arduino IDE;
  • Arduino (ми використовуємо Arduino Mega);
  • GPS модуль (ми використовуємо EM-411, можливі інші, що підтримують протокол NMEA, наприклад, VK2828U7G5LF або GY-NEO6MV2);
  • макетна плата, перемички та потенціометр 5 кОм;
  • бібліотека TinyGPS (посилання нижче).

Вступ

Створення системи глобального позиціонування, або GPS, почалося на початку 1970-х років. Кожна країна (Росія, США, Китай і т.д.) мають свою власною системою, але більшість коштів супутникової навігаціїу світі використовують систему США.

Кожен супутник системи має атомний годинник, який безперервно контролюється і коригується NORAD (командуванням повітряно-космічної оборони Північної Америки) кожен день.

По суті, приймач по своїх годинниках вимірює TOA (час отримання сигналу, time of arrival) чотирьох супутникових сигналів. Виходячи з TOA і TOT (часу відправки сигналу, time of transmission), приймач обчислює чотири значення часу "прольоту" сигналу (TOF, time of flight), які відрізняються один від одного залежно від відстані супутник-приймач. Потім, виходячи з чотирьох значень TOF, приймач обчислює своє положення в тривимірному просторі та відхилення свого годинника.

Найдешевші GPS приймачі мають точність близько 20 метрів для більшості місць на Землі. Тепер подивимося, як виготовити свій власний годинник GPS за допомогою Arduino.

Апаратна частина

Мій модуль GPS має 6 контактів: GND, Vin, Tx, Rx і знову GND. Шостий висновок нікуди не підключено. Контакт GNDз'єднаний з корпусом на Arduino, Vin підключаємо до шини +5В на Arduino, Tx підключений до виведення 10 на Arduino, а виведення Rx нікуди не підключаємо, тому що не будемо посилати на GPS модуль жодних повідомлень. Мій модуль передає супутникові дані, використовуючи інтерфейс RS-232 зі швидкістю 4800 біт/сек, які приймаються Arduino на виводі 10.

Нижче показано фото GPS модуля:

GPS модуль EM-411

Модуль відправляє те, що відомо як повідомлення NMEA. Тут ви можете побачити приклад одного NMEA повідомлення та його роз'яснення (витяг з технічного опису):

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,0000*18

Формат даних GGA
НазваприкладОдиниціОпис
ID повідомлення$GPGGA Заголовок протоколу GGA
Час UTC161229.487 hhmmss.sss (дві цифри годинник, дві цифри хвилини, потім секунди з точністю до тисячних)
Широта3723.2475
Прапор N/SN N – північ, S – південь
Довгота12158.3416 ddmm.mmmm (перші дві цифри градуси, потім хвилини з точністю до десятитисячних)
Підкреслити E/WW E – схід, W – захід
Індикатор розташування1
  • 0 - місцезнаходження недоступне або некоректне;
  • 1 - режим GPS SPS, місце розташування коректне;
  • 2 – диференціальний GPS, режим SPS, місце розташування коректно;
  • 3 - режим GPS PPS, місце розташування коректне.
Кількість використовуваних супутників07 У діапазоні від 0 до 12
HDOP1.0 Погіршення точності по горизонталі
Висота щодо рівня моря9.0 метри
Одиниці виміруMметри
Геоїдальна відмінність Відмінність між земним еліпсоїдом WGS-84 та рівнем моря (геноїдом)
Одиниці виміруMметри
Вік диференціальних даних GPS секундиНульові поля, коли DGPS не використовується
ID станції, що передає диференціальні поправки0000
Контрольна сума*18
Кінець повідомлення

Всі ці дані приймаються Arduino через висновок 10. Бібліотека TinyGPS читає повідомлення GPGGA та GPRMC (для детальної інформаціїпро GPRMC дивіться технічний опис).

Arduino на схемі не показано. Підключіть периферійні пристроїзгідно з підписаними з'єднаннями.


Схема GPSгодин на arduino

Програмне забезпечення

При подачі живлення GPS модуль витрачає деякий час, щоб отримати правильне розташування від супутників. Коли місцезнаходження отримано, модуль надсилає NMEA повідомлення на Arduino. Бібліотека TinyGPS містить функцію для отримання часу та дати з GPRMC повідомлення. Вона називається crack_datetime() і приймає в якості параметрів сім покажчиків на змінні: рік year, місяць month, день місяця day, години hour, хвилини minute, секунди second, і соті частки секунди hundredths. Виклик функції виглядає так:

Gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);

Виклик цієї функції повертає вам у змінних правильні значення до тих пір, поки з залізом все гаразд.

Щоб отримати місце розташування, можна викликати функцію f_get_position() . Ця функціяприймає як параметри два покажчики на змінні: широта latitude і довгота longitude . Виклик цієї функції виглядає так:

Gps.f_get_position(&latitude, &longitude);

Початковий текстпрограми:

#include #include #include #define RXPIN 10 #define TXPIN 9 #define GPSBAUD 4800 #define RS 2 #define EN 3 #define D4 4 #define D5 5 #define D6 6 #define D7 7 TinyGPS gps; SoftwareSerial uart_gps(RXPIN, TXPIN); LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); // Змінні int seconds; int timeoffset = 1; // Користувач повинен змінити одиницю на відповідний часовий пояс. У прикладі використовуємо зсув на +1 год. // Оголошення функцій. void getgps(TinyGPS &gps); // Функція налаштування - запускається лише при включенні void setup() ( Serial.begin(115200); // Запуск послідовного інтерфейсудля налагодження uart_gps.begin(GPSBAUD); // Запуск приймача UART GPS lcd.begin(16,2); // Оголошення LCD lcd.print("GPS clock"); // Повідомлення привітання delay (1000); // Чекаємо на одну секунду lcd.clear(); // Очистити LCD) // Цикл головної програми- запущений завжди void loop() ( while(uart_gps.available()) ( int c = uart_gps.read(); if(gps.encode(c)) ( getgps(gps); ) ) ) /* * Ця функція отримує дані від GPS модуля * і відображає їх на LCD * / void getgps(TinyGPS &gps) ( int year; float latitude, longitude; byte month, day, hour, minute, second, hundredths; .crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths); hour = hour + timeoffset; lcd.clear();//lcd.setCursor(0, 0); lcd.print("Time: ") ; if (hour<= 9) { lcd.print("0"); lcd.print(hour, DEC); } else { lcd.print(hour, DEC); } lcd.print(":"); if (minute <=9) { lcd.print("0"); lcd.print(minute, DEC); } else { lcd.print(minute, DEC); } lcd.print(":"); if (second <= 9) { lcd.print("0"); lcd.print(second, DEC); } else { lcd.print(second, DEC); } lcd.setCursor(0,1); lcd.print("Date: "); if (day <= 9) { lcd.print("0"); lcd.print(day, DEC); } else { lcd.print(day, DEC); } lcd.print("-"); if (month <= 9) { lcd.print(month, DEC); } else { lcd.print(month, DEC); } lcd.print("-"); lcd.print(year, DEC); delay(2000); lcd.clear(); lcd.print("Lat: "); lcd.print(latitude, DEC); lcd.setCursor(0,1); lcd.print("Lon: "); lcd.print(longitude, DEC); delay(2000); // Debugging purpose only. Serial.print(latitude, DEC); Serial.print(" - "); Serial.println(longitude, DEC); }

GPS-модулі дозволяють вашому автономному пристрої відстежувати свої координати та параметри переміщення. Така функціональність важлива для всіляких трекерів, розумних нашийників та рюкзаків. У цій статті ми зробили спробу короткого огляду GPS-модулів та програм для роботи з GPS на комп'ютері. Підключення до Ардуїно розглянуто на прикладі найбільш популярного модуля NEO 6.0

Перш ніж приступати до підключення GPS до Ардуїно, потрібно навчитися тестувати сам модуль. Для цього нам обов'язково знадобиться програма, що дозволяє показати статус пристрою, кількість спійманих супутників та другу тестову інформацію. Ми постаралися зібрати разом найпопулярніший софт для роботи з GPS на комп'ютері.

U-Center

Програма u-center використовується для роботи з провідниками GNSS від фірми U-Blox. За допомогою цього програмного забезпечення можна тестувати точність позиціонування, змінювати конфігурацію ресивера та проводити загальну діагностику, обробляти отримані дані та відображати їх у режимі реального часу. Координати приймач отримує за допомогою GPS, ГЛОНАСС. Отриману інформацію можна експортувати та показувати на картах Google Maps, Google Earth. Програма дозволяє створювати двовимірні діаграми, гістограми та інші види графіків. u-center можна використовувати під час роботи з кількома приймачами.

Можливості програмного забезпечення U-Center:

  • Робота з Windows;
  • Читання NMEA, SiRF даних, UBX;
  • Виведення отриманих даних у вигляді тексту та графіків;
  • Запис даних, та відтворення;
  • Повне керування модулем GPS;
  • Можливість зміни конфігурації GPS-модуля;
  • Запис нової конфігурації модуль;
  • Запис конфігурації у файл формату .txt;
  • Оновлення прошивки модуля;
  • Можливість холодного, теплого та гарячого старту модуля.

Програма дозволяє оцінювати працездатність приймача, аналізувати його швидкодію та встановлювати його налаштування. Крім U-Center можуть використовуватися інші програми, наприклад, Visual GPS, Time Tools GPS Clock та інші.

Visual GPS

Ця програма використовується для відображення даних GPS за протоколом NMEA 0183 у графічному вигляді. Програма дозволяє записувати лог даних у файл. Існує два режими роботи у програмі – у першому Visual GPS зв'язується з приймачем GPS, а другому Visual GPS зчитує показання NMEA з файла. Програма має 4 основні вікна – Signal Quality (якість сигналу), Navigation (навігація), Survey (дослідження), Azimuth and Elevation (азимут та висота).

Time Tools GPS Clock

Ця програма працює на Windows та будь-яких робочих станціях, вона перевіряє час зі стандартного приймача часу NMEA GPS, який підключений до комп'ютера, і дозволяє синхронізувати час на ПК. Відображається інформація про час, дату, стан GPS, отримана від приймача. Недоліком програми є неможливість високоточного визначення часу, оскільки GPS-пристрої немає секундного імпульсу для послідовного порту комп'ютера.

GPS TrimbleStudio

Програмне забезпечення використовується для роботи з приймачем Copernicus у Windows. Програма відображає навігаційні дані, що приймаються. Отримані координати можна вибрати на картах Google Maps, Microsoft Visual Earth. Усі налаштування приймача можна зберегти в конфігураційному файлі

Fugawi

Програма використовується для планування маршруту, навігації GPS в реальному часі. Програма дозволяє записувати та зберігати маршрути та дорожні точки на картах. Навігація проводиться як на суші, так і на воді та у повітрі. У програмі використовуються різні види цифрових карток – топографічні карти, стандарти NOAA RNC, відскановані копії паперових карток, Fugawi Street Maps.

3D World Map

У цій програмі можна побачити землю у тривимірному вигляді. Використовується як зручний географічний довідник, в якому можна дізнатися інформацію в 269 країнах та тридцяти тисячах населених пунктів, проводити вимірювання між двома точками, відтворювати аудіозаписи.

Огляд GPS-модулів для Ардуїно

Для роботи з Ардуїно існує велика кількість різних GPS-модулів. З їхньою допомогою можна визначати точне місце розташування (географічні координати, висота над рівнем моря), швидкість переміщення, дату, час.

Модуль EM-411. Пристрій створено на базі високопродуктивного чіпа SiRF Star III, який має низьке споживання енергії. Модуль має великий обсяг пам'яті для збереження даних альманаху, що підтримує стандартний протокол NMEA 0183. Час холодного старту становить близько 45 секунд.

VK2828U7G5LF. Цей модуль збудовано на базі чіпа Ublox UBX-G7020-KT. З його допомогою можна отримувати координати GPS і ГЛОНАСС. У приймачі є вбудована пам'ять, в яку можна зберігати налаштування. Модуль оснащений вбудованою керамічною антеною, працює за протоколом NMEA 0183. Напруга живлення модуля 3,3-5В.

SKM53 GPS. Один з найдешевших модулів, що має низьке споживання струму. Час холодного запуску приблизно 36 секунд, гарячого – 1 секунда. Для позиціонування використовуються 66 каналів, для стеження 22 канали. У модулі є вбудована GPS антена, пристрій забезпечує високу продуктивність навігації за різних умов видимості.

GPS Neo-6M. Приймач виробляється компанією u-blox. У цьому модулі використовуються новітні технології для отримання точної інформації про місцезнаходження. Напруга живлення модуля 3-5В. Лінійка пристроїв представлена ​​типами G, Q, M, P, V та T зі своїми унікальними характеристиками. Час холодного старту – близько 27 секунд.

locosys 1513. Цей модуль підтримує роботу з GPS, ГЛОНАСС, Galileo, QZSS, SBAS. Базується на чіпі MediaTek MT333, який має низьке енергоспоживання, високу чутливість і стабільну роботу в різних умовах. У приймачі є підтримка текстового протоколу управління. Час холодного старту приблизно 38 секунд.

Arduino GPS модуль GY-NEO6MV2

Модуль використовує стандартний протокол NMEA 0183 для зв'язку з приймачами GPS. Приймач є платою, на якій розташовуються модуль NEO-6M-0-001, стабілізатор напруги, енергонезалежна пам'ять, світлодіод і акумулятор.

Технічні характеристики модуля:

  • Напруга живлення 3,3-5В;
  • Інтерфейс UART 9600 8N1 3.3V;
  • протокол NMEA;
  • Вага модуля 18 гр.;
  • Наявність EEPROM для збереження установок;
  • Наявність вбудованої батареї;
  • Можливість підключення антени до роз'єму U-FL;
  • Час холодного старту приблизно 27 секунд, час гарячого старту – 1 секунда;
  • Наявність понад 50 каналів позиціонування;
  • Частота поновлення 5 Гц;
  • Робочі температури від -40С до 85С.

Модуль широко використовується для коптерів, визначення поточного становища малорухливих об'єктів та транспортних засобів. Отримані координати можна завантажити до карт Google Maps, Google Earth та інші.

Після холодного старту модуля починається завантаження альманаху. Час завантаження – не більше 15 хвилин, залежно від умов та кількість супутників у зоні видимості.

Розпинування: GND (земля), RX (вхід для даних UART), TX (вихід для даних UART), Vcc - живлення від 3,3 до 5 В.

Для підключення знадобиться модуль GY-NEO6MV2, плата Ардуїно, дроти, антена GPS. З'єднання контактів: VCC до 5V, GND до GND, RX до 9 пін на Ардуїно, TX до 10 пін. Потім Ардуїно необхідно підключити до комп'ютера через USB.

Для роботи потрібно підключити декілька бібліотек. SoftwareSerial – потрібний для розширення апаратних функцій пристрою та обробки завдання послідовного зв'язку. Бібліотека TinyGPS використовується для перетворення повідомлень NMEA у зручний для читання формат.

Перевірка роботи через програму U-Center

Як згадувалося вище, модуль виробляється компанією u-blox, тому налаштування приймача використовується програма U-Center.

При підключенні до UART приймач надсилає повідомлення за допомогою протоколу NMEA раз на секунду. За допомогою програми можна налаштовувати надіслані повідомлення.

Щоб налаштувати модуль, необхідно підключити його через USB-UART(COM-UART) перетворювач. Можна настроїти підключення за допомогою меню Receiver-Port . Як тільки з'єднання буде встановлено, засвітиться зелений індикатор. Приймач почне встановлювати з'єднання із супутниками, після чого на екрані з'являться поточні координати, час та інша інформація. Всі повідомлення відображаються у вікні Messages. У меню View – Messages можна вибрати повідомлення, які надсилатимуться до мікроконтролера. Залежно від поставленого завдання, можна зменшити кількість повідомлень, що надсилаються, що збільшить швидкість обробки даних і полегшить алгоритм розбору повідомлень контролером.

Якщо зв'язок із супутником не встановлюється, потрібно перевірити, чи підключена антена. Потім потрібно перевірити напругу живлення, воно має бути 5В. Якщо з'єднання не встановлюється, можна помістити модуль до вікна або вийти на відкриту територію.

Переглянути передані дані можна через меню View.

Усі повідомлення починаються символом $, наступні його символи – ідентифікатори повідомлення. GP- це глобальна система, наступні 3 літери показують, яка інформація міститься.

RMC – найменша навігаційна інформація (час, дата, координати, швидкість, напрямок).

GGA – зафіксована інформація про позиціонування. Записано час, координати, висота, статус позиціонування, кількість супутників.

Перевірка роботи через Arduino IDE

Працювати з модулем можна через стандартне середовище розробки Arduino IDE. Після підключення модуля до плати потрібно завантажити скетч і подивитися на результат. Якщо на моніторі з'явиться безладний набір знаків, потрібно відрегулювати швидкість інтерфейсу Ардуїно з комп'ютером і швидкість інтерфейсу модуля з контролером.

Скетч для виведення даних про місцезнаходження.

#include #include //підключення необхідних роботи бібліотек TinyGPS gps; SoftwareSerial gpsSerial(8, 9); //номери пінів, до яких підключений модуль (RX, TX) bool newdata = false; unsigned long start; long lat, lon; unsigned long time, date; void setup()( gpsSerial.begin(9600); // встановлення швидкості обміну з приймачем Serial.begin(9600); Serial.println("Waiting data of GPS..."); ) void loop()( if (millis () - start > 1000) //установка затримки в одну секунду між оновленням даних ( newdata = readgps(); if (newdata) ( start = millis(); gps.get_position(&lat, &lon); gps.get_datetime(&date, &time); Serial.print("Lat: "); Serial.print(lat); Serial.print(" Long: "); (date); Serial.print(" Time: "); Serial.println(time); )) ) // перевірка наявності даних bool readgps() ( while (gpsSerial.available()) ( int b = gpsSerial.read( // у бібліотеці TinyGPS є помилка: не обробляються дані з \r і \n if("\r" != b) ( if (gps.encode(b)) return true; ) ) return false; )

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

У моніторі порту з'являться дані широти та довготи. Також буде отримано значення поточної дати та часу за Грінвічем. Встановити свій часовий пояс можна вручну – це робиться у рядку Serial.print(static_cast(hour+8));

Висновок

Як бачимо, для початку роботи з GPS не потрібно якихось складних маніпуляцій. На допомогу приходять готові модулі або шилди, які взаємодіють з Arduino через UART. Для полегшення написання скетчів можна використовувати готові бібліотеки. Крім того, будь-який GPS-модуль можна протестувати без Ардуїно, підключивши до комп'ютера та скориставшись спеціальним софтом. Огляд найбільш популярних програм ми привели до цієї статті.

Що таке GPS?

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

Як працює GPS?

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


Щоб обчислити ваше положення у двовимірному просторі (широта та довгота) та рух, GPS-приймач повинен приймати сигнали не менше 3 супутників. За наявності 4 або більше супутників приймач може визначити ваше тривимірне положення (широта, довгота та висота). Як правило, приймач GPS відстежуватиме 8 або більше супутників, але це залежить від часу доби і того, де ви знаходитесь на землі. Як тільки ваша позиція буде визначена, GPS модуль зможе розрахувати іншу інформацію, таку як швидкість, відстань до пункту призначення і т.д.


Супутники GPS передають щонайменше 2 малопотужні радіосигнали. Сигнали рухаються по лінії прямої видимості, тобто вони проходитимуть крізь хмари, скло та пластик, але не проходитимуть через більшість твердих об'єктів, таких як будівлі та гори. Однак сучасні приймачі більш чутливі і можуть відстежувати ці сигнали в приміщеннях. Сигнал GPS містить 3 різні типи інформації. По-перше, це псевдовипадковий код, тобто ID-код, який ідентифікує який супутник передає інформацію. По-друге, дані ефемерид – необхідні визначення місця розташування супутника і дають важливу інформацію про стан супутника, поточну дату і час. По-третє, дані альманаху, які повідомляють GPS-приймачу, де кожен супутник GPS має бути в певний час протягом дня, і відображають інформацію про орбіту для цього супутника та кожного іншого супутника в системі.

Підключення GPS-модуля NEO-6m до Arduino

Додати в Arduino проект можливості GPS досить просто. Потрібно лише підключити до плати Arduino GPS-модуль, наприклад NEO-6m. Схема підключення показана нижче. Для кращого прийому сигналів до модуля GPS бажано приєднати антену.


Код взаємодії Arduino та GPS-модуля NEO-6m

Нижче наведено код (скетч), що дозволяє отримувати дані від GPS-модуля та виводити їх на екран LCD-дисплея.


#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.println("The GPS Received Signal:"); gpsSerial.begin(9600); // підключити GPS-датчик lcd.begin(16,2); ) void loop()( while(gpsSerial.available())( // перевірити дані gps if(gps.encode(gpsSerial.read()))) // декодувати дані gps ( gps. // отримати широту і довготу // відобразити положення lcd.clear(); lcd.setCursor(1,0); lcd.print("GPS Signal"); : "); //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);

Після кількох експериментів з Ардуін вирішив зробити простенький і не дуже дорогий 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 заснований GSM/GPRS Shield
  • DC-DC 12v->5v 3A converter

Система глобального позиціонування GPS вже увійшла до нашого життя. Сьогодні важко уявити мобільний телефон без убудованого GPS-модуля. Ця супутникова система навігації дозволяє відстежувати будь-які об'єкти, визначати їх координати та швидкість переміщення. Тепер GPS доступна не тільки компаніям, які розробляють відповідне обладнання, але й простим радіоаматорам, які вже використовують популярні плати Arduino. У цьому матеріалі буде розглянуто підключення мініатюрного GPS-трекера до плати Arduino Pro Mini. Як піддослідний використовується трекер PG03 MiniGPS.



Даний трекер крім безпосередньо географічних координат показує напрямок руху, пройдений шлях і швидкість переміщення. На жаль, він не забезпечує запису інформації, тому, підключивши його до Arduino, можна отримати доступ до цих даних і робити з ними все, що захочеться.


Спочатку трекер потрібно розібрати. Нижче показано зображення розібраного GPS-трекера.




Серцем трекера є GPS-чіп Venus638FLP. Його 44-ий висновок є виходом інтерфейсу UART (TxD). Можна припаяти провід безпосередньо до цього висновку, а можна знайти на платі контакт для тестування, до якого також підключений висновок. Нижче показано зображення розташування висновків мікросхеми та спосіб підключення до потрібного висновку.





Тепер візьмемо компактну плату Arduino Pro Mini і модуль для карток SD, щоб записувати дані протоколу NMEA. Схема з'єднань Arduino Pro Mini та модуля для SD-карт виглядає так:



Підключення висновків модуля для карток SD:


GND до GND
VCC до 3.3
MISO до висновку 12
MOSI до висновку 11
SCK до висновку 13
CS до висновку 10

Підключення висновків GPS-трекера:


GND до GND
Висновок 2 (Arduino) висновку 44 (GPS)

Харчування краще взяти з GPS-трекера (3.7). Оскільки його акумулятор має малу енергоємність, краще підключити зовнішній акумулятор, наприклад, від мобільного телефону на 1400 мАч, як показано на одному з малюнків вище.


Тепер потрібно завантажити бібліотеку TinyGPS, також знадобиться бібліотека для роботи з SD-картами та бібліотека SoftwareSerial, яку можна знайти в Arduino\libraries.



У наведеному нижче шматку коду можна вибирати, які дані записувати:


void gpsdump(TinyGPS &gps) ( float flat, flon; // Lat, Long float fkmph = gps.f_speed_kmph(); // Speed ​​in km/hr float falt = gps.f_altitude(); // +/- altitude in meters (seem to be elevation, in fact) float fc = gps.f_course();// Course in degrees unsigned long age; (flat, 4); Serial.print("lon"); Serial.print(flon, 4); Serial.print("kms"); Serial.print(fkmph); Serial.print("course"); .print(fc); Serial.print("elevation"); Serial.println(falt); ///////////////////////////// //////////////////////////////////////////////////// ////////////////

Завантажте скетч в Arduino, вставте SD-карту, відформатовану відповідно до FAT32 і має докорінно файл log.txt. Запустіть послідовний монітор, і ви побачите дані, які записуватимуться на SD-карту.