Детальная инструкция по подключению, программированию и отладке GPS NEO-8M, позволяющая реализовать различные геолокационные проекты.
Код
# -*- coding: utf-8 -*-
import serial
import pynmea2
# Настройка последовательного порта
ser = serial.Serial('/dev/serial0', 9600, timeout=1)
try:
while True:
# Чтение данных с GPS модуля
line = ser.readline().decode('ascii', errors='replace')
if line.startswith('$GNGGA'): # Ищем строки NMEA, начинающиеся с $GNGGA
try:
msg = pynmea2.parse(line)
print(f"Время: {msg.timestamp}")
print(f"Широта: {msg.latitude} {msg.lat_dir}")
print(f"Долгота: {msg.longitude} {msg.lon_dir}")
print(f"Высота: {msg.altitude} {msg.altitude_units}")
print(f"Количество спутников: {msg.num_sats}")
print("------------------------")
except pynmea2.ParseError:
pass
except KeyboardInterrupt:
print("Программа остановлена пользователем")
finally:
ser.close()
Установка библиотек
Установим pyserial
и pynmea2
:
pip install pyserial pynmea2
Импорт библиотек
Мы импортируем serial
для работы с последовательным портом и pynmea2
для парсинга NMEA-сообщений.
Настройка последовательного порта
ser = serial.Serial('/dev/serial0', 9600, timeout=1)
Здесь мы настраиваем соединение с GPS-модулем через последовательный порт /dev/serial0
со скоростью 9600 бод.
Основной цикл
Скрипт постоянно читает данные с GPS-модуля в бесконечном цикле.
Фильтрация NMEA-сообщений
if line.startswith('$GNGGA'):
Мы ищем сообщения типа GGA (Global Positioning System Fix Data), которые содержат основную информацию о местоположении.
Парсинг данных
Используя pynmea2.parse()
, мы извлекаем нужную информацию из NMEA-сообщения.
Решение проблем
Как включить последовательный порт?
Чтобы включить последовательный порт, введем в консоли
sudo raspi-config
выберем Interface Options
перейдем в Serial Port
будут заданы два вопроса:
1. Would you like a login shell to be accessible over serial? — No
2. Would you like the serial port hardware to be enabled? — Yes
Эти настройки отключат консоль на последовательном порту (что освободит его для использования с GPS), но оставят сам порт включенным для использования.
- Would you like a login shell to be accessible over serial?:
- Если выбрать
Yes
: Вы сможете войти в систему Raspberry Pi через последовательный порт, как если бы вы использовали обычный экран и клавиатуру. - Если выбрать
No
: Консоль будет отключена, и последовательный порт будет свободен для использования другими устройствами, такими как GPS-модуль. Но это не повлияет на возможность использования консоли через другие методы, например, по SSH.
- Если выбрать
- Would you like the serial port hardware to be enabled?:
- Этот вопрос касается активации аппаратного интерфейса последовательного порта. Выбор
Yes
включает сам порт, позволяя вам использовать его для передачи данных.
- Этот вопрос касается активации аппаратного интерфейса последовательного порта. Выбор
Как узнать ID последовательного порта NEO 8M?
Чтобы получить список всех последовательных устройств, введем
ls -l /dev/serial*
Чтобы узнать, к какому порту подключен GPS-модуль введем в терминале команду
ls /dev/tty*
Модуль не подключается к спутникам
Проверка сырых данных
Посмотрим на сырые данные, которые приходят с GPS-модуля. Изменим скрипт, чтобы он выводил все строки, а не только $GNGGA
# -*- coding: utf-8 -*-
import serial
import time
ser = serial.Serial('/dev/serial0', 9600, timeout=1)
try:
while True:
line = ser.readline().decode('ascii', errors='replace').strip()
if line:
print(line)
time.sleep(0.1)
except KeyboardInterrupt:
print("Программа остановлена пользователем")
finally:
ser.close()
Если данные выводятся, то модуль работает 🙂
Расположение антенны
Убедитесь, что GPS-антенна находится в месте с хорошим обзором неба. Идеально — на открытом воздухе или у окна.
Время до первого определения местоположения (TTFF — Time To First Fix)
GPS-модулям может потребоваться до 15-30 минут для первого определения местоположения, особенно если они долго не использовались или были перемещены на большое расстояние. Оставьте модуль включенным на открытом пространстве на 30 минут и посмотрите, изменятся ли данные.
Проверка подключения
Перепроверьте подключение TX и RX пинов. Убедитесь, что TX GPS модуля подключен к RX Raspberry Pi, а RX модуля – к TX Raspberry Pi.
Количество спутников
Обычно для 2Д-фиксации (широта и долгота) требуется минимум 3 спутника, а для 3Д-фиксации (включая высоту) — минимум 4. Однако для надежного определения местоположения лучше иметь больше спутников.
Мой модуль показал координаты и высоту, когда я переместил его на подоконник. Время до первого обнаружения — 20 минут. Количество спутников — 5.
Полный код
Полный код доступен в репозитории на Гитхабе.