Оглавление:
- Шаг 1. Начало работы
- Шаг 2: подключите модуль GPS к Raspberry Pi
- Шаг 3: Получите данные от модуля приемника GPS
- Шаг 4. Подключите дисплей к Raspberry Pi
- Шаг 5: Настройте дисплей для работы с Raspberry Pi
- Шаг 6: Настройте конечные автоматы для отображения информации GPS на дисплее
- Шаг 7: Давайте внедрим нашу систему GPS
Видео: Система GPS: 7 шагов
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-10 13:48
Создатель проекта: Карлос Гомес
Наличие надежной навигационной системы имеет первостепенное значение для каждого, кто пытается путешествовать и исследовать мир.
Наиболее важным аспектом, позволяющим работать навигационной системе, является встроенная в систему возможность GPS. Система GPS позволяет любому человеку отслеживать свое местоположение и скорость, чтобы отображать точную информацию о пользователе и давать пользователю точное представление о том, где он находится и как далеко от своего местоположения.
Глобальная система позиционирования (GPS) - это сеть спутников, вращающихся вокруг Земли на высоте около 20 000 км. Любой, у кого есть устройство GPS, может принимать радиосигналы, передаваемые со спутников, и может использовать их любым способом. Где бы вы ни находились на планете, вам должны быть доступны как минимум четыре GPS в любое время. Используя метод, называемый трехмерной трилатерацией, устройство GPS может использовать три спутника для определения местоположения устройства на Земле. Каждый из трех спутников отправляет сигнал на устройство, и устройство определяет его расстояние от спутника. Используя каждое из трех вычислений расстояния, устройство теперь может точно определить свое местоположение на Земле и возвращает его пользователю.
Система GPS, которую мы создадим, сможет отслеживать местоположение пользователя, получая координаты пользователя на Земле и выполняя некоторые вычисления, чтобы вернуть скорость пользователя, его местоположение и пройденное расстояние.
Шаг 1. Начало работы
Чтобы начать этот проект, нам сначала нужно собрать все необходимые материалы.
1: Raspberry Pi Zero W
2: GPS-приемник
3: 1,8 TFT 128 x 160 ЖК-экран SPI
4: ~ 11 проводов
5: 2 кнопки
6: 2 резистора 1 кОм и 2 резистора 10 кОм для кнопок pull down
7: Хлебная доска
В этом проекте будут использоваться контакты GPIO Raspberry Pi, и поэтому нам нужно будет соединить все с макетной платой, чтобы разработать наш проект. Также предполагается, что пайка на всех контактах сделана и закончена, прежде чем двигаться дальше и соединять все наши части.
Шаг 2: подключите модуль GPS к Raspberry Pi
Для использования нашей системы GPS вам необходимо подключить контакты Tx и Rx модуля GPS к контактам 14 и 15 GPIO на Raspberry Pi. Контакт Tx приемника GPS подключается к контакту Rx Pi, а контакт Rx приемника GPS идет к контакту Tx Raspberry pi.
Приемник GPS, показанный на изображениях, требует использования 3,3 В, и вы можете подключить контакты 3,3 В к правильному напряжению, подключив контакт заземления к земле.
Шаг 3: Получите данные от модуля приемника GPS
Чтобы получать данные от GPS-приемника на Raspberry Pi, нам нужно разрешить правильным сокетам читать из портов UART. Чтение необработанных данных потребует от нас создания нашей собственной библиотеки синтаксического анализа, но в этом сценарии мы можем воспользоваться преимуществом демона GPS, который работает в фоновом режиме, чтобы помочь использовать синтаксический анализ данных и передать их на Raspberry Pi.
Для этого мы можем открыть терминал на Raspberry Pi и выполнить код:
sudo apt-get update
sudo apt-get install gpsd gpsd-clients python-gps
Это должно позаботиться о загрузке для нас.
По завершении нам нужно отключить системную службу gpsd, выполнив следующие команды:
sudo systemctl stop gpsd.socket
sudo systemctl отключить gpsd.socket
Если вы когда-нибудь захотите включить системную службу gpsd по умолчанию, вы можете выполнить следующие команды, чтобы восстановить ее:
sudo systemctl включить gpsd.socket
sudo systemctl start gpsd.socket
Теперь нам нужно запустить демон gpsd и указать его на порты UART, введя
sudo gpsd / dev / ttyAMA0 -F /var/run/gpsd.sock
Теперь мы можем запустить команду ниже и увидеть все плавающие данные!
cgps -s
Шаг 4. Подключите дисплей к Raspberry Pi
После того, как наш GPS-приемник включен и работает с Raspberry Pi, мы можем подключить дисплей к Raspberry Pi. Мы будем использовать 5 проводов для подключения нашего ЖК-дисплея к Raspberry Pi и еще 4 контакта для подключения основного питания и светодиода. на экране.
Я включил фотографию используемого мною TFT-экрана, но он должен работать с экранами аналогичного размера и конструкции.
Подключите LED- и GND к земле и подключите LED + и VCC к 3,3 В.
Подключите контакт RESET на экране к контакту 25 на плате Pi.
Подключите A0 к контакту 24 на плате Pi.
Подключите вывод SDA к выводу MOSI на плате Pi.
Подключите контакт SCK на ЖК-экране к плате Pi.
Подключите вывод CS к выводу 8 на плате Pi.
Шаг 5: Настройте дисплей для работы с Raspberry Pi
Чтобы настроить отображение, нам нужно использовать библиотеку ST7735, найденную в этом репо:
Библиотека экранов Python ST7735
После того, как мы установили эту библиотеку дисплея в нашу систему Raspberry Pi, мы можем приступить к настройке файла примера, чтобы убедиться, что наша предыдущая проводка работает правильно.
Создайте файл с названием example.py и вставьте туда следующий текст вместе с образцом изображения по вашему выбору в той же папке.
импортировать ST7735 как TFT; импортировать Adafruit_GPIO как GPIO; импортировать Adafruit_GPIO. SPI как SPI.
ШИРИНА = 128
ВЫСОТА = 160 СКОРОСТЬ_ГЦ = 4000000
# Конфигурация Raspberry Pi.
# Это контакты, необходимые для подключения ЖК-дисплея к Raspberry Pi.
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Создать класс ЖК-дисплея TFT.
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Инициализировать дисплей.
disp.begin () disp.reset ()
# Загрузить изображение.
newData = 0x42 disp.command (newData) print ('Загрузка изображения …') image = Image.open ('cat.jpg')
# Измените размер изображения и поверните его так, чтобы оно соответствовало отображению.
image = image.rotate (270).resize ((ШИРИНА, ВЫСОТА))
# Напечатает на терминал, что наша программа рисует изображение на экране
print ('Рисование изображения')
# Эта функция выведет наше изображение на экран
disp.display (изображение)
Этот файл настроит конфигурацию Raspberry Pi для ЖК-экрана, а библиотека преобразует наше изображение в папке и отобразит его на экране.
Шаг 6: Настройте конечные автоматы для отображения информации GPS на дисплее
Мы будем использовать 5 различных конечных автоматов при реализации нашей диаграммы задач для настройки нашей системы GPS.
Отображение конечного автомата изменения:
Этот конечный автомат будет управлять отображением в зависимости от нажатия кнопки. Он делает это, изменяя переменную, которая позволяет python использовать преимущества утиной печати и вызывает правильную функцию для отображения в зависимости от вызываемой функции.
Конечный автомат скорости:
Этот конечный автомат будет выполнять текущую скорость в зависимости от местоположения людей. Это будет выполняться каждый тактовый цикл для системы GPS.
Конечный автомат вывода:
Этот конечный автомат будет определять вывод на основе переменной, которую конечный автомат изменения отображения определяет как текущее отображение.
Дистанционный конечный автомат
Этот конечный автомат выполняет каждый тактовый цикл и определяет общее расстояние, пройденное пользователем, и после нажатия кнопки сброса сбрасывает текущее пройденное расстояние.
Конечный автомат местоположения:
Этот конечный автомат возвращает текущее местоположение пользователя, используя координаты, которые модуль GPS возвращает о пользователе. Этот конечный автомат зависит от подключения пользователя к Интернету.
Шаг 7: Давайте внедрим нашу систему GPS
Как только у нас есть модуль GPS, отправляющий информацию на Raspberry Pi и наш ЖК-экран, отображающий информацию на нем, мы можем начать программировать нашу систему GPS. Я буду использовать конечные автоматы предыдущего шага, чтобы закодировать нашу систему GPS.
## Главный файл для системы навигации # # # #
# Библиотеки для рисования изображений
из PIL импортировать изображение из PIL импортировать ImageDraw из PIL импортировать ImageFont
# Библиотека для контроллера ST7737
импортировать ST7735 как TFT
# Библиотека для GPIO для Raspberry Pi
импортировать Adafruit_GPIO как GPIO импортировать Adafruit_GPIO. SPI как SPI
# Библиотека для GPS
#import gpsd from gps3 import gps3
# Библиотека времени
время импорта
# Библиотека для определения расстояния между двумя точками
из математического импорта sin, cos, sqrt, atan2, радианы
# Импортировать библиотеку Rpi, чтобы использовать кнопки для переключения меню и сброса
# импортировать RPi. GPIO как bGPIO
# Настройка пинов для кнопок
bGPIO.setmode (bGPIO. BCM)
bGPIO.setup (18, bGPIO. IN, pull_up_down = bGPIO. PUD_DOWN)
bGPIO.setup (23, bGPIO. IN, pull_up_down = bGPIO. PUD_DOWN)
# import geopy library for Geocoding
# # Для работы необходим доступ в Интернет
из geopy.geocoders import Nominatim
geolocator = Nominatim ()
# Константы для системы
#################################
ШИРИНА = 128
ВЫСОТА = 160 СКОРОСТЬ_ГЦ = 4000000
# Контакты конфигурации Raspberry Pi
DC = 24 # A0 на экране TFT RST = 25 # Сброс вывода на экране TFT SPI_PORT = 0 # Порт SPI на raspberry pi, SPI0 SPI_DEVICE = 0 # Выбор ведомого устройства на rapsberry pi, CE0
# Создать объект дисплея TFT LCD
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Инициализировать дисплей
disp.begin ()
# Фон будет зеленым
# disp.clear ((0, 255, 0))
# Очистить экран до белого и отобразить
# disp.clear ((255, 255, 255)) draw = disp.draw () # draw.rectangle ((0, 10, 127, 150), контур = (255, 0, 0), fill = (0, 0, 255)) # disp.display ()
# Переменные размещения скорости, широты и долготы
#currentS = "Текущая скорость:" # Строка скорости #totalDis = "Общее расстояние:" # Строка расстояния #currentLoc = "Текущее местоположение:" # Строка местоположения
# Расстояние x и координаты y
distX = 10 distY = 20
pointsList =
# Скорость по координатам x и y
скорость X = 10 скорость Y = 20
# Расположение координат x и y
locX = 10 locY = 20
# Преобразует из м / с в миль / ч
конверсияVal = 2,24
# Функция обновления скорости, возвращает строку
SpeedVar = 0
def speedFunc (): global SpeedVar SpeedText = data_stream. TPV ['скорость'] if (SpeedText! = "n / a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = round (SpeedText, 1) # return (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
location = geolocator.reverse (reverseString)
возврат (location.address)
# Функция обновления широты, возвращает значение с плавающей запятой
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n / a"): return 0 else: return float (round (Latitude, 4))
# Функция обновления долготы, возвращает строку
def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n / a"): return 0 else: return float (round (Longitude, 4))
# Функция Distance возвращает ОБЩЕЕ пройденное расстояние
totalDistance = 0
def distFunc ():
global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 или newLon == 0): totalDistance = totalDistance # return (totalDistance) else: pointsList.append ((newLat, newLon)) last = len (pointsList) -1 if (last == 0): return else: totalDistance + = coorDistance (pointsList [last-1], pointsList [last]) # return totalDistance
# Сбрасывает общее расстояние
def resDistance ():
global totalDistance totalDistance = 0
# Функция, используемая для определения расстояния между двумя координатами
# для поиска использует формулу Хаверсина. # Входные точки представляют собой кортеж
def coorDistance (точка1, точка2):
# Приблизительный радиус Земли в километрах earthRadius = 6373,0
lat1 = point1 [0]
lon1 = point1 [1]
lat2 = point2 [0]
lon2 = point2 [1]
distanceLon = lon2 - lon1
distanceLat = lat2 - lat1
# Хаверсин а
a = sin (distanceLat / 2) ** 2 + cos (lat1) * cos (lat2) * sin (distanceLon / 2) ** 2
# Хаверсин c
c = 2 * atan2 (sqrt (a), sqrt (1-a))
# Преобразовать км в мили
расстояние = (радиус земли * c) * 0,62137
if (distance <= 0.01): return 0.00 else: return round (distance, 3)
# Функция отображения скорости на экране
def dispSpeed ():
global SpeedVar # Поместите расстояние в переменную на экране draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Функция отображения расстояния на экране
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Функция отображения местоположения на экране, для работы требуется интернет
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Использование словаря для имитации операторов переключения
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Функция вывода на экран
def output ():
# Использование глобальной переменной для displayIndex global displayIndex # Очистка экрана и применение фона disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (255, 0, 0))
# Вызывает функцию в зависимости от значения displayIndex
dispOptions [displayIndex] ()
# Удалится, если работает другой метод
# разместить переменную расстояния на экране
# draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) # поместите переменную скорости на экран # draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Показать обновления экрана disp.display ()
displayButton = 18 # BCM Пин на Raspberry Pi
resetButton = 23 # BCM Пин на Raspberry Pi
buttonPress = Ложь
def checkDisplay ():
global buttonPress global displayIndex if (bGPIO.input (displayButton), а не buttonPress): displayIndex + = 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) and buttonPress): print (" Все еще нажата ") else: buttonPress = False
# Настройка gps
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
timerPeriod =.5
# Значение индекса для отображения displayIndex = 0 try: for new_data in gps_socket: if new_data: data_stream.unpack (new_data) if data_stream. TPV ['lat']! = 'N / a': print (data_stream. TPV ['speed'], data_stream. TPV ['lat'], data_stream. TPV ['lon']) distFunc () speedFunc () output () checkDisplay () if (bGPIO.input (resetButton)): resDistance () else: output () checkDisplay () if (bGPIO.input (resetButton)): resDistance () print ('GPS еще не подключен') time.sleep (.1) time.sleep (.8) except KeyboardInterrupt: gps_socket.close () print (' / nЗавершено пользователем ctrl + c ')
Приведенный выше код - всего лишь один пример того, как кодировать нашу систему, и я встроил видео о том, как эта система работает.