Точный gps приемник на ардуино. Получение и вывод GPS координат на Arduino
Однажды у меня возник интерес к GPS, а еще чуть раньше - к платформе Arduino. Поэтому со Sparkfun были заказаны, с разницей в пару дней, Arduino Duemilanove, GPS Shield и GPS приемник EM-406A .
Заказ пришел и частично лежал на полке, а недавно дошли руки до этого комплекта…
Собранный GPS Shield, подключенный к Arduino
Аппаратная часть
- Arduino Duemilanove
- GPS Shield
- GPS приемник EM-406A
- LCD WH-0802A
Распиновка GPS модуля EM-406A
При наличии щилда распиновка, по большому счету, не так важна - нужно просто вставить два разъема. Если щилд отсутствует, то нужно подключить выводы GND к GND, Rx - к digital pin 2, Tx - к digital pin 3, VCC - к POWER 5V. Внимание, серый провод не 1, а 6й!
На GPS модуле имеется светодиодный индикатор состояния:
- индикатор горит постоянно - идет поиск спутников и определение координат
- индикатор моргает - координаты установлены, идет их передача
- индикатор не горит, питание на шилд подано - плохой контакт в разъемах или модуль переключился в бинарный SiRF протокол
Переключатель UART/DLINE
С помощью переключателя можно подключить Rx и Tx GPS модуля к ногам Tx и Rx Arduino (позиция UART) или к pin digital 2 и digital 3 (позиция DLINE, если не снимать перемычки из припоя). Нужно убедиться, что переключатель находится в положении «DLINE», иначе возможны проблемы с заливкой скетчей в Arduino.
Подключение знакосинтезирующего ЖК индикатора
Я не покупал отдельный shield под экран и подключал уже имеющийся индикатор - WH-0802A в 4х битном режиме. В принципе, так можно подключить любой другой знакосинтезирующий индикатор. Для этого нужно найти в даташите распиновку разъема и подключить линии RS, E, D4, D5, D6, D7 к любым цифровым pin"ам (кроме 0…3) и не забыть сконфигурировать куда подключены эти линии в коде, Vss, R/W - к GND, Vdd - к 5V. Вывод Vo (настройка контрастности) нужно подключить к потенциометру, включенному между GND и 5V, но я просто подключил к GND - полученная контрастность меня устроила.Назначение выводов индикатора WH-0802A
Мой вариант подключения индикатора к Arduino
- RS - pin 13
- E - pin 12
- D4 - pin 11
- D5 - pin 10
- D6 - pin 9
- D7 - pin 8
- Vss, R/W, Vo - GND
- Vdd - 5V
Программная часть
Для работы с GPS потребуются две библиотеки TinyGPS и NewSoftSerial . Библиотеки распаковываются в каталог libraries.#include
#include
#include
TinyGPS gps;
//Tx, Rx
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
void setup() {
//4800 скорость обмена с GPS приемником
nss.begin(4800);
//8 символов, 2 строки
lcd.begin(8, 2);
lcd.print("waiting" );
}
void loop() {
bool newdata = false ;
unsigned long start = millis();
long lat, lon;
unsigned long age;
//задержка в секунду между обновлениями координат
while (millis() - start < 1000) {
if (readgps())
newdata = true ;
}
if (newdata) {
gps.get_position(&lat, &lon, &age);
lcd.setCursor(0, 0);
lcd.print(lat);
lcd.setCursor(0, 1);
lcd.print(lon);
}
}
bool readgps() {
while (nss.available()) {
int b = nss.read();
//в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
if ("\r" != b) {
if (gps.encode(b))
return true ;
}
}
return false ;
}
После включения GPS модуля и заливки скетча нужно подождать как минимум 42 секунды (время холодного старта) для того чтобы модуль определил свое местоположение и начал выдавать валидные координаты. Когда модуль перейдет в рабочий режим он начнет моргать светодиодом. У меня на рабочем столе модуль не всегда может найти спутники - приходится переносить его на окно.
Работающий модуль с подключенным дисплеем и полученными координатами
Справа к дисплею подключён источник питания для подсветки.
После определения спутников на дисплее появляются координаты и обновляются раз в секунду.
В итоге получен опыт работы и база для дальнейшего освоения GPS.
Существует немало GPS-модулей и шилдов для Arduino, но многие из них довольно недешевы. Если вам в вашем проекте по каким-то причинам нужен GPS, самым дешевым (не в ущерб качеству!) из известных мне вариантов будет модуль на базе чипа NEO-6M. На AliExpress такие модули продаются за 230 рублей (4 $) с учетом доставки в Россию. Давайте же попробуем разобраться, как с ними работать.
Примечание: Как правило, GPS не работает в доме. Чтобы поймать сигнал от спутников, с модулем нужно выйти на улицу или на балкон, или хотя бы положить его рядом с окном. Кроме того, GPS может плохо ловить в облачную погоду. Учтите также, что даже на открытом воздухе и в хорошую погоду при первом включении модулю может потребоваться несколько минут на инициализацию.
К Arduino модуль подключается не сложно, так как питается он от 5 В, а данные передает по UART на скорости 9600 бод. Когда модуль находит достаточное количество спутников для определения своего местоположения, он начинает мигать синим светодиодом и передавать по UART раз в секунду что-то вроде:
$GPRMC,160709.00,A,5546.7229,N,03749.47557,E,2.578,228.26,170617,A*69
$GPVTG,228.26,T,M,2.578,N,4.774,K,A*39
$GPGGA,160709.00,5546.792,N,03749.475,E,1,07,4.00,172.3,M,13.3,M,*5C
$GPGSA,A,3,13,20,18,30,21,15,6.45,3.95,5.11*02
Тут на глаз несложно найти текущие координаты (5546.79229,N и 03749.47557,E), а также дату (170617) и время в UTC (160709). Цифры в конце строк после звездочки — это контрольные суммы. Стоит отметить, что если модуль еще не определил свои GPS-координаты, он передает по UART немного другие данные. Подробное описание того, как декодировать все эти данные можно найти в документе под названием U-blox 6 Receiver Description Including Protocol Specification .
Несмотря на то, что написать свой парсер достаточно просто, их написано и отлажено уже достаточно, чтобы не тратить на это свое время. Лично я воспользовался библиотекой TinyGPSPlus . Код прошивки:
#include
#include
#include "LiquidCrystal_I2C.h"
#include "TinyGPS++.h"
const
int
DELAY =
100
;
const
int
SWITCH_TIME =
5000
;
LiquidCrystal_I2C lcd(0x3F
, 16
, 2
)
;
SoftwareSerial gps_serial(A3, A2)
;
/* RX, TX */
TinyGPSPlus gps_parser;
void
setup()
{
Serial.begin
(9600
)
;
gps_serial.begin
(9600
)
;
lcd.begin
()
;
}
String twoDigits(int
x)
{
if
(x <
10
)
return
"0"
+
String(x)
;
else
return
String(x)
;
}
int
currentModeTime =
0
;
bool
showLocation =
false
;
void
loop()
{
while
(gps_serial.available
()
>
0
)
{
char
temp =
gps_serial.read
()
;
Serial.write
(temp)
;
gps_parser.encode
(temp)
;
}
String lat =
"Unknown "
;
String lng =
"location "
;
if
(gps_parser.location
.isValid
()
)
{
lat =
"Lat: "
+
String(gps_parser.location
.lat
()
, 6
)
;
lng =
"Lng: "
+
String(gps_parser.location
.lng
()
, 6
)
;
}
String date =
"Unknown date "
;
if
(gps_parser.date
.isValid
()
)
{
date =
twoDigits(gps_parser.date
.day
()
)
+
"/"
+
twoDigits(gps_parser.date
.month
()
)
+
"/"
+
String(gps_parser.date
.year
()
)
+
" "
;
}
String time
=
"Unknown time "
;
if
(gps_parser.time
.isValid
()
)
{
time
=
twoDigits(gps_parser.time
.hour
()
)
+
":"
+
twoDigits(gps_parser.time
.minute
()
)
+
":"
+
twoDigits(gps_parser.time
.second
()
)
+
" UTC "
;
}
if
(showLocation)
{
lcd.setCursor
(0
, 0
)
;
lcd.print
(lat)
;
lcd.setCursor
(0
, 1
)
;
lcd.print
(lng)
;
}
else
{
// show date and time
lcd.setCursor
(0
, 0
)
;
lcd.print
(date)
;
lcd.setCursor
(0
, 1
)
;
lcd.print
(time
)
;
}
Delay(DELAY)
;
currentModeTime +
=
DELAY;
if
(currentModeTime >=
SWITCH_TIME)
{
lcd.clear
()
;
showLocation =
!
showLocation;
currentModeTime =
0
;
}
}
Соответствующее устройство в действии.
В этом проекте мы покажем вам как связать 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В Visual Studio мы создали приложение в котором можно найти текущее местоположение GPS. Оно работает только тогда, когда подключено последовательно к ПК или ноутбуку:
Если вы хотите внести некоторые изменения в приложение, вы можете сделать это открыв sln-файл в Visual Studio (2012 и выше), или вы можете напрямую установить и использовать его.
На этом пока всё. Хороших вам проектов.
После нескольких экспериментов с ардуиной решил сделать простенький GPS-tracker.
Используется 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 нет хардверных портов, поэтому приходится использовать программный. Так вот, он может принимать данные только на пине, на котором плата поддерживает прерывания. В случае 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. Однако, модулю не нравится питание в 5в. Идем на хак: подключаем 5в в пин, с которого приходит 5в от ардуины. Тогда встроенный преобразователь модуля (существенно мощнее преобразователя ардуины, MIC 29302WU) сделает из 5в то, что нужно модулю.
Сервер
Сервер написал примитивный - хранение координат и рисование на Яндекс.картах. В дальнейшем возможно добавление разных фич, включая поддержку многих пользователей, статус «на охране/не на охране», состояние систем автомобиля (зажигание, фары и пр.), возможно даже управление системами автомобиля. Конечно, с соответствующей поддержкой трекера, плавно превращающегося в полновесную сигнализацию.
Полевые испытания
Вот так выглядит собранный девайс, без корпуса:
После установки преобразователя питания и укладывания в корпус от дохлого DSL модема система выглядит так:
Припаивал провода, вынул несколько контактов из колодок ардуины. Выглядят так:
Подключил 12В в машине, проехался по Москве, получил трек:
Трек получается рваным. Причина в том, что отправка данных по GPRS занимает относительно много времени, и в это время координаты не считываются. Это явная ошибка программирования. Лечится во-первых, отправкой сразу пачки координат со временем, во-вторых, асинхронной работой с GPRS модулем.
После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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