Sisukord:
- 1. samm: alustamine
- Samm: ühendage GPS -moodul Raspberry Pi -ga
- 3. samm: andmete vastuvõtmine GPS -vastuvõtumoodulist
- Samm: ühendage ekraan Raspberry Pi -ga
- Samm: seadistage ekraan Raspberry Pi -ga töötamiseks
- 6. samm: seadistage olekumasinad GPS -i teabe kuvamiseks ekraanile
- Samm: rakendage meie GPS -süsteem
Video: GPS -süsteem: 7 sammu
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-10 13:46
Projekti looja: Carlos Gomez
Usaldusväärse navigeerimissüsteemi olemasolu on ülioluline kõigile, kes üritavad reisida ja maailma avastada.
Kõige olulisem aspekt, mis võimaldab navigeerimissüsteemil töötada, on süsteemi sisseehitatud GPS -funktsioon. GPS -süsteem võimaldab kõigil jälgida oma asukohta ja kiirust, et kuvada kasutaja kohta täpset teavet ja anda kasutajale täpne ülevaade sellest, kus nad asuvad ja kui kaugel nad oma asukohast on.
Globaalne positsioneerimissüsteem (GPS) on satelliitide võrgustik, mis tiirleb ümber Maa umbes 20 000 km kõrgusel. Kõik, kellel on GPS -seade, saavad satelliitide edastatavaid raadiosignaale vastu võtta ja saavad neid igal võimalikul viisil kasutada. Kõikjal, kus teie asukoht planeedil on, peaks igal ajal olema saadaval vähemalt neli GPS -i. Kasutades meetodit nimega 3-D trilateration, saab GPS-seade kasutada kolme satelliiti, et määrata seadme asukoht Maal. Kõik kolm satelliiti saadavad seadmele signaali ja seade määrab selle kauguse satelliidist. Kasutades kõiki kolme kaugusarvutusi, saab seade nüüd täpselt kindlaks määrata oma asukoha Maal ja tagastab selle kasutajale.
Meie loodud GPS -süsteem suudab jälgida kasutaja asukohti, hankides kasutaja koordinaadid Maal ja tehes mõned arvutused, et tagastada kasutaja kiirus, asukoht ja läbitud vahemaa.
1. samm: alustamine
Selle projekti käivitamiseks peame kõigepealt koguma kõik õiged materjalid
1: Vaarika Pi Zero W
2: GPS -vastuvõtja
3: 1,8 TFT 128 x 160 LCD SPI -ekraan
4: ~ 11 juhtmest
5: 2 nupud
6: 2x 1k ja 2x 10k takistid allalaaditavate nuppude jaoks
7: leivalaud
See projekt kasutab Raspberry Pi GPIO tihvte ja sellisena peame oma projekti arendamiseks ühendama kõik leivalauaga. Samuti eeldatakse, et kõigi tihvtide jootmine on tehtud ja lõpetatud, enne kui liigume ja ühendame kõik meie osad.
Samm: ühendage GPS -moodul Raspberry Pi -ga
Meie GPS -süsteemi kasutamiseks peate ühendama GPS -mooduli Tx- ja Rx -tihvtid Raspberry Pi GPIO -pistikutega 14 ja 15. GPS -vastuvõtja Tx -tihvt läheb Pi Rx -tihvti ja GPS -vastuvõtja Rx -tihvt Raspberry pi Tx -tihvti juurde.
Piltidel näidatud GPS -vastuvõtja vajab kasutamist 3,3 V ja saate ühendada 3,3 V nööpnõelad õige pingega, samal ajal ühendades maandusnõela maandusega.
3. samm: andmete vastuvõtmine GPS -vastuvõtumoodulist
Selleks, et saada andmeid GPS -vastuvõtjalt Raspberry Pi -le, peame lubama UART -portidest õigete pesade lugemise. Toorandmete lugemine nõuaks meilt oma analüüsimisteegi loomist, kuid selle stsenaariumi korral saame kasutada taustal töötavat GPS -deemonit, et aidata andmeid analüüsida ja Raspberry Pi -le edastada
Selle saavutamiseks saame avada terminali Raspberry Pi -l ja käivitada koodi:
sudo apt-get update
sudo apt-get install gpsd gpsd-kliendid python-gps
See peaks meie jaoks allalaadimise eest hoolitsema.
Kui see on lõpule viidud, peame gpsd süsteemiteenuse keelama, käivitades järgmised käsud:
sudo systemctl stop gpsd.socket
sudo systemctl keela gpsd.socket
Kui soovite kunagi lubada gpsd -süsteemi vaiketeenuse, saate selle taastamiseks käivitada järgmised käsud:
sudo systemctl lubab gpsd.socket
sudo systemctl käivitage gpsd.socket
Nüüd peame käivitama gpsd deemoni ja suunama selle sisestades UART -portidele
sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock
Nüüd saame käivitada alloleva käsu ja näha kõiki andmeid hõljumas!
cgps -s
Samm: ühendage ekraan Raspberry Pi -ga
Kui oleme oma GPS -vastuvõtja püsti pannud ja Raspberry Pi -ga töötanud, saame ekraani Raspberry Pi -ga ühendada. LCD -ekraani ühendamiseks Raspberry Pi -ga kasutame 5 juhtmest ja põhitoite ja LED -i ühendamiseks veel 4 kontakti. ekraanil.
Olen lisanud foto kasutatavast TFT -ekraanist, kuid see peaks toimima sarnase suuruse ja ehitusega ekraanidega.
Ühendage LED- ja GND-ühendus maandusega ning ühendage LED+ ja VCC toitepingega 3.3V.
Ühendage ekraanil olev RESET -tihvt Pi -plaadi tihvtiga 25.
Ühendage A0 Pi -plaadi tihvtiga 24.
Ühendage SDA -tihvt Pi -plaadi MOSI -tihvtiga.
Ühendage LCD -ekraanil olev SCK -tihvt Pi -plaadiga.
Ühendage CS -tihvt Pi -plaadi tihvtiga 8.
Samm: seadistage ekraan Raspberry Pi -ga töötamiseks
Ekraani seadistamiseks peame kasutama selles repos leiduvat ST7735 raamatukogu:
Python ST7735 ekraaniteek
Kui oleme selle ekraaniteegi oma Raspberry Pi süsteemi installinud, võime nüüd jätkata näidisfaili seadistamist, et veenduda, et meie eelmine juhtmestik töötab õigesti.
Looge fail nimega example.py ja sisestage sinna järgmine tekst koos teie valitud näidispildiga samasse kausta
importige ST7735 TFT -na Importige Adafruit_GPIO GPIO -ks importige Adafruit_GPIO. SPI SPI -na
LAIUS = 128
KÕRGUS = 160 SPEED_HZ = 4000000
# Vaarika Pi konfiguratsioon.
# Need on tihvtid, mida on vaja LCD -ekraani ühendamiseks Raspberry Pi -ga
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Looge TFT LCD -ekraanide klass.
disp = TFT. ST7735 (DC, esimene = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Ekraani initsialiseerimine.
disp.begin () disp.reset ()
# Laadige pilt.
newData = 0x42 disp.command (newData) print ('pildi laadimine …') image = Image.open ('cat.jpg')
# Muutke pildi suurust ja pöörake seda vastavalt ekraanile.
image = image.rotate (270). resize ((WIDTH, HEIGHT))
# Prindib terminali, et meie programm joonistab ekraanile meie pildi
print ('Joonistav pilt')
# See funktsioon kuvab meie pildi ekraanil
disp.display (pilt)
See fail seadistab LCD -ekraani jaoks Raspberry Pi konfiguratsiooni ja raamatukogu teisendab meie pildi kausta ja kuvab selle ekraanil.
6. samm: seadistage olekumasinad GPS -i teabe kuvamiseks ekraanile
GPS -i seadistamiseks kasutame oma ülesande skeemi rakendades 5 erinevat olekumasinat.
Ekraani muutmise oleku masin:
See olekumasin kontrollib, mida kuvada, sõltuvalt meie nupuvajutusest. See muudab muutujat, mis võimaldab pythonil kasutada parditüüpi ja kutsuda õige funktsiooni kuvamiseks sõltuvalt kutsutud funktsioonist
Kiiruse oleku masin:
See olekumasin käivitab praeguse kiiruse sõltuvalt üksikisikute asukohast. See käivitab GPS -i iga kella tsükli
Väljundi oleku masin:
See olekumasin määrab väljundi muutuja põhjal, mille kuva muutmise oleku masin määrab praeguseks kuvaks.
Kauguse oleku masin
See olekumasin täidab iga kella tsüklit ja määrab kasutaja läbitud kogu vahemaa ning kui lähtestusnuppu vajutatakse, lähtestab see praeguse läbitud vahemaa.
Asukoha oleku masin:
See olekumasin tagastab kasutaja praeguse asukoha, kasutades koordinaate, mille GPS -moodul kasutaja kohta tagastab. See olekumasin sõltub kasutajate Interneti -ühendusest.
Samm: rakendage meie GPS -süsteem
Kui oleme oma GPS -mooduli saatnud teavet meie Raspberry Pi -le ja meie LCD -ekraanil kuvatakse selle kohta teavet, saame hakata oma GPS -süsteemi programmeerima. Kasutan meie GPS -süsteemi kodeerimiseks eelmise sammu piiratud olekuga masinaid
## Navigatsioonisüsteemi põhifail # # # #
# Raamatukogud piltide joonistamiseks
PIL -i importimisest Pilt PIL -ist Import ImageDraw PIL -i importimisest ImageFont
# ST7737 kontrolleri raamatukogu
importige ST7735 TFT -na
# Raamatukogu GPIO jaoks Raspberry Pi jaoks
importige Adafruit_GPIO GPIO -ks importige Adafruit_GPIO. SPI SPI -na
# GPS -i raamatukogu
#import gpsd gps3 -st importige gps3
# Raamatukogu aega
impordi aeg
# Raamatukogu kahe punkti vahelise kauguse leidmiseks
matemaatikast import sin, cos, sqrt, atan2, radiaanid
# Importige Rpi teek, et kasutada nuppe menüüde vahetamiseks ja lähtestamiseks
# impordi RPi. GPIO kui bGPIO
# Seadistage nööpnõelad nuppudele
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)
# impordige geokodeerimiseks geopiiraamatukogu
# # Selle toimimiseks on vaja Interneti -ühendust
saidilt geopy.geocoders impordivad Nominatimi
geolokator = Nominatim ()
# Konstandid süsteemile
#################################
LAIUS = 128
KÕRGUS = 160 SPEED_HZ = 4000000
# Raspberry Pi konfiguratsiooninõelad
DC = 24 # A0 TFT -ekraanil RST = 25 # TFT -ekraani nööpnõela SPI_PORT = 0 # SPI -port vaarika pi, SPI0 SPI_DEVICE = 0 # Slave select on rapsberry pi, CE0
# Looge TFT LCD -ekraani objekt
disp = TFT. ST7735 (DC, esimene = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Ekraani initsialiseerimine
disp.begin ()
# Taust on seatud roheliseks
#disp.clear ((0, 255, 0))
# Puhastage ekraan valgeks ja kuvage
#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), kontuur = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()
# Kiiruse, laiuskraadi ja pikkuskraadi paigutuse muutujad
#currentS = "Praegune kiirus:" # Speed string #totalDis = "Kogu vahemaa:" # Distance string #currentLoc = "Praegune asukoht:" # Asukoha string
# Kaugus x ja y koordinaadid
distX = 10 distY = 20
pointsList =
# Kiiruse x ja y koordinaadid
kiirusX = 10 kiirustY = 20
# Asukoha x ja y koordinaadid
locX = 10 locY = 20
# Teisendab m/s kiiruseks mph
conversionVal = 2,24
# Kiirvärskendusfunktsioon, tagastab stringi
SpeedVar = 0
def speedFunc (): globaalne SpeedVar SpeedText = data_stream. TPV ['kiirus'], kui (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = ümmargune (SpeedText, 1) # return (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
asukoht = geolokator.reverse (reverseString)
tagasi (asukoht.address)
# Laiuskraadi värskendamise funktsioon tagastab ujuva väärtuse
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (round (Latitude, 4))
# Pikkuskraadi värskendamise funktsioon, tagastab stringi
def lonFunc (): pikkuskraad = data_stream. TPV ['lon'] if (pikkuskraad == "n/a"): tagastab 0 muud: tagastab ujuki (ümmargune (pikkuskraad, 4))
# Kaugusfunktsioon tagastab TOTAL läbitud vahemaa
totalDistance = 0
def distFunc ():
global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 or newLon == 0): totalDistance = totalDistance # return (totalDistance) else: pointsList.append ((newLat, newLon)) last = len (pointsList) -1 kui (viimane == 0): tagasta muidu: totalDistance += coorDistance (pointsList [last-1], pointsList [last]) # return totalDistance
# Lähtestab kogu vahemaa
def resDistance ():
globaalne totalDistance totalDistance = 0
# Funktsioon, mida kasutatakse kahe koordinaadi vahelise kauguse leidmiseks
# kasutab leidmiseks Haversine'i valemit. # Sisendpunktid on tüübid
def coorDistance (punkt1, punkt2):
# Maa ligikaudne raadius kilomeetrites maaRadius = 6373,0
lat1 = punkt1 [0]
lon1 = punkt1 [1]
lat2 = punkt2 [0]
lon2 = punkt2 [1]
kaugusLon = lon2 - lon1
kaugusLat = lat2 - lat1
# Haversine a
a = sin (kaugusLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (kaugusLon/2) ** 2
# Haversine c
c = 2 * atan2 (sqrt (a), sqrt (1-a))
# Teisenda km miilideks
kaugus = (earthRadius * c) * 0,62137
if (kaugus <= 0,01): tagasisõit 0,00 muu: tagasitulek (kaugus, 3)
# Funktsioon kiiruse kuvamiseks ekraanil
def dispSpeed ():
globaalne SpeedVar # Asetage kaugus muutujale ekraanile draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Funktsioon kauguse kuvamiseks ekraanil
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Funktsioon kuvab ekraanil asukoha, nõuab töötamiseks Internetti
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Sõnastiku kasutamine lülitite avaldiste jäljendamiseks
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Ekraani väljundfunktsioon
def väljund ():
# Globaalse muutuja kasutamine kuva jaoksIndex globaalne kuvaIndex # Ekraani puhastamine ja tausta disp. Rakendamine täitke = (255, 0, 0))
# Kõnede funktsioon sõltub displayIndexi väärtusest
dispOptions [displayIndex] ()
# Kustutatakse, kui muu meetod töötab
# koha kauguse muutuja ekraanil
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #kiiruse muutuja ekraanil #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Ekraanivärskenduste kuvamine
displayButton = 18 # BCM Nõel vaarika pi
resetButton = 23 # BCM Nõel vaarika pi
nupuvajutus = vale
def checkDisplay ():
globaalne nupp Vajutage globaalset kuvaIndex kui (bGPIO.input (displayButton) ja mitte nupuvajutus): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) ja buttonPress): print (" Ikka vajutatud ") else: buttonPress = False
# GPS -i seadistamine
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
taimerPeriood =.5
# Indeksiväärtus kuvari kuvaleIndex = 0 proovige: uue_andme jaoks gps_socketis: kui uus_andmed: data_stream.unpack (uus_andmed) kui data_stream. TPV ['lat']! = 'N/a': print (data_stream. TPV ['kiirus')], 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 pole veel ühendatud') time.sleep (.1) time.sleep (.8), välja arvatud KeyboardInterrupt: gps_socket.close () print (' / nLõpetas kasutaja ctrl+c ')
Ülaltoodud kood on vaid üks näide meie süsteemi kodeerimisest ja ma olen lisanud video selle süsteemi toimimise kohta.