GPS трекер на базе GY-NEO6M своими руками - это просто


Добрый день (опционально вечер/ночь).

Сегодня будет обзор на GPS приемник и его применение на практике.


ПРЕДИСЛОВИЕ

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

Обзоров на этот GPS приемник было, из самых обширных, немного — штуки 4, один из них реально был хорош, остальные так, описывали в целом. Сильно много повторяться не буду.

Как обычно предупреждение:



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

Внешний вид


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



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





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



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

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

А тут находится страница, ведущая на сайт производителя данного аппарата

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


Подключение и проверка модуля на PC


В целом данный приемник можно использовать и для подключения к ПК посредством UART, для этих целей можно использовать переходник USB-UART TTL, которых просто тьма, разнообразных модификаций:

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

А еще Вам потребуется программное обеспечение, U-blox предоставляет его бесплатно, за что им большое спасибо (+ за поддержку).

Доступно по этой ссылке.



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



Выглядит примерно так:



Затем устанавливаем приложение U-center, ссылку давал выше, и выбираем порт:



По умолчанию общаемся на 9600 бод.

Вот в целом работает, все что поймал в помещении:



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


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



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

Дополнительная информация
// 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 0x00

class 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;

#endif

void 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' command
unsigned 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 30
void 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 address
uint8_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, пойдет прошивка контроллера (у меня проходит только со второй попытки, нужно набраться терпения):



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

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



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

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

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

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

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

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

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

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

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



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

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

Подключаем к 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 это предел!)


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

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



Код прост и незамысловат, для использования Вам понадобится, пожалуй самая легкая библиотека для дисплея. Далее библиотека для 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 pin

static PCD8544 lcd; //RST - D6, CE - D7, DC - D5, DIN - D4, CLK - D3, VCC - 5V (опционально, при наличии преобразователя на 3.3В линии), Light - GND, GND - GND
bool 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;}


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



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



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

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



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





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

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









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









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


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



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



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



Готово:



Далее можно загрузить все это дело в ПО Google Earth Pro, используя вкладку Файл -> Открыть, открываем наш файлик и выбираем столбцы, отвечающие за широту и долготу и получаем похожий трек (тк я был в одном месте, то получил россыпь точек):



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



Итог


В общем логер работает, писать трек можно, с последующим редактированием на карте. Так же в программном обеспечении от гугла, трек можно сохранить в более популярном формате, которые поддерживают другие карты.

Свое любопытство удовлетворил с лихвой.

Из минусов это маленькая антенна, порой холодный старт затягивается до 10 минут (зависит от того, насколько сильна облачность, время суток). Антенну конечно можно заменить, на самодельную, либо докупить, на али довольно много активных антенн.

Спасибо за потраченное время.

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


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

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

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







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

Планирую купить +136 Добавить в избранное +170 +299
+
avatar
+8
+
avatar
+1
А посоветуйте пожалуйста gps трекер для авто, чтобы недорого и работало хорошо
+
avatar
+1
Отвечу честно, я не знаю. Я почему собрал себе эту приблуду, да только потому, что я ничего толкового до 1 тысячи рублей не нашел, в целом они базируются на GSM модулях, что мне не подходит, а те что смотрел идут по цене от 2-3 тысяч. По идее этот же модуль можно использовать и с авто, фантазия она такая.
+
avatar
  • DMA
  • 10 мая 2018, 09:23
+1
TK102B за 13 баксов чем не устраивает?
+
avatar
0
Ну во первых, я хочу уст-во с дисплеем, ну вот желание такое. Во вторых, не натыкался на него.
+
avatar
  • kovax
  • 10 мая 2018, 10:25
0
а б/у навигатор взять можно до 1000р — чем не вариант то??? батарейку побольше пристроить и все — большой дисплей, софт можно найти для трекера…
+
avatar
+3
Зачем вообще что-то делать? Просто так захотелось, навигаторы такого размера больно уж дорогие, всякие там гармины и тд. даже бу, а глупый, тормозной навигатор с 5 дюймовым дисплеем, увольте. Да и не ставилась цель изготовить навигатор.
+
avatar
0
Любой навигатор на WinCE с лёгкостью справится с функцией трекера и тормозить не будет.
Нормально написанные программы ещё и карту успевают отображать и не тормозить.
+
avatar
0
А такое, с дисплеем?
+
avatar
0
А черт его знает что там внутри. Может компас с гироскопом и гсм? Тоже самое выдаст. Мутный гаджет како-то.
+
avatar
0
Когдато таким пользовался
+
avatar
+2
покупал знакомому ru.aliexpress.com/item/Vehicle-GPS-Tracker-GT02A-Realtime-Car-GSM-GPRS-GPS-Tracking-Alarm-system-Google-link-GPS-Tracker/32790875812.html
Не жалуется. Есть несколько обзоров здесь
+
avatar
0
Он точно GPS? Цена маленькая, а дописка GSM мне не нравится. Я понимаю, что по GSM можно управлять логгером, но может там и чипа GPS нет совсем.
+
avatar
+1
Пользуйтесь поиском на сайте ) mySKU.me/search/topics/?q=gsm+%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80
+
avatar
+2
Хорошо, что в нём микрофона нет (вроде бы). А то можно попасть как фермер или Артем Лаптев…
+
avatar
  • c2d
  • 10 мая 2018, 10:20
