Подключение GPS модуля к микроконтроллеру AVR ATmega16/32


GPS модули широко используются в современной электронике для определения местоположения, основываясь на координатах долготы и широты. Системы мониторинга транспортных средств, часы GPS, системы предупреждения о чрезвычайных происшествиях, системы наблюдения – это лишь небольшой список приложений, в которых может потребоваться технология GPS. Система GPS обеспечивает информацию о высоте, долготе, широте, реальном времени и ряд другой информации о местоположении, которая берется с нескольких спутников. В данной статье мы рассмотрим подключение GPS модуля к микроконтроллеру AVR, с помощью которого мы будем считывать информацию из данного модуля (широту и долготу) и отображать ее на жидкокристаллическом (ЖК) дисплее 16x2.

Подключение GPS модуля к микроконтроллеру AVR ATmega16/32: внешний вид конструкции

Необходимые компоненты

  1. Микроконтроллер ATmega16/32 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. GPS модуль (uBlox Neo 6M GPS (или 7M) (купить на AliExpress).
  4. ЖК дисплей 16x2 (купить на AliExpress).
  5. Антенна типа "длинный провод".
  6. Резисторы 2,2 кОм, 1 кОм (купить на AliExpress).
  7. Конденсатор 1000 мкФ (купить на AliExpress).
  8. Конденсатор 10 мкФ (купить на AliExpress).
  9. Преобразователь напряжения LM7805 (купить на AliExpress).
  10. DC Jack.
  11. Адаптер 12 В.
  12. Макетная плата.
  13. Соединительные провода.
  14. Burgstips (соединительные колодки).

Получение данных местоположения от GPS модуля

Ublox Neo 6M представляет собой последовательный GPS модуль, который передает детали местоположения через последовательный порт. Он имеет 4 контакта, назначение которых представлено в следующей таблице.

Контакт Описание
Vcc 2.7 – 5V питающее напряжение
Gnd земля
TXD передача данных
RXD прием данных

Его внешний вид представлен на следующем рисунке.

Внешний вид GPS модуля Ublox Neo 6M

GPS модуль Ublox neo 6M является TTL совместимым и его спецификация представлена в следующей таблице.

Время захвата холодный старт - 27 сек., горячий старт - 1 сек.
Протокол связи NMEA
Последовательная связь 9600 бод/с , 8 бит данных , 1 стоповый бит , нет контроля четности и управления потоком
Потребляемый ток 45 мА

GPS модуль будет передавать данные в виде последовательности строк на скорости 9600 бод/с. Если мы будем использовать последовательный терминал (UART) на скорости 9600 бод/с мы сможем принимать данные от GPS модуля.

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

• $GPGGA: фиксированные данные глобального позиционирования;
• $GPGSV: спутники GPS в зоне видимости;
• $GPGSA: GPS DOP и активные спутники;
• $GPRMC: минимум специфических данных GPS/транзитных данных.

Пример данных, передаваемых GPS модулем на скорости 9600 бод/с, выглядит следующим образом:

$GPRMC,141848.00,A,2237.63306,N,08820.86316,E,0.553,,100418,,,A*73
$GPVTG,,T,,M,0.553,N,1.024,K,A*27
$GPGGA,141848.00,2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2, M,,*74
$GPGSA,A,2,06,02,05,,,,,,,,,,2.75,2.56,1.00*02
$GPGSV,1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324,*76
$GPGLL,2237.63306,N,08820.86316,E,141848.00,A,A*65

Когда мы используем GPS модуль для определения местоположения нам из всего этого набора данных будут нужны только координаты, поэтому из представленных данных нам будет нужна только строка $GPGGA, в которой содержатся фиксированные данные системы глобального позиционирования (Global Positioning System Fix Data):

$GPGGA,141848.00,2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2,M,,*74

Расшифровка данной строки (данных глобального позиционирования):

  1. Строка всегда начинается со знака “$”.
  2. Аббревиатура GPGGA означает фиксированные данные системы глобального позиционирования.
  3. “,” означает разделение между двумя значениями.
  4. 141848.00: всемирное время по Гринвичу 14(hr):18(min):48(sec):00(ms).
  5. 2237.63306,N: Широта (Latitude) 22(градуса) 37(минут) 63306(секунд) North (Север).
  6. 08820.86316,E: Долгота (Longitude) 088(градуса) 20(минут) 86316(секунд) East (Восток).
  7. 1 : Fix Quantity (Фиксированное количество) 0= неправильные данные, 1= достоверные данные, 2=DGPS fix.
  8. 03 : число спутников, которые мы в данный момент видим.
  9. 1.0: HDOP.
  10. 2.56,M : высота над уровнем моря (в метрах).
  11. 1.9,M : Geoids height (геоидная высота).
  12. *74 : контрольная сумма.

То есть, фактически, нам будут необходимы только п.5 и п.6 из представленных данных чтобы получить информацию о местоположении модуля.

Схема устройства

Схема устройства приведена на следующем рисунке.

Схема подключения GPS модуля к микроконтроллеру AVR ATmega16/32

Устройство запитывается от адаптера на 12В постоянного тока, но, поскольку схема работает от напряжения 5В, то в схеме присутствует регулятор напряжения LM7805. ЖК дисплей 16x2 сконфигурирован для работы в 4-битном режиме. GPS модуль также запитывается от напряжения 5В и его вывод передачи (tx pin) напрямую подсоединен к приемному выводу (Rx) микроконтроллера Atmega. Для задания тактовой частоты микроконтроллера используется кварцевый генератор на 8 МГц.

Подача питающего напряжения и подключение антенны

Последовательность действий по подключению GPS модуля к микроконтроллеру AVR

  1. Установить конфигурацию микроконтроллера, включая установку тактовой частоты.
  2. Установить необходимый для подключения ЖК дисплея порт.
  3. Подсоединить GPS модуль к микроконтроллеру используя USART (универсальный синхронно-асинхронный приемопередатчик).
  4. Инициализировать систему UART в режиме ISR (Interrupt Service Routine - процедура обработки прерывания), со скоростью 9600 бод/с и ЖК дисплеем в 4-битном режиме.
  5. Задать в программе 2 символьных массива, в которые будем сохранять широту и долготу.
  6. Принимать по одному символу в каждый момент времени и проверять является ли символ $ или нет.
  7. Если мы приняли $ (нашли его в составе принимаемой строки символов) нам необходимо проверить $GPGGA, то есть эти 6 букв, включая и символ $.
  8. Если это действительно GPGGA, то принимаем всю эту строку и устанавливаем необходимые флаги.
  9. Извлекаем из этой строки широту и долготу и записываем их в наши массивы.
  10. Выводим значения этих массивов на экран ЖК дисплея.

Пример работы схемы

Объяснение кода программы

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

В начале подключим необходимые заголовки и запишем макросы для поразрядной маски для ЖК дисплея и конфигурирования последовательного порта (UART).

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

Запрограммируем ряд функций для работы с ЖК дисплеем.

После этого инициализируем последовательную связь с GPS модулем и сравним принимаемую строку с "GPGGA".

Теперь, если мы успешно нашли строку, содержащую GPGGA, то в основной функции (main) извлечем и отобразим на экране ЖК дисплея координаты широты и долготы нашего местоположения.

Программа получилась немного сложноватой, но если для аналогичной задачи использовать плату Arduino, то работа с с GPS модулем значительно упростится:

Полный текст программы на языке С (Си)

В этом разделе статьи приведен полный текст программы, позволяющий произвести подключение GPS модуля к микроконтроллеру AVR ATmega16/32, извлечения из него координат широты и долготы и их отображения на экране ЖК дисплея.

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
6 168 просмотров

Комментарии

Подключение GPS модуля к микроконтроллеру AVR ATmega16/32 — 13 комментариев

  1. Здравствуйте!Помогите пожалуйста собрать устройство на основе сравнения GPS координаты с координатой из списка и выдачи сигнала при нахождении в предустановленном радиусе.ПРинимаю любые советы. Моё мыло sergonijсобакаgmail.com. Спасибо!

  2. Здравствуйте,у меня вопрос по программированию МК в Atmel studio.
    Вопрос такой:интересует алгоритм написания функции для МК AVR 32,
    отправка показаний датчика через GSM модуль (SIM800C) по СМС на мобильник,
    например:напряжение с АЦП(зарядное для акб.),
    или запрос с мобильного баланса GSM модуля,
    есть функция отправки смс с заранее написанными смс,
    не могу понять как переделать функцию ,чтобы отправлять по смс ,
    постоянно меняющиеся данные с датчика или запрос о балансе,
    вот функция USART
    void USART_SendString(char *str) /* Отправить строку функции данных USART */
    {
    int i=0;
    while (str[i]!=0)
    {
    USART_TxChar(str[i]); /* Отправить каждый символ строки до NULL */
    i++;
    }
    }

    вот функция отправки смс:
    void GSM_Send_Msg(char *num,char *sms)
    {
    char sms_buffer[35];
    buffer_pointer=0;
    sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
    USART_SendString(sms_buffer); //*отправить команду AT+CMGS="Mobile No."\r */

    while(1)
    {
    if(buff[buffer_pointer]==0x3e) //*ждать символа '>'*/
    {
    LCD_String_xy(1,0,"OTPRAVL1");
    _delay_ms(3000);
    LCD_Clear();
    buffer_pointer = 0;
    memset(buff,0,strlen(buff));
    USART_SendString(sms); //* отправить сообщение на указанный nom. */
    USART_TxChar(26);
    USART_TxChar(0); //* отправьте Ctrl + Z, тогда будет передаваться только сообщение*/
    break;
    }
    buffer_pointer++;
    }

    buffer_pointer = 0;
    memset(buff,0,strlen(buff));
    memset(sms_buffer,0,strlen(sms_buffer));
    }

    если не трудно объясните,что нужно дописать,
    или скиньте ссылку на эту тему.

  3. В коде программы какое исходное (начальное) значение у регистров PORTB и DDRB?

    • В функции int main() первой строкой идет команда "LCDPORTDIR=0xFF;", в соответствии с определенным в начале программы макросом "#define LCDPORTDIR DDRB" получаем что начальное значение DDRB=0xFF. Затем в функции int main() происходит вызов функции lcdbegin(), внутри которой вызывается функция lcdwrite, в которой первой строкой идет команда LCDPORT=ch & 0xF0, а в соответствии с ранее определенным макросом "#define LCDPORT PORTB" получаем что начальное значение PORTB=ch & 0xF0. К сожалению, программа написана достаточно сложновато, но поскольку она не моя, то я в нее никаких изменений не вносил. Значительно более просто о работе микроконтроллера AVR с ЖК дисплеем можно прочитать в этой статье.

  4. "Но я стараюсь разбираться во всех статьях которые перевожу"
    Тогда вопрос к автору статьи, вы этот проект собирали?
    В Студии этот исходник не компилируется. Есть функции в программе, которые просто не заявлены.
    Но, все поддается лечению "ломать, не строить".

    • Нет, я этот проект лично не собирал. У меня, пока, к сожалению не хватает времени чтобы их собирать, я пока успеваю только переводить статьи. Но в том, что подключить GPS модуль к микроконтроллеру можно - я уверен. Авторы программы - индусы, они могли использовать не студию, а другое программное обеспечение - поэтому она может в студии не компилироваться. Либо же в тексте программы могла закрасться небольшая опечатка.
      Цель моего сайта - не дать готовые решения, а научить посетителей сайта их делать самим,чтобы они разобрались и сами могли потом видоизменять программу под те возможности, которые им нужны. Поэтому каждый проект на сайте снабжен достаточно подробным объяснением. Если у вас есть конкретные вопросы по тексту статьи или программы, с радостью отвечу на них.

    • Спасибо и вам что оценили мой труд. Если у вас получится сделать эту конструкцию и запустить ее в работу буду признателен если поделитесь ценными советами относительно ее создания - ведь всегда при написании статьи "что то остается за кадром". Готов даже опубликовать ваш мини-очерк о создании этого устройства в конце статьи с вашими фотографиями.

      В будущем я и сам хочу попробовать реализовывать те статьи, которые я перевожу, в "железе", но пока, к сожалению, не хватает времени заняться этим

  5. Вы написали "В этом проекте мы будем использовать GPS библиотеку, в которой есть функции для извлечения широты и долготы из данных GPS модуля, поэтому нам не придется программировать это вручную."
    Но где подключение этой библиотеки ? Похоже, что Вы запрограммировали все вручную.
    Если код писался в Code Vision , то хотелось бы ясно понять где самостоятельно написанный код, а где "творчество" CodeVision

    • Добрый вечер. Спасибо что нашли опечатку, библиотека действительно не использовалась, автор статьи совершил опечатку (видимо он скопировал это предложение из похожей статьи на Arduino), а я не заметил это при переводе. К сожалению, программа не моя - не люблю присваивать себе чужой труд. Статья переведена с иностранного сайта, ее оригинал - https://circuitdigest.com/microcontroller-projects/gps-module-interfacing-with-atmega16-32-avr-microcontroller.
      Но я стараюсь разбираться во всех статьях которые перевожу, поэтому если есть вопросы могу попробовать ответить на них.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *