Përmbajtje:
- Hapi 1: Fillimi
- Hapi 2: Lidhni modulin GPS me Raspberry Pi
- Hapi 3: Merrni të dhëna nga moduli i marrësit GPS
- Hapi 4: Lidhni ekranin me Raspberry Pi
- Hapi 5: Konfiguroni ekranin për të punuar me Raspberry Pi
- Hapi 6: Konfiguroni makinat e gjendjes për të shfaqur informacionin GPS në ekran
- Hapi 7: Le të Implementojmë Sistemin tonë GPS
Video: Sistemi GPS: 7 hapa
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-10 13:48
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
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
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
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
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
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
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.