Точный gps приемник на ардуино. Лучшие GPS-трекеры для машины (маяки). Функциональные возможности GPS передатчиков
После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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 приемник/передатчик
![](https://i1.wp.com/habrastorage.org/getpro/habr/post_images/162/da3/ab5/162da3ab5e84b80e39db1b97b0b839cd.jpg)
Теперь начинается более интересная часть. 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
В этом проекте мы покажем вам как связать 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 и выше), или вы можете напрямую установить и использовать его.
На этом пока всё. Хороших вам проектов.
Данные сохраняются в электронную таблицу dataGPS.csv , формат которой соответствует требованиям сервиса Google My Maps .
Язык программирования: Arduino (C++)
Видеоинструкция
Что потребуется
Как собрать
gps-tracker.ino // библиотека для работы с устройствами по SPI #includeИндивидуальные GPS передатчики
Сегодня прогресс идет такими темпами, что устройства, которые раньше были громоздкими, дорогими и узкоспециализированными, очень быстро теряют в размерах, весе и цене, но приобретают множество новых функций.
Так устройства, основанные на GPS технологиях, добрались до карманных гаджетов и прочно там обосновались, даря людям новые возможности. Особенно стоит выделить индивидуальные GPS передатчики.
По сути, это те же самые GPS-трекеры, только рассчитанные на использование не на транспортном средстве, а человеком в повседневной жизни.
В зависимости от модели, в одном корпусе могут быть совмещены несколько различных устройств. В самом простом варианте это просто не большая коробочка без дисплея, которая позволяет контролировать перемещения детей, животных либо каких-то других объектов
, на которых закреплена.
Внутри у неё расположен GPS модуль, определяющий координаты на местности, GSM/GPRS модуль, передающий информацию и принимающий управляющие команды, а так же источник питания, обеспечивающий автономную работу в течение длительного времени.
Функциональные возможности GPS передатчиков
По мере роста функциональности, появляются следующие возможности прибора:
![](https://i0.wp.com/steptosleep.ru/wp-content/uploads/2018/06/32087.jpg)
Варианты исполнения GPS передатчиков
В зависимости от комплектации, могут значительно отличаться корпуса передатчиков. Различные модели имеют исполнения в виде сотовых телефонов, классических навигаторов, или даже наручных часов.
Красочный дизайн специальных версий и полезные дополнения позволяют детям относиться к данным устройствам не как к «родительским шпионам», а как к модным и практичным гаджетам.
В качестве преимущества, стоит упомянуть тот факт, что многие версии прибора прекрасно обходятся без абонентской платы за услуги специализированных операторов, а всю необходимую информацию отправляют клиенту напрямую через интернет или СМС сообщения, что позволяет достаточно весомо сэкономить на содержании подобного оборудования.
Статьи о GPS-трекерах
В этой статье я покажу как использовать gsm модуль совместно с arduino на примере sim800L. Эта же инструкция вполне подойдет для использования любых других gsm модулей, например, sim900 и т.д., потому что все модули работают примерно по одному и тому же типу — это обмен АТ-командами через порт.
Использование модуля с arduino я покажу на примере SMS-реле, которое можно использовать для управления устройством удаленно, посредством SMS-команд. Это можно применять совместно с автосигнализацией и т.д.
Подключается модуль к Arduino через UART интерфейс программного серийного порта, работающего на 2 и 3 цифровых выводах Arduino nano.
Работа Arduino с GSM модулями
Для питания модуля необходимо напряжение в диапазоне от 3.6В до 4.2В, это значит, что придется использовать дополнительный стабилизатор напряжения, так в Arduino установлен стабилизатор на 3.3 вольта, что не подходит для питания модуля, вторая причина установить дополнительный стабилизатор — GSM модуль является серьезной нагрузкой, так как в нем имеется не слабый передатчик, обеспечивающий стабильную связь с сотовой станцией. Питание для Arduino nano подводится к контакту VIN — это встроенный в Arduino стабилизатор, обеспечивающий работу модуля в широких диапазонах напряжения (6-10В). Модуль реле подключается согласно приведенному тексту программы, к 10 выводу Arduino nano и легко может быть изменен на любой другой, работающий как цифровой выход.
Работает это так: устанавливаем SIM-карту в GSM модуль, включаем питание и отправляем SMS с текстом «1» на номер SIM карты для того чтобы включить наше реле, чтобы отключить отправляем SMS с текстом «0».
#include
SoftwareSerial gprsSerial(2, 3); // установка контактов 2 и 3 для программного порта
int LedPin = 10; // для реле
void setup()
{
gprsSerial.begin(4800);
pinMode(LedPin, OUTPUT);
// настройка приема сообщений
gprsSerial.print(«AT+CMGF=1\r»);
gprsSerial.print(«AT+IFC=1, 1\r»);
delay(500);
gprsSerial.print(«AT+CPBS=\»SM\»\r»);
delay(500); // задержка на обработку команды
gprsSerial.print(«AT+CNMI=1,2,2,1,0\r»);
delay(700);
}
String currStr = «»;
// если эта строка сообщение, то переменная примет значение True
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if (‘\r’ == currSymb) {
if (isStringMessage) {
// если текущая строка - сообщение, то…
if (!currStr.compareTo(«1»)) {
digitalWrite(LedPin, HIGH);
} else if (!currStr.compareTo(«0»)) {
digitalWrite(LedPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith(«+CMT»)) {
// если текущая строка начинается с «+CMT», то следующая сообщение
isStringMessage = true;
}
}
currStr = «»;
} else if (‘\n’ != currSymb) {
currStr += String(currSymb);
}
}
Видео версия статьи:
Теги: #Arduino, #SIM800L
Ваша оценка:
Товары, использованные в данной статье:
← GPS-логгер на arduino | Управление реле по COM порту →
GSM сканер на RTL-SDR
| Главная | English | Разработка | FAQ |
Основные характеристики сканера
GSM сканер выполняет сканирование нисходящих каналов GSM и отображает информацию об уровне сигнала и принадлежности канала одному из трех основных операторов сотовой связи МТС, Билайн и Мегафон. По результатам работы сканер позволяет сохранить список идентификаторов базовых станций MCC, MNC, LAC и CI для всех сканированных каналов.
GSM сканер может быть использован для оценки уровня GSM сигнала, сравнения качества сигнала разных операторов, оценки радиопокрытия, при принятии решения об установке усилителей сигналов сотовой связи и регулировке их параметров, в образовательных целях и др.
Сканер работает под Windows и использует простой и дешевый приемник — RTL-SDR. Прочитать о RTL-SDR можно на:
RTL-SDR (RTL2832U) and software defined radio news and projects,
RTL-SDR – OsmoSDR,
RTL-SDR по-русски.
Параметрами RTL-SDR и определяются основные характеристики сканера. Безусловно GSM сканер не является заменой нормального измерительного оборудования.
Сканер распространяется бесплатно, без каких либо ограничений на использование.
Текущая версия поддерживает диапазон GSM 900 и не поддерживает GSM 1800. Это определяется тем, что рабочая частота RTL-SDR с тюнером R820T ограничена значением 1760 МГц. Есть надежда что применение экспериментального драйвера RTL-SDR позволит реализовать работу хотя бы в части диапазона 1800 МГц.
Запуск сканера
Последнюю версию сканера можно скачать по ссылке. Просто разархивируйте файл в удобное место и запустите gsmscan.exe.
Предыдущие версии сканера, ссылка на репозиторий с исходниками и другая информация связанная с разработкой находится на странице разработки.
Для работы сканера требуется установка драйверов RTL-SDR, если они еще не были установлены, это удобно сделать с помощью программы Zadig описание процедуры установки.
Использование сканера
Ниже представлен вид окна программы сканера:
По горизонтальной оси откладывается номер канала GSM в виде ARFCN или в МГц, по вертикальной оси уровень сигнала в дБм. Высота линии показывает уровень сигнала.
GSM модуль NEOWAY M590 связь с Ардуино
Если идентификаторы БС были декодированы успешно и они соответствуют идентификаторам тройки основных операторов связи, линии окрашиваются в соответствующие цвета.
Выпадающие списки в верхней части экрана позволяют выбирать SDR приемник, если их подключено несколько, диапазон работы GSM 900 или GSM 1800 и единицы измерения по горизонтальной оси ARFCN или МГц.
Кнопки позволяют сохранить отчет о работе сканера в виде списка декодированных базовых станций, очистить результаты декодирования БС и получить информацию о программе.
Принципы и особенности работы.
В процессе работы программа сканирует рабочий диапазон частот с шагом 2.0 МГц (10 каналов GSM) и оцифровывает сигнал с частотой дискретизации 2.4 МГц. Процесс сканирования состоит из быстрого прохода всего диапазона для измерения мощности сигнала и медленного прохода для декодирования идентификаторов БС.
Один шаг декодирования выполняется после прохода всего диапазона для измерения мощности. Таким образом, в диапазоне GSM 900, уровень сигнала обновляется приблизительно раз в 2 с, а полный проход декодирования занимает порядка 1 мин.
Из-за плохого качества сигнала получаемого с RTL-SDR, вероятность правильного декодирования системной информации (SI) широковещательного управляющего канала (BCCH) БС оказывается не высокой. Флуктуации уровня сигнала в результате много-лучевого распространения так же снижают вероятность декодирования системной информации. По этим причинам, для получения идентификаторов БС необходимо чтобы сканер накапливал информацию в течении времени порядка 10 мин. Но даже в этом случае, далеко не все каналы обеспечивают в данном месте достаточный уровень и качество сигнала для декодирования даже самым идеальным приемником. Кроме этого, не все каналы GSM используются для работы по стандарту GSM, как видно на рисунке выше, каналы 975 — 1000 заняты Мегафоном для работы по стандарту UMTS.
В процессе работы, сканер добавляет системную информацию о новых декодированных каналах в общий массив информации по каналам. Но информация о декодированных ранее каналах не стирается при недекодировании системной информации на данном шаге, и остается в массиве. Для очистки этой информации служит кнопка очистки результатов декодирования БС.
При нажатии на кнопку сохранения отчета, накопленные результаты сохраняются в текстовый файл с названием составленным из названия программы, даты и времени сохранения данных. Ниже для примера приведена часть файла отчета:
Сканер предназначен для работы под Windows 7, 8.1 и 10. работа тестировалась с тремя экземплярами RTL-SDR с тюнером R820T, другие типы тюнеров не тестировались.
Для работы под Windows XP собрана специальная версия программы, работает она в несколько раз медленнее стандартной версии.
Развитие.
Программа сканера поставляется как есть, без каких либо гарантий и ответственности. Если у вас есть разумные идеи как расширить функциональность или улучшить работу сканера мы готовы обсудить возможность их реализации.
Вы можете принять участие в разработке сканера, для этого посетите страницу разработки.
Планируется дальнейшее развитие GSM сканера, возможно с вашим участием.
После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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 нет хардверных портов, поэтому приходится использовать программный. Так вот, он может принимать данные только на пине, на котором плата поддерживает прерывания. В случае 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 модулем.