Оглавление:

Система GPS: 7 шагов
Система GPS: 7 шагов

Видео: Система GPS: 7 шагов

Видео: Система GPS: 7 шагов
Видео: Как включить GPS на часах Garmin | Как работает GPS | Настройка GPS 2024, Октября
Anonim
Система GPS
Система GPS
Система GPS
Система GPS
Система GPS
Система GPS

Создатель проекта: Карлос Гомес

Наличие надежной навигационной системы имеет первостепенное значение для каждого, кто пытается путешествовать и исследовать мир.

Наиболее важным аспектом, позволяющим работать навигационной системе, является встроенная в систему возможность 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-модуль к Raspberry Pi
Подключите GPS-модуль к Raspberry Pi
Подключите GPS-модуль к Raspberry Pi
Подключите 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
Получение данных от модуля приемника 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

Подключите дисплей к Raspberry Pi
Подключите дисплей к Raspberry Pi
Подключите дисплей к Raspberry Pi
Подключите дисплей к 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

Настройка дисплея для работы с Raspberry Pi
Настройка дисплея для работы с 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 на дисплее

Настройка конечных автоматов для отображения информации GPS на дисплее
Настройка конечных автоматов для отображения информации GPS на дисплее
Настройка конечных автоматов для отображения информации GPS на дисплее
Настройка конечных автоматов для отображения информации GPS на дисплее
Настройка конечных автоматов для отображения информации GPS на дисплее
Настройка конечных автоматов для отображения информации 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 ')

Приведенный выше код - всего лишь один пример того, как кодировать нашу систему, и я встроил видео о том, как эта система работает.

Рекомендуемые: