Создаем gps часы на arduino

Features

Data connections

  • TCP (HTTP, MQTT, Blynk, …)
    • ALL modules support TCP connections
    • Most modules support multiple simultaneous connections:
      • A6/A7 — 8
      • ESP8266 — 5
      • Neoway M590 — 2
      • Quectel BG96 — 12
      • Quectel M95 — 6
      • Quectel MC60/MC60E — 6
      • Sequans Monarch — 6
      • SIM 800/900 — 5
      • SIM 5360/5320/5300/7100 — 10
      • SIM7000 — 8
      • SIM 7500/7600/7800 — 10
      • u-blox 2G/3G — 7
      • u-blox SARA R4/N4 — 7
      • Digi XBee — only 1 connection supported!
  • UDP
  • SSL/TLS (HTTPS)
    • Supported on:
      • SIM800, u-Blox, XBee cellular, ESP8266, and Sequans Monarch
      • Note: only some device models or firmware revisions have this feature (SIM8xx R14.18, A7, etc.)
    • Not yet supported on:
    • Not possible on:
    • Like TCP, most modules support simultaneous connections
    • TCP and SSL connections can usually be mixed up to the total number of possible connections

USSD

  • Sending USSD requests and decoding 7,8,16-bit responses
    • Supported on:
    • Not possible on:

SMS

  • Only sending

    Supported on all cellular modules

    SMS is supported, not receiving

Voice Calls

  • Supported on:
  • Not yet supported on:
  • Not possible on:
  • Functions:
    • Dial, hangup
    • Receiving calls
    • Incoming event (RING)
    • DTMF sending
    • DTMF decoding

Location

  • GPS/GNSS
    • SIM808, SIM7000, SIM7500/7600/7800, BG96, u-blox
    • NOTE: u-blox chips do NOT have embedded GPS — this function only works if a secondary GPS is connected to primary cellular chip over I2C
  • GSM location service

Credits

  • Primary Authors/Contributors:
    • vshymanskyy
    • SRGDamia1
  • SIM7000:
  • Sequans Monarch:
  • Quectel M9C60
  • Quectel M95
  • Other Contributors:

Программа

Она должна отображать текущее положение приемника, скорость, направление движения, факторы снижения точности, время, дату, а еще показывать в полярной системе координат используемые спутники. Вот примерно так, как это делает u-center на рис. 2.

Рис. 2. Ожидание того, что будет показано на экранчике 128 х 64

Как только строка от Neo-6M принимается контроллером, происходит ее разбитие на токены (массив ) — на подстроки, которые в исходной строке разделены запятыми.

Казалось бы, вполне логично использовать функцию , но я этого не делаю. Причину покажу на примере. Пусть имеется строка . Результат разбития ее на токены с помощью будет таким: . Для разбора NMEA это недопустимо, поскольку в этом протоколе значения токенов зависят от положения в строке. Результат работы описанного выше метода включает в себя пустые токены — .

Для удобного хранения информации о положении приемника, о точности определения положения, а также о параметрах спутников были написаны три структуры данных.

Положение и скорость приемника, а также дата и время:

Структура точности определения координат:

Структура о номере спутника, его положении и качестве сигнала:

Если информация о спутнике не полная, например есть информация о высоте и азимуте, но нет о соотношении сигнал/шум, то в поле записывается нулевое значение. Такие спутники при выводе на «радар» будут игнорироваться.

Заполнение структуры на основе массива токенов происходит очень просто: после разбора строки в массиве значения факторов снижения точности *DOP находятся в элементах за номерами 15, 16 и 17.

Теперь можно разобранную информацию смело выводить на экран (рис. 3).

Рис. 3. А вот и реальность!

Подключение и настройка

GPS/GLONASS-модуль общается с управляющей платой по протоколу UART.
В зависимости от управляющей платформы выберите вариант подключения GPS-модуля.

HardwareSerial

На управляющей плате Iskra JS и Arduino платах с микроконтроллером , данные по USB и общение через пины и осуществляется через два раздельных UART. Это даёт возможность подключить GPS-модуль к аппаратному UART на пинах и .

Список поддерживаемых плат:

  • Iskra JS

  • Iskra Neo

  • Arduino Leonardo

При подключении удобно использовать Troyka Shield.

С Troyka Slot Shield можно обойтись без лишних проводов.

SoftwareSerial

Для примера подключим управляющие пины GPS-модуля и — на и контакты управляющей платы.

При подключении удобно использовать Troyka Shield.

С Troyka Slot Shield можно обойтись без лишних проводов.

HardwareSerial Mega

На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины и , отвечает также за передачу по USB. Это означает невозможность использовать одновременно для коммуникации с GPS-модулем и отладки по USB.

Но на платах такого форм-фактора есть ещё дополнительно 3 аппаратных UART:

  • Serial1: пины и ;
  • Serial2: пины и ;
  • Serial3: пины и .

Список поддерживаемых плат:

  • Arduino Mega 2560

  • Arduino ADK

  • Arduino Due

Подключим GPS-модуль к объекту на пины и на примере платы Arduino Mega 2560.

Description of Arduino handheld controller

The Arduino handheld controller is used by a user to find the location of their GPS tracking device. It is powered by an 18650 Li-ion cell and consists of Li-ion protection and charging circuitry, an Arduino, a 1.8″ TFT LCD display, a HC-12 wireless communication module and buttons for requesting various data from the tracking device. When it receives data from the tracking device, the Arduino will interpret the message formtted as <datatype>:<CSV of data> into <data type> and an array of data for each item in <CSV of data>. Then, the tracker respond in the appropriate way. The messages it understands and the way it responds are listed below:

if receive «gps:<latitude>, <longitude>, <num of satellites>, <accuracy>, <speed>, <direction>, <age of data>, <checksum>»

Display these figures on the 1.8″ TFT LCD display.

Buttons

The buttons on the handheld controller are pulled high by the Arduino’s internal pull-up resistors. To activate the button, the pin should be connected to ground.

The Arduino pins used to connect to peripherals is shown below:

#define namePin no.Function
SOFTWARE_SERIAL_TX2For the HC-12 module. Connects to HC-12 RX
SOFTWARE_SERIAL_RX3For the HC-12 module. Connects to HC-12 TX
CELLVOLTS_BUTTON4Push button connected to ground. transmit: «cell:volts» to the tracking device
REQUEST_GPS_ONCE_BUTTON5Push button connected to ground. transmit: «gps:once»
REQUEST_GPS_CONTINUOUS_BUTTON6Push button connected to ground. transmit: «gps:continuous»
REQUEST_GPS_STOP_BUTTON7Push button connected to ground. transmit: «gps:stop»
sclk13Connection to 1.8″ TFT LCD screen. Connects to TFT SCK/
mosi11Connection to 1.8″ TFT LCD screen. Connects to TFT SDA/
cs10Connection to 1.8″ TFT LCD screen. Connects to TFT SCS/
dcA0Connection to 1.8″ TFT LCD screen. Connects to TFT A0/
rstA1Connection to 1.8″ TFT LCD screen. Connects to TFT RESET/

Скетч

Прошейте контроллер скетчем через Arduino IDE.

gps-speedometr.ino
#include "TroykaButton.h"
// создаём объект для работы с кнопкой
TroykaButton button(A2);
// библиотека для работы с дисплеем
#include <QuadDisplay2.h>
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(10);
// библиотека для работы с GPS устройством
#include <TroykaGPS.h>
// создаём объект класса GPS и передаём в него объект Serial1 
GPS gps(Serial1);
// задаём размер массива для времени, даты, широты и долготы
#define MAX_SIZE_MASS 16
// макросы
#define SPEED         0
#define DISTANCE      1
// переменые для хранения текущей скорости и пройденного расстояния
float speed;
float distance = ;
// переменные для хранения координат
float latitudeLast;
float longitudeLast;
// режим отображение: текущей скорости / пройденного расстояния 
bool state = SPEED;
// флаг первого считывания данных с GPS-модуля
bool firstStart = true;
 
void setup()
{ 
  // открываем последовательный порт для мониторинга действий в программе
  // для ревизии v1 модуля GPS:
//  Serial.begin(115200); 
  // для ревизии v2 модуля GPS:
  Serial.begin(9600);
//  Serial.print("Serial init OK\r\n");
  // открываем Serial-соединение с GPS-модулем
  // для ревизии v1 модуля GPS: 
//  Serial1.begin(115200); 
  // для ревизии v2 модуля GPS: 
  Serial1.begin(9600);
  // инициализация дисплея
  qd.begin();
  // инициализация кнопки
  button.begin();
}
 
void loop()
{
  // переменные для хранения текущих координат
  float latitude;
  float longitude;
  // считывание данных с кнопки
  button.read();
  // если был клик
  if (button.justPressed()) {
    // меняем отображение скорости на расстояния или наоборот
    state = !state;
    // в зависимости от текущего состояния спидометра
    if (!state) {
      qd.displayDigits(QD_S, QD_P, QD_E, QD_d);
    } else {
      qd.displayDigits(QD_d, QD_I, QD_S, QD_t);
    }
    delay(1000);
  }
    // если пришли данные с GPS-модуля
  if (gps.available()) {
    // считываем данные и парсим
    gps.readParsing();
    // считываем состояние GPS-модуля
    switch(gps.getState()) {
      // всё OK
      case GPS_OK
        // считываем с GPS-модуля текушие координаты и скорость
        speed = gps.getSpeedKm();
        latitude = gps.getLatitudeBase10();
        longitude = gps.getLongitudeBase10();
        // если данные с GPS-модуля пришли впервые
        if (firstStart) {
          // сохраняем текущие значения координат
          latitudeLast = latitude;
          longitudeLast = longitude;
          // первый запуск был совершен
          firstStart = false;
        }
        distance = distance + latlng2distance(latitudeLast, longitudeLast, latitude, longitude);
        // сохраняем текущие значения координат
        latitudeLast = latitude;
        longitudeLast = longitude;
  /*      Serial.print(speed);
        Serial.print("\t");
        Serial.print(latitude, 6);
        Serial.print("\t");
        Serial.print(longitude, 6);
        Serial.print("\t"); 
        Serial.println(distance);*/
        // в зависимости от режима работы спидометра
        if(!state) {
          // выводим текущую скорость
          qd.displayFloat(speed, 1);
        } else {
          // выводим текущее расстояние
          qd.displayFloat(distance, 1);
        }
        break;
      // ошибка данных
      case GPS_ERROR_DATA
        Serial.println("GPS error data");
        break;
      // нет соединение со спутниками
      case GPS_ERROR_SAT
        Serial.println("GPS no connect to satellites");
        qd.displayDigits(QD_E, QD_r, QD_r, QD_NONE);
        break;
    }
  }
}
 
float latlng2distance(float lat1, float long1, float lat2, float long2) {
    //радиус Земли
    unsigned long R = 6372795;
    //перевод коордитат в радианы
    lat1 *= 3.14  180;
    lat2 *= 3.14  180;
    long1 *= 3.14  180;
    long2 *= 3.14  180;
    //вычисление косинусов и синусов широт и разницы долгот
    float cl1 = cos(lat1);
    float cl2 = cos(lat2);
    float sl1 = sin(lat1);
    float sl2 = sin(lat2);
    float delta = long2 - long1;
    float cdelta = cos(delta);
    float sdelta = sin(delta);
    //вычисления длины большого круга
    float y = sqrt(pow(cl2 * sdelta, 2) + pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2));
    float x = sl1 * sl2 + cl1 * cl2 * cdelta;
    float ad = atan2(y, x);
    float dist = ad * R; //расстояние между двумя координатами в метрах
    return dist;
}

Часто задаваемые вопросы

  • Как установить библиотеку

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

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

Скетч и библиотеки

Дополнительно нам понадобятся некоторые библиотеки:

Больше различных библиотек вы можете найти на нашем сайте в разделе Библиотеки.

Скетч для Arduino GPS вы можете скачать или скопировать ниже:

#include <LiquidCrystal.h> 
#include <SoftwareSerial.h> 
#include <TinyGPS.h> 
float lat = 28.5458,lon = 77.1703; // создать переменную для объекта широты и долготы  
SoftwareSerial gpsSerial(3,4);//rx,tx 
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); 
TinyGPS gps; // создать gps объект
void setup(){ 
Serial.begin(9600); // соединяем serial 
//Serial.println("Полученный сигнал GPS:"); 
gpsSerial.begin(9600); // подключаем gps датчик
lcd.begin(16,2); 
} 
void loop(){ 
  while(gpsSerial.available()){ // проверка gps данных
  if(gps.encode(gpsSerial.read()))// шифровать gps данные 
  {  
  gps.f_get_position(&lat,&lon); // получить широту и долготу
  // отобразить позицию 
  lcd.clear(); 
  lcd.setCursor(1,0); 
  lcd.print("GPS Signal"); 
  //Serial.print("Position: "); 
  //Serial.print("Latitude:"); 
  //Serial.print(lat,6); 
  //Serial.print(";"); 
  //Serial.print("Longitude:"); 
  //Serial.println(lon,6);  
  lcd.setCursor(1,0); 
  lcd.print("LAT:"); 
  lcd.setCursor(5,0); 
  lcd.print(lat); 
  //Serial.print(lat); 
  //Serial.print(" "); 
  lcd.setCursor(0,1); 
  lcd.print(",LON:"); 
  lcd.setCursor(5,1); 
  lcd.print(lon); 
 } 
} 
String latitude = String(lat,6); 
  String longitude = String(lon,6); 
Serial.println(latitude+";"+longitude); 
delay(1000); 
}

В Visual Studio мы создали приложение в котором можно найти текущее местоположение GPS. Оно работает только тогда, когда подключено последовательно к ПК или ноутбуку:

Если вы хотите внести некоторые изменения в приложение, вы можете сделать это открыв sln-файл в Visual Studio (2012 и выше), или вы можете напрямую установить и использовать его.

メソッド

bool check (void)

受信バッファを読み取り、NMEAデータを解析する。1行分のデータが正常に揃えば真を返す。

このメソッドは受信バッファが溢れる前に、継続して繰り返し呼び出す必要がある。
より高速なボーレートを扱う場合は相応の頻度が必要。
(当然だが)割込ルーチン内から呼び出してはならない。
内部的に delay() は使用していないので、yield() から呼び出すことはできる。

現在保持している時刻情報のミリ秒を、符号なし整数型で返す。範囲は 0〜999 である。

この項目はリアルタイムの時間を表してはいない。
PMTK220 コマンドで指定した間隔で更新される。

現在保持している時刻情報の年月日を、BCDカレンダー年月日型で返す。

この項目は RMCに現れる。

現在保持している時刻情報の時分秒を、BCDカレンダー時分秒型で返す。

この項目は すべての NMEAパケットに現れる。

int32_t latitude (void)

現在保持している最新の緯度を、符号付き整数型で返す。

最小精度(1LSB)は 1/600000度(およそ0.1852メートル)である。
なので 600000 で割ると Web地図座標系になる。

この項目は RMCと GGAの両方に現れる。

現在保持している最新の経度を、符号付き整数型で返す。

最小精度(1LSB)は 1/600000度である。
なので 600000 で割ると Web地図座標系になる。

この項目は RMCと GGAの両方に現れる。

現在保持している最新の高度を、符号付き整数で返す。

最小精度(1LSB)は 1センチメートルである。
なので 100 で割るとメートルに換算できる。

この項目は GGAに現れる。

uint32_t speed (void)

現在保持している最新の移動速度を、符号なし整数で返す。

最小精度(1LSB)は 1/100ノーチカルマイル毎時である。
なので 0.01852 を掛けると、キロメートル毎時に換算できる。
(割算なら 53.99568 ちょうどだが覚えにくい)

本項が «海里» 単位なのは、元になった NMEAフォーマットが海運用途で設計された名残であり、互換性維持のためであろう。

ちなみに «時速1海里» で南北方向に1時間進むと、緯度は1/60度(1分)増減する。
したがって latitude メンバーは 10000 増減することになる。

この項目は RMCに現れる。

uint16_t course (void)

現在保持している最新の移動方位を、符号なし整数で返す。

最小精度(1LSB)は 1/100度である。
真北を0度とし時計回りに360度で1回転する。
従って本項の有効範囲は 0〜35999 である。

この項目は RMCに現れる。

現在軌道情報を把握して追跡している GPS/QZSS衛星の数を返す。
MTK333Xの場合は最大64を返す可能性がある。

この項目は GGAに現れる。

uint16_t dop (void)

現在のDOP値を、符号なし整数にして返す。

最小精度(1LSB)は 1/100である。

1個以上の衛星を補足していれば、時刻情報は十分校正されている。
(0個なら GPSデバイス内の RTCの更新値が返ってくる)
高さを含む位置情報の算出には最低4個の衛星捕捉が必要である。
それ以上の衛星が視野にある場合は、最も適切な位置にあるだろう4個が選ばれる。
概念的には、うち3個が正三角形を描き、残る1個がその中心に近いほど、DOP値は高くなる。
DOP値が低いということはこの形が歪んでおり、三角測量の精度が悪くなるということである。
衛星捕捉数が多ければ歪んでいない正三角形を見つけやすいので測量精度が上がると換言できる。

この項目は GGAに現れる。

bool sendMTKcommand (uint16_t PMTKCODE, String MESSAGE = «»)

GPSデバイスに PMTK制御コマンドを送信し、1秒以内に応答があれば、その結果を真偽値で返す。
第1引数にコマンド番号を整数で、第2引数に追加のパラメータを文字列で渡す。

// UARTボーレートを 9600bpsに設定する
GPS.sendMTKcommand(251, F(",9600"));

// 1Hz(1000ms)間隔で NMEAを出力する
GPS.sendMTKcommand(220, F(",1000"));

// AlwaysLocate モード開始
GPS.sendMTKcommand(225, F(",8"));

// 上記を解除してスタンダードモードに遷移
GPS.sendMTKcommand(225, F(",0"));

// QZSS(みちびき)をサポートする
GPS.sendMTKcommand(351, F(",1"));

// RMCとGGAをともに1サイクルで出力する(1サイクル時間は PMTK220 による)
// 各項は ",GLL,RMC,VTG,GGA,GSA,GSV,0,0,0,0,0,0,0,0,0,0,0,ZDA,MCHN"
GPS.sendMTKcommand(314, F(",0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"));

本ライブラリの実装では RMCと GGAしか解釈しないので、
PMTK314でそれら以外を有効にしても、受信バッファとリソースを無駄にするだけである。

bool sendUBXcommand (uint16_t UBXCODE, String MESSAGE = «»)

U-blox シリーズの GPSに UBXコマンドを送信する。
使い方は sendMTKcommand() と同様であるが、戻り値はない。(常に偽)

本ライブラリは U-blox シリーズを真にサポートしているわけではないが、
単純に位置座標と時刻を取得する用途なら問題はないので、利便性のためこのコマンドが用意されている。

// GPS(U-blox)出力設定の例
GPS.sendUBXcommand(40, F(",RMC,1,1,0,0,0,0"));
GPS.sendUBXcommand(40, F(",GGA,1,1,0,0,0,0"));
GPS.sendUBXcommand(40, F(",VTG,1,0,0,0,0,0"));
GPS.sendUBXcommand(40, F(",GLL,1,0,0,0,0,0"));
GPS.sendUBXcommand(40, F(",GSA,1,0,0,0,0,0"));
GPS.sendUBXcommand(40, F(",VSV,1,0,0,0,0,0"));
GPS.flush();

Железо

Что же мы используем в проекте?

  • Отладочную плату STM32F3-Discovery;
  • модуль UART GPS NEO-6M от WaveShare на базе приемника u-blox NEO-6M;
  • ЖК-матрицу МТ-12864А.

Про ЖК-экран я рассказывал в сентябрьском номере (№ 188), кратко лишь скажу, что сделан он на базе контроллеров KS0108, а схема подключения к STM32F3-Discovery не изменилась: разъем для подключения экрана содержит в себе 20 пинов, описание представлено в списке по следующей маске: <номер> — <название из даташита> — <описание из даташита> — <куда подключается>.

  • 1 — Ucc — питание — к 5V на Discovery.
  • 2 — GND — земля — к GND на Discovery.
  • 3 — Uo — вход питания ЖК-панели для управления контрастностью — к подстроечному резистору.
  • 4..11 — DB0..DB7 — шина данных — к PD0..PD7 на Discovery.
  • 12, 13 — E1, E2 — выбор контроллера — к PD8,PD9 на Discovery.
  • 14 — RES — сброс — к PD10 на Discovery.
  • 15 — R/W — выбор: чтение/запись — к PD11 на Discovery.
  • 16 — A0 — выбор: команда/данные — к PD12 на Discovery.
  • 17 — E — стробирование данных — к PD13 на Discovery.
  • 18 — Uee — выход DC-DC преобразователя — к подстроечному резистору.

コンストラクタ

GPS_MTK333X のコンストラクタには、接続インタフェースに応じて4種類が用意されている。

GPS_MTK333X_MultiUART (uint8_t RX_PIN, uint8_t TX_PIN)

SoftwareSerial または MultiUART コンストラクタでは、
受信ピン、送信ピンの指定は必須である。
またそれぞれに対応したライブラリを事前にインクルードしていなければならない。
ピン番号は Arudiono で規定されたものとする。
それぞれのピンのIO設定は直ちに行われる。
これを用いた場合の最大ボーレートは 9600bpsである。

#define TX_PIN 6
#define RX_PIN 5

// もっぱらグローバルなオブジェクトとして
#include <SoftwareSerial.h>
GPS_MTK333X_SoftwareSerial GPS(RX_PIN, TX_PIN);
GPS.begin(9600);

// スコープから抜けると破棄されるようなオブジェクトとして
auto GPS = new GPS_MTK333X_SoftwareSerial(RX_PIN, TX_PIN);
GPS->begin(9600);

GPS_MTK333X_Serial4 (void)

HardwareSerial を用いてクラスオブジェクトを作成するコンストラクタ。
9600bps を超えるボーレートを使用する場合は、このコンストラクタが必要である。

GPS_MTK333X_Serial1 GPS;
GPS.begin(115200);

GPS_MTK333X_I2C (void)

I2Cバスを用いてクラスオブジェクトを作成するコンストラクタ。
クラス名が UART用とは異なる。
また begin() の引数が I2C用に変わる。

GPS_MTK333X_I2C GPS;
GPS.begin(I2C_SPEED_STANDARD);

GPS_MTK333X_I2C (uint8_t intPin)

MTK3333 の INTピンを配線して使用できるのであれば、コンストラクタでそれを指定することもできる。
このピンは I2Cバッファに NMEAデータが用意されると LOWになり、I2Cバッファが空であれば HIGHになる。
これが利用できると I2Cバスを空読みする事がなくなり、負荷が軽くなる。

#define GPS_INT_PIN 4

pinMode(GPS_INT_PIN, INPUT_PULLUP)
GPS_MTK333X_I2C GPS(GPS_INT_PIN);
GPS.begin(I2C_SPEED_STANDARD);

NMEA-0183

NMEA — National Marine Electronics Association, а NMEA-0183 (согласно Википедии) — текстовый протокол связи морского (как правило, навигационного) оборудования (или оборудования, используемого в поездах) между собой. Вот строки, приходящие от моего приемника.

Сначала определим похожие части каждой строки. Легко видеть, что все они начинаются одинаково и более-менее одинаково заканчиваются. — информация идет от приемника GPS (ты ведь понимаешь, что на корабле куча других датчиков: если бы у нас был аварийный маяк, то строка начиналась бы с , а если эхолот, то с , ну и так далее). Каждая строка обязательно заканчивается контрольной XOR-суммой всех байтов в строке начиная от и заканчивая — это как раз те два символа в конце строки. И не забываем про символы и после контрольной суммы. Разберем каждую из строк подробнее.

  • — GPS Recommended Minimum Navigation Information sentence C — рекомендуемый минимум навигационной информации, строка типа С.
  • — время по всемирному координированному времени UTC, когда была произведена фиксация положения.
  • — флаг достоверности информации. Если , то информации верить нельзя.
  • — величина широты. Первые две цифры — градусы, вторые две — целое значение количества угловых минут, после точки — дробная часть количества угловых минут (переменной длины).
  • — северная широта. Если , то южная.
  • — величина долготы. Первые две цифры — градусы, вторые две — целое значение количества угловых минут, после точки — дробная часть количества угловых минут (переменной длины).
  • — восточная долгота. Если , то западная.
  • — горизонтальная скорость в узлах (умножить на 1,852 для получения скорости в километрах в час), целая и дробная части имеют переменную длину.
  • — направление скорости (путевой угол, курс) в градусах, целая и дробная части имеют переменную длину.
  • — текущая дата.
  • — отсутствующая у нас величина направления магнитного склонения.
  • — также отсутствующее у нас направление магнитного склонения.
  • — индикатор режима.
  • — контрольная сумма.
  • — GPS Track Made Good and Ground Speed — строка с информацией о курсе и скорости.
  • — курс в градусах.
  • — True, флаг достоверности информации.
  • — направление магнитного склонения (у нас его нет).
  • — Magnetic, да, действительно магнитное.
  • — горизонтальная скорость в узлах (умножить на 1,852 для получения скорости в километрах в час).
  • — kNots, узлы.
  • — горизонтальная скорость в километрах в час (и умножать ничего не надо).
  • — километры в час.
  • — контрольная сумма.
  • — Global Positioning System Fix Data — строка с информацией о текущем местоположении.
  • — время по всемирному координированному времени UTC, когда была произведена фиксация положения.
  • — величина широты.
  • — северная широта. Если , то южная.
  • — величина долготы.
  • — восточная долгота. Если , то западная.
  • — флаг качества сигнала GPS.
  • — количество используемых спутников.
  • — фактор снижения точности (DOP, Dilution of precision).
  • — высота расположения приемника над уровнем моря.
  • — высота дается в метрах.
  • — различие между геоидом (истинной формой нашей планеты) и эллипсоидом по WGS84 (трехмерная система координат для позиционирования).
  • — различие дается в метрах.
  • — номер станции, передающей поправки DGPS.
  • — контрольная сумма.
  • — GPS DOP and Active satellites — строка с информацией о спутниках, использованных для определения местоположения и о факторах снижения точности.
  • — автоматический режим выбора работы в 2D или 3D, — ручной режим, когда жестко выбран, например, 2D.
  • — режим работы приемника: — координаты не определены, — режим 2D, — режим 3D.
  • — номера спутников, используемых для определения местоположения приемника.
  • — PDOP, HDOP, VDOP (факторы снижения точности по положению, в горизонтальной плоскости и в вертикальной плоскости соответственно).
  • — контрольная сумма.
  • — GPS Satellites in View — строка содержит в себе информацию о номере, азимуте, высоте над горизонтом и соотношением сигнал/шум спутника. В строке максимально может быть четыре спутника.
  • — общее количество строк .
  • — номер текущей строки.
  • — номер спутника.
  • — высота над горизонтом в градусах .
  • — азимут спутника в градусах .
  • — соотношение сигнал/шум в дБ .

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

Разумеется, производителям GPS-приемников не запрещается добавлять собственные строки. У моего приемника можно при запуске увидеть такие:

Getting Started

First Steps

  1. Using your phone:
    — Disable PIN code on the SIM card
    — Check your balance
    — Check that APN, User, Pass are correct and you have internet
  2. Ensure the SIM card is correctly inserted into the module
  3. Ensure that GSM antenna is firmly attached
  4. Ensure that you have a stable power supply to the module of at least 2A.
  5. Check if serial connection is working (Hardware Serial is recommended)
    Send an command using this sketch
  6. Try out the WebClient example

Writing your own code

The general flow of your code should be:

  • Define the module that you are using (choose one and only one)
  • Included TinyGSM
  • Create a TinyGSM modem instance
  • Create one or more TinyGSM client instances
    • For a single connection, use
    • For multiple connections (on supported modules) use:
      • , , etc
        or
      • , , etc
    • Secure and insecure clients can usually be mixed when using multiple connections.
    • The total number of connections possible varies by module
  • Begin your serial communication and set all your pins as required to power your module and bring it to full functionality.
  • Wait for the module to be ready (could be as much as 6s, depending on the module)
  • Initialize the modem
    • or
    • restart generally takes longer than init but ensures the module doesn’t have lingering connections
  • Unlock your SIM, if necessary:
  • If using WiFi, specify your SSID information:
    • Network registration should be automatic on cellular modules
  • Wait for network registration to be successful
  • If using cellular, establish the GPRS or EPS data connection after your are successfully registered on the network
    • (or simply )
    • The same command is used for both GPRS or EPS connection
    • If using a Digi brand cellular XBee, you must specify your GPRS/EPS connection information before waiting for the network. This is true ONLY for Digi cellular XBees! For all other cellular modules, use the GPRS connect function after network registration.
  • Connect the TCP or SSL client

  • Send out your data.

If you have any issues:

  1. Read the whole README (you’re looking at it!), particularly the troubleshooting section below.
  2. Some boards require special configuration.
  3. Try running the Diagnostics sketch
  4. Check for highlighted topics here

Характеристики навигаторов

Основные:

  • время работы прибора, в течение которого он способен работать на сменных батареях или встроенной батарее аккумуляторной;
  • величина постоянной памяти (встроенной). Особое значение имеет характеристика в случае отсутствия слота для памяти дополнительной;
  • память оперативная, служащая непосредственно для работы (расчета маршрута и пр.), а не для хранения информации. Характеристика определяет быстродействие навигатора и равна в большинстве моделей 128 Мб, хотя может достигать и 512;
  • чипеет – главный элемент устройства, благодаря которому происходит связь со спутниками, определяется местонахождения авто;
  • количество каналов приемника, которое соответствует числу спутников, работающих одновременно с навигатором (минимум их должно быть три). Если их больше, возрастает точность. В некоторых навигаторах их от 20 до 32;
  • частота процессора, означающая, как и для компьютера, число операций, одновременно выполняемых за секунду.

Видео: Как подключить GPS-модуль к Arduino

Шаг 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. Когда нулевой сигнал подается на базу транзистора, он выключается, действуя как открытый выключатель, и ток коллектора не течет. При положительном сигнале, подаваемом на базу транзистора, он становится «включенным», действующим как замкнутый переключатель, и максимальный ток цепи протекает через устройство.

Step 4: Conclusion

I still relatively new in the 3D printing word, so it is natural that my prints do not come perfect :)

In general I can not complain but I still have a lot to improve on this area. The back plate currently is not fixing go good as in the beginning, so some more design updates will be needed.

Also I left out the GPS antenna in the back plate, thing that I will not do in the next design. The course display also did not work so well, but this was only to a little detail. In the future I’m planning to replace with something more useful, ex.: time of arrival to a point (size the majority of my trips are going back and forward).

Fell free to comment or send me a message if you found any mistake or if you have any suggestion/improvement or questions.

«Do not get bored, do something».

P.S.: If you like this project, do not forget to leave your vote for the contests I’m running.

1. Backend setup

  1. Add a new device for your new TTN application and select ABP Activation Method
  2. Insert Network Session Key, App Session Key and Device Address to file in Arduino project
  3. Upload sketch to your board, you can program the T-Beam using the Arduino ESP32 board
  4. In your TTN application, in section Payload formats select
  5. In Integrations section, select
  6. Fill Process ID (choose any name you prefer), select Default Access Key and click on Add integration
  7. Click on Add new -> Device/Widget -> LoRa -> The Things Network -> Cayenne LPP
  8. If your tracker already sent any data to TTN, you’ll see bunch of data fields. You can drag them to your Cayenne project.
  9. Install the Cayenne mobile app to your Android/iPhone.

That’s it

This is how it will look like when data is received by TTN and Cayenne.

Cayenne data fields

After these steps, you will see these data fields in Cayenne Dashboard:

Optional fields, you can choose to send them in the program:

  • Analog Input (5): Battery voltage (in volts)
  • Analog Input (6): If tracker is moving, this field is GPS speed, in km/h
  • Analog Input (7): Number of satellites, that the GPS module currently ‘sees’
  • Analog Input (8): Approximate tracker’s altitude calculated from barometric air pressure
Оцените статью:
Оставить комментарий
Adblock
detector