Sadržaj:

GPS sustav: 7 koraka
GPS sustav: 7 koraka

Video: GPS sustav: 7 koraka

Video: GPS sustav: 7 koraka
Video: Simplify your drive with DriveSmart™ 66/76/86 GPS navigators – Garmin® Retail Training 2024, Listopad
Anonim
GPS sustav
GPS sustav
GPS sustav
GPS sustav
GPS sustav
GPS sustav

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

Početak rada
Početak rada
Početak rada
Početak rada
Početak rada
Početak rada
Početak rada
Početak rada

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

Spojite GPS modul na Raspberry Pi
Spojite GPS modul na Raspberry Pi
Spojite GPS modul na Raspberry Pi
Spojite GPS modul na 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

Primajte podatke iz modula GPS prijemnika
Primajte podatke iz modula GPS prijemnika

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

Spojite zaslon na Raspberry Pi
Spojite zaslon na Raspberry Pi
Spojite zaslon na Raspberry Pi
Spojite 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

Postavljanje zaslona za rad s Raspberry Pi
Postavljanje zaslona 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

Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
Postavljanje strojeva stanja za prikaz GPS informacija na zaslonu
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.

Preporučeni: