Sadržaj:
- Korak 1: Početak
- Korak 2: Povežite GPS modul s Raspberry Pi
- Korak 3: Preuzmite podatke iz modula GPS prijamnika
- Korak 4: Priključite zaslon na Raspberry Pi
- Korak 5: Postavite zaslon za rad s Raspberry Pi
- Korak 6: Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
- Korak 7: Omogućimo implementaciju našeg GPS sustava
Video: GPS sustav: 7 koraka
2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-10 13:47
Autor projekta: Carlos Gomez
Pouzdani navigacijski sustav najvažniji je za svakoga tko pokušava putovati i istraživati svijet.
Najvažniji aspekt koji omogućuje rad navigacijskog sustava je GPS funkcija ugrađena u sustav. GPS sustav omogućuje svakome da prati njihovu lokaciju i brzinu kako bi prikazao točne podatke o korisniku i korisniku dao točan prikaz gdje se nalazi i koliko je udaljen od svoje lokacije.
Globalni sustav pozicioniranja (GPS) mreža je satelita koji kruže oko Zemlje na nadmorskoj visini od oko 20 000 km. Svatko s GPS uređajem može primiti radio signale koje sateliti emitiraju i može ih koristiti na bilo koji način. Gdje god se nalazili na planeti, u svakom trenutku bi vam trebala biti dostupna najmanje četiri GPS -a. Pomoću metode 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. Pomoću svakog od tri izračuna udaljenosti uređaj sada može točno odrediti svoje mjesto na Zemlji i to vraća korisniku.
GPS sustav koji ćemo stvoriti moći će pratiti lokacije korisnika dobivanjem korisnikovih koordinata na Zemlji i obavljanjem nekih izračuna kako bi se vratila brzina, lokacija i pređena udaljenost korisnika.
Korak 1: Početak
Kako bismo započeli ovaj projekt, prvo ćemo morati prikupiti sve ispravne materijale
1: Malina Pi Zero W
2: GPS prijemnik
3: 1,8 TFT 128 x 160 LCD SPI zaslon
4: ~ 11 žica
Gumbi 5: 2
6: 2x 1k i 2x 10k otpornici za povlačenje tipki
7: Daska za kruh
Ovaj će projekt koristiti Raspberry Pi GPIO pinove i kao takvi ćemo morati povezati sve s pločom za kruh kako bismo razvili naš projekt. Također se pretpostavlja da je lemljenje svih pinova obavljeno i završeno prije nego što krenete dalje i spojite sve naše dijelove.
Korak 2: Povežite GPS modul s Raspberry Pi
Za korištenje našeg GPS sustava 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 prijamnik prikazan na slikama zahtijeva upotrebu 3.3V, a pinove od 3.3V možete spojiti na ispravan napon, dok pin za uzemljenje spajate na masu.
Korak 3: Preuzmite podatke iz modula GPS prijamnika
Kako bismo primali podatke s GPS prijamnika na Raspberry Pi, moramo dopustiti čitanje ispravnih utičnica s UART portova. Čitanje sirovih podataka zahtijevalo bi od nas da stvorimo vlastitu biblioteku za raščlanjivanje, no u ovom scenariju možemo iskoristiti GPS demona 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 kôd:
sudo apt-get ažuriranje
sudo apt-get install gpsd gpsd-clients python-gps
Ovo bi se trebalo pobrinuti za preuzimanje umjesto nas.
Nakon što je dovršena, 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ćiti gpsd.socket
sudo systemctl start gpsd.socket
Sada moramo pokrenuti gpsd daemon i upisati ga na UART portove
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 prijamnik i počnemo raditi s Raspberry Pi, možemo povezati zaslon s Raspberry Pi. Upotrijebit ćemo 5 žica za povezivanje 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.
Spojite RESET pin na ekranu na 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: Postavite zaslon za rad s Raspberry Pi
Za postavljanje zaslona moramo koristiti biblioteku ST7735 koja se nalazi u ovom repo -u:
Knjižnica zaslona Python ST7735
Nakon što ovu biblioteku zaslona instaliramo na naš Raspberry Pi sustav, sada možemo nastaviti s postavljanjem datoteke primjera kako bismo potvrdili da naše prethodno ožičenje radi ispravno.
Napravite 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 BRZINA_HZ = 4000000
# Konfiguracija Raspberry Pi.
# Ovo su pinovi potrebni za povezivanje LCD -a s Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Stvorite klasu TFT LCD zaslona.
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 terminal da naš program iscrtava našu sliku na ekranu
print ('Slika za crtanje')
# Ova funkcija prikazuje našu sliku na ekranu
disp.display (slika)
Ova datoteka će postaviti Raspberry Pi konfiguraciju za LCD zaslon, a knjižnica će pretvoriti našu sliku u mapu i prikazati je na ekranu.
Korak 6: Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
Koristit ćemo 5 različitih državnih strojeva, dok ćemo implementirati naš dijagram zadataka za postavljanje našeg GPS sustava.
Zaslon Promjena stanja stroja:
Ovaj državni stroj će kontrolirati koji će se prikazivati ovisno o unosu s gumbima. To čini promjenom varijable koja omogućuje pythonu da iskoristi prednosti patkarskog upisivanja i pozivanjem ispravne funkcije za prikaz ovisno o pozvanoj funkciji
Stroj stanja brzine:
Ovaj državni stroj izvršit će trenutnu brzinu ovisno o lokaciji pojedinaca. Ovo će izvesti svaki ciklus takta za GPS sustav
Stroj izlaznog stanja:
Ovaj stroj za stanje će odrediti izlaz na temelju varijable za koju stroj za prikaz stanja promjene prikaza utvrđuje da je trenutni prikaz.
Stroj stanja udaljenosti
Ovaj stroj 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 stanja:
Ovaj stroj za stanje vraća trenutnu lokaciju korisnika, koristeći koordinate koje GPS modul vraća o korisniku. Ovaj državni stroj ovisi o internetskoj vezi korisnika.
Korak 7: Omogućimo implementaciju našeg GPS sustava
Nakon što naš GPS modul šalje informacije na naš Raspberry Pi i naš LCD zaslon s prikazom podataka na njemu, tada možemo početi programirati naš GPS sustav. Koristit ću strojeve konačnog stanja iz prethodnog koraka kako bih kodirao naš GPS sustav
## Glavna datoteka za navigacijski sustav # # # #
# Knjižnice za crtanje slika
from PIL import Image from PIL import ImageDraw from PIL import ImageFont
# Knjižnica za kontroler ST7737
uvozite ST7735 kao TFT
# Knjižnica za GPIO za Raspberry Pi
uvoz Adafruit_GPIO kao GPIO uvoz Adafruit_GPIO. SPI kao SPI
# Knjižnica za GPS
#import gpsd s gps3 uvoz gps3
# Knjižnica za vrijeme
vrijeme uvoza
# Knjižnica za pronalaženje udaljenosti između dvije točke
iz matematike uvoz sin, cos, sqrt, atan2, radijani
# Uvezite Rpi knjižnicu za korištenje gumba za prebacivanje izbornika i vraćanje na zadano
# uvoz RPi. GPIO kao bGPIO
# Pinovi za postavljanje gumba
način rada bGPIO.set (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 geokodiranje
# # Pristup internetu je neophodan da bi ovo funkcioniralo
iz geopy.geokoderi uvoze Nominatim
geolokator = Nominatim ()
# Konstante za sustav
#################################
ŠIRINA = 128
VISINA = 160 BRZINA_HZ = 4000000
# Raspberry Pi konfiguracijske pinove
DC = 24 # A0 na TFT ekranu RST = 25 # Resetirajte 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
# Izradite objekt TFT LCD zaslona
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 postavljena na zelenu
#disp.clear ((0, 255, 0))
# Očistite zaslon do bijelog i 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 ()
# 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
poeni bodova =
# Brzine koordinata x i y
brzinaX = 10 brzinaY = 20
# Location x and y coordiantes
locX = 10 locY = 20
# Pretvara iz m/s u mph
pretvorbena vrijednost = 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)
povrat (lokacija.adresa)
# 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 zemljopisne 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 prijeđenu udaljenost
ukupna udaljenost = 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 točke su torka
def coorDistance (točka 1, točka 2):
# Približni polumjer Zemlje u kilometrima earthRadius = 6373,0
lat1 = točka1 [0]
lon1 = točka 1 [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 u milje
udaljenost = (earthRadius * c) * 0,62137
if (udaljenost <= 0,01): povratak 0,00 drugo: povratak krug (udaljenost, 3)
# Funkcija za prikaz brzine na zaslonu
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 prikaza mjesta 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 zaslona
def izlaz ():
# Upotreba globalne varijable za displayIndex globalni displayIndex # Brisanje zaslona 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 zaslonu
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #promjenjiva brzina mjesta na ekranu #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Prikaz ažuriranja zaslona disp.display ()
displayButton = 18 # BCM Pin na malini pi
resetButton = 23 # BCM Pin na malini pi
buttonPress = Netačno
def checkDisplay ():
globalni gumbPritisnite 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š uvijek pritisnuto ") else: buttonPress = False
# Postavljanje GPS -a
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
vremenski period =.5
# Vrijednost indeksa za display 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 spojen') time.sleep (.1) time.sleep (.8) osim KeyboardInterrupt: gps_socket.close () print (' / nZavršeno od strane korisnika ctrl+c ')
Gornji kôd samo je jedan primjer kako kodirati naš sustav, a ja sam ugradio video o tome kako ovaj sustav radi.