Satura rādītājs:

GPS sistēma: 7 soļi
GPS sistēma: 7 soļi

Video: GPS sistēma: 7 soļi

Video: GPS sistēma: 7 soļi
Video: Спутниковый мониторинг транспорта. Данные в GPS/ГЛОНАСС системах 2024, Oktobris
Anonim
GPS sistēma
GPS sistēma
GPS sistēma
GPS sistēma
GPS sistēma
GPS sistēma

Projekta veidotājs: Carlos Gomez

Uzticamas navigācijas sistēmas izmantošana ir ārkārtīgi svarīga ikvienam, kurš cenšas ceļot un izpētīt pasauli.

Vissvarīgākais aspekts, kas ļauj darboties navigācijas sistēmai, ir sistēmas iekšpusē iebūvētā GPS iespēja. GPS sistēma ļauj ikvienam izsekot savai atrašanās vietai un ātrumam, lai parādītu precīzu informāciju par lietotāju un sniegtu lietotājam precīzu priekšstatu par to, kur viņi atrodas un cik tālu atrodas no savas atrašanās vietas.

Globālā pozicionēšanas sistēma (GPS) ir satelītu tīkls, kas riņķo ap Zemi aptuveni 20 000 km augstumā. Ikviens, kam ir GPS ierīce, var uztvert satelītu pārraidītos radiosignālus un var tos izmantot jebkurā vajadzīgā veidā. Lai kur būtu jūsu atrašanās vieta uz planētas, jums jebkurā laikā jābūt pieejamai vismaz četrām GPS ierīcēm. Izmantojot metodi, ko sauc par trīsdimensiju trilatrāciju, GPS ierīce var izmantot trīs satelītus, lai noteiktu ierīces atrašanās vietu uz Zemes. Katrs no trim satelītiem nosūta signālu uz ierīci, un ierīce nosaka tā attālumu no satelīta. Izmantojot katru no trim attāluma aprēķiniem, ierīce tagad var precīzi noteikt savu atrašanās vietu uz Zemes un atgriež to lietotājam.

Mūsu izveidotā GPS sistēma varēs izsekot lietotāja atrašanās vietām, iegūstot lietotāja koordinātas uz Zemes un veicot dažus aprēķinus, lai atgrieztu lietotāja ātrumu, atrašanās vietu un veikto attālumu.

1. darbība. Darba sākšana

Darba sākšana
Darba sākšana
Darba sākšana
Darba sākšana
Darba sākšana
Darba sākšana
Darba sākšana
Darba sākšana

Lai sāktu šo projektu, mums vispirms būs jāsavāc visi pareizie materiāli

1: Raspberry Pi Zero W

2: GPS uztvērējs

3: 1.8 TFT 128 x 160 LCD SPI ekrāns

4: ~ 11 vadi

5: 2 pogas

6: 2x 1k un 2x 10k rezistori nolaižamajām pogām

7: maizes dēlis

Šajā projektā tiks izmantotas Raspberry Pi GPIO tapas, un tāpēc mums, lai attīstītu savu projektu, viss būs jāsavieno ar maizes dēli. Tiek pieņemts arī, ka visu tapu lodēšana ir veikta un pabeigta, pirms pāriet un savienot visas mūsu detaļas.

2. darbība: pievienojiet GPS moduli Raspberry Pi

Savienojiet GPS moduli ar Raspberry Pi
Savienojiet GPS moduli ar Raspberry Pi
Savienojiet GPS moduli ar Raspberry Pi
Savienojiet GPS moduli ar Raspberry Pi

Lai izmantotu mūsu GPS sistēmu, jums būs jāpievieno Tx un Rx tapas no GPS moduļa ar GPIO 14. un 15. tapu Raspberry Pi. GPS uztvērēja Tx tapa iet uz Pi Rx tapu un GPS uztvērēja Rx tapa uz Raspberry pi Tx tapu.

Attēlos redzamajam GPS uztvērējam ir jāizmanto 3.3V, un jūs varat savienot 3.3V tapas ar pareizo spriegumu, vienlaikus savienojot zemējuma tapu ar zemi.

3. darbība: iegūstiet datus no GPS uztvērēja moduļa

Datu saņemšana no GPS uztvērēja moduļa
Datu saņemšana no GPS uztvērēja moduļa

Lai saņemtu datus no GPS uztvērēja uz Raspberry Pi, mums jāļauj no UART portiem lasīt pareizās ligzdas. Lai lasītu neapstrādātus datus, mums ir jāizveido sava parsēšanas bibliotēka, taču šajā gadījumā mēs varam izmantot GPS dēmonu, kas darbojas fonā, lai palīdzētu izmantot datu parsēšanu un pārsūtīšanu uz Raspberry Pi

Lai to paveiktu, mēs varam atvērt Raspberry Pi termināli un izpildīt kodu:

sudo apt-get update

sudo apt-get instalēt gpsd gpsd-klienti python-gps

Tam vajadzētu rūpēties par lejupielādi mūsu vietā.

Kad tas ir pabeigts, mums ir jāatspējo gpsd sistēmas pakalpojums, palaižot šādas komandas:

sudo systemctl stop gpsd.socket

sudo systemctl atspējot gpsd.socket

Ja kādreiz vēlaties iespējot noklusējuma GPS pakalpojumu, varat palaist šādas komandas, lai to atjaunotu:

sudo systemctl iespējot gpsd.socket

sudo systemctl sākt gpsd.socket

Tagad mums jāuzsāk gpsd dēmons un jānorāda uz UART portiem, ievadot

sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock

Tagad mēs varam palaist komandu zemāk un redzēt visus datus, kas peld!

cgps -s

4. darbība: pievienojiet displeju Raspberry Pi

Savienojiet displeju ar Raspberry Pi
Savienojiet displeju ar Raspberry Pi
Savienojiet displeju ar Raspberry Pi
Savienojiet displeju ar Raspberry Pi

Kad GPS uztvērējs ir izveidots un strādājam ar Raspberry Pi, mēs varam savienot displeju ar Raspberry Pi. Mēs izmantosim 5 vadus, lai savienotu mūsu LCD displeju ar Raspberry Pi, un vēl 4 tapas, lai savienotu galveno barošanu un LED uz ekrāna.

Esmu iekļāvis izmantotā TFT ekrāna fotoattēlu, taču tam vajadzētu darboties ar līdzīga izmēra un uzbūves ekrāniem.

Pievienojiet LED un GND zemei un pievienojiet LED+ un VCC pie 3.3V.

Savienojiet ekrānā esošo RESET tapu ar Pi plāksnes 25. tapu.

Savienojiet A0 ar Pi plāksnes 24. tapu.

Pievienojiet SDA tapu MOSI tapai uz Pi plates.

Pievienojiet SCK tapu LCD ekrānā pie Pi plates.

Savienojiet CS tapu ar Pi tapas 8. tapu.

5. darbība: iestatiet displeju darbam ar Raspberry Pi

Iestatiet displeju darbam ar Raspberry Pi
Iestatiet displeju darbam ar Raspberry Pi

Lai iestatītu displeju, mums jāizmanto šajā repo atrodamā ST7735 bibliotēka:

Python ST7735 ekrāna bibliotēka

Kad šī displeja bibliotēka ir instalēta mūsu Raspberry Pi sistēmā, tagad mēs varam turpināt izveidot parauga failu, lai apstiprinātu, ka mūsu iepriekšējā elektroinstalācija darbojas pareizi.

Izveidojiet failu ar nosaukumu example.py un ievietojiet tur šādu tekstu kopā ar jūsu izvēlētā attēla paraugu tajā pašā mapē

importēt ST7735 kā TFTimportēt Adafruit_GPIO kā GPIO importēt Adafruit_GPIO. SPI kā SPI

PLATUMS = 128

AUGSTUMS = 160 SPEED_HZ = 4000000

# Raspberry Pi konfigurācija.

# Šīs ir tapas, kas nepieciešamas, lai LCD savienotu ar Raspberry Pi

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

# Izveidojiet TFT LCD displeju klasi.

disp = TFT. ST7735 (DC, pirmais = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))

# Inicializēt displeju.

disp.begin () disp.reset ()

# Ielādējiet attēlu.

newData = 0x42 disp.command (newData) print ('Notiek attēla ielāde …') image = Image.open ('cat.jpg')

# Mainiet attēla izmēru un pagrieziet to atbilstoši displejam.

image = image.rotate (270). resize ((WIDTH, HEIGHT))

# Drukās uz termināli, ka mūsu programma uz ekrāna zīmē mūsu attēlu

drukāt ('Zīmēt attēlu')

# Šī funkcija parādīs mūsu attēlu ekrānā

displejs (attēls)

Šis fails iestatīs Raspberry Pi konfigurāciju LCD ekrānam, un bibliotēka pārveidos mūsu attēlu mapē un parādīs to ekrānā.

6. darbība: iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju

Iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
Iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
Iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
Iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
Iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
Iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju

Mēs izmantosim 5 dažādas valsts iekārtas, vienlaikus ieviešot mūsu uzdevumu diagrammu, lai iestatītu mūsu GPS sistēmu.

Displeja mainīšanas stāvokļa mašīna:

Šī stāvokļa mašīna kontrolēs to, ko rādīt, atkarībā no mūsu pogas ievades. Tas tiek darīts, mainot mainīgo, kas ļauj python izmantot pīles rakstīšanas priekšrocības un izsauc pareizo funkciju parādīšanai atkarībā no izsauktās funkcijas

Ātruma stāvokļa mašīna:

Šī stāvokļa mašīna veiks pašreizējo ātrumu atkarībā no indivīdu atrašanās vietas. Tas izpildīs katru GPS sistēmas pulksteņa ciklu

Izejas stāvokļa mašīna:

Šī stāvokļa mašīna noteiks izvadi, pamatojoties uz mainīgo, ko displeja maiņas stāvokļa mašīna nosaka kā pašreizējo displeju.

Attāluma stāvokļa mašīna

Šī stāvokļa mašīna izpilda katru pulksteņa ciklu un nosaka kopējo lietotāja nobraukto attālumu, un, tiklīdz tiek nospiesta atiestatīšanas poga, tiks atiestatīts pašreizējais nobrauktais attālums.

Atrašanās vietas stāvokļa mašīna:

Šī stāvokļa mašīna atgriež pašreizējo lietotāja atrašanās vietu, izmantojot koordinātas, kuras GPS modulis atgriež par lietotāju. Šī stāvokļa mašīna ir atkarīga no lietotāju interneta savienojuma.

7. solis: ļauj ieviest mūsu GPS sistēmu

Kad mūsu GPS modulis sūta informāciju uz mūsu Raspberry Pi un LCD ekrāns parāda informāciju, mēs varam sākt programmēt savu GPS sistēmu. Es izmantošu iepriekšējā soļa galīgās iekārtas, lai kodētu mūsu GPS sistēmu

## Navigācijas sistēmas galvenais fails # # # #

# Bibliotēkas attēlu zīmēšanai

no PIL importa attēla no PIL importa ImageDraw no PIL importēšanas ImageFont

# Bibliotēka kontrolierim ST7737

importēt ST7735 kā TFT

# Bibliotēka GPIO Raspberry Pi

importēt Adafruit_GPIO kā GPIO importēt Adafruit_GPIO. SPI kā SPI

# GPS bibliotēka

#import gpsd no gps3 importēt gps3

# Bibliotēka laikam

importa laiks

# Bibliotēka attāluma noteikšanai starp diviem punktiem

no matemātikas importa sin, cos, sqrt, atan2, radiāni

# Importējiet Rpi bibliotēku, lai izmantotu pogas izvēlņu pārslēgšanai un atiestatīšanai

# importējiet RPi. GPIO kā bGPIO

# Iestatīšanas tapas pogām

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ēt ģeogrāfisko bibliotēku ģeokodēšanai

# # Lai tas darbotos, ir nepieciešama piekļuve internetam

no geopy.geocoders importē Nominatim

ģeolokators = Nominatim ()

# Sistēmas konstantes

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

PLATUMS = 128

AUGSTUMS = 160 SPEED_HZ = 4000000

# Raspberry Pi konfigurācijas tapas

DC = 24 # A0 TFT ekrānā RST = 25 # Reset pin in TFT screen SPI_PORT = 0 # SPI ports on aveņu pi, SPI0 SPI_DEVICE = 0 # Slave select on rapsberry pi, CE0

# Izveidojiet TFT LCD displeja objektu

disp = TFT. ST7735 (DC, pirmais = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))

# Inicializēt displeju

disp.begin ()

# Fons tiks iestatīts uz zaļu

#displejs skaidrs ((0, 255, 0))

# Notīriet ekrānu līdz baltam un parādiet

#disp.clear ((255, 255, 255)) draw = disp.draw () #draw. taisnstūris ((0, 10, 127, 150), kontūra = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()

# Ātruma, platuma, garuma izvietojuma mainīgie

#currentS = "Pašreizējais ātrums:" # Ātruma virkne #totalDis = "Kopējais attālums:" # Attāluma virkne #currentLoc = "Pašreizējā atrašanās vieta:" # Atrašanās vietas virkne

# Attālums x un y koordinātas

distX = 10 distY = 20

pointsList =

# Ātruma x un y koordinātas

ātrumsX = 10 ātrumsY = 20

# Atrašanās vietas x un y koordinātas

locX = 10 locY = 20

# Pārvērš no m/s uz mph

conversionVal = 2,24

# Ātruma atjaunināšanas funkcija, atgriež virkni

SpeedVar = 0

def speedFunc (): globālais SpeedVar SpeedText = data_stream. TPV ['ātrums'], ja (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = apaļš (SpeedText, 1) # return (SpeedText)

def locationFunc ():

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

reverseString = latLoc + "," + lonLoc

location = geolocator.reverse (reverseString)

atgriešanās (location.address)

# Latitude atjaunināšanas funkcija, atgriež peldošo vērtību

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

# Garuma atjaunināšanas funkcija, atgriež virkni

def lonFunc (): garums = data_stream. TPV ['lon'], ja (garums == "n/a"): atgriežas 0 cits: atgriežas pludiņš (apaļš (garums, 4))

# Attāluma funkcija atgriež KOPĀ nobraukto attālumu

totalDistance = 0

def distFunc ():

global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 or newLon == 0): totalDistance = totalDistance # return (totalDistance) cits: pointsList.append ((newLat, newLon)) last = len (pointsList) -1, ja (pēdējais == 0): atgriežas cits: totalDistance += coorDistance (pointsList [last-1], pointsList [last]) # return totalDistance

# Atiestata kopējo attālumu

def resDistance ():

global totalDistance totalDistance = 0

# Funkcija, ko izmanto, lai atrastu attālumu starp divām koordinātām

# izmanto Haversine formulu, lai atrastu. # Ievades punkti ir karte

def coorDistance (1. punkts, 2. punkts):

# Aptuvenais Zemes rādiuss kilometros earthRadius = 6373,0

lat1 = 1. punkts [0]

lon1 = 1. punkts [1]

lat2 = 2. punkts [0]

lon2 = 2. punkts [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 (kvadrātveida (a), kvadrātveida (1-a))

# Pārvērst km uz jūdzēm

attālums = (earthRadius * c) * 0.62137

ja (attālums <= 0,01): atgriešanās 0,00 cits: atgriešanās kārta (attālums, 3)

# Funkcija ātruma parādīšanai ekrānā

def dispSpeed ():

globālais SpeedVar # Novietojiet attālumu uz mainīgā ekrānā draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Funkcija, lai ekrānā parādītu attālumu

def dispDistance ():

draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))

# Funkcija ti parāda atrašanās vietu ekrānā, lai darbotos internets

def dispLocation ():

draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))

# Vārdnīcas izmantošana slēdzienu paziņojumu atdarināšanai

dispOptions = {

0: dispSpeed, 1: dispDistance, 2: dispLocation}

# Ekrāna izvades funkcija

def izeja ():

# Globālā mainīgā izmantošana displejamIndex globālais displejsIndekss # Ekrāna notīrīšana un fona displeja pielietošana. ([255, 255, 255]) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), aizpildīt = (255, 0, 0))

# Zvanu funkcija atkarībā no displayIndex vērtības

dispOptions [displayIndex] ()

# Izdzēs, ja cita metode darbojas

# vietas attāluma mainīgais ekrānā

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #ātruma mainīgais uz ekrāna #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Displeja displeja atjauninājumu displejs ()

displayButton = 18 # BCM Pin uz aveņu pi

resetButton = 23 # BCM Pin uz aveņu pi

buttonPress = False

def checkDisplay ():

globālā poga Nospiediet globālo displejaIndeksu, ja (bGPIO.input (displayButton), nevis pogas spiediens): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) un buttonPress): print (" Joprojām tiek nospiests ") else: buttonPress = False

# GPS iestatīšana

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

taimerisPeriods =.5

# Indeksa vērtība displeja displejamIndex = 0 try: new_data in gps_socket: if new_data: data_stream.unpack (new_data) if data_stream. TPV ['lat']! = 'N/a': print (data_stream. TPV ['ātrums')], 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 vēl nav savienots') time.sleep (.1) time.sleep (.8), izņemot KeyboardInterrupt: gps_socket.close () print (' / nPārtrauc lietotājs ctrl+c ')

Iepriekš minētais kods ir tikai viens piemērs, kā kodēt mūsu sistēmu, un es esmu ievietojis video par šīs sistēmas darbību.

Ieteicams: