Përmbajtje:

Sistemi GPS: 7 hapa
Sistemi GPS: 7 hapa

Video: Sistemi GPS: 7 hapa

Video: Sistemi GPS: 7 hapa
Video: Обзор GPS навигатора Pioneer 7" 2024, Tetor
Anonim
Sistemi GPS
Sistemi GPS
Sistemi GPS
Sistemi GPS
Sistemi GPS
Sistemi GPS

Krijuesi i projektit: Carlos Gomez

Të kesh një sistem navigimi të besueshëm është parësor për këdo që përpiqet të udhëtojë dhe të eksplorojë botën.

Aspekti më i rëndësishëm që lejon funksionimin e sistemit të navigimit është aftësia GPS e ngulitur brenda sistemit. Sistemi GPS lejon këdo që të mbajë gjurmët e vendndodhjes dhe shpejtësisë së tij në mënyrë që të shfaq informacione të sakta rreth përdoruesit dhe t'i japë përdoruesit një paraqitje të saktë se ku ndodhen dhe sa larg janë nga vendndodhja e tyre.

Sistemi i Pozicionimit Global (GPS) është një rrjet satelitësh që rrotullohen rreth Tokës në një lartësi prej rreth 20,000 km. Çdokush me një pajisje GPS mund të marrë sinjalet e radios që transmetojnë satelitët dhe është në gjendje t'i përdorë ato në çfarëdo mënyre të nevojshme. Kudo që vendndodhja juaj në planet të paktën katër GPS duhet të jenë në dispozicion për ju në çdo kohë. Duke përdorur një metodë të quajtur trilatimi 3-D, një pajisje GPS është në gjendje të përdorë tre satelitë për të përcaktuar vendndodhjen e pajisjes në Tokë. Secili nga tre satelitët dërgon një sinjal në pajisje dhe pajisja përcakton distancën e saj nga sateliti. Duke përdorur secilën nga tre llogaritjet e distancës, pajisja tani është në gjendje të përcaktojë vendndodhjen e saj në Tokë dhe ia kthen atë përdoruesit.

Sistemi GPS që do të krijojmë do të jetë në gjendje të gjurmojë vendndodhjet e përdoruesit duke marrë koordinatat e përdoruesit në Tokë dhe duke bërë disa llogaritje në mënyrë që të kthejë shpejtësinë e përdoruesit, vendndodhjen dhe distancën e mbuluar.

Hapi 1: Fillimi

Fillimi
Fillimi
Fillimi
Fillimi
Fillimi
Fillimi
Fillimi
Fillimi

Për të filluar këtë projekt, së pari do të duhet të mbledhim të gjitha materialet e sakta

1: Raspberry Pi Zero W

2: Marrësi GPS

3: 1.8 TFT 128 x 160 LCD ekran SPI

4: ~ 11 tela

Butona 5: 2

Rezistenca 6: 2x 1k dhe 2x 10k për butonat tërheqës

7: Tabela e bukës

Ky projekt do të përdorë kunjat GPIO të Raspberry Pi dhe si të tillë do të na duhet të lidhim gjithçka me një dërrasë buke në mënyrë që të zhvillojmë projektin tonë. Supozohet gjithashtu se bashkimi në të gjitha kunjat është bërë dhe përfunduar para se të vazhdoni dhe lidhni të gjitha pjesët tona.

Hapi 2: Lidhni modulin GPS me Raspberry Pi

Lidhni modulin GPS me Raspberry Pi
Lidhni modulin GPS me Raspberry Pi
Lidhni modulin GPS me Raspberry Pi
Lidhni modulin GPS me Raspberry Pi

Për përdorimin e sistemit tonë GPS do t'ju duhet të lidhni kunjat Tx dhe Rx nga moduli GPS në pin GPIO 14 dhe 15 në Raspberry Pi. Kunja Tx e marrësit GPS shkon në kunjin Rx të Pi dhe kunja Rx e marrësit GPS shkon në kunjin Tx të Raspberry pi.

Marrësi GPS i treguar në imazhe kërkon 3.3V për t'u përdorur dhe ju mund t'i lidhni kunjat 3.3V me tensionin e duhur, ndërsa lidhni kunjin e Tokës me tokën.

Hapi 3: Merrni të dhëna nga moduli i marrësit GPS

Merrni të dhëna nga moduli i marrësit GPS
Merrni të dhëna nga moduli i marrësit GPS

Për të marrë të dhëna nga marrësi GPS në Raspberry Pi ne duhet të lejojmë që prizat e sakta të lexohen nga portet UART. Leximi i të dhënave të papërpunuara do të na kërkonte të krijonim bibliotekën tonë të analizës, por në këtë skenar ne mund të përfitojmë nga një demon GPS që funksionon në sfond për të ndihmuar në analizimin e të dhënave dhe transmetimin e tyre në Raspberry Pi

Për të arritur këtë ne mund të hapim një terminal në Raspberry Pi dhe të ekzekutojmë kodin:

përditësim sudo apt-get

sudo apt-get instaloni gpsd gpsd-klientët python-gps

Kjo duhet të kujdeset për shkarkimin për ne.

Pasi të përfundojë, ne duhet të çaktivizojmë shërbimin e sistemit gpsd duke ekzekutuar komandat e mëposhtme:

sudo systemctl stop gpsd.socket

sudo systemctl çaktivizoni gpsd.socket

Nëse ndonjëherë dëshironi të aktivizoni shërbimin e paracaktuar të sistemit gpsd, mund të ekzekutoni komandat e mëposhtme për ta rivendosur atë:

sudo systemctl aktivizoni gpsd.socket

sudo systemctl start gpsd.socket

Tani duhet të fillojmë demonin gpsd dhe ta drejtojmë në portat UART duke hyrë

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

Tani mund të ekzekutojmë komandën më poshtë dhe të shohim të gjitha të dhënat që notojnë!

cgps -s

Hapi 4: Lidhni ekranin me Raspberry Pi

Lidhni ekranin me Raspberry Pi
Lidhni ekranin me Raspberry Pi
Lidhni ekranin me Raspberry Pi
Lidhni ekranin me Raspberry Pi

Pasi të kemi marrë marrësin tonë GPS dhe të punojmë me Raspberry Pi, atëherë mund ta lidhim ekranin me Raspberry Pi. Ne do të përdorim 5 tela për të lidhur ekranin tonë LCD me Raspberry Pi dhe 4 kunja të tjera për të lidhur fuqinë kryesore dhe LED në ekran.

Unë kam përfshirë një fotografi të ekranit TFT që po përdor, por kjo duhet të funksionojë me ekranet me madhësi dhe strukturë të ngjashme.

Lidhni LED- dhe GND me tokën dhe lidhni LED+ dhe VCC me 3.3V.

Lidhni kunjin RESET në ekran me kunjin 25 në tabelën Pi.

Lidhni A0 me pin 24 në tabelën Pi.

Lidhni kunjin SDA me kunjin MOSI në bordin Pi.

Lidhni kunjin SCK në ekranin LCD me tabelën Pi.

Lidhni kunjin CS me kunjin 8 në tabelën Pi.

Hapi 5: Konfiguroni ekranin për të punuar me Raspberry Pi

Konfiguroni ekranin për të punuar me Raspberry Pi
Konfiguroni ekranin për të punuar me Raspberry Pi

Për të konfiguruar ekranin, duhet të përdorim bibliotekën ST7735 që gjendet në këtë repo:

Biblioteka e ekranit Python ST7735

Pasi të kemi instaluar këtë bibliotekë të ekranit në sistemin tonë Raspberry Pi, tani mund të vazhdojmë me ngritjen e një skedari shembull për të konfirmuar që instalimet tona të mëparshme po funksionojnë si duhet.

Krijoni një skedar të titulluar example.py dhe futni tekstin e mëposhtëm atje së bashku me një imazh mostër të zgjedhur nga ju në të njëjtën dosje

import ST7735 si TFTimport Adafruit_GPIO si GPIO import Adafruit_GPIO. SPI si SPI

Gjerësia = 128

Lartësia = 160 SPEED_HZ = 4000000

# Konfigurimi i Raspberry Pi.

# Këto janë kunjat e nevojshme për të lidhur LCD -në me Raspberry Pi

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

# Krijoni klasë të ekranit TFT LCD.

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

# Filloni shfaqjen.

disp.filloj () disp.reset ()

# Ngarko një imazh.

newData = 0x42 disp.command (newData) print ('Loading image…') image = Image.open ('cat.jpg')

# Ndryshoni madhësinë e figurës dhe rrotullojeni atë në mënyrë që të përputhet me ekranin.

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

# Do të printojë në terminalin që programi ynë po vizaton imazhin tonë në ekran

print ('Vizatimi i imazhit')

# Ky funksion do të shfaqë imazhin tonë në ekran

shpërndarje. shfaqje (imazh)

Ky skedar do të konfigurojë konfigurimin e Raspberry Pi për ekranin LCD dhe biblioteka do të konvertojë imazhin tonë në dosje dhe do ta shfaqë atë në ekran.

Hapi 6: Konfiguroni makinat e gjendjes për të shfaqur informacionin GPS në ekran

Vendosni Makinat e Gjendjes për të shfaqur informacionin GPS në ekran
Vendosni Makinat e Gjendjes për të shfaqur informacionin GPS në ekran
Vendosni Makinat e Gjendjes për të shfaqur informacionin GPS në ekran
Vendosni Makinat e Gjendjes për të shfaqur informacionin GPS në ekran
Vendosni Makinat e Gjendjes për të shfaqur informacionin GPS në ekran
Vendosni Makinat e Gjendjes për të shfaqur informacionin GPS në ekran

Ne do të përdorim 5 makina të ndryshme shtetërore, ndërsa zbatojmë diagramin tonë të detyrave për të konfiguruar sistemin tonë GPS.

Shfaq makinën e ndryshimit të gjendjes:

Kjo makinë shtetërore do të kontrollojë se cila të shfaqet në varësi të hyrjes së butonit tonë. E bën këtë duke ndryshuar një variabël që lejon python të përfitojë nga shtypja e rosës dhe të thërrasë funksionin e duhur për të shfaqur në varësi të funksionit të thirrur

Makinë e gjendjes së shpejtësisë:

Kjo makinë shtetërore do të ekzekutojë shpejtësinë aktuale në varësi të vendndodhjes së individit. Kjo do të ekzekutojë çdo cikël të orës për sistemin GPS

Makina e gjendjes së daljes:

Kjo makinë shtetërore do të përcaktojë daljen bazuar në ndryshoren që makina e gjendjes së ndryshimit të ekranit përcakton të jetë ekrani aktual.

Makinë shtetërore në distancë

Kjo makinë shtetërore ekzekuton çdo cikël të orës dhe përcakton distancën totale të përshkuar nga përdoruesi dhe sapo të shtypet butoni i rivendosjes, do të rivendosë distancën aktuale të udhëtuar.

Makina e gjendjes së vendndodhjes:

Kjo makinë shtetërore kthen vendndodhjen aktuale të përdoruesit, duke përdorur koordinatat që moduli GPS kthen për përdoruesin. Kjo makinë shtetërore varet nga lidhja e internetit e përdoruesve.

Hapi 7: Le të Implementojmë Sistemin tonë GPS

Pasi të kemi modulin tonë GPS që dërgon informacion në Raspberry Pi tonë dhe në ekranin tonë LCD që shfaq informacione mbi të, atëherë mund të fillojmë të programojmë sistemin tonë GPS. Unë do të përdor makinat e gjendjes së fundme të hapit të mëparshëm në mënyrë që të kodoj sistemin tonë GPS

## Skedari kryesor për sistemin e lundrimit # # # #

# Bibliotekat për vizatimin e imazheve

nga PIL import Imazh nga PIL import ImageDraw nga PIL import ImageFont

# Biblioteka për kontrolluesin ST7737

importoni ST7735 si TFT

# Biblioteka për GPIO për Raspberry Pi

importoni Adafruit_GPIO si GPIO importoni Adafruit_GPIO. SPI si SPI

# Biblioteka për GPS

#import gpsd nga gps3 import gps3

# Biblioteka për kohën

koha e importit

# Biblioteka për gjetjen e distancës midis dy pikave

nga matematika import sin, cos, sqrt, atan2, radians

# Importoni bibliotekën Rpi për të përdorur butona për të ndryshuar menutë dhe rivendosur

# importo RPi. GPIO si bGPIO

# Vendosni kunjat për butonat

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)

# importoni bibliotekën gjeopiane për Gjeokodim

# # Qasja në internet është e nevojshme që kjo të funksionojë

nga gjeopia.geokoderët importojnë Nominatim

gjeolokator = Nominatim ()

# Konstantet për sistemin

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

Gjerësia = 128

Lartësia = 160 SPEED_HZ = 4000000

# Kunjat e konfigurimit të Raspberry Pi

DC = 24 # A0 në ekranin TFT RST = 25 # Rivendos pinin në ekranin TFT SPI_PORT = 0 # Port SPI në mjedër pi, SPI0 SPI_DEVICE = 0 # Zgjedhja e skllavit në raspberry pi, CE0

# Krijoni objektin e ekranit TFT LCD

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

# Filloni shfaqjen

disp.filloj ()

# Sfondi do të vendoset në të gjelbër

#disp. e qartë ((0, 255, 0))

# Pastro ekranin në të bardhë dhe shfaq

#disp.qartë ((255, 255, 255)) barazim = disp.draw () #vizatim drejtkëndësh ((0, 10, 127, 150), skicë = (255, 0, 0), mbush = = (0, 0, 255)) #disp. Shfaqje ()

# Ndryshoret e vendosjes së shpejtësisë, gjerësisë gjeografike, gjatësisë

#currentS = "Shpejtësia aktuale:" # Speed string #totalDis = "Distanca totale:" # Distance string #currentLoc = "Vendndodhja aktuale:" # Vargu i vendndodhjes

# Distanca koordinatat x dhe y

distX = 10 distY = 20

pikëListra =

# Koordinatat e shpejtësisë x dhe y

shpejtësiaX = 10 shpejtësiY = 20

# Koordinatat e vendndodhjes x dhe y

locX = 10 locY = 20

# Konvertohet nga m/s në mph

konvertimiVal = 2.24

# Funksioni i azhurnimit të shpejtësisë, kthen vargun

SpeedVar = 0

def speedFunc (): SpeedVar globale SpeedText = data_stream. TPV ['shpejtësia'] nëse (SpeedText! = "n/a"): SpeedText = noton (SpeedText) * conversionVal SpeedVar = raund (SpeedText, 1) # kthim (SpeedText)

def locationFunc ():

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

reverseString = latLoc + "," + lonLoc

vendndodhja = gjeolokatori. i kundërt (vargu i kundërt)

kthimi (vendndodhja.adresa)

# Funksioni i përditësimit të gjerësisë gjeografike, kthen vlerën e notit

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

# Funksioni i përditësimit të gjatësisë, kthen vargun

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): return 0 else: return float (raundi (Gjatësia, 4))

# Funksioni i distancës kthen TOTAL distancën e përshkuar

totalDistanca = 0

def distFunc ():

total totalDistanca newLat = latFunc () newLon = lonFunc () nëse (newLat == 0 ose newLon == 0): totalDistance = totalDistance # kthim (totalDistanca) tjetër: pointsList.append ((newLat, newLon)) last = len (pointsList) -1 nëse (e fundit == 0): kthehu tjetër: totalDistanca += coorDistance (pikëListër [e fundit-1], pikëListër [e fundit]) # kthim totalDistanca

# Rivendos distancën totale

def resistance ():

total globalDistanca totalDistanca = 0

# Funksioni i përdorur për të gjetur distancën midis dy koordinatave

# përdor formulën e Haversine për të gjetur. # Pikat hyrëse janë një tufë

def coorDistanca (pika 1, pika 2):

# Rrezja e përafërt e Tokës në kilometra tokëRadius = 6373.0

lat1 = pika1 [0]

lon1 = pika1 [1]

lat2 = pikë2 [0]

lon2 = pika2 [1]

distancaLon = 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))

# Ktheni km në milje

distanca = (tokaRadius * c) * 0.62137

nëse (distanca <= 0.01): kthehet 0.00 tjetër: raundi i kthimit (distanca, 3)

# Funksioni për të shfaqur shpejtësinë në ekran

def dispSpeed ():

global SpeedVar # Vendosni distancën në ndryshoren në vizatimin e ekranit. teksti ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Funksioni për të shfaqur distancën në ekran

def dispDistance ():

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

# Funksioni i shfaqjes së vendndodhjes në ekran, kërkon internet për të punuar

def dispLocation ():

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

# Përdorimi i fjalorit për të imituar deklaratat e ndërrimit

disponimet = {

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

# Funksioni i daljes së ekranit

def dalje ():

# Përdorimi i ndryshores globale për shfaqjen Indexi globalIndexi # Pastrimi i ekranit dhe aplikimi i shpërndarjes së sfondit. E qartë ((255, 255, 255)) barazim. Drejtkëndësh ((0, 10, 127, 150), skicë = (255, 0, 0), mbush = (255, 0, 0))

# Thirrjet funksionojnë në varësi të vlerës së indeksit të indeksit

dispOptions [displayIndex] ()

# Do të fshihet nëse metoda tjetër funksionon

# ndryshore e distancës së vendit në ekran

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #vendos ndryshoren e shpejtësisë në ekran #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Shfaq përditësimet në ekran disp.display ()

displayButton = 18 # BCM Pin në mjedër pi

resetButton = 23 # BCM Pin në mjedër pi

buttonPress = E gabuar

def checkDisplay ():

butoni globalShtypja globaleIndeksi nëse (bGPIO.input (displayButton) dhe jo buttonPress): displayIndex += 1 button Press = E vërtetë nëse (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) dhe buttonPress): print (" Shtypur akoma ") tjetër: buttonShtyp = E gabuar

# Konfiguro GPS

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

kohëmatësiPeriudha =.5

# Vlera e indeksit për shfaqjen e ekranitIndex = 0 provo: për të dhënat_ reja në gps_socket: nëse new_data: data_stream.unpack (new_data) nëse 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 () tjetër: output () checkDisplay () if (bGPIO.input (resetButton)): resDistance () print ('GPS nuk është lidhur akoma') koha. gjumi (.1) koha. gjumi (.8) përveç KeyboardInterrupt: gps_socket.close () print (" / nPërfunduar nga përdoruesi ctrl+c ')

Kodi i mësipërm është vetëm një shembull se si të kodojmë sistemin tonë dhe unë kam vendosur një video se si funksionon ky sistem.

Recommended: