Kazalo:
- 1. korak: Začnite
- Korak: Povežite modul GPS z Raspberry Pi
- 3. korak: Pridobite podatke iz sprejemniškega modula GPS
- 4. korak: Priključite zaslon na Raspberry Pi
- 5. korak: Nastavite zaslon za delo z Raspberry Pi
- Korak 6: Nastavite državne naprave za prikaz informacij GPS na zaslonu
- 7. korak: Uvedimo naš GPS sistem
Video: GPS sistem: 7 korakov
2025 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2025-01-10 13:48
Ustvarjalec projekta: Carlos Gomez
Zanesljiv navigacijski sistem je najpomembnejši za vse, ki poskušajo potovati in raziskovati svet.
Najpomembnejši vidik, ki omogoča delovanje navigacijskega sistema, je zmogljivost GPS, vgrajena v sistem. Sistem GPS omogoča vsakomur, da spremlja njihovo lokacijo in hitrost, da prikaže natančne podatke o uporabniku in uporabniku natančno predstavi, kje je in kako daleč je od svoje lokacije.
Globalni sistem za določanje položaja (GPS) je mreža satelitov, ki krožijo okoli Zemlje na nadmorski višini približno 20 000 km. Vsakdo, ki ima napravo GPS, lahko sprejema radijske signale, ki jih oddajajo sateliti, in jih lahko uporablja na kakršen koli način. Ne glede na vašo lokacijo na planetu bi vam morali biti na voljo vsaj štiri GPS. S pomočjo metode, imenovane 3-D trilateracija, lahko naprava GPS s pomočjo treh satelitov določi lokacijo naprave na Zemlji. Vsak od treh satelitov pošlje signal napravi in naprava določi njegovo oddaljenost od satelita. Z vsakim od treh izračunov razdalje lahko naprava zdaj natančno določi svojo lokacijo na Zemlji in to vrne uporabniku.
Sistem GPS, ki ga bomo ustvarili, bo lahko sledil uporabnikovim lokacijam tako, da bo dobil uporabnikove koordinate na Zemlji in naredil nekaj izračunov, da bo vrnil uporabnikovo hitrost, lokacijo in prevoženo razdaljo.
1. korak: Začnite
Za začetek tega projekta moramo najprej zbrati vse ustrezne materiale
1: Raspberry Pi Zero W
2: GPS sprejemnik
3: 1,8 TFT 128 x 160 LCD SPI zaslon
4: ~ 11 žic
Gumbi 5: 2
6: 2x 1k in 2x 10k upori za izvlečne gumbe
7: Krušna deska
Ta projekt bo uporabljal zatiče GPIO Raspberry Pi, zato bomo morali za razvoj našega projekta vse povezati s ploščo za kruh. Predpostavlja se tudi, da je spajkanje na vseh zatičih opravljeno in končano, preden nadaljujete in povežete vse naše dele.
Korak: Povežite modul GPS z Raspberry Pi
Za uporabo našega sistema GPS boste morali priključke Tx in Rx iz modula GPS priključiti na pin 14 in 15 GPIO na Raspberry Pi. Tx pin GPS sprejemnika gre na Rx pin Pi in Rx pin GPS sprejemnika gre na Tx pin Raspberry pi.
Sprejemnik GPS, prikazan na slikah, potrebuje uporabo 3,3 V, priključke 3,3 V pa lahko priključite na pravilno napetost, hkrati pa ozemljitveni zatič priključite na ozemljitev.
3. korak: Pridobite podatke iz sprejemniškega modula GPS
Za sprejem podatkov iz sprejemnika GPS v Raspberry Pi moramo dovoliti, da pravilna vtičnica bere iz vrat UART. Če beremo neobdelane podatke, bi morali ustvariti lastno knjižnico za razčlenjevanje, vendar lahko v tem scenariju izkoristimo daemon GPS, ki teče v ozadju, da pomagamo razčleniti podatke in jih poslati v Raspberry Pi
Da bi to dosegli, lahko odpremo terminal na Raspberry Pi in izvedemo kodo:
sudo apt-get posodobitev
sudo apt-get install gpsd gpsd-clients python-gps
To bi moralo poskrbeti za prenos.
Ko je dokončana, moramo onemogočiti sistemsko storitev gpsd z izvajanjem naslednjih ukazov:
sudo systemctl stop gpsd.socket
sudo systemctl onemogoči gpsd.socket
Če želite kdaj omogočiti privzeto sistemsko storitev gpsd, lahko za obnovitev izvedete naslednje ukaze:
sudo systemctl omogoči gpsd.socket
sudo systemctl zaženite gpsd.socket
Zdaj moramo zagnati demon gpsd in ga z vnosom usmeriti na vrata UART
sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock
Zdaj lahko zaženemo spodnji ukaz in si ogledamo vse podatke, ki plavajo!
cgps -s
4. korak: Priključite zaslon na Raspberry Pi
Ko imamo sprejemnik GPS in delamo z Raspberry Pi, lahko zaslon povežemo z Raspberry Pi. Za povezovanje LCD zaslona z Raspberry Pi bomo uporabili 5 žic in še 4 zatiče za priključitev glavnega napajanja in LED na zaslonu.
Priložil sem fotografijo zaslona TFT, ki ga uporabljam, vendar bi to moralo delovati z zasloni podobne velikosti in zgradbe.
Priključite LED in GND na ozemljitev ter LED+ in VCC na 3.3V.
Priključite pin RESET na zaslonu na pin 25 na plošči Pi.
Priključite A0 na pin 24 na plošči Pi.
Priključite pin SDA na pin MOSI na plošči Pi.
Priključite SCK pin na LCD zaslonu na Pi ploščo.
Priključite pin CS na pin 8 na plošči Pi.
5. korak: Nastavite zaslon za delo z Raspberry Pi
Za nastavitev zaslona moramo uporabiti knjižnico ST7735, ki jo najdemo v tem repo:
Knjižnica zaslona Python ST7735
Ko imamo to knjižnico zaslona nameščeno v naš sistem Raspberry Pi, lahko zdaj nadaljujemo z nastavitvijo primerne datoteke, ki potrjuje, da naše prejšnje ožičenje deluje pravilno.
Ustvarite datoteko z naslovom example.py in vanjo vstavite naslednje besedilo skupaj z vzorčno sliko po vaši izbiri v isto mapo
uvoz ST7735 kot TFTimport Adafruit_GPIO kot GPIO uvoz Adafruit_GPIO. SPI kot SPI
ŠIRINA = 128
VISINA = 160 SPEED_HZ = 4000000
# Konfiguracija Raspberry Pi.
# To so zatiči, potrebni za povezavo LCD -ja z Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Ustvarite razred zaslona TFT LCD.
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Začetek prikaza.
disp.begin () disp.reset ()
# Naložite sliko.
newData = 0x42 disp.command (newData) print ('Nalaganje slike …') image = Image.open ('cat.jpg')
# Spremenite velikost slike in jo zavrtite tako, da se ujema z zaslonom.
image = image.rotate (270).resize ((WIDTH, HEIGHT))
# Na terminal bo natisnilo, da naš program nariše našo sliko
print ('Risbena slika')
# Ta funkcija bo prikazala našo sliko na zaslonu
disp.display (slika)
Ta datoteka bo nastavila konfiguracijo Raspberry Pi za LCD zaslon, knjižnica pa bo našo sliko pretvorila v mapo in jo prikazala na zaslonu.
Korak 6: Nastavite državne naprave za prikaz informacij GPS na zaslonu
Za nastavitev našega sistema GPS bomo uporabili 5 različnih državnih strojev.
Zaslon Spremeni stanje stanja:
Ta avtomat bo nadzoroval prikaz, odvisno od vnosa z gumbi. To stori tako, da spremeni spremenljivko, ki omogoča, da python izkoristi prednosti tipkanja rac in pokliče pravilno funkcijo za prikaz, odvisno od klicane funkcije
Stroj stanja hitrosti:
Ta državni stroj bo izvajal trenutno hitrost glede na lokacijo posameznikov. S tem se izvede vsak cikel ure za sistem GPS
Stroj izhodnega stanja:
Ta stroj stanja bo določil izhod na podlagi spremenljivke, ki jo stroj za stanje stanja prikaza določi kot trenutni prikaz.
Stroj na daljavo
Ta avtomat za stanje izvaja vsak cikel ure in določi skupno razdaljo, ki jo prevozi uporabnik, in ko enkrat pritisnete gumb za ponastavitev, ponastavi trenutno prehojeno razdaljo.
Stroj za lokacijo stanja:
Ta državni stroj vrne trenutno lokacijo uporabnika z uporabo koordinat, ki jih modul GPS vrne o uporabniku. Ta državni stroj je odvisen od internetne povezave uporabnikov.
7. korak: Uvedimo naš GPS sistem
Ko imamo naš GPS modul, ki pošilja podatke na naš Raspberry Pi, in LCD zaslon, na katerem so prikazane informacije, lahko začnemo programirati naš GPS sistem. Za kodiranje našega sistema GPS bom uporabil končne avtomate prejšnjega koraka
## Glavna datoteka za navigacijski sistem # # # #
# Knjižnice za risanje slik
from PIL import Image from PIL import ImageDraw from PIL import ImageFont
# Knjižnica za krmilnik ST7737
uvozite ST7735 kot TFT
# Knjižnica za GPIO za Raspberry Pi
uvoz Adafruit_GPIO kot GPIO uvoz Adafruit_GPIO. SPI kot SPI
# Knjižnica za GPS
#import gpsd from gps3 import gps3
# Knjižnica za čas
čas uvoza
# Knjižnica za iskanje razdalje med dvema točkama
iz matematike uvoz sin, cos, sqrt, atan2, radiani
# Uvozi knjižnico Rpi za uporabo gumbov za preklapljanje menijev in ponastavitev
# uvozite RPi. GPIO kot bGPIO
# Nastavitveni zatiči za gumbe
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)
# uvoz knjižnice geopy za geokodiranje
# # Za to je potreben dostop do interneta
iz geopy.geocoders uvoz Nominatim
geolocator = Nominatim ()
# Konstante za sistem
#################################
ŠIRINA = 128
VISINA = 160 SPEED_HZ = 4000000
# Konfiguracijski zatiči Raspberry Pi
DC = 24 # A0 na zaslonu TFT RST = 25 # Ponastavi pin na zaslonu TFT SPI_PORT = 0 # Vrata SPI na malini pi, SPI0 SPI_DEVICE = 0 # Izbira podrejenega na rapsberry pi, CE0
# Ustvarite objekt TFT LCD zaslona
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Začetek prikaza
disp.begin ()
# Ozadje bo nastavljeno na zeleno
#disp.clear ((0, 255, 0))
# Počistite bel zaslon in ga prikažite
#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()
# Spremenljivke umestitve hitrosti, zemljepisne širine in dolžine
#currentS = "Trenutna hitrost:" # niz hitrosti #totalDis = "Skupna razdalja:" # niz razdalje #currentLoc = "Trenutna lokacija:" # Niz lokacije
# Koordinate razdalje x in y
distX = 10 distY = 20
pointsList =
# Koordinate hitrosti x in y
hitrost X = 10 hitrost Y = 20
# Lokacija x in y coordiantes
locX = 10 locY = 20
# Pretvori iz m/s v mph
pretvorbena vrednost = 2,24
# Funkcija posodabljanja hitrosti, vrne niz
SpeedVar = 0
def speedFunc (): globalni SpeedVar SpeedText = data_stream. TPV ['speed'] if (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = round (SpeedText, 1) # return (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
location = geolocator.reverse (reverseString)
return (location.address)
# Funkcija posodabljanja zemljepisne širine, vrne plavajočo vrednost
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (round (Latitude, 4))
# Funkcija posodabljanja zemljepisne dolžine, vrne niz
def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): return 0 else: return float (round (Longitude, 4))
# Funkcija razdalje vrne TOTAL prevoženo razdaljo
totalDistance = 0
def distFunc ():
globalna skupna razdalja newLat = latFunc () newLon = lonFunc () if (newLat == 0 ali 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]) # vrnitev totalDistance
# Ponastavi skupno razdaljo
def resDistance ():
globalna skupna razdalja totalna razdalja = 0
# Funkcija za iskanje razdalje med dvema koordinatama
# uporablja Haversine formulo za iskanje. # Vhodne točke so nabor
def coorDistance (točka 1, točka 2):
# Približen polmer Zemlje v kilometrih zemljeRadius = 6373,0
lat1 = točka1 [0]
lon1 = točka1 [1]
lat2 = točka2 [0]
lon2 = točka 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))
# Pretvorite km v milje
razdalja = (earthRadius * c) * 0,62137
if (razdalja <= 0,01): vrnitev 0,00 drugače: vrnitev kroga (razdalja, 3)
# Funkcija prikaza hitrosti na zaslonu
def dispSpeed ():
globalni SpeedVar # Postavite razdaljo na spremenljivko na zaslonu draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Funkcija za prikaz razdalje na zaslonu
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Funkcija prikaza mesta na zaslonu zahteva delovanje interneta
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Uporaba slovarja za posnemanje stavkov stikala
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Izhodna funkcija zaslona
def izhod ():
# Uporaba globalne spremenljivke za displayIndex global displayIndex # Čiščenje zaslona in uporaba ozadja disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), izpolni = (255, 0, 0))
# Funkcija klicev je odvisna od vrednosti displayIndex
dispOptions [displayIndex] ()
# Izbriše se, če deluje druga metoda
# spremenljivka razdalje na zaslonu
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #spremenljivko hitrosti postavite na zaslon #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Prikaz posodobitev zaslona disp.display ()
displayButton = 18 # BCM Pin na malini pi
resetButton = 23 # BCM Pin na malini pi
buttonPress = False
def checkDisplay ():
globalni gumbPritisnite globalni prikazIndex if (bGPIO.input (displayButton) in ne buttonPress): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) in buttonPress): print (" Še vedno pritisnjeno ") else: buttonPress = False
# Nastavitev GPS -a
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
timerPeriod =.5
# Vrednost indeksa za display displayIndex = 0 poskusite: za nove_podatke v gps_socket: če so novi_podatki: data_stream.unpack (novi_podatki), če je 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 še ni povezan') time.sleep (.1) time.sleep (.8) razen KeyboardInterrupt: gps_socket.close () print (' / nZakonča uporabnik ctrl+c ')
Zgornja koda je le en primer, kako kodirati naš sistem, in vdelal sem videoposnetek o tem, kako ta sistem deluje.