Модуль серии ATGM336H-5N представляет собой устройство, позволяющее точное позиционирование объекта в которое оно встроено. Данная серия основана на четвертом поколении маломощных чипах AT6558, поддерживающее множество спутниковых навигационных систем, ГЛОНАСС в России.
AT6558 – это многомодовый спутниковый навигационный модуль с 32 каналами отслеживания, которые могут одновременно принимать до шести спутников используемые для навигационных систем. Данный модуль обладает высокой чувствительность и низким энергопотреблением. Подходит для автомобильной и переносной навигации.
1. Аппаратная часть
Для эксперимента с GPS используем:
- Arduino UNO с кабелем для подключения к компьютеру;
- Приемник GPS/Глонасс модуль ATGM336H;
- Преобразователь интерфейсов USB-UART;
- Жидкокристаллический символьный дисплей 16Х2.
2. Подключение и проверка модуля ATGM336H-5N
Модуль GPS передает информацию в последовательном формате TTL. Это делает его унивирсальным для взаимодействия с Arduino: все, что нам нужно сделать, — это подключить его TX к входу D0 Arduino и RX к входу D1 этого вполне достаточно. GPS-приемник содержит встроенную батарею, что позволяет при отключении питания модуля получить время (вывод PPS), в противном случае нам придется подождать несколько секунд, пока приемник не найдет спутник и не вычислит информацию о времени / местоположении. Модуль имеет встроенный светодиод. Когда светодиод горит, он указывает на стабильный сигнал спутников. Если он мигает, это означает, что модуль еще не получил сигнал спутников GPS
Итак давайте проверим нашь модуль. Для этого подключим его к USB-UART преобразователь интерфейсов, согласно схеме:
Далее подключаем схему к компьютеру и запускаем Arduino IDE. В настройках выбираем тот COM-порт, к которому подключен модуль:
После установки COM-порта запускаем “Монитор порта”, выставляем скорость 9600 и видим как GPS приемник передает информацию порт в формате NMEA:
$GNGGA,,,,,,0,00,25.5,,,,,,*64 $GNGLL,,,,,,V,N*7A $GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*02 $BDGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*13 $GPGSV,1,1,01,26,,,29*77 $BDGSV,2,1,05,02,,,27,04,,,31,05,,,32,06,,,32*6C $BDGSV,2,2,05,14,,,29*63 $GNRMC,,V,,,,,,,,,,N*4D $GNVTG,,,,,,,,,N*2E $GNZDA 172809, 28, 03, 2018, 00, 00*45 $GPTXT,01,01,01,ANTENNA OK*35
Давайте рассмотрим, что такое протокол NMEA.
NMEA — это формат передачи сообщений между корабельными приборами. Он включает в себя систему сообщений для обмена информацией между навигационными GPS-приемниками и потребителями навигационной информации. Все команды и сообщения передаются в текстовом ASCII-виде. Сообщения относящиеся к GPS-приемнику начинаются с $GP, в конце строки сообщения должны быть символы. В последнем поле сообщения может быть указана контрольная сумма текущего сообщения, начинающаяся с разделителя *. Контрольная сумма всех символов сообщения, включая пробелы, расположенных между разделителями $и *, не включая последних. Шестнадцатеричный результат переводится в два ASCII-символа (0-9, A-F).
Для нашего примера работы модуля, будет использоваться строка $GNZDA, так как в ней содержится информацию о времени, календарном дне, месяце, годе и локальном часовом поясе.
3. Программа для получения данных с модуля ATGM336H
Соберем схему, которая будет отображать на дисплее время, дату и координаты местоположения.
Загружаем программу на Ардуино. После загрузки смотрим на дисплее дату, время и наше местоположение.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <string.h>
#include <ctype.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int rxPin = 0; // RX pin
int txPin = 1; // TX pin
int byteGPS=-1;
char cmd[7] = "$GPZDA";
int counter1 = 0;
int counter2 = 0;
int offsets[13];
char buf[300] = "";
//Настройка дисплея и модуля GPS
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
Serial.begin(9600);
lcd.begin();
lcd.backlight();
lcd.print("waiting for gps");
offsets[0] = 0;
reset();
}
void reset() {
counter1 = 0;
counter2 = 0;
}
int get_size(int offset) {
return offsets[offset+1] - offsets[offset] - 1;
}
int handle_byte(int byteGPS) {
buf[counter1] = byteGPS;
if (counter1 == 300) {
return 0;
}
if (byteGPS == ',') {
counter2++;
offsets[counter2] = counter1;
if (counter2 == 13) {
return 0;
}
}
if (byteGPS == '*') {
offsets[12] = counter1;
}
if (byteGPS == 10) {
if (counter2 != 12 || (get_size(0) != 6)) {
return 0;
}
// Данные с NMEA кода $GNZDA
for (int j=0; j<6; j++) {
if (buf[j] != cmd[j]) {
return 0;
}
}
// Настройка отброжжения времени
if (get_size(1) != 10) {
return 0;
}
if (get_size(9) != 6) {
return 0;
}
//Вывод времени
lcd.clear();
for (int j=0; j<6; j++) {
lcd.print(buf[offsets[1]+j]);
if (j==1) {
lcd.print("h");
}
else if (j==6) {
lcd.print("m");
}
else if (j==5) {
lcd.print("EKB");
}
}
// Вывод даты
lcd.setCursor(0, 1);
for (int j=0; j<6; j++) {
lcd.print(buf[offsets[9]+j]);
if (j==1 || j==3) {
lcd.print(".");
}
}
return 0;
}
return 1;
}
//Основной цикл программы
void loop() {
byteGPS=Serial.read(); //Чтение информации с порта
if (byteGPS == -1) { // Проверка данных NMEA
delay(100);
}
else {
if (!handle_byte(byteGPS)) {
reset();
}
}
}
Заключение
С помощью модуля GPS/Глонасс можно сделать простейшую систему навигации для робота. Автопилот для квадрокоптера или же использовать в своих проектах.