Данные сохраняются в электронную таблицу dataGPS.csv , формат которой соответствует требованиям сервиса Google My Maps .

    Язык программирования: Arduino (C++)

Видеоинструкция

Что потребуется

Как собрать

gps-tracker.ino // библиотека для работы с устройствами по SPI #include // библиотека для работы с SD-картой #include // библиотека для работы с GPS устройством #include // создаём объект класса GPS и передаём в него объект Serial1 GPS gps(Serial1) ; // пин светодиода #define LED_PIN A0 // пин кнопки #define BUTTON_PIN 13 // пин CS micro-sd карты #define CHIP_SELECT_PIN 9 // интервал времени записи данных на карту #define INTERVAL 5000 // задаём размер массива для времени, даты, широты и долготы #define MAX_SIZE_MASS 16 // массив для хранения текущего времени char time [ MAX_SIZE_MASS] ; // состояние записи bool stateRec = false ; // запоминает текущее время long startMillis = millis() ; void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin (115200 ) ; // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе // while (!Serial) { // } Serial.print ("Serial init OK\r \n " ) ; // открываем Serial-соединение с GPS-модулем Serial1.begin (115200 ) ; // устанавливаем светодиод в режим выхода pinMode(LED_PIN, OUTPUT) ; // устанавливаем кнопку в режим входа pinMode(BUTTON_PIN, INPUT_PULLUP) ; // выводим информацию об инициализации в Serial-порт Serial.println ("Initializing SD card..." ) ; // инициализируем SD-карту while (! SD.begin (CHIP_SELECT_PIN) ) { Serial.println ("Card failed, or not present" ) ; delay(1000 ) ; } // выводим информацию в Serial-порт Serial.println ("Card initialized" ) ; // создаём объект dataFile класса File для работы с файлами File dataFile = SD.open ("dataGPS.csv" , FILE_WRITE) ; // если файл существует if (dataFile) { // записываем название будущих данных на карту памяти dataFile.println ("Time, Coordinates, Speed" ) ; // закрываем файл dataFile.close () ; Serial.println ("Save OK" ) ; } else { Serial.println ("Error opening test.csv" ) ; } } void loop() { // Фиксируем нажатие кнопки if (! digitalRead(BUTTON_PIN) ) { // меняем состояние «запись» / «не запись» на карту памяти stateRec = ! stateRec; // меняем состояние светодиода индикации digitalWrite(LED_PIN, stateRec) ; } // если пришли данные с gps-модуля if (gps.available () ) { // считываем данные и парсим gps.readParsing () ; // проверяем состояние GPS-модуля switch (gps.getState () ) { // всё OK case GPS_OK: Serial.println ("GPS is OK" ) ; // если прошёл заданный интервал времени if (millis() - startMillis > INTERVAL && stateRec) { // сохраняем данные на карту памяти saveSD() ; // запоминаем текущее время startMillis = millis() ; } break ; // ошибка данных case GPS_ERROR_DATA: Serial.println ("GPS error data" ) ; break ; // нет соединение со спутниками case GPS_ERROR_SAT: Serial.println ("GPS no connect to satellites" ) ; break ; } } } // функция сохарение данных на карту памяти void saveSD() { File dataFile = SD.open ("dataGPS.csv" , FILE_WRITE) ; // если файл существует и открылся if (dataFile) { // считывает текущее время gps.getTime (time , MAX_SIZE_MASS) ; // записываем время на карту памяти dataFile.print ("\" " ) ; dataFile.print (time ) ; dataFile.print ("\" " ) ; dataFile.print ("," ) ; dataFile.print ("\" " ) ; // считываем и записывае координаты широты и долготы на карту памяти dataFile.print (gps.getLatitudeBase10 () , 6 ) ; dataFile.print ("," ) ; dataFile.print (gps.getLongitudeBase10 () , 6 ) ; dataFile.print ("\" " ) ; dataFile.print ("," ) ; dataFile.print (gps.getSpeedKm () ) ; dataFile.println ("km/h" ) ; dataFile.close () ; Serial.println ("Save OK" ) ; } else { Serial.println ("Error opening test.csv" ) ; } }

Система глобального позиционирования 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; gps.f_get_position(&flat, &flon, &age); Serial.print(” lat “); Serial.print(flat, 4); Serial.print(” lon “); Serial.print(flon, 4); Serial.print(” kms “); Serial.print(fkmph); Serial.print(” course “); Serial.print(fc); Serial.print(” elevation “); Serial.println(falt); /////////////////////////////////////////////////////////////////////////////////////////////

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



После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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

После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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 модулем.

Индивидуальные GPS передатчики

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

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

По сути, это те же самые GPS-трекеры, только рассчитанные на использование не на транспортном средстве, а человеком в повседневной жизни.

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

Внутри у неё расположен GPS модуль, определяющий координаты на местности, GSM/GPRS модуль, передающий информацию и принимающий управляющие команды, а так же источник питания, обеспечивающий автономную работу в течение длительного времени.

Функциональные возможности GPS передатчиков

По мере роста функциональности, появляются следующие возможности прибора:


Варианты исполнения 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 сканера, возможно с вашим участием.