GPS NEO-8M: подключение к Raspberry Pi

Подключение GPS NEO-8M к Raspberry Pi

Детальная инструкция по подключению, программированию и отладке GPS NEO-8M, позволяющая реализовать различные геолокационные проекты.

Схема подключения NEO-8M к Raspberry Pi
Схема подключения NEO-8M к Raspberry Pi

Код

Python
# -*- 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:

Bash
pip install pyserial pynmea2

Импорт библиотек

Мы импортируем serial для работы с последовательным портом и pynmea2 для парсинга NMEA-сообщений.

Настройка последовательного порта

Python
ser = serial.Serial('/dev/serial0', 9600, timeout=1)

Здесь мы настраиваем соединение с GPS-модулем через последовательный порт /dev/serial0 со скоростью 9600 бод.

Основной цикл

Скрипт постоянно читает данные с GPS-модуля в бесконечном цикле.

Фильтрация NMEA-сообщений

Python
if line.startswith('$GNGGA'):

Мы ищем сообщения типа GGA (Global Positioning System Fix Data), которые содержат основную информацию о местоположении.

Парсинг данных

Используя pynmea2.parse(), мы извлекаем нужную информацию из NMEA-сообщения.

Решение проблем

Как включить последовательный порт?

Чтобы включить последовательный порт, введем в консоли

Bash
sudo raspi-config

выберем Interface Options

interface options raspberry pi
Interface Options Raspberry Pi

перейдем в Serial Port

Serial Port Raspberry Pi
Serial Port Raspberry Pi

будут заданы два вопроса:

1. Would you like a login shell to be accessible over serial?No

Would you like a login shell to be accessible over serial
Would you like a login shell to be accessible over serial

2. Would you like the serial port hardware to be enabled? Yes

Would you like the serial port hardware to be enabled
Would you like the serial port hardware to be enabled

Эти настройки отключат консоль на последовательном порту (что освободит его для использования с GPS), но оставят сам порт включенным для использования.


  1. Would you like a login shell to be accessible over serial?:
    • Если выбрать Yes: Вы сможете войти в систему Raspberry Pi через последовательный порт, как если бы вы использовали обычный экран и клавиатуру.
    • Если выбрать No: Консоль будет отключена, и последовательный порт будет свободен для использования другими устройствами, такими как GPS-модуль. Но это не повлияет на возможность использования консоли через другие методы, например, по SSH.
  2. Would you like the serial port hardware to be enabled?:
    • Этот вопрос касается активации аппаратного интерфейса последовательного порта. Выбор Yes включает сам порт, позволяя вам использовать его для передачи данных.

Как узнать ID последовательного порта NEO 8M?

Чтобы получить список всех последовательных устройств, введем

Bash
ls -l /dev/serial*
Список всех последовательных устройств
Список всех последовательных устройств

Чтобы узнать, к какому порту подключен GPS-модуль введем в терминале команду

Bash
ls /dev/tty*
Последовательный порт NEO 8M
Последовательный порт NEO 8M

Модуль не подключается к спутникам

Проверка сырых данных

Посмотрим на сырые данные, которые приходят с GPS-модуля. Изменим скрипт, чтобы он выводил все строки, а не только $GNGGA

Python
# -*- 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.

Полный код

Полный код доступен в репозитории на Гитхабе.