GPS-трекер для авто из смартфона своими руками

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

Внешний вид

Размеры данного модуля не большие 35 х 24 мм, и он сможет найти свое место не только в носимой электронике, но и в RC — аппаратах.

6e6d95.jpg

В комплекте идет пассивная антенна:

701220.jpg

5eb2cc.jpg

При желании всегда можно заменить активной или изготовить самому, по этой методике:

561caa.png

По запросу, в комментариях, выдам ссылку на мануал.

На сегодняшний день модуль не является устаревшей моделью, и активно используется, + имеется поддержка производителя

даташит с сайта производителя

.

А тут находится

страница, ведущая на сайт

производителя данного аппарата

На приведенном изображении кратко описаны возможности данного семейства приемников:

7c1d02.jpg

Принципы работы

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

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

Трекер для автомобиля работает как:

  • приемник спутникового сигнала;
  • передатчик сигнала спутника в формате GSM на принимающее устройство (сотовый телефон, компьютер, ноутбук или планшет);
  • трекер автономное устройство, снабженное источником питания – батареей или аккумулятором.

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

Принцип действия GPSПринцип действия GPS трекера

Преимущества мониторинга:

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

Все текущие данные выводятся на монитор смартфона или планшета в режиме онлайн.

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

Какой сервер GPS-мониторинга выбрать?

Да, друзья, начинается все именно с сервера, а уже затем под его параметры настраивается специальное ПО на телефоне. В дальнейшем я буду показывать работу системы слежения на примере онлайн-сервиса gpshome.ru. Поэтому необходимо пройти по указанной ссылке и зарегистрироваться.

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

Именно она свяжет пользовательское устройство с сервером спутникового мониторинга. Бесплатно скачать ее следует в официальном магазине вот по этой ссылке. С подробными техническими требованиями к аппарату можно ознакомиться в разделе «Приложение Андроид» на сайте сервиса:

zen.yandex.ru

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

Принцип работы и область применения

Маячок находится в спящем режиме и включается по запрограммированному циклу. При активации происходит обмен параметрами со спутником или станциями сотовой связи стандарта GSM, а затем устройство уходит в спящий режим. Из-за особенностей работы информация от маячка имеет вид отдельных точек, которые можно соединить ломаной прямой.

В стандартном графике маяк выходит на связь до четырех раз в сутки. В случае необходимости режим работы прибора можно изменить через систему сотовой связи и увеличить частоту включения до одного раза в 5-10 минут. Постоянный обмен информацией позволит ускорить поиск машины или человека, но может быстро разрядить аккумуляторную батарею маячкового устройства. В режиме подачи сигнала раз в сутки маячок способен функционировать на одном аккумуляторе три-четыре года. Переключение устройства в режим тревоги сокращает время работы до 12-15 суток.

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

Разновидности

Существуют различные GPS-маячки:

  1. С возможностью подключения к замку зажигания автомобиля. Это позволяет устройству автоматически переключаться в режим частого обмена координатами со станциями при попытке несанкционированного запуска двигателя.
  2. Встречаются конструкции маячков со встроенными микрофонами, которые позволяют дистанционно прослушивать салон автомобиля.
  3. Имеются модели маяков с отдельно выведенной кнопкой для активации режима тревоги. Устройства носятся в кармане или устанавливаются на транспортном средстве. Нажатие на кнопку производится при попытке ограбления или угона. Прибор стал популярен для подачи ребенком сигнала о помощи. При нажатии клавиши на сотовый телефон родителей поступают координаты места подачи тревоги.
  4. В виде часов. Одним из образцов устройств для контроля за перемещением человека являются часы Smart Watch A19, которые могут отслеживать местонахождение в реальном времени и сохранять историю перемещений. Имеется возможность ограничения территории перемещения владельца. При выходе за пределы на телефон родителей поступает текстовое сообщение или звонок.
  5. Выпускаются маячки в виде брелков, которые позволяют родителям осуществлять двухстороннюю связь с ребенком. Маяк с небольшими габаритами и весом легко размещается в кармане. При этом устройство имеет герметичный корпус, который продлевает срок службы изделия.

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

Кроме отдельных устройств, имеется возможность отслеживания ребенка или груза по сигналам смартфона. У операторов сотовой связи есть специальные тарифные планы, в рамках которых можно видеть местоположение второго абонента, например, тариф МТС “Ребенок под присмотром”.

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

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

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

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

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

Arduino MKR FOX 1200

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

Дополнительная информация здесь.

GPS-модуль ATGM332

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

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

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

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

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

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

GPS трекеры на базе телефонов

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

Отследить объект со смартфоном не сложно. До уровня тренера он доводится простыми манипуляциями подключения к сети объекта. Потребуется установка соответствующих GPS-приложений, с последующей настройкой. Экспертами рекомендовано активировать опции:

  • Автозапуска;
  • Информирования (желание владельца);
  • Внешнего питания;
  • Абсолютного пробуждения (желание владельца);
  • Обработки указаний.

Полноценным маяком мобильное устройство станет, когда задастся минимальный промежуток времени при обновлениях сведений, отправке SMS-ок при пропаже общения с серверами. Если владельцу требуется, то для устойчивого функционирования GPS-трекеров предлагается выполнить часть потребных настроек в разделе «События».

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

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

  • Обычные сотовые телефоны;
  • GPS, GPRS блоки;
  • Приемники сигналов;
  • Соединительные переходники;
  • Режущий инструмент, паяльники.

GPS маяки доработка на базе телефоновДоработка мобильного телефона до состояния GPS-маяка заключается в соединении блока навигации с самим устройством. Соединяется проводом от зарядного приспособления, один конец, которого совместим с зарядным разъемом МУ, другой паяется к блоку навигации. Включением приемника, настройкой мобилки, прибор доводится до состояния GPS трекера.

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

Сотовые операторы тоже не сидят на месте. Ими освоено предоставление соответствующих услуг. Активация доступна любому МУ без GPS-навигации, маяк в таком случае не нужен. Списки абонентов передаются оператору. Для получения информации потребуются сделать запрос по форме, с указанием нужного абонента.

Характеристики трекера А8

  • Название модели: mini A8 GPS Tracker
  • Мощность аккумулятора: 500mAh
  • Напряжение: 5V Li-Ion
  • Рабочая частота: GSM850/900/1800/1900MHz
  • Режим ожидания: 12 дней
  • Производитель: Гонконг
  • Размер: 43х33х13 мм

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

Подготовим программатор для прошивки:

9ab35e.jpg

Затем в Нано зашиваем этот скетч:

Дополнительная информация

// ArduinoISP// Copyright © 2008-2011 Randall Bohn// If you require a license, see// http://www.opensource.org/licenses/bsd-license.php//// This sketch turns the Arduino into a AVRISP using the following Arduino pins://// Pin 10 is used to reset the target microcontroller.//// By default, the hardware SPI pins MISO, MOSI and SCK are used to communicate// with the target. On all Arduinos, these pins can be found// on the ICSP/SPI header://// MISO °. . 5V (!) Avoid this pin on Due, Zero…// SCK . . MOSI// . . GND//// On some Arduinos (Uno,…), pins MOSI, MISO and SCK are the same pins as// digital pin 11, 12 and 13, respectively. That is why many tutorials instruct// you to hook up the target to these pins. If you find this wiring more// practical, have a define USE_OLD_STYLE_WIRING. This will work even when not// using an Uno. (On an Uno this is not needed).//// Alternatively you can use any other digital pin by configuring// software (‘BitBanged’) SPI and having appropriate defines for PIN_MOSI,// PIN_MISO and PIN_SCK.//// IMPORTANT: When using an Arduino that is not 5V tolerant (Due, Zero, …) as// the programmer, make sure to not expose any of the programmer’s pins to 5V.// A simple way to accomplish this is to power the complete system (programmer// and target) at 3V3.//// Put an LED (with resistor) on the following pins:// 9: Heartbeat — shows the programmer is running// 8: Error — Lights up if something goes wrong (use red if that makes sense)// 7: Programming — In communication with the slave//#include «Arduino.h»#undef SERIAL#define PROG_FLICKER true// Configure SPI clock (in Hz).// E.g. for an ATtiny @ 128 kHz: the datasheet states that both the high and low// SPI clock pulse must be > 2 CPU cycles, so take 3 cycles i.e. divide target// f_cpu by 6:// #define SPI_CLOCK (128000/6)//// A clock slow enough for an ATtiny85 @ 1 MHz, is a reasonable default:#define SPI_CLOCK (1000000/6)// Select hardware or software SPI, depending on SPI clock.// Currently only for AVR, for other architectures (Due, Zero,…), hardware SPI// is probably too fast anyway.#if defined(ARDUINO_ARCH_AVR)#if SPI_CLOCK > (F_CPU / 128)#define USE_HARDWARE_SPI#endif#endif// Configure which pins to use:// The standard pin configuration.#ifndef ARDUINO_HOODLOADER2#define RESET 10 // Use pin 10 to reset the target rather than SS#define LED_HB 9#define LED_ERR 8#define LED_PMODE 7// Uncomment following line to use the old Uno style wiring// (using pin 11, 12 and 13 instead of the SPI header) on Leonardo, Due…// #define USE_OLD_STYLE_WIRING#ifdef USE_OLD_STYLE_WIRING#define PIN_MOSI 11#define PIN_MISO 12#define PIN_SCK 13#endif// HOODLOADER2 means running sketches on the ATmega16U2 serial converter chips// on Uno or Mega boards. We must use pins that are broken out:#else#define RESET 4#define LED_HB 7#define LED_ERR 6#define LED_PMODE 5#endif// By default, use hardware SPI pins:#ifndef PIN_MOSI#define PIN_MOSI MOSI#endif#ifndef PIN_MISO#define PIN_MISO MISO#endif#ifndef PIN_SCK#define PIN_SCK SCK#endif// Force bitbanged SPI if not using the hardware SPI pins:#if (PIN_MISO != MISO) || (PIN_MOSI != MOSI) || (PIN_SCK != SCK)#undef USE_HARDWARE_SPI#endif// Configure the serial port to use.//// Prefer the USB virtual serial port (aka. native USB port), if the Arduino has one:// — it does not autoreset (except for the magic baud rate of 1200).// — it is more reliable because of USB handshaking.//// Leonardo and similar have an USB virtual serial port: ‘Serial’.// Due and Zero have an USB virtual serial port: ‘SerialUSB’.//// On the Due and Zero, ‘Serial’ can be used too, provided you disable autoreset.// To use ‘Serial’: #define SERIAL Serial#ifdef SERIAL_PORT_USBVIRTUAL#define SERIAL SERIAL_PORT_USBVIRTUAL#else#define SERIAL Serial#endif// Configure the baud rate:#define BAUDRATE 19200// #define BAUDRATE 115200// #define BAUDRATE 1000000#define HWVER 2#define SWMAJ 1#define SWMIN 18// STK Definitions#define STK_OK 0x10#define STK_FAILED 0x11#define STK_UNKNOWN 0x12#define STK_INSYNC 0x14#define STK_NOSYNC 0x15#define CRC_EOP 0x20 //ok it is a space…void pulse(int pin, int times);#ifdef USE_HARDWARE_SPI#include «SPI.h»#else#define SPI_MODE0 0x00class SPISettings { public: // clock is in Hz SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) : clock(clock) { (void) bitOrder; (void) dataMode; }; private: uint32_t clock; friend class BitBangedSPI;};class BitBangedSPI { public: void begin() { digitalWrite(PIN_SCK, LOW); digitalWrite(PIN_MOSI, LOW); pinMode(PIN_SCK, OUTPUT); pinMode(PIN_MOSI, OUTPUT); pinMode(PIN_MISO, INPUT); } void beginTransaction(SPISettings settings) { pulseWidth = (500000 + settings.clock — 1) / settings.clock; if (pulseWidth == 0) pulseWidth = 1; } void end() {} uint8_t transfer (uint8_t b) { for (unsigned int i = 0; i < 8; ++i) { digitalWrite(PIN_MOSI, (b & 0x80) ? HIGH : LOW); digitalWrite(PIN_SCK, HIGH); delayMicroseconds(pulseWidth); b = (b << 1) | digitalRead(PIN_MISO); digitalWrite(PIN_SCK, LOW); // slow pulse delayMicroseconds(pulseWidth); } return b; } private: unsigned long pulseWidth; // in microseconds};static BitBangedSPI SPI;#endifvoid setup() { SERIAL.begin(BAUDRATE); pinMode(LED_PMODE, OUTPUT); pulse(LED_PMODE, 2); pinMode(LED_ERR, OUTPUT); pulse(LED_ERR, 2); pinMode(LED_HB, OUTPUT); pulse(LED_HB, 2);}int error = 0;int pmode = 0;// address for reading and writing, set by ‘U’ commandunsigned int here;uint8_t buff[256]; // global block storage#define beget16(addr) (*addr * 256 + *(addr+1) )typedef struct param { uint8_t devicecode; uint8_t revision; uint8_t progtype; uint8_t parmode; uint8_t polling; uint8_t selftimed; uint8_t lockbytes; uint8_t fusebytes; uint8_t flashpoll; uint16_t eeprompoll; uint16_t pagesize; uint16_t eepromsize; uint32_t flashsize;}parameter;parameter param;// this provides a heartbeat on pin 9, so you can tell the software is running.uint8_t hbval = 128;int8_t hbdelta = 8;void heartbeat() { static unsigned long last_time = 0; unsigned long now = millis(); if ((now — last_time) < 40) return; last_time = now; if (hbval > 192) hbdelta = -hbdelta; if (hbval < 32) hbdelta = -hbdelta; hbval += hbdelta; analogWrite(LED_HB, hbval);}static bool rst_active_high;void reset_target(bool reset) { digitalWrite(RESET, ((reset && rst_active_high) || (!reset && !rst_active_high)) ? HIGH : LOW);}void loop(void) { // is pmode active? if (pmode) { digitalWrite(LED_PMODE, HIGH); } else { digitalWrite(LED_PMODE, LOW); } // is there an error? if (error) { digitalWrite(LED_ERR, HIGH); } else { digitalWrite(LED_ERR, LOW); } // light the heartbeat LED heartbeat(); if (SERIAL.available()) { avrisp(); }}uint8_t getch() { while (!SERIAL.available()); return SERIAL.read();}void fill(int n) { for (int x = 0; x < n; x++) { buff[x] = getch(); }}#define PTIME 30void pulse(int pin, int times) { do { digitalWrite(pin, HIGH); delay(PTIME); digitalWrite(pin, LOW); delay(PTIME); } while (times—);}void prog_lamp(int state) { if (PROG_FLICKER) { digitalWrite(LED_PMODE, state); }}uint8_t spi_transaction(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { SPI.transfer(a); SPI.transfer(b); SPI.transfer©; return SPI.transfer(d);}void empty_reply() { if (CRC_EOP == getch()) { SERIAL.print((char)STK_INSYNC); SERIAL.print((char)STK_OK); } else { error++; SERIAL.print((char)STK_NOSYNC); }}void breply(uint8_t b) { if (CRC_EOP == getch()) { SERIAL.print((char)STK_INSYNC); SERIAL.print((char)b); SERIAL.print((char)STK_OK); } else { error++; SERIAL.print((char)STK_NOSYNC); }}void get_version(uint8_t c) { switch © { case 0x80: breply(HWVER); break; case 0x81: breply(SWMAJ); break; case 0x82: breply(SWMIN); break; case 0x93: breply(‘S’); // serial programmer break; default: breply(0); }}void set_parameters() { // call this after reading parameter packet into buff[] param.devicecode = buff[0]; param.revision = buff[1]; param.progtype = buff[2]; param.parmode = buff[3]; param.polling = buff[4]; param.selftimed = buff[5]; param.lockbytes = buff[6]; param.fusebytes = buff[7]; param.flashpoll = buff[8]; // ignore buff[9] (= buff[8]) // following are 16 bits (big endian) param.eeprompoll = beget16(&buff[10]); param.pagesize = beget16(&buff[12]); param.eepromsize = beget16(&buff[14]); // 32 bits flashsize (big endian) param.flashsize = buff[16] * 0x01000000 + buff[17] * 0x00010000 + buff[18] * 0x00000100 + buff[19]; // AVR devices have active low reset, AT89Sx are active high rst_active_high = (param.devicecode >= 0xe0);}void start_pmode() { // Reset target before driving PIN_SCK or PIN_MOSI // SPI.begin() will configure SS as output, so SPI master mode is selected. // We have defined RESET as pin 10, which for many Arduinos is not the SS pin. // So we have to configure RESET as output here, // (reset_target() first sets the correct level) reset_target(true); pinMode(RESET, OUTPUT); SPI.begin(); SPI.beginTransaction(SPISettings(SPI_CLOCK, MSBFIRST, SPI_MODE0)); // See AVR datasheets, chapter «SERIAL_PRG Programming Algorithm»: // Pulse RESET after PIN_SCK is low: digitalWrite(PIN_SCK, LOW); delay(20); // discharge PIN_SCK, value arbitrarily chosen reset_target(false); // Pulse must be minimum 2 target CPU clock cycles so 100 usec is ok for CPU // speeds above 20 KHz delayMicroseconds(100); reset_target(true); // Send the enable programming command: delay(50); // datasheet: must be > 20 msec spi_transaction(0xAC, 0x53, 0x00, 0x00); pmode = 1;}void end_pmode() { SPI.end(); // We’re about to take the target out of reset so configure SPI pins as input pinMode(PIN_MOSI, INPUT); pinMode(PIN_SCK, INPUT); reset_target(false); pinMode(RESET, INPUT); pmode = 0;}void universal() { uint8_t ch; fill(4); ch = spi_transaction(buff[0], buff[1], buff[2], buff[3]); breply(ch);}void flash(uint8_t hilo, unsigned int addr, uint8_t data) { spi_transaction(0x40 + 8 * hilo, addr >> 8 & 0xFF, addr & 0xFF, data);}void commit(unsigned int addr) { if (PROG_FLICKER) { prog_lamp(LOW); } spi_transaction(0x4C, (addr >> 8) & 0xFF, addr & 0xFF, 0); if (PROG_FLICKER) { delay(PTIME); prog_lamp(HIGH); }}unsigned int current_page() { if (param.pagesize == 32) { return here & 0xFFFFFFF0; } if (param.pagesize == 64) { return here & 0xFFFFFFE0; } if (param.pagesize == 128) { return here & 0xFFFFFFC0; } if (param.pagesize == 256) { return here & 0xFFFFFF80; } return here;}void write_flash(int length) { fill(length); if (CRC_EOP == getch()) { SERIAL.print((char) STK_INSYNC); SERIAL.print((char) write_flash_pages(length)); } else { error++; SERIAL.print((char) STK_NOSYNC); }}uint8_t write_flash_pages(int length) { int x = 0; unsigned int page = current_page(); while (x < length) { if (page != current_page()) { commit(page); page = current_page(); } flash(LOW, here, buff[x++]); flash(HIGH, here, buff[x++]); here++; } commit(page); return STK_OK;}#define EECHUNK (32)uint8_t write_eeprom(unsigned int length) { // here is a word address, get the byte address unsigned int start = here * 2; unsigned int remaining = length; if (length > param.eepromsize) { error++; return STK_FAILED; } while (remaining > EECHUNK) { write_eeprom_chunk(start, EECHUNK); start += EECHUNK; remaining -= EECHUNK; } write_eeprom_chunk(start, remaining); return STK_OK;}// write (length) bytes, (start) is a byte addressuint8_t write_eeprom_chunk(unsigned int start, unsigned int length) { // this writes byte-by-byte, page writing may be faster (4 bytes at a time) fill(length); prog_lamp(LOW); for (unsigned int x = 0; x < length; x++) { unsigned int addr = start + x; spi_transaction(0xC0, (addr >> 8) & 0xFF, addr & 0xFF, buff[x]); delay(45); } prog_lamp(HIGH); return STK_OK;}void program_page() { char result = (char) STK_FAILED; unsigned int length = 256 * getch(); length += getch(); char memtype = getch(); // flash memory @here, (length) bytes if (memtype == ‘F’) { write_flash(length); return; } if (memtype == ‘E’) { result = (char)write_eeprom(length); if (CRC_EOP == getch()) { SERIAL.print((char) STK_INSYNC); SERIAL.print(result); } else { error++; SERIAL.print((char) STK_NOSYNC); } return; } SERIAL.print((char)STK_FAILED); return;}uint8_t flash_read(uint8_t hilo, unsigned int addr) { return spi_transaction(0x20 + hilo * 8, (addr >> 8) & 0xFF, addr & 0xFF, 0);}char flash_read_page(int length) { for (int x = 0; x < length; x += 2) { uint8_t low = flash_read(LOW, here); SERIAL.print((char) low); uint8_t high = flash_read(HIGH, here); SERIAL.print((char) high); here++; } return STK_OK;}char eeprom_read_page(int length) { // here again we have a word address int start = here * 2; for (int x = 0; x < length; x++) { int addr = start + x; uint8_t ee = spi_transaction(0xA0, (addr >> 8) & 0xFF, addr & 0xFF, 0xFF); SERIAL.print((char) ee); } return STK_OK;}void read_page() { char result = (char)STK_FAILED; int length = 256 * getch(); length += getch(); char memtype = getch(); if (CRC_EOP != getch()) { error++; SERIAL.print((char) STK_NOSYNC); return; } SERIAL.print((char) STK_INSYNC); if (memtype == ‘F’) result = flash_read_page(length); if (memtype == ‘E’) result = eeprom_read_page(length); SERIAL.print(result);}void read_signature() { if (CRC_EOP != getch()) { error++; SERIAL.print((char) STK_NOSYNC); return; } SERIAL.print((char) STK_INSYNC); uint8_t high = spi_transaction(0x30, 0x00, 0x00, 0x00); SERIAL.print((char) high); uint8_t middle = spi_transaction(0x30, 0x00, 0x01, 0x00); SERIAL.print((char) middle); uint8_t low = spi_transaction(0x30, 0x00, 0x02, 0x00); SERIAL.print((char) low); SERIAL.print((char) STK_OK);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void avrisp() { uint8_t ch = getch(); switch (ch) { case ‘0’: // signon error = 0; empty_reply(); break; case ‘1’: if (getch() == CRC_EOP) { SERIAL.print((char) STK_INSYNC); SERIAL.print(«AVR ISP»); SERIAL.print((char) STK_OK); } else { error++; SERIAL.print((char) STK_NOSYNC); } break; case ‘A’: get_version(getch()); break; case ‘B’: fill(20); set_parameters(); empty_reply(); break; case ‘E’: // extended parameters — ignore for now fill(5); empty_reply(); break; case ‘P’: if (!pmode) start_pmode(); empty_reply(); break; case ‘U’: // set address (word) here = getch(); here += 256 * getch(); empty_reply(); break; case 0x60: //STK_PROG_FLASH getch(); // low addr getch(); // high addr empty_reply(); break; case 0x61: //STK_PROG_DATA getch(); // data empty_reply(); break; case 0x64: //STK_PROG_PAGE program_page(); break; case 0x74: //STK_READ_PAGE ‘t’ read_page(); break; case ‘V’: //0x56 universal(); break; case ‘Q’: //0x51 error = 0; end_pmode(); empty_reply(); break; case 0x75: //STK_READ_SIGN ‘u’ read_signature(); break; // expecting a command, not CRC_EOP // this is how we can get back in sync case CRC_EOP: error++; SERIAL.print((char) STK_NOSYNC); break; // anything else we will return STK_UNKNOWN default: error++; if (CRC_EOP == getch()) SERIAL.print((char)STK_UNKNOWN); else SERIAL.print((char)STK_NOSYNC); }}

После этого выбираем Ваш контроллер Pro Mini, указываем программатор ArduinoISP и шьем контроллер, используя команду

Скетч -> Загрузить через программатор

и нажимаем кнопку Reset на Pro mini, пойдет прошивка контроллера (у меня проходит только со второй попытки, нужно набраться терпения):

ed473a.png

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

«проект»

мое желание не обошло стороной.

Что нам для всего этого потребуется:

52b4c7.jpg

В общем, собрал весь хлам, который валялся без дела:

1. SD card module, очень огромный, поэтому я старался как можно скорее избавится от него.

2. Дисплей на базе контроллера PCD8544, всем известный нокиа дисплей.

3. Карта памяти на 1Гб, с не популярным стандартом MiniSD, вообще был без идеи куда ее воткнуть, а хочется все пустить в дело, вот и пускай поработает на благо навигации.

4. Потребуется мозг, большой такой мозг Pro Mini на чипе 328P.

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

Вообще я очень старался засунуть весь проект в нано, ну просто очень. Не получается, либо отказываемся от карты памяти, либо от дисплея.

5. Конечно же, сам модуль + антенна, как писал выше можно изготовить самому.

6. Ах да, чуть не забыл, потребуется еще корпус иначе, что за устройство без корпуса.

7da12f.jpg

В качестве корпуса были закуплены, еще раз

те самые коробки

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

Когда все комплектующие есть в наличии, можно все это подключить и запрограммировать.

Подключаем к Pro Mini по следующей схеме:

Дисплей:

RST — D6
CE — D7
DC — D5
DIN — D4
CLK — D3
VCC — 5V (опционально в моем случае, в остальных 3.3В )
Light — GND
GND — GND

Подсветка мне была не нужна, и я не стал ее подключать.

SD карта:

CS-D10
MOSI-D11
MISO-D12
SCK-D13
GND — GND
5V — VCC (опционально в моем случае, в некоторых при наличии преобразователя подключаем на 3.3В)

GPS модуль:

RX-D8
TX-D2
GND — GND
VCC-3.3 (3.3 это предел!)

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

Примерный вид:

b2a9e6.jpg

Код прост и незамысловат, для использования Вам понадобится, пожалуй

самая легкая библиотека для дисплея

. Далее

библиотека для GPS

. Остальные являются встроенными. По коду, строка — time*0.000001+5, по сути я привел время в удобоваримый вид и добавил часовой пояс. Можно этого не делать и получать чистые результаты.

Ещё один нюанс по библиотеке дисплея заключается в следующем у дисплея, включая с нулевой строкой, всего влезет 6 строк. Что довольно мало, поэтому нужно сразу решать, какую информацию выводить, что-то придется выводить символами, экономя место. Дисплей перерисовывается каждую секунду, при этом обновляя и записывая информацию, поступающую со спутников.

При ошибке чтения файла или отсутствия доступа до карты SD будет выводиться сообщение

SD-

, в остальных случаях

SD+

.

Скетч

#include <SoftwareSerial.h>#include <TinyGPS.h>#include <PCD8544.h>#include <SD.h> //CS-D10, MOSI-D11, MISO-D12, SCK-D13, GND — GND, 5V — VCC (опционально в моем случае, в некоторых при отсутствии преобразователя подключаем на 3.3В)File GPS_file;TinyGPS gps;SoftwareSerial gpsSerial(2, 8);//RX — 8 pin, TX — 2 pinstatic PCD8544 lcd; //RST — D6, CE — D7, DC — D5, DIN — D4, CLK — D3, VCC — 5V (опционально, при наличии преобразователя на 3.3В линии), Light — GND, GND — GNDbool newdata = false;unsigned long start;long lat, lon;unsigned long time, date;void setup() { lcd.begin(84, 48);gpsSerial.begin(9600);Serial.begin(9600);pinMode(10, OUTPUT);if (!SD.begin(10)){lcd.setCursor(0, 0);lcd.println(«SD-«);return;}lcd.setCursor(0, 0);lcd.println(«SD+»);GPS_file = SD.open(«GPSLOG.txt», FILE_WRITE);if (GPS_file){Serial.print(«Writing to test.txt…»);GPS_file.print(«LATITUDE»);GPS_file.print(«,»);GPS_file.print(«LONGITUDE»);GPS_file.print(«,»);GPS_file.print(«DATE»);GPS_file.print(«,»);GPS_file.print(«TIME»);GPS_file.print(«,»);GPS_file.print(«ALTITUDE»);GPS_file.println();GPS_file.close();Serial.println(«done.»);}else{ Serial.println(«error opening test.txt»);}lcd.setCursor(0,3);lcd.print(«ALT: «);lcd.setCursor(0,2);lcd.print(«SPD: «);lcd.setCursor(0,4);lcd.print(«LAT: «);lcd.setCursor(0,5);lcd.print(«LON: «);} void loop() {if (millis() — start > 1000){newdata = readgps();if (newdata){start = millis();gps.get_position(&lat, &lon);gps.get_datetime(&date, &time);lcd.setCursor(50,1);lcd.print(date);lcd.setCursor(55,0);lcd.print(time*0.000001+5);lcd.setCursor(22, 4);lcd.print(lat);lcd.setCursor(22, 5);lcd.print(lon);lcd.setCursor(22, 2);lcd.print(gps.f_speed_kmph());lcd.setCursor(22, 3);lcd.print(gps.f_altitude());}}GPS_file = SD.open(«GPSLOG.txt», FILE_WRITE);if(GPS_file){GPS_file.print(lat);GPS_file.print(«,»);GPS_file.print(lon);GPS_file.print(«,»);GPS_file.print(date);GPS_file.print(«,»);GPS_file.print(time*0.000001+5);GPS_file.print(«,»);GPS_file.print(gps.f_altitude());GPS_file.println();GPS_file.close();}else{ lcd.setCursor(0, 0);lcd.println(«SD-«);}}bool readgps(){while (gpsSerial.available()){int b = gpsSerial.read();if(‘r’ != b){if (gps.encode(b))return true;}}return false;}

После прошивки Вы увидите нечто подобное (в скетче вывод даты отредактирован к правому краю под временем):

23b292.jpg

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

4f5cb2.jpg

Что делать дальше? Собирать в корпус, можно на клей, можно на двухсторонний скотч все разместить, мне же захотелось все разместить на макетной плате:

В качестве элементов питания я использую LI-ion аккумулятор. Покупаю акб для экшн — камер оптом и использую их в своих поделках + ко всему всегда могут пригодиться для экшн — камеры, которой пользуюсь в походах.

Покупал тут

.

beaea4.jpg

Далее идет борьба за место, отрезаем лишнее от контактов и ровняем их с высотой макетной платы.

52898e.jpg

75dc9f.jpg

Используя макетную плату, собираем все воедино:

На корпус для карты памяти наклеил кусок изоленты, тк он соприкасается с контактами зарядника для батареи. Карту памяти прошиваем в FAT16.

5b60b7.jpg

2a5a84.jpg

8de17c.jpg

1cd5fa.jpg

Потом запускаем и проверяем, не забыв поставить выключатель:

fbef3c.jpg

5f03d6.jpg

f7f4ef.jpg

76431a.jpg

Плюсы и минусы самодельной конструкции

К сожалению, сделать идеальное устройство без недостатков не представляется возможным, но все же оно имеет некоторые достоинства

Плюсы самодельного gps трекера:

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

Вид платы для GPS трекера с двух сторон:

gps-treker-dlya-mashiny-svoimi-rukami-10.jpg

Не стоит забывать и про недостатки трекера, сделанного своими руками:

  1. из-за размеров существует сложность, при размещении в салоне автомобиля;
  2. точность работы трекера зависит от качества мобильной сети, так как основой является телефон;
  3. прочность конструкции далека от совершенной, при плохой спайке провода могут отойти друг от друга.

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

GPS трекер Mini A8 инструкция по настройке и особенности работы

  1. Активируйте симку на мобильном телефоне. Во время активации обязательно уберите функцию запросы PIN-кода.
  2. Примите настройки GPRS интернета.
  3. Обязательно пополните счёт симки, которую будете вставлять в устройство.
  4. Откройте крышку на задней панели трекера и вставьте в слот активированную симку. После вставки возле слота должен загореться красный индикатор. Это будет означать, что аппарат начал функционировать. Индикатор прогорит секунд 20, после чего потухнет. Если красное свечение не появляется, это не значит, что устройство сломано — просто у него истощился заряд батареи. В таком случае зарядите аппарат (с сим-картой) и повторите процедуру.
  5. Далее авторизуйте свой смартфон. Для этого наберите номер телефона, привязанный к симке трекера, вставив перед числами две буквы — SQ. Теперь пользоваться функциями GPS-трекера Mini A8 вы сможете только с одного телефона. Это большой плюс к конфиденциальности, но иногда такая возможность лишь мешает. Чтобы убрать её, достаточно просто отправить на номер трекера уже известные нам буквы SQ без номера телефона.
  1. Проверять местонахождение GPS трекера Mini A8. Для этого надо отправить на номер аппарата SMS с буквами DW. Менее чем через минуту на смартфон придёт сообщение с указанием точного географического расположения аппарата. В дополнение к этому аппарат пришлёт ссылку на локацию. Открыть её можно при наличии хотя бы слабого интернет-соединения.
  2. Прослушивать разговор человека, находящегося в машине. Для этого необходимо лишь позвонить на номер трекера. «Трубка» снимется автоматически по истечении нескольких секунд после начала вызова. Вместе с этим сразу же включится микрофон. Таким образом вы сумеете прослушать всё, что происходит в вашем авто. Этой же функцией можно пользоваться в тех случаях, когда трекер находится в кармане человека. Принцип действия тот же — надо набрать номер.
  3. Активировать автоматический звонок трекера. В данном случае аппарат сам вам позвонит, если поблизости будет уловлен шум. Чтобы включить эту функцию, надо отправить на номер устройства сообщение 1111. Выключение описываемой возможности происходит при помощи отправки SMS с цифрами 0000. Применять такую возможность можно только для охраны своей машины. Если аппарат будет находиться в кармане супруги или рюкзаке ребёнка, он будет звонить вам постоянно из-за непрерывного улавливания шумов.

Как видно, все функционирование GPS-трекера Mini A8 основано на использовании мобильной сети. Поэтому вам надо периодически пополнять денежный баланс вставленной СИМ-карты, иначе ни звонить, ни присылать SMS аппарат не сможет.

Обработка результатов

Результаты представляются в виде текстового файла:

4d687f.png

Далее полученные данные загоним в эксель:

4abf27.png

Разделитель колонок выставляем — запятая:

4e079a.png

Готово:

24408d.png

Далее можно загрузить все это дело в ПО Google Earth Pro, используя вкладку

Файл -> Открыть

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

af6d81.png

Можно выбрать точку и отобразить все количество точек, которые ей соответсвуют:

7e2115.png

Что дальше?

В машине трекер работает от встроеной USB-розетки. Если хотите сделать его более автономным, используйте Power Shield или аккумулятор «крона».

Хотите собрать другой девайс?Выберите будущее устройство из списка проектов на Slot Shield.

Где скачать необходимые библиотеки и как их установить?

Видео “Изготовление GPS-маячка из телефона”

Процесс превращения мобильного телефона в GPS-маячок изложен в видеоролике от канала КТО-ГДЕ. ИНФО.

Обновление от 22.05.18

1. Заменил корпус и изготовил антенну из представленной мною ссылке. (Уменьшил время холодного старта, быстрее находит спутники, значительно быстрее.)

2. Вынес разъем дебага наружу (поигравшись, буду писать прошивку поинтереснее, выкладывать буду сюда же)

3. Для уменьшения занимаемого места, разобрал дисплей и подпаялся к нему.

957c20.jpg

d77bf1.jpg

dcadf0.jpg

Пока вид такой.

Оставьте комментарий