0
Читал, что фермера таки оправдали. Только у нас не прецедентарное право, как в пендостане — поэтому не факт, что следующему «фермеру» тоже повезет.
+
avatar
+1
Дело отправили на пересмотр только потому, что о нём напрямую спросили Президента.
Вряд ли так каждому повезёт.
Цитата
В итоге преследование прекратили, но случилось это после того, как журналисты рассказали историю Владимиру Путину, который изрядно удивился. Проблема еще и в том, что, когда кто-то заказывает такую технику, ему и в голову не придет, что он — потенциальный шпион.
Когда материалы попадают к правоохранителям, они проводят экспертизу, рассказывает управляющий партнер адвокатского бюро «ЗКС» Денис Саушкин:
Денис Саушкин, управляющий партнер адвокатского бюро: «ЗКС» «Техническая экспертиза, как правило, очень проста. Устанавливается просто, имеется ли возможность скрытого записывания и скрытой передачи информации. Самое неприятное в этой ситуации, что суды по данным делам выносят обвинительные приговоры. Позиция, что будут знать его сотрудники о том, что у них эти трекеры, не исключает его ответственности в рамках уголовного закона. Есть такие казусы, что возбуждаются уголовные дела даже на пастухов, которые трекеры ставили на своих коров».
Эта шпионская статья появилась в нашем Уголовном кодексе семь лет назад. В 2012 году по ней судили 72 человек, а в прошлом году — уже 254, причем ни одного не оправдали.
Кто-то отделался штрафами, а кто-то получил реальные сроки: максимальное наказание по статье — до четырех лет тюрьмы. Правда, как пишет «Коммерсантъ», Генпрокуратура провела масштабную проверку этих дел.
Теперь закон могут скорректировать. Когда это произойдет, пока не известно. Сейчас следователи решают, возбуждать ли против Артема Лаптева дело или нет. Сам он опасается, что может на пустом месте получить судимость. Получается, за то, что хотел цифровизовать свой бизнес. Об этом сообщает Рамблер.
+
avatar
  • lap
  • 10 мая 2018, 12:45
+4
Вот вся суть нашей системы, Кому повезет… а все слуги народа… понапринимают законов по которым любого можно привлечь
+
avatar
+2
Не хочу вдавать в политику, но это в любой системе так, не только в «вашей». Если заходят, посадят любого, был бы повод.
Или вы живёте всё время честно, и дорогу никогда на красный свет не переходили (даже, когда не было машин)? :)
+
avatar
+1
Мыши плакали, кололись, но продолжали жрать кактус выбирать тех же…
+
avatar
0
+
avatar
+1
Как сказал один очень интеллигентный адвокат:
Сидят там %%%%%% конченые и придумывают такие %%%% законы.
))
+
avatar
0
Все зависит от вашего ГУ и его поддержкой разных устройств.
Если это ГУ Калина/Приора то отлично подойдет u-blox VK-172. (Если не ошибаюсь то на Win CE подойдет отлично)
Если это ГУ на андроиде то надо искать то, к чему есть драйвера на андроиде (завести u-blox VK-172 вроде как тоже можно, но с большим геморроем)

P.S. или Вам просто в машину бросить не подключая к ГУ?
P.S. Я бы побоялся такие устройства заказывать с Али, если Вы конечно из России)
+
avatar
+1
Извиняюсь конечно, а зачем дрова? Просто по RX-TX гнать нельзя что-ли? У андройда через терминал все подключить можно у винды и того проще, COM порт через переходник, даже у СЕ такое провернуть можно. Хотя наверное имеется в виду что-то утилитарное.
+
avatar
0
Именно данный экземпляр (про который я написал) это готовое usb устройство для него дрова нужны, чтобы программы (например тот же я.навигатор) смог эти данные считать правильно.
Могу конечно ошибаться, несколько лет назад увлекался сборкой carPC и там была с этим проблема.
+
avatar
0
Объясняю. У Ublox помимо выхода USART есть ещё порты USB. То есть его можно напрямую воткнуть в комп без преобразователей. Проблема только в том, что по умолчанию он отображается в системе как GNSS Sensor. Что с одной стороны хорошо так как система сразу понимает кто это и с чем его едят. С другой стороны нормально это работает только под Винду. С другими OS есть нюансы
+
avatar
0
Не из России) просто отдельный блочек, чтобы стабильно работал главное)
+
avatar
  • Yurivp
  • 10 мая 2018, 11:59
+1
TK905/915/925 — и держат долго и работают нормально. А трек лучше не на дисплее читать, а в программе, в том числе для мобильного. Покупал ТК103, но нужно время его ставить, а ТК915 положил в укромный уголок (можно и примагнитить), кинул зарядку к ближайшим 12 в и все. Пока едет, подзаряжает, в остальное время автономный.
+
avatar
0
Бросил в авто старичка Galaxy S3 и привязал его gpshome.ру
Работает отлично, проблема только с зарядкой при кратких поездках. Решил подключением зарядного модуля к лампе освещения салона, на которой 12В есть еще 30 минут после постановки на охрану.
+
avatar
0
Когда- то присылали с Ленинграда Gps трекер Мини А8. Так не разу и не пользовался. Точно не помню где то 3400 р. Отдавал или больше. Щас бы за 1000 отдал. Если кому надо. Реклама по всему инету была mini A8 с зелёным роботом типа андроид…
+
avatar
0
Маленькое обновление трекера, металлический корпус не оправдал себя, дополнительная антенна наше все.
+
avatar
+1
При желании всегда можно заменить активной
Ммм… А что в этой антенне активного?
+
avatar
0
Активные антенны представляют собой пассивные антенны со встроенным малошумящим усилителем. Если вы читали хорошо, то там было указано, что даю ссылку на самодельную антенну, она не является активной.
+
avatar
0
Да, не обратил внимание на «или». С ним всё правильно получается. :)
+
avatar
0
Кстати по поводу активности антенны. Я не буду утверждать за модель автора, но я разбирал подобную антенну. Там под металлическим экраном небольшой усилитель прятался. Так, что очень даже может быть что и антенна ТС тоже активная.
+
avatar
+2
<сарказм>Как же Вас ФСБ проглядело</сарказм>
Спасибо, было интересно почитать
+
avatar
  • Prays
  • 10 мая 2018, 08:31
+4
Спасибо за проявление гражданской позиции. Уже выехали.
С уважением, ФСБ.
+
avatar
+2
оффтоп
Ко мне? Я случайно сайт открыл =)
+
avatar
  • Prays
  • 10 мая 2018, 08:52
+1
К обоим. Сопротивление бесполезно. Вы окружены. :)
+
avatar
  • nikam
  • 10 мая 2018, 10:58
+17
+
avatar
+3
«Если вы видите эту картинку, вы и есть Сопротивление.»©
+
avatar
+1
Цифровое
+
avatar
0
+
avatar
+1
Это уже клоунское.
+
avatar
  • Yurivp
  • 10 мая 2018, 11:59
0
Трекер не является средством шпионажа. Кстати, умно, что нет микрофона
+
avatar
0
Боюсь спросить, а Вы в какой стране живете?
https://www.znak.com/2017-11-21/zhitel_sela_poymannyy_fsb_s_gps_trekerom_kupil_ego_chtoby_sledit_za_telenkom
+
avatar
  • Yurivp
  • 10 мая 2018, 13:12
0
У вас нет мобильного телефона? Если есть, то и трекер у вас с собой. Что касается истории, да слышал, как и слышал ВВП о том, что с ними нужно разобраться. Думаю, разберутся. Ибо есть Закон про наличии ГЛОНАСС в а/м, что есть тот же трекер.
+
avatar
0
Дело не в трекере GPS, дело в возможности некоторых из них «негласно получать информацию» — это когда у него есть микрофон и его можно прослушивать.
+
avatar
  • Yurivp
  • 10 мая 2018, 14:52
+1
BT есть в машине? Есть и микрофон…
+
avatar
  • hcetih
  • 11 мая 2018, 23:04
+1
дело в признании, уголовное дело будет только в случае письменного чистосердечного признания о том что устройство заказывалось для негласного получения информации. Что конкретней писать — подскажет следователь.
А если вместо признания писать«был пьян, что заказывал не помню, и на кой оно мне тогда было нужно не знаю» — и дела никакого не будет
+
avatar
0
Не пишите ерунды. Хоть основы права почитайте. Есть объективная сторона дела, помимо субъективной.
+
avatar
  • hcetih
  • 12 мая 2018, 18:44
+1
Много чего есть, но не здесь, теперь покажите решение где без признания осудили за покупку. А по мнению наших экспертов под эту статью попадает практически любая электроника с камерой/микрофоном.
+
avatar
0
Несёте полный бред. Данные дела квалифицируются по объективной стороне дела — доказанному факту оборота специальных средств. Причём тут «эксперты», какое «попадает практически любая электроника», когда есть перечень «Технические средства, предназначенные для негласного получения информации...»?! Полная юридическая неграмотность.
+
avatar
  • hcetih
  • 13 мая 2018, 01:59
0
1. где дела без признания?
2. в этот перечень легко засовывается смартфон или видеорегистратор, нужно только признание что приобретен с целью «негласного получения информации» и вуаля, обычный китайский сматрфон становится запрещенным к ввозу, а покупатель уголовником.
+
avatar
0
конечно по объективной.
вот только преступника нужно НАЙТИ.
и доказать что именно Он заказал нужно признание.
иначе 0% что найдут заказ на Али, оплату заказа.

таким макаром ты своему «другу» можешь заказать ручку-микрофон и т.п.
и отправить его на нары! или тебя любой желающий! подумай об этом!
ЗЫ достаточно ФИО и адреса «друга»
+
avatar
0
Вы очень плохо представляете работу органов следствия и дознания.
+
avatar
0
в списке ФСБ и трекеры есть
негласно получать — для них все негласно что на батарейках.
мздоимцы и оборотни бздят что их поймают. плевать им на частную жизнь граждан

поэтому берите камеры Без Глазков, с отдельно Подключаемыми микрофонами и т.д.
ничего такого в сборе
+
avatar
0
Если есть микрофон — является. Да и без него не всё так просто…
+
avatar
  • Yurivp
  • 10 мая 2018, 13:10
0
Ну а я про что написал? Разве в этой конструкции есть микрофон?

У меня в машине стоит ЗАВОДСКОЙ ТРЕКЕР, машина сертифицирована к использованию на территории РФ. Более того, по Закону теперь каждый а/м обязан иметь при себе ГЛОНАСС, что по сути и есть трекер. Вопрос только сертифицирован или нет.
+
avatar
+3
NEO6 и NEO7 устарели морально уже давно.
+
avatar
+1
Что можете предложить взамен?
+
avatar
+1
NEO8?
+
avatar
0
ЦЕНА!!!
+
avatar
  • Dimon_
  • 10 мая 2018, 10:54
+3
6,5$ на али.
Да, это выше, чем neo6, но не настолько, чтобы ужас-ужас.
Зато сразу gps+глонасс+бэйдоу.
+
avatar
0
Э… А указано Galileo (без BeiDou).

В любом случае, как я помню, во всех американских и европейских модулях (а u-blox — это Швейцария формально) «неродные» спутники используются только тогда, когда своих недостаточно для определения координат. Помнится, ещё в телефонах было это: ГЛОНАСС начинал сильно влиять на точность только тогда, когда «виделось» мало (недостаточно) спутников GPS (NAVSTAR), в противном случае — при большом числе «видимых» спутников GPS данные ГЛОНАСС (и других) не использовались, т. е. координаты (и точность) определялись только данными GPS (а ГЛОНАСС в тех условиях мог сильно прибавить точности).
+
avatar
  • jeepeg
  • 10 мая 2018, 13:49
0
Модуль выдает координаты отдельной строкой для каждой из трёх (всего 4, но одновременно могут работать только 3). Какие системы включать выбираете вы сами. Как использовать данные каждой из систем, тоже выбираете вы, а не модуль. В U-center столько настроек, что голову сломаешь.
+
avatar
0
Давайте перейдём в ветвь ниже, а то дублирование какое-то. :)
+
avatar
+1
За те же деньги, еще хорошо бы.
+
avatar
  • f1203
  • 10 мая 2018, 08:32
0
Интересный обзор. Я собирал метеостанцию, но так и не смог подключить SD карту и дисплей нокии одновременно, не хватало памяти. Зато с дисплеем 1602 всё заработало. его библиотека намного меньше. А почему лог пишется в TXT файл? Удобнее сразу в CSV, а вместо разделителя использовать отступ (\t), по сути это тот же текстовый файл только екселем нормально открывается. А ещё картридер насмерть запилил карточку, наверное, горячее подключение он не поддерживает.
+
avatar
+1
Я честно старался все загнать в CSV, но так и не получилось, использовал эту книгу. Ну и конечно библиотеки, да самые маленькие выбирал для дисплея с минимум возможностей.

Все всегда можно подредактировать и дошить, я думал туда еще магнитометр с гироскопом засунуть, но это совсем жирно было для контроллера, хотя хотел считать угол относительно гироскопа и высчитывать направление движения, электронный компасс, благо у дисплея еще одна строка оставалась не занятой.
+
avatar
+8
....Хороший обзор!-и познавательный, и информативный, и подкреплён грамотной практикой с необходимыми ссылками.
Действительно, ценники на готовые GPS-треккера просто конские,а здесь и зарядка для ума, и забава для шаловливых ручонок!
Взял себе на заметку, мои наилучшие пожелания Автору обзора!
+
avatar
+3
Всегда пожалуйста, очень рад, что было интересно.
+
avatar
+1
Насколько несложно, настолько же и полезно. То есть очень. И недорого, опять же.
+
avatar
  • jeepeg
  • 10 мая 2018, 09:19
+1
Обзор хороший, плюсанул. Но я всё жду когда кто-то уже на STM32 такое запилит))
Конечно с компактностью беда. Вот эта штука покомпактнее будет ebay.com/itm/401348172392 Вообще, на модулях делать проще, но по факту нужна голая Мега и микроСД адаптер (не модуль), что поместится на пятачке.
Кстати, что там с потреблением, какой ток? И ещё, M8N поддерживает предзагрузку альманаха (может и этот). Правда на сайте Ublox надо регистрироваться и дождаться пока ключ пришлют. Грузится через U-center.
Экран по большому счёту не нужен такому устройству, цифры координат мало полезны, время можно и на часах посмотреть, разве что пройденный путь, ну так для этого такой экран избыточен. И да, полезнее было бы видеть оставшийся заряд батареи или её напряжение. Данные в таком виде тоже не особо применимы, проще и легче писать NMEA в файл, а потом на компе разобрать его.
Для двух- трехсистемных модулей (GPS, ГЛОНАСС, Beidou/Galileo) эта библиотека берет только данные GPS? Если да, то как-то не айс.
+
avatar
+5
1. По потреблению 40 mA. (Держит примерно день)
2. Экран это моя прихоть, можно сэкономить на потреблении убрав его.
3. Заряд батареи это можно дописать, сам уже об этом подумал.
4. Почему данные не применимы? Вполне можно использовать, после конвертации и строить маршрут.
5. Библиотека только для GPS (нужна была очень простая и легкая)
6. Не забывайте, что даже человек не подготовленный мог собрать это уст-во, по этому самый простяцкий вариант я показал.
+
avatar
  • Kila
  • 10 мая 2018, 09:38
+1
А в чем проблема, настроить SPI и UART? Вот GPS парсер уже 4 года лежит, остальные примеры тоже можно найти
+
avatar
0
Для двух- трехсистемных модулей (GPS, ГЛОНАСС, Beidou/Galileo) эта библиотека берет только данные GPS?
Вроде же это чипом определяется, наружу-то уже готовые координаты отдаются. И, как я помню, отдаются в основном именно по GPS (см. мой комментарий выше). Использовать «сырые» данные и считать всё самому на контроллере… Нереально.
+
avatar
  • jeepeg
  • 10 мая 2018, 13:56
0
Чип выдает NMEA строки, отдельные для каждой системы
+
avatar
0
Хм. А вот этот момент поподробней. То есть я допускаю, что где то в настройках это можно переключить. Но например у меня по умолчанию он выдает только одну строку с координатами, как я понял являющуюся результирующей для все систем.
+
avatar
0
Я знаю.

(фото продавца).

Вот крупнее фрагмент:


Дальше что? Как Вы улучшите позиционирование с этими данными на микроконтроллере?
+
avatar
  • jeepeg
  • 10 мая 2018, 15:26
0
Само позиционирование никак. Это скорее данные для последующей их обработки
+
avatar
0
Так о том и речь, что на микроконтроллере с этим ничего не сделать. Всё, что используется (всеми практически) — это готовые координаты, полученные от модуля. И там точность определяется, как я уже сказал, именно GPS. Так что толку от других систем в условиях достаточного приёма нет. Вот если в «тоннеле» зданий GPS не ловятся, а ГЛОНАСС есть — да, эти данные станут использоваться.
Так что толку от этих данных в нашем примере нет.
+
avatar
  • jeepeg
  • 10 мая 2018, 17:19
0
В том то и дело, что модуль не перейдет никуда, если смотрит на строку GP…
+
avatar
  • junari
  • 10 мая 2018, 21:07
0
Если трекер самодельный как тут, то думаю поправить одну буковку с GPGGA на GLGGA не составит труда. А если возможности МК позволяют, то и автовыбор можно попробовать сделать.
+
avatar
0
Речь не об этом, а о том, что улучшить позиционирование Вы не сможете (без сырых данных и серьёзных рассчётов). Можете выбрать либо то, либо другое (при этом, вполне вероятно, координаты для всех систем рассчитаны только по GPS). А заставить модуль делать рассчёты одновременно по спутникам разных систем и получить меньшее отклонение — не сможете.
+
avatar
  • ResSet
  • 10 мая 2018, 09:22
0
Отличный обзор, плюсик Вам =)
Вот сижу думаю, можно ли в магнитоле(android) впаять похожий модуль вместо вышедшего из строя ноунейма(затерли маркировку) без необходимости потом прописывать его в системе?
+
avatar
+1
Теоретически можно подпаяться к контактам RX-TX, практически надо проверять, как пойдет общения андройда с модулем в терминале.
+
avatar
  • f1203
  • 10 мая 2018, 09:25
0
Дайте ссылочку на макетную плату под этот корпус
+
avatar
+1
Я брал комплектом, мало ли на коленке быстро скрутить какую-нибудь хрень. Кстати платы очень качественные, стойкие к вандализму (запаивание и перепаивание одних и тех же площадок).
+
avatar
  • Dimon_
  • 10 мая 2018, 09:37
+15
За DIY +
Но вот за программный код… Не сочтите за критику, но вот вам задел на будущее. (или тем, кто будет повторять).


gps.get_datetime(&date, &time);
...
lcd.print(time*0.000001+5);


по сути я привел время в удобоваримый вид и добавил часовой пояс.
По сути, это очень плохая практика.

Потому что в 23 часа по GMT вы у себя на месте получите магические 28 часов вечера.
Так низзя :)
Я по этим граблям уже ходил.

Поэтому надо честно разбирать часы, минуты и секунды, и често переводить всё под свой часовой пояс. Это значит, что если час перескакивает через 24, то прибавлять дату. Если, при этом, день перескакивает за количество дней в месяце, то прибавлять месяц, если месяц переходит за границу года, то прибавлять год. Причём, корректировать под любую часовую зону, как восточной, так и западной долготы (т.е. в обе стороны).

Ну и ввести переменную под часовую зону, а то половина читателей даже думать не станет, откуда у вас эти "+5" в формуле. :)

И, да, совершенно нет анализа корректности полученных данных, поэтому вместо точки на карте у вас «ёжик» и разброд. А для понимания корректности полученных данных в библиотеке есть переменная age. Задайтесь порогом корректности и просто отбрасывайте всё, что уже протухло (т.е. выходит за этот порог). Данных будет меньше, но они будут точные.

Я делал обзор самодельных часов, получающих время с GPS. Все желающие из исходников могут надёргать нужные куски кода, «всё уже украдено до нас» ©.
+
avatar
+1
Спасибо, кстати да, не обратил внимание по часам. Дельные советы.
+
avatar
0
Сделай то же самое только со способностью замерять разгон до 100 суперточно, и 402м, аналоги стоят кучу денег, а так можно даже приторговывать ими :) Я первый куплю)
+
avatar
  • Rzzz
  • 10 мая 2018, 13:16
0
Не замеришь суперточно. Приёмник такого уровня определяет координаты в лучшем случае раз в секунду, дискретность конская для ваших пожеланий.
Надо измерялку на других принципах строить.
+
avatar
0
Приёмник такого уровня определяет координаты в лучшем случае раз в секунду,
Про частоту Вы ошибаетесь:

Перевожу: только по GPS — до 18 раз в секунду, совместно с другими системами — до 10 раз в секунду.
Вопрос точности самого определения координат — это другой вопрос.
+
avatar
0
Кстати не знаю как это работает, но у меня складывается впечатление, что 10 раз в секунду на точность ни как не влияет. А то даже кажется, что с 10 Гц точность выше. (Хотя возможно это просто так кажется из за того, что трек стал более гладким).

Например вот трек с Ublox-8. Я точно знаю, что в этом месте я делал перестроение. И на треке четко видно как я менял полосу движения.
+
avatar
0
Я не говорил, что частота влияет на точность. Я говорил, что для «замеришь суперточно» ещё играет роль сама точность позиционирования, которая для таких приёмников обычно не лучше 1-3 м (и хуже в динамике).
+
avatar
0
Раз в секунду? В 10 раз они легко перенастраивать. Было бы желание
+
avatar
0
Глупости. В настройках U-blox можно (и нужно) перевести частоту опроса GPS на несколько раз в секунду и поубирать лишние протоколы нафих.
+
avatar
+3
Вступлюсь за Автора темы:-он исходил и из своих знаний, и своих возможностей\источников, как и предпочтений.
Вы предлагаете свою, возможно и более продвинутую, версию\подход…
Самое правильное, и в этой, и-похожих ситуациях, это суммировать положительное, помогая и остальным избегать замеченных ошибок, советуя — как лучше сделать правильно…
Есть недочёты, критические ошибки?-создавайте своё!...-где и давайте развёрнутые простыни по освещаемой вами теме! А часы-вам в помощь!(часики с GPS-это так модно среди обывателей сегодня!)-что без часов с GPS сегодня-ну никуда, и нигде...!.;-)
+
avatar
  • Dimon_
  • 10 мая 2018, 10:33
+2
Самое правильное, и в этой, и-похожих ситуациях, это суммировать положительное, помогая и остальным избегать замеченных ошибок, советуя — как лучше сделать правильно…
Моя реплика, на ваш взгляд, имеет какое-то другое наполнение? Я писал её именно с этой целью.
Есть недочёты, критические ошибки?-создавайте своё!...-где и давайте развёрнутые простыни
Так и делаю. Практически все мои обзоры — это развёрнутые простыни, с объяснениями, комментариями, подробными разъяснениями. Да ещё и консультациями в ПМ.
часики с GPS-это так модно среди обывателей сегодня!
Попытался почитать ваши обзоры про самоделки, дабы «просуммировать положительное», «избежать замеченных ошибок», да и поучиться у вас чему-то новому, не всё же мне сидеть в модно-обывательском болоте.
Да вот незадача… Не получилось.
+
avatar
-2
… А и не получится, сударь!
Бо, я-если и делаю что-то!-то не бегу тотчас оное прославлять, ибо нет всему совершенства…
Ибо, просто стесняюсь демонстрировать и свои(всегда неизбежные!) ошибки, создавая что-то.
Но-уважаю храбрость тех, кто этого не боится(-особенно, не под влиянием п.18..).
Чужд я рекламы, уж простите.
+
avatar
+2
Эм. В коде есть ошибка, которая в некоторых случаях дает абсурдные результаты. Человек указал на ошибку и сказал, как можно её исправлять. В чем проблема? Зачем защищать ошибки автора.

И да, что бы ты не нудел на тему «диванные специалисты которые только критиковать умеют, а сам ничего не сделали». Я тоже сталкивался с такой проблемой. Я правда решал её несколько другим путем, время полученное по GPS преобразовывал вы Unix time с которым легко и приятно работать. С которым поправка на часовой пояс дается просто добавлением нужного количества секунд. А потом при выводе преобразовывал обратно.
+
avatar
+4
Ребята, не забывайте это учебное уст-во, что бы мог повторить каждый, особых знаний в понимании моего кода не требуется, он прост и безалаберен, есть всегда к чему стремиться и необязательно повторять его точь в точь. Я сделал его от скуки, он выдает координаты, которых мне достаточно после последующего конвертирования, высоту и скорость я вывел просто так, интересно было. Не забывайте, что высота считается над уровнем моря.
+
avatar
0
Хех, есть чудная библиотека времени TimeLib.h и библиотека работы с GPS — TinyGPS++.h
Если задать смещение в переменную offset, то настройка и коррекция времени будет выглядеть так:
const int offset = 3; // Наше смещение по времени


   if(gps.date.year()>=2017&&Set==0) // тупо проверка, что GPS получил время со спутника
     {
      setTime(gps.time.hour(), gps.time.minute(), gps.time.second(), gps.date.day(), gps.date.month(), gps.date.year());
      adjustTime(offset * SECS_PER_HOUR);
      Set=1; // настройка завершена
     }
 adjustTime(offset * SECS_PER_HOUR);

Вообще в этой реализации много проблем, как аппаратных, так и программных. Для совсем начинающих пойдет.
+
avatar
0
А точно резистора между NEO и Arduino не надо?
+
avatar
0
Нет, не надо. Сам модуль уже распаян на плате, у которой все есть.
+
avatar
  • Worker
  • 10 мая 2018, 11:22
0
Спасибо вам за прямые руки. Так как из меня инженер не очень хороший, то сохранил ваш пост себе. Тоже хочется все собрать самому, а не использовать готовое.
+
avatar
  • f1203
  • 10 мая 2018, 11:45
0
Как присоединяется аккумулятор? Сразу ардуине без 5В преобразователя?
+
avatar
0
Плата заряда для лития, на фото ее видно:

+
avatar
  • f1203
  • 10 мая 2018, 11:56
0
Это понятно, плата нужна для заряда, но она не выдаёт 5В. Ардуина питается без преобразователей напряжением 4,2В — 3В?
+
avatar
+2
Pro mini питается от 5 до 1.8В, карта памяти от 3.3В, GPS от 3.3В. Все укладывается.
+
avatar
+1
Если желаете, можно добавить повышающий DC-DC.
+
avatar
  • CTAHOK
  • 10 мая 2018, 13:31
0
Очень интересно! Спасибо.
Спящий режим и пробуждение по таймеру бы организовать, тогда время работы можно увеличить.

Как вырезали окно под дисплей на корпусе? — ровно получилось.
+
avatar
0
Фреза и дремель творят чудеса 8)
+
avatar
0
Антенна не должна находиться внутри металлического корпуса, хоть он и из дюраля.
Это экран, в большей или меньшей степени.
Либо корпус пластиковый, либо антенна — наружу.

Дописал: Антенну нашёл. Она снаружи. Но, вплотную к корпусу. Можно попробывать, чуть отнести её от корпуса и сверить силу сигнала от спутника в обоих случаях.
+
avatar
  • DainB
  • 10 мая 2018, 13:46
-1
А как активная антенна поможет ускорить загрузку альманаха при холодном старте?
+
avatar
+1
NEO6 старый чип. А ваш так еще и не удобный. Лишняя плата с антеной не добавляют надежности. Лучше брать такой — ebay.com/itm/182285401796
+
avatar
  • vs713
  • 10 мая 2018, 17:20
0
А батарейка в нем vk2828u7g5lf есть?
+
avatar
0
вас в гугле забанили?



третья страница от сюда.

чип по крышкой UBX-G7020-KT

фото со снятой крышкой — тут в середине. батарейка там же.
+
avatar
  • Rifer
  • 11 мая 2018, 08:16
0
Поддерживаю, купил Vk2828u7g5lf. Впечатления положительные.
+
avatar
0
Поделитесь, пожалуйста, ссылочкой на проверенную активную\пассивную GPS антенну покомпактнее. Желательно, чтобы альтернативные системы тоже ловила.
+
avatar
0
На Али брал давно компактную, от родной квадратной антенны от модуля уровень сигнала не сильно отличался, даже в помещение ловил. Поиском на Али их полно было.

Она точно активная, подключал её еще к модулю ublox pci-5s (питания на антенном разьеме нет, брал для ноута на слот PCI-E) — на нем не работало, надо питание как-то через развязку подавать на антенну

Как с Glonass работает не скажу проверить не на чем

Кстати есть ещё usb модуль VK-172 (u-blox 7) тоже неплохо ловит из помещения и GPS и Glonass (только по отдельности). Правда сейчас группировка Glonass не полноценная, хуже должно ловить походу.



+
avatar
-3
Ребят, вот то, что руки растут из правильного места это хорошо, но В Российском законодательстве есть замечательная статья 138.1 УК РФ:
Статья 138.1. Незаконный оборот специальных технических средств, предназначенных для негласного получения информации
Незаконные производство, приобретение и (или) сбыт специальных технических средств, предназначенных для негласного получения информации, — наказываются штрафом в размере до двухсот тысяч рублей или в размере заработной платы или иного дохода осужденного за период до восемнадцати месяцев, либо ограничением свободы на срок до четырех лет, либо принудительными работами на срок до четырех лет с лишением права занимать определенные должности или заниматься определенной деятельностью на срок до трех лет или без такового, либо лишением свободы на срок до четырех лет с лишением права занимать определенные должности или заниматься определенной деятельностью на срок до трех лет или без такового.

Почитав комментарии к данной статье я понял, что уже сам факт покупки или кустарного производства говорит, что вы виновны. Тогда необходимо посмотреть, что же можно покупать, а что нельзя. Об этом нам может рассказать Федеральный закон №144 от 12.06.1995. Согласно данному закону:
Ввоз в Российскую Федерацию и вывоз за ее пределы специальных технических средств, предназначенных для негласного получения информации, не уполномоченными на осуществление оперативно-розыскной деятельности физическими и юридическими лицами подлежат лицензированию в порядке, устанавливаемом Правительством Российской Федерации.
Перечень видов специальных технических средств, предназначенных для негласного получения информации в процессе осуществления оперативно-розыскной деятельности, устанавливается Правительством Российской Федерации.
Разработка, производство, реализация и приобретение в целях продажи специальных технических средств, предназначенных для негласного получения информации, индивидуальными предпринимателями и юридическими лицами, осуществляющими предпринимательскую деятельность, подлежат лицензированию в соответствии с законодательством Российской Федерации.

ПЕРЕЧЕНЬ ВИДОВ СПЕЦИАЛЬНЫХ ТЕХНИЧЕСКИХ СРЕДСТВ…
1. Специальные технические средства для негласного получения и регистрации акустической информации.
2. Специальные технические средства для негласного визуального наблюдения и документирования.
3. Специальные технические средства для негласного прослушивания телефонных переговоров.
4. Специальные технические средства для негласного перехвата и регистрации информации с технических каналов связи.
5. Специальные технические средства для негласного контроля почтовых сообщений и отправлений.
6. Специальные технические средства для негласного исследования предметов и документов.
7. Специальные технические средства для негласного проникновения и обследования помещений, транспортных средств и других объектов.
8. Специальные технические средства для негласного контроля за перемещением транспортных средств и других объектов.
9. Специальные технические средства для негласного получения (изменения, уничтожения) информации с технических средств ее хранения, обработки и передачи.
10. Специальные технические средства для негласной идентификации личности.

Ну что ж, уже исходя из этого складывается некоторая картина. Не все что продается в интернете законно покупать и использовать. (Кто бы мог подумать? Это как внезапный снег в декабре…)

Подведем итог:
1. Любой трекер может быть идентифицирован как, и является, специальным техническим средством.
2. Специальное техническое средство должно быть лицензировано (каким-то образом легализовано для производства, продажи и покупки на территории РФ). То есть даже физическое лицо приобретя стс за границей должно получить лицензию на ввоз.
3. Изготовление кустарным способом (читай сделать приспособа из старого мобильника), реализация (вот что это значит? Продажа или исполнение замысла, получение результата – тогда бы написали использование…), покупка и продажа не лицензированных СТС карается по закону (причем так не хило. 200 тыр, 4 года…).
+
avatar
0
Садись, два!
Ключевое слово: для негласного
+
avatar
-1
Поясните.
Кто-то будет разбираться в гласности и негласность? Есть устройство. Устройство имеет определённые габариты. Может быть использовано негласно? Может! Факт изготовления был? Был!
Устройство является СТС? Да. Лицензия есть? Нет!
Виновен.
В чем я не прав?
+
avatar
+3
По Вашей логике за перепрошитый телефон тоже могут наказать? А что? Негласно использовать можно, факт модернизации есть… :)
Напоминает анекдот
В квартире Рабиновича обыск. Нашли самогонный аппарат. Участковый:
— Та-ак! Будем вас судить за самогоноварение.
— Но ведь я не гнал самогон!
— Ну и что, аппарат же есть.
— Тогда судите и за изнасилование.
— А вы что, кого-то изнасиловали?
— Нет, но аппарат же есть!
+
avatar
+1
Не хочу вас расстраивать, но да. Причём логика не моя. Такая логика у наших законодательных и исполнительных органов. Блин, ну реально есть куча инцидентов описанных в интернете и на том же ютубе когда человек покупает трекер на али, а его на почте берут за Жопу.
Мне это не нравится, я считаю политику ценообразования неправильной, но… ля, закон есть — и его ни кто не отменял.
Кто знает в какой момент захотят объявить «охоту на ведьм» и попадётся ли ваша покупка или рукоблудие под это?
Согласно данному закону, хотите трекер в машину — купите в России. Они есть. Но стоят в разы дороже. Цена на з/ч из поста до 1000 р., цена готового решения на али около 1000 р. Цена готового решения в России 5000-7000. Вот откуда???
+
avatar
  • sim31r
  • 14 мая 2018, 02:15
0
>>> есть куча инцидентов

Да пара событий на страну где 140 млн. населения. Причем кончается всё ничем.
+
avatar
  • demonk
  • 15 мая 2018, 18:47
+1
Во всех инцидентах участвовали трекеры со скрытым за незаметной дырдочкой микрофоном и возможностью позвонить на девайс и слушать что возле него происходит. Что несколько выходит за рамки основной функции и таки привлекает органы. Надо брать без таких китайских бонусов и проблем не будет.
+
avatar
0
Посмотрите п.8 из моего первого поста. Где вы в нем видеть микрофон? Микрофон есть в п.1. И эти пункты не связаны между собой. Как я уже писал выше, закон есть, его ни кто не отменял. И вероятность попасть под раздачу есть.
+
avatar
0
Подскажите кто «в теме» — можно ли как-то улучшить точность позиционирования? Задача такая: медленно движущийся объект должен знать свое местоположение с точностью до метра. Или полуметра :) Если взять второй неподвижный приемник, то можно ли как-то получить коррекцию с него?
+
avatar
0
Перефразирую. Подскажите кто в теме. — есть две рулетки с точностью +-30 метров. Можно ли как то с их помощью померить с точностью 1 метр используя вторую рулетку для коррекции первой.
+
avatar
0
О таком слышал. Но на сколько мне известно, для RTK нужны «сырые» данные со стационарного приемника. А эти данные могут отдавать далеко не все приемники и явно не из дешевых серий. Из М8 вроде только M8Q умеет. Ранние серии М8N тоже умели, но производитель быстренько сменил прошивочку с невозможностью отката на предыдущую версию. Да и вычислительных ресурсов такая система требует немереных, простым контроллером не обойтись — нужен линукс.
Есть возможность передать на устройство дельту со стационарного приемника. Как думаете, если на движущемся устройстве делать поправку на эту дельту — улучшится точность? Мне сантиметров не надо — +- полметра или даже метр достаточно.
+
avatar
0
по ссылкам есть схема без линукса, с плисой и контроллером. Spartan6 стоит сейчас 1200р.
+
avatar
0
Теоретически можно, но тогда появляется параметр время и параметр вероятность. Есть объект, мы получаем координаты объекта в полярной системе координат. Значения координат плавают. Применяешь среднеквадратичное отклонение и считаешь.
+
avatar
0
А что это мне даст? Среднеквадратическое отклонение только укажет на выпадение очередной точки из доверительного интервала. Каким образом оно улучшит точность определения координат? Объект не стационарен, скорость перемещения немного выше скорости «прыжков» приемника — от 1 до 5 м/с. Как отличить «прыжок» от реального перемещения?
+
avatar
0
Никак. Система получится достаточно инертна. Просто к каждым значениям координат полученным от объекта будет добавляться некоторая дельта. Попробуйте смоделировать такую задачу. Тело двигается. У него есть реальные координаты. К вам приходят координаты с отклонением распределённым по Гаусу. Вы строите координаты с использование фильтра СКО. В итоге точность определения координат без фильтра будет несколько ниже точности определения с фильтром.
Почитайте про координатные фильтры…
+
avatar
0
насколько мне известно — точность «до сантима» доступна лишь определенным структурам с помощью дополнительных, скрытых спутников. ну там для наведения на цели или еще зачем, Бог знает. простому человеку это незачем = НЕДОСТУПНО. Фермеры платят денюжку за использование системы точного позиционирования на тракторах, управляемых через спутник. Таким образом в полуавтоматическом режиме трактора садят картошку в нашем регионе. (Прикамье). Информация от них «оборудование GPS на тракторах американских… мы платим за „точность“. Так что извольте…
+
avatar
0
На счет «скрытых спутников» Вы ошибаетесь — спутники те же, только для военных используется другой частотный диапазон с кодированием. А фермеры, на сколько мне известно, получают дополнительную дифференциальную коррекцию от стационарных базовых станций. Вот и крутится в голове вопрос как передать эту коррекцию на свой объект. Я могу поставить рядом второй приемник, получить его дельту, но как сформировать пакет коррекции — не знаю. Связь с объектом уже налажена, добавить в нее свой пакет не проблема.
+
avatar
  • jeepeg
  • 18 мая 2018, 06:07
+2
Кстати, если кому-то ещё интересна данная тема, нашёл вариант ebay.com/itm/282713866005:m:mCXkwzOv2JsZD91Kh236Q2w
Openlog — уже и мега и карта на одной плате, размеры миниатюрниийшие.
+
avatar
0
Спасибо, заказал.
+
avatar
  • R2AJA
  • 14 января 2020, 10:44
0
Статью прочитал, спасибо.
Теперь критика:
1) название: антенна-маяк хммммм ну хотя бы «антенна и маяк»!
2) «В комплекте идет пассивная антенна:» — показанная антенна, активная, забирает немного питания на себя. Сравните ток модуля с такой антенной и без нее (при холодном старте).
3) «При желании всегда можно заменить активной или изготовить самому, по этой методике:»
показана разорванная рамка с длиной около одной длины волны, но не показан способ подключения такой антенны. Далее по фоткам можно понять, что автор припаялся к контактной точке керамической антенны, и получил антенну с непонятной диаграммой направленности. Предположу, что и без этой проволочки керамика работает не хуже. Не думаю, что нам здесь покажут диаграммы уровней сигналов спутников для «керамики» и «доработанной керамики», а так говорить об эффективности — всего лишь эмоции автора.
4) «На рисунке ниже я показал, какие линии куда подключать, что бы GPS определился в компьютере:» — на блоке GPS не показаны названия PINов. Если взять в руки модуль, можно понять, что на данном изображении соединения TX/RX нарисованы с ошибкой.
5) Про расчет часовых поясов тут уже написали.
+
avatar
  • VKOT
  • 16 мая 2021, 13:59
0
Здравствуйте! Если тема еще жива, то тогда вопрос; почему не полная информация на lcd

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