Sadržaj:
- Korak 1: Početak
- Korak 2: Povežite GPS modul s Raspberry Pi
- Korak 3: Preuzmite podatke iz modula GPS prijemnika
- Korak 4: Priključite zaslon na Raspberry Pi
- Korak 5: Podesite zaslon za rad s Raspberry Pi
- Korak 6: Postavite državne mašine za prikaz GPS informacija na ekranu
- Korak 7: Omogućimo implementaciju našeg GPS sistema
Video: GPS sistem: 7 koraka
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-10 13:46
Kreator projekta: Carlos Gomez
Pouzdani navigacijski sistem najvažniji je za svakoga tko pokušava putovati i istraživati svijet.
Najvažniji aspekt koji omogućava rad navigacionog sistema je GPS funkcija ugrađena u sistem. GPS sustav omogućuje svakome da prati njihovu lokaciju i brzinu kako bi prikazao točne podatke o korisniku i korisniku dao tačan prikaz gdje se nalazi i koliko je udaljen od svoje lokacije.
Globalni sistem pozicioniranja (GPS) je mreža satelita koji kruže oko Zemlje na nadmorskoj visini od oko 20 000 km. Svako ko ima GPS uređaj može primiti radio signale koje sateliti emituju i može ih koristiti na bilo koji način koji je potreban. Gdje god se nalazili na planeti, u svakom trenutku bi vam trebala biti dostupna najmanje četiri GPS -a. Koristeći metodu koja se naziva 3-D trilateracija, GPS uređaj može koristiti tri satelita kako bi odredio lokaciju uređaja na Zemlji. Svaki od tri satelita šalje signal uređaju i uređaj određuje udaljenost od satelita. Koristeći svaki od tri proračuna udaljenosti, uređaj sada može odrediti svoju lokaciju na Zemlji i to vraća korisniku.
GPS sistem koji ćemo stvoriti moći će pratiti lokacije korisnika tako što će dobiti korisničke koordinate na Zemlji i izvršiti neke proračune kako bi vratio brzinu, lokaciju i pređenu udaljenost korisnika.
Korak 1: Početak
Da bismo započeli ovaj projekt, prvo ćemo morati prikupiti sve ispravne materijale
1: Raspberry Pi Zero W
2: GPS prijemnik
3: 1.8 TFT 128 x 160 LCD SPI ekran
4: ~ 11 žica
Dugmad 5: 2
6: 2x 1k i 2x 10k otpornici za dugmad na dole
7: Ploča za hleb
Ovaj projekt će koristiti Raspberry Pi GPIO pinove i kao takvi ćemo morati sve povezati s pločom za razvoj kruha kako bismo razvili naš projekt. Također se pretpostavlja da je lemljenje svih pinova obavljeno i završeno prije nego što krenete dalje i povežete sve naše dijelove.
Korak 2: Povežite GPS modul s Raspberry Pi
Za upotrebu našeg GPS sistema morat ćete spojiti Tx i Rx pinove iz GPS modula na GPIO pin 14 i 15 na Raspberry Pi. Tx pin GPS prijemnika ide na Rx pin Pi, a Rx pin GPS prijemnika ide na Tx pin Raspberry pi.
GPS prijemnik prikazan na slikama zahtijeva upotrebu 3,3 V za upotrebu i možete priključiti pinove od 3,3 V na odgovarajući napon, dok pin za uzemljenje spajate na masu.
Korak 3: Preuzmite podatke iz modula GPS prijemnika
Da bismo mogli primati podatke s GPS prijemnika na Raspberry Pi moramo omogućiti ispravnim utičnicama čitanje s UART portova. Čitanje sirovih podataka zahtijevalo bi od nas da stvorimo vlastitu biblioteku za raščlanjivanje, ali u ovom scenariju možemo iskoristiti prednost GPS daemona koji radi u pozadini kako bismo lakše raščlanili podatke i prenijeli ih na Raspberry Pi
Da bismo to postigli, možemo otvoriti terminal na Raspberry Pi -u i izvršiti kod:
sudo apt-get update
sudo apt-get install gpsd gpsd-clients python-gps
Ovo bi se umjesto nas trebalo pobrinuti za preuzimanje.
Kada se dovrši, moramo onemogućiti gpsd sistemsku uslugu pokretanjem sljedećih naredbi:
sudo systemctl stop gpsd.socket
sudo systemctl onemogući gpsd.socket
Ako ikada želite omogućiti zadanu gpsd sistemsku uslugu, možete pokrenuti sljedeće naredbe da biste je vratili:
sudo systemctl omogući gpsd.socket
sudo systemctl pokrenite gpsd.socket
Sada moramo pokrenuti gpsd demon i usmjeriti ga na UART portove ulaskom
sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock
Sada možemo pokrenuti naredbu ispod i vidjeti sve podatke koji plutaju!
cgps -s
Korak 4: Priključite zaslon na Raspberry Pi
Nakon što postavimo GPS prijemnik i počnemo raditi s Raspberry Pi, tada možemo povezati zaslon s Raspberry Pi. Upotrijebit ćemo 5 žica za povezivanje našeg LCD zaslona s Raspberry Pi i još 4 pina za povezivanje glavnog napajanja i LED diode na ekranu.
Uključio sam fotografiju TFT ekrana koji koristim, ali ovo bi trebalo funkcionirati sa ekranima slične veličine i izrade.
Spojite LED i GND na masu, a LED+ i VCC na 3.3V.
Priključite pin RESET na ekranu u pin 25 na Pi ploči.
Spojite A0 na pin 24 na Pi ploči.
Spojite SDA pin na MOSI pin na Pi ploči.
Spojite SCK pin na LCD ekranu na Pi ploču.
Spojite CS pin na pin 8 na Pi ploči.
Korak 5: Podesite zaslon za rad s Raspberry Pi
Za postavljanje ekrana moramo koristiti biblioteku ST7735 koja se nalazi u ovom repo -u:
Python ST7735 Biblioteka ekrana
Nakon što instaliramo ovu biblioteku prikaza na naš Raspberry Pi sistem, sada možemo nastaviti s postavljanjem datoteke primjera kako bismo potvrdili da naše prethodno ožičenje radi ispravno.
Kreirajte datoteku pod nazivom example.py i umetnite sljedeći tekst tamo zajedno sa uzorkom slike po vašem izboru u istu mapu
uvoz ST7735 kao TFTimport Adafruit_GPIO kao GPIO uvoz Adafruit_GPIO. SPI kao SPI
ŠIRINA = 128
VISINA = 160 SPEED_HZ = 4000000
# Konfiguracija Raspberry Pi.
# Ovo su pinovi potrebni za povezivanje LCD -a sa Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Kreirajte klasu TFT LCD ekrana.
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Inicijalizacija prikaza.
disp.begin () disp.reset ()
# Učitajte sliku.
newData = 0x42 disp.command (newData) print ('Učitavanje slike …') image = Image.open ('cat.jpg')
# Promijenite veličinu slike i rotirajte je tako da odgovara ekranu.
image = image.rotate (270).resize ((WIDTH, HEIGHT))
# Ispisat će na terminalu da naš program iscrtava našu sliku na ekranu
print ('Crtanje slike')
# Ova funkcija će prikazati našu sliku na ekranu
disp.display (slika)
Ova datoteka će postaviti Raspberry Pi konfiguraciju za LCD ekran, a biblioteka će pretvoriti našu sliku u mapu i prikazati je na ekranu.
Korak 6: Postavite državne mašine za prikaz GPS informacija na ekranu
Koristit ćemo 5 različitih državnih mašina, dok implementiramo naš dijagram zadataka za postavljanje našeg GPS sistema.
Displej Promena stanja mašine:
Ova mašina za stanje će kontrolirati šta će se prikazivati ovisno o našem unosu tipkama. To čini promjenom varijable koja omogućuje pythonu da iskoristi prednosti patkarskog kucanja i pozivanjem ispravne funkcije za prikaz ovisno o pozvanoj funkciji
Mašina stanja brzine:
Ova mašina za stanje će izvršiti trenutnu brzinu ovisno o lokaciji pojedinaca. Ovo će izvesti svaki ciklus takta za GPS sistem
Izlazna mašina stanja:
Ova mašina stanja će odrediti izlaz na osnovu varijable koju mašina stanja stanja prikaza utvrđuje kao trenutni prikaz.
Stanje mašina
Ova mašina za stanje izvršava svaki ciklus takta i određuje ukupnu udaljenost koju je korisnik prešao, a nakon što se pritisne tipka za poništavanje, resetirat će se trenutna prijeđena udaljenost.
Mapa stanja lokacije:
Ova mašina stanja vraća trenutnu lokaciju korisnika, koristeći koordinate koje GPS modul vraća o korisniku. Ova državna mašina ovisi o internetskoj vezi korisnika.
Korak 7: Omogućimo implementaciju našeg GPS sistema
Nakon što naš GPS modul šalje informacije na naš Raspberry Pi i naš LCD ekran s prikazom informacija na njemu, tada možemo početi programirati naš GPS sistem. Koristiću mašine iz konačnog stanja iz prethodnog koraka kako bih kodirao naš GPS sistem
## Glavna datoteka za navigacijski sistem # # # #
# Biblioteke za crtanje slika
iz PIL uvoza Slike iz PIL uvoza ImageDraw iz PIL uvoza ImageFonta
# Biblioteka za kontroler ST7737
uvozite ST7735 kao TFT
# Biblioteka za GPIO za Raspberry Pi
uvoz Adafruit_GPIO kao GPIO uvoz Adafruit_GPIO. SPI kao SPI
# Biblioteka za GPS
#import gpsd sa gps3 uvoz gps3
# Biblioteka za vrijeme
vreme uvoza
# Biblioteka za pronalaženje udaljenosti između dvije točke
iz matematike uvoz sin, cos, sqrt, atan2, radijani
# Uvezite Rpi biblioteku za korištenje dugmadi za prebacivanje menija i resetovanje
# uvozite RPi. GPIO kao bGPIO
# Pinovi za podešavanje dugmadi
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 geopy library za Geocoding
# # Pristup internetu je neophodan da bi ovo funkcioniralo
from geopy.geocoders import Nominatim
geolokator = Nominatim ()
# Konstante za sistem
#################################
ŠIRINA = 128
VISINA = 160 SPEED_HZ = 4000000
# Raspberry Pi konfiguracijski pinovi
DC = 24 # A0 na TFT ekranu RST = 25 # Reset pin na TFT ekranu SPI_PORT = 0 # SPI port na malini pi, SPI0 SPI_DEVICE = 0 # Odabir podređenog uređaja na rapsberry pi, CE0
# Kreirajte objekat TFT LCD ekrana
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Inicijalizacija prikaza
disp.begin ()
# Pozadina će biti zelena
#disp.clear ((0, 255, 0))
# Očistite ekran bijelim i prikazite
#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()
# Varijable položaja brzine, zemljopisne širine i dužine
#currentS = "Trenutna brzina:" # Niz brzine #totalDis = "Ukupna udaljenost:" # Niz udaljenosti #currentLoc = "Trenutna lokacija:" # Niz lokacije
# Udaljenost x i y koordinate
distX = 10 distY = 20
bodovaLista =
# Brzine koordinata x i y
speedX = 10 speedY = 20
# Location x and y coordiantes
locX = 10 locY = 20
# Pretvara iz m/s u mph
conversionVal = 2.24
# Funkcija ažuriranja brzine, vraća niz
SpeedVar = 0
def speedFunc (): globalni SpeedVar SpeedText = data_stream. TPV ['speed'] if (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = okrugli (SpeedText, 1) # return (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
location = geolocator.reverse (reverseString)
return (location.address)
# Funkcija ažuriranja Latitude, vraća float vrijednost
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (okruglo (Latitude, 4))
# Funkcija ažuriranja geografske dužine, vraća niz
def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): return 0 else: return float (okruglo (Longitude, 4))
# Funkcija udaljenosti vraća UKUPNO pređenu udaljenost
totalDistance = 0
def distFunc ():
globalna ukupna udaljenost newLat = latFunc () newLon = lonFunc () if (newLat == 0 ili 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]) # povratak totalDistance
# Vraća ukupnu udaljenost
def resDistance ():
globalna ukupna udaljenost ukupna udaljenost = 0
# Funkcija koja se koristi za pronalaženje udaljenosti između dvije koordinate
# koristi Haversine formulu za pronalaženje. # Ulazne tačke su tuple
def coorDistance (tačka1, tačka2):
# Približni polumjer Zemlje u kilometrima earthRadius = 6373,0
lat1 = točka 1 [0]
lon1 = bod1 [1]
lat2 = točka2 [0]
lon2 = bod2 [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 u milje
udaljenost = (earthRadius * c) * 0.62137
if (udaljenost <= 0,01): povratak 0,00 drugo: povratak krug (udaljenost, 3)
# Funkcija za prikaz brzine na ekranu
def dispSpeed ():
globalni SpeedVar # Postavite udaljenost na varijablu na ekranu draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Funkcija za prikaz udaljenosti na ekranu
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Funkcija prikazivanja lokacije na ekranu zahtijeva rad Interneta
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Korištenje rječnika za oponašanje naredbi switch
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Izlazna funkcija ekrana
def izlaz ():
# Korištenje globalne varijable za displayIndex globalni displayIndex # Brisanje ekrana i primjena pozadinske disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), ispuni = (255, 0, 0))
# Funkcija poziva ovisno o displayIndex vrijednosti
dispOptions [displayIndex] ()
# Brisat će se ako druga metoda radi
# mjesto varijable udaljenosti na ekranu
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #postavite varijablu brzine na ekranu #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Prikaz ažuriranja na ekranu disp.display ()
displayButton = 18 # BCM Pin na malini pi
resetButton = 23 # BCM Pin na malini pi
buttonPress = Netačno
def checkDisplay ():
globalno dugmePritisnite globalni displayIndex if (bGPIO.input (displayButton), a ne buttonPress): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) i buttonPress): print (" Još pritisnuto ") else: buttonPress = False
# Postavljanje GPS -a
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
timerPeriod =.5
# Vrijednost indeksa za prikaz displayIndex = 0 pokušaj: za nove_podatke u gps_socket: ako su novi_podaci: data_stream.unpack (novi_dati) ako 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 još nije povezan') time.sleep (.1) time.sleep (.8) osim KeyboardInterrupt: gps_socket.close () print (' / nZavršeno od strane korisnika ctrl+c ')
Gornji kôd je samo jedan primjer kako kodirati naš sistem, a ja sam ugradio video o tome kako ovaj sistem funkcionira.