Съдържание:

GPS система: 7 стъпки
GPS система: 7 стъпки

Видео: GPS система: 7 стъпки

Видео: GPS система: 7 стъпки
Видео: БЕСПЛАТНЫЙ, САМЫЙ ТОЧНЫЙ НАВИГАТОР ДЛЯ ЛЕСА, ОХОТЫ, РЫБАЛКИ. РАБОТАЕТ БЕЗ ИНТЕРНЕТА.#GPS#НАВИГАТОР 2024, Октомври
Anonim
GPS система
GPS система
GPS система
GPS система
GPS система
GPS система

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

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

Най -важният аспект, който позволява на навигационната система да работи, е възможността за GPS, вградена в системата. GPS системата позволява на всеки да следи тяхното местоположение и скорост, за да покаже точна информация за потребителя и да даде на потребителя точно представяне къде се намира и колко далеч е от местоположението си.

Глобалната система за позициониране (GPS) е мрежа от спътници, обикалящи около Земята на височина около 20 000 км. Всеки с GPS устройство може да приема радиосигналите, които спътниците излъчват, и може да ги използва по който и да е начин. Където и да се намирате на планетата, най -малко четири GPS трябва да са ви на разположение по всяко време. Използвайки метод, наречен 3-D трилатерация, GPS устройството може да използва три спътника, за да определи местоположението на устройството на Земята. Всеки от трите спътника изпраща сигнал към устройството и устройството определя неговото разстояние от сателита. Използвайки всяко от трите изчисления на разстоянието, устройството вече може да определи местоположението си на Земята и го връща на потребителя.

GPS системата, която ще създадем, ще може да проследява местоположенията на потребителя, като получава координатите на потребителя на Земята и прави някои изчисления, за да върне скоростта, местоположението и изминатото разстояние на потребителя.

Стъпка 1: Първи стъпки

Приготвяме се да започнем
Приготвяме се да започнем
Приготвяме се да започнем
Приготвяме се да започнем
Приготвяме се да започнем
Приготвяме се да започнем
Приготвяме се да започнем
Приготвяме се да започнем

За да стартираме този проект, първо ще трябва да съберем всички правилни материали

1: Raspberry Pi Zero W

2: GPS приемник

3: 1.8 TFT 128 x 160 LCD SPI екран

4: ~ 11 проводника

Бутони 5: 2

6: 2x 1k и 2x 10k резистори за бутони за изтегляне

7: Дъска за хляб

Този проект ще използва GPIO пиновете на Raspberry Pi и като такъв ще трябва да свържем всичко с дъска за хляб, за да развием нашия проект. Предполага се също, че запояването на всички щифтове е извършено и завършено, преди да продължите и да свържете всички наши части.

Стъпка 2: Свържете GPS модула към Raspberry Pi

Свържете GPS модула към Raspberry Pi
Свържете GPS модула към Raspberry Pi
Свържете GPS модула към Raspberry Pi
Свържете GPS модула към Raspberry Pi

За използването на нашата GPS система ще трябва да свържете Tx и Rx щифтовете от GPS модула към GPIO пин 14 и 15 на Raspberry Pi. Tx щифтът на GPS приемника отива към Rx щифта на Pi, а Rx щифтът на GPS приемника отива към Tx щифта на Raspberry pi.

GPS приемникът, показан на изображенията, изисква 3.3V за използване и можете да свържете 3.3V щифтовете към правилното напрежение, като същевременно свържете заземяващия щифт към земята.

Стъпка 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 стартира 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 проводника за свързване на LCD дисплея към Raspberry Pi и още 4 пина за свързване на основното захранване и LED на екрана.

Включих снимка на TFT екрана, който използвам, но това трябва да работи с екрани с подобен размер и конструкция.

Свържете LED и GND към земята и свържете LED+ и VCC към 3.3V.

Свържете щифта RESET на екрана към щифт 25 на платката Pi.

Свържете A0 към щифт 24 на Pi платката.

Свържете щифта SDA към щифта MOSI на платката Pi.

Свържете SCK щифта на LCD екрана към Pi платката.

Свържете CS щифта към щифт 8 на Pi платката.

Стъпка 5: Настройте дисплея да работи с Raspberry Pi

Настройка на дисплея за работа с Raspberry Pi
Настройка на дисплея за работа с Raspberry Pi

За да настроим дисплея, трябва да използваме библиотеката ST7735, намерена в това репо:

Екранна библиотека на Python ST7735

След като инсталираме тази дисплейна библиотека в нашата система Raspberry Pi, сега можем да пристъпим към създаване на примерен файл, за да потвърдим, че предишното ни окабеляване работи правилно.

Създайте файл със заглавие example.py и вмъкнете следния текст заедно с примерно изображение по ваш избор в същата папка

импортирайте ST7735 като TFTimport Adafruit_GPIO като GPIO импортирайте Adafruit_GPIO. SPI като SPI

ШИРИНА = 128

ВИСОТА = 160 SPEED_HZ = 4000000

# Конфигурация на Raspberry Pi.

# Това са щифтовете, необходими за свързване на LCD към Raspberry Pi

DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0

# Създайте клас TFT LCD дисплей.

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 ((WIDTH, HEIGHT))

# Ще отпечата на терминала, че нашата програма рисува нашето изображение на екрана

print ('Чертежно изображение')

# Тази функция ще покаже нашето изображение на екрана

disp.display (изображение)

Този файл ще настрои конфигурацията на Raspberry Pi за LCD екрана и библиотеката ще преобразува нашето изображение в папката и ще го покаже на екрана.

Стъпка 6: Настройка на машините на състоянието за показване на GPS информация на дисплея

Настройка на машините на състоянието за показване на GPS информация на дисплея
Настройка на машините на състоянието за показване на GPS информация на дисплея
Настройка на машините на състоянието за показване на GPS информация на дисплея
Настройка на машините на състоянието за показване на GPS информация на дисплея
Настройка на машините на състоянието за показване на GPS информация на дисплея
Настройка на машините на състоянието за показване на GPS информация на дисплея

Ще използваме 5 различни състоятелни машини, докато прилагаме нашата диаграма на задачите, за да настроим нашата gps система.

Дисплей Машина за промяна на състоянието:

Тази машина на състоянието ще контролира коя да се показва в зависимост от въвеждането от нашия бутон. Това става чрез промяна на променлива, която позволява на python да се възползва от въвеждането на патици и извикване на правилната функция за показване в зависимост от извикваната функция

Машина за състояние на скоростта:

Тази машина на състоянието ще изпълнява текущата скорост в зависимост от местоположението на индивидите. Това ще изпълни всеки тактов цикъл за GPS системата

Машина за състояние на изход:

Тази машина на състоянието ще определи изхода въз основа на променливата, която машината за състоянието на промяна на дисплея определи като текущ дисплей.

Машина за състояние на разстояние

Тази машина на състоянието изпълнява всеки тактов цикъл и определя общото изминато разстояние от потребителя и след като бутонът за нулиране бъде натиснат, ще нулира текущото изминато разстояние.

Машина за състояние на местоположение:

Тази машина на състоянието връща текущото местоположение на потребителя, като използва координати, които GPS модулът връща за потребителя. Тази машина на състоянието зависи от интернет връзката на потребителите.

Стъпка 7: Нека внедрим нашата GPS система

След като имаме нашия GPS модул, изпращащ информация към нашия Raspberry Pi и нашия LCD екран, показващ информация за него, можем да започнем да програмираме нашата 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)

# импортирайте библиотека за геокопиране за геокодиране

# # Достъпът до интернет е необходим, за да работи това

от geopy.geocoders импортират Nominatim

geolocator = Nominatim ()

# Константи за системата

#################################

ШИРИНА = 128

ВИСОТА = 160 SPEED_HZ = 4000000

# Конфигурационни щифтове за Raspberry Pi

DC = 24 # A0 на TFT екрана RST = 25 # Нулиране на щифта на TFT екрана SPI_PORT = 0 # SPI порт на малиново пи, 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), outline = (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 coordiantes

locX = 10 locY = 20

# Конвертира от m/s в mph

conversionVal = 2.24

# Функция за актуализиране на скоростта, връща низ

SpeedVar = 0

def speedFunc (): глобален SpeedVar SpeedText = data_stream. TPV ['speed'] if (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = кръгъл (SpeedText, 1) # return (SpeedText)

def locationFunc ():

latLoc = str (latFunc ()) lonLoc = str (lonFunc ())

reverseString = latLoc + "," + lonLoc

location = geolocator.reverse (reverseString)

връщане (location.address)

# Функция за актуализиране на Latitude, връща плаваща стойност

def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (кръг (Latitude, 4))

# Функция за актуализиране на дължина, връща низ

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): return 0 else: return float (кръг (Longitude, 4))

# Функцията за разстояние връща TOTAL изминатото разстояние

totalDistance = 0

def distFunc ():

глобална тотална дистанция 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]) # връщане totalDistance

# Нулира общото разстояние

def resDistance ():

глобално общо разстояние общоразстояние = 0

# Функция, използвана за намиране на разстоянието между две координати

# използва формулата на Haversine за намиране. # Входните точки са кортеж

def coorDistance (точка1, точка2):

# Приблизителен радиус на Земята в километри земя Радиус = 6373,0

lat1 = точка1 [0]

lon1 = точка1 [1]

lat2 = точка2 [0]

lon2 = точка2 [1]

distanceLon = lon2 - lon1

distanceLat = lat2 - lat1

# Haversine a

a = sin (distanceLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (distanceLon/2) ** 2

# Haversine c

c = 2 * atan2 (sqrt (a), sqrt (1-a))

# Конвертирайте км в мили

разстояние = (EarthRadius * c) * 0.62137

if (разстояние <= 0.01): връщане 0.00 иначе: връщане кръг (разстояние, 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 изход ():

# Използване на глобална променлива за displayIndex глобален displayIndex # Изчистване на екрана и прилагане на фона disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), запълване = (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 Pin на малиново пи

resetButton = 23 # BCM Pin на малиново пи

buttonPress = False

def checkDisplay ():

глобален бутон Натиснете глобален displayIndex if (bGPIO.input (displayButton), а не buttonPress): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) и buttonPress): print (" Все още натиснат ") else: buttonPress = False

# Настройка на GPS

gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()

timerPeriod =.5

# Стойност на индекса за дисплей displayIndex = 0 опит: за нови_данни в gps_socket: ако 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) с изключение на KeyboardInterrupt: gps_socket.close () print (' / nПрекратено от потребителя ctrl+c ')

Горният код е само един пример за това как да кодираме нашата система и вградих видео за това как работи тази система.

Препоръчано: