В этом проекте мы разберемся как подключить модуль GPS к Arduino UNO, чтобы долгота и широта отображались на ЖК-дисплее.

Комплектующие

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

  1. Плата Arduino Uno
  2. u-blox NEO-6M GPS-модуль
  3. Дисплей Adafruit RGB Backlight LCD — 16×2

Что такое GPS?

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

Как работает GPS

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

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

Чтобы рассчитать ваше двухмерное положение (широту и долготу) и отследить перемещение, GPS-приемник должен быть привязан к сигналу как минимум 3 спутников. При наличии в поле зрения 4 или более спутников приемник может определить ваше трехмерное положение (широту, долготу и высоту). Обычно GPS-приемник отслеживает 8 или более спутников, но это зависит от времени суток и местоположения на Земле.

После определения вашего местоположения устройство GPS может рассчитать другую информацию, например:

  • Скорость
  • Пеленг
  • Трек
  • Путь
  • Расстояние до пункта назначения

Что за сигнал?

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

Сигнал GPS содержит 3 различных типа информации:

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

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

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

Библиотеки

Скачайте и установите необходимые библиотеки для работы GPS в IDE Arduino:

GPS-модуль NEO-6M

GPS-модуль NEO-6M показан на рисунке ниже. Он поставляется с внешней антенной и не имеет выводов для подключения. Поэтому вам придется его припаять.

GPS-модуль NEO-6M

NEO-6M GPS чип

Сердцем модуля является чип NEO-6M GPS от u-blox. Он может отслеживать до 22 спутников на 50 каналах и достигает самого высокого в отрасли уровня чувствительности, т.е. -161 дБ, потребляя при этом ток питания всего 45 мА.

Механизм позиционирования u-blox 6 также может похвастаться временем до первой фиксации (TTFF) менее 1 секунды. Одной из лучших функций чипа является режим энергосбережения (PSM). Он позволяет снизить энергопотребление системы путем выборочного включения и выключения частей приемника.

Это значительно снижает энергопотребление модуля всего до 11 мА, что делает его подходящим для энергочувствительных приложений, таких как наручные часы GPS. Необходимые контакты данных микросхемы NEO-6M GPS разбиты на заголовки с шагом 0,1 дюйма. Это включает в себя контакты, необходимые для связи с микроконтроллером через UART.

Примечание. Модуль поддерживает скорость передачи данных от 4800 бит/с до 230400 бит/с, по умолчанию 9600 бит/с.

Светодиодный индикатор фиксации положения

На GPS-модуле NEO-6M есть светодиодный индикатор, который показывает состояние Position Fix (определение местоположения). Он мигает с различной частотой в зависимости от того, в каком состоянии он находится:

  • Не мигает -> означает, что идет поиск спутников
  • Мигает каждые 1 с -> означает, что обнаружена фиксация положения

Регулятор LDO на 3,3 В

Рабочее напряжение чипа NEO-6M составляет от 2,7 до 3,6 В. Но модуль поставляется с регулятором MIC5205 с ультранизким падением напряжения 3V3 от MICREL. Логические выводы также устойчивы к 5-вольтовому напряжению, поэтому мы можем легко подключить его к Arduino или любому другому микроконтроллеру с 5-вольтовой логикой без использования какого-либо преобразователя логических уровней.

Аккумулятор и EEPROM

Модуль оснащен двухпроводной последовательной памятью EEPROM HK24C32. Она имеет размер 4 КБ и подключена к чипу NEO-6M через I2C. Модуль также содержит аккумуляторную батарею, которая действует как суперконденсатор.

EEPROM вместе с батареей помогает сохранить оперативную память с батарейной поддержкой (BBR). BBR содержит данные часов, последние данные о положении (GNSS или битовые данные) и конфигурацию модуля. Но она не предназначена для постоянного хранения данных.

Поскольку батарея сохраняет время и последнее положение, время до первой фиксации (TTFF) значительно сокращается до 1 с. Это позволяет намного быстрее фиксировать положение.

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

Распиновка модуля

  • GND — это контакт заземления, который должен быть подключен к контакту GND на Arduino.
  • Контакт TxD (передатчик) используется для последовательной связи.
  • Контакт RxD (приемник) используется для последовательной связи.
  • VCC обеспечивает питание модуля. Вы можете напрямую подключить его к контакту 5V на Arduino.

Arduino Uno

Arduino — это электронная платформа с открытым исходным кодом, основанная на простом в использовании аппаратном и программном обеспечении.

Плата Ардуино Уно — одна из плат линейки Ардуино

Платы Arduino способны считывать входные данные — свет на датчике, палец на кнопке или сообщение в Twitter — и превращать их в выходные данные — активировать двигатель, включать светодиод, публиковать что-то в Интернете.

Вы можете указать вашей плате, что делать, отправив набор инструкций микроконтроллеру на плате. Для этого вы используете язык программирования Arduino (основанный на Wiring) и программное обеспечение Arduino (IDE), основанное на Processing.

Распиновка платы

Arduino Uno — это микроконтроллерная плата на базе 8-битного микроконтроллера ATmega328P. Наряду с ATmega328P, в состав платы входят другие компоненты, такие как кварцевый генератор, последовательная связь, регулятор напряжения и т.д. для поддержки микроконтроллера.

Arduino Uno имеет 14 цифровых входов/выходов (из которых 6 могут быть использованы как ШИМ-выходы), 6 аналоговых входов, USB-разъем, разъем для подключения шины питания, разъем ICSP и кнопку сброса.

14 цифровых контактов ввода/вывода могут быть использованы как входные или выходные контакты с помощью функций pinMode(), digitalRead() и digitalWrite() в программировании Arduino.

Каждый вывод работает при напряжении 5 В и может выдавать или принимать ток максимум 40 мА, а также имеет внутренний подтягивающий резистор 20-50 КОм, который по умолчанию отключен. Из этих 14 выводов некоторые имеют специфические функции, перечисленные ниже:

  • Последовательные контакты 0 (Rx) и 1 (Tx) -> Пины Rx и Tx используются для приема и передачи последовательных данных TTL. Они соединены с соответствующим последовательным чипом ATmega328P USB-TTL.
  • Контакты 2 и 3 внешнего прерывания -> Эти контакты могут быть настроены для запуска прерывания при низком значении, нарастающем или спадающем фронте или изменении значения.
  • ШИМ-контакты 3, 5, 6, 9 и 11 -> Эти контакты обеспечивают 8-битный выход ШИМ с помощью функции analogWrite().
  • SPI-контакты 10 (SS), 11 (MOSI), 12 (MISO) и 13 (SCK) -> Эти контакты используются для SPI-коммуникации.
  • Встроенный светодиод Вывод 13 -> Этот вывод соединен со встроенным светодиодом, когда вывод 13 высокий — светодиод включен, а когда вывод 13 низкий — выключен.

Имеется 6 аналоговых входных контактов, каждый из которых обеспечивает разрешение 10 бит, т.е. 1024 различных значения. Они измеряют от 0 до 5 вольт, но этот предел можно увеличить, используя вывод AREF с функцией analogReference().

  • Аналоговый вывод 4 (SDA) и вывод 5 (SCA) также используются для TWI-коммуникации с помощью библиотеки Wire.
  • AREF -> Используется для обеспечения опорного напряжения для аналоговых входов с помощью функции analogReference().
  • Контакт сброса ==> Если сделать этот контакт НИЗКИМ, микроконтроллер будет сброшен.

Схема соединения

Схема 1

Схема 2

Предпочтительно подавать питание 12 В на GSM

Подключите четыре контакта от UBLOX к Arduino следующим образом:

GPS-модуль <=> Arduino
GND <=> GND
TX <=> Цифровой пин (D3)
RX <=> Цифровой пин (D4)
Vcc <=> 3.3 V

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

Для обеспечения напряжения используйте распространенный USB TTL.

USB driver

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

Распиновка дисплея:

Ground (Земля) -> контакт заземления модуля ЖК-дисплея.

Вывод 2 (Vcc) -> Питание модуля ЖКД (на этот вывод подается напряжение +5 В)

Вывод 3 (VEE) -> вывод регулировки контрастности. Это делается путем подключения концов потенциометра 10K к +5 В и земле, а затем подключите ползунок к выводу VEE. Напряжение на выводе VEE определяет контрастность. Нормальное значение составляет от 0,4 до 0,9 В.

Вывод 4 (RS) -> вывод выбора регистра. JHD162A имеет два регистра, а именно регистр команд и регистр данных. Логический ВЫСОКИЙ на выводе RS выбирает регистр данных, а логический НИЗКИЙ на выводе RS выбирает регистр команд. Если мы сделаем вывод RS ВЫСОКИМ и подадим входной сигнал на линии данных (DB0 — DB7), этот вход будет рассматриваться как данные для отображения на ЖК-дисплее. Если мы сделаем вывод RS НИЗКИМ и подадим входной сигнал на линии данных, то он будет рассматриваться как команда (команда, которая должна быть записана в контроллер LCD — например, позиционирование курсора, очистка экрана или прокрутка).

Вывод 5 (R/W) -> Режимы чтения/записи. Этот вывод используется для выбора между режимами чтения и записи. Логический ВЫСОКИЙ на этом выводе активирует режим чтения, а логический НИЗКИЙ на этом выводе активирует режим записи.

Вывод 6 (E) -> Этот вывод предназначен для включения модуля LCD. Сигнал от ВЫСОКОГО до НИЗКОГО на этом выводе включит модуль.

Контакт 7 (DB0)Контакт 14 (DB7) -> Это контакты данных. Через эти контакты команды и данные подаются на модуль LCD.

Вывод 15 (LED+) -> Анод светодиодной подсветки. При работе от 5 В к этому выводу следует последовательно подключить резистор 560 Ом. В проектах на базе Arduino светодиодная подсветка может питаться от источника 3,3 В на плате Arduino.

Вывод 16 (LED-) -> Катод светодиодной подсветки.

Подключение дисплея:

LCD <=> Arduino
VSS <= > GND
VCC <= > 5V
VEE <= > 10K Resistor
RS <= > A0 (Analog pin)
R/W <= > GND
E <= > A1
D4 <= > A2
D5 <= > A3
D6 <= > A4
D7 <= > A5
LED+ <= > VCC
LED- <= > GND

Код проекта

Загрузите на плату Ардуино следующий скетч:

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
//long   lat,lon; // create variable for latitude and longitude object
float lat = 28.5458,lon = 77.1703; // create variable for latitude and longitude object 
SoftwareSerial gpsSerial(3,4);//rx,tx
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);
TinyGPS gps; // create gps object
void setup(){
Serial.begin(9600); // connect serial
//Serial.println("The GPS Received Signal:");
gpsSerial.begin(9600); // connect gps sensor
lcd.begin(16,2);
}
 
void loop(){
    while(gpsSerial.available()){ // check for gps data
    if(gps.encode(gpsSerial.read()))// encode gps data
    { 
    gps.f_get_position(&lat,&lon); // get latitude and longitude
    // display position
    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);
  
}

Статьи # #