Kazalo:

GPS sistem: 7 korakov
GPS sistem: 7 korakov

Video: GPS sistem: 7 korakov

Video: GPS sistem: 7 korakov
Video: Где купить квартиру. Москва. Позиционирование #дизайнер #подключ #отделка #дизайн #ремонт #москва 2024, Oktober
Anonim
GPS sistem
GPS sistem
GPS sistem
GPS sistem
GPS sistem
GPS sistem

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četek
Začetek
Začetek
Začetek
Začetek
Začetek
Začetek
Začetek

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

Povežite modul GPS z Raspberry Pi
Povežite modul GPS z Raspberry Pi
Povežite modul GPS z Raspberry Pi
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

Pridobite podatke iz sprejemniškega modula GPS
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

Priključite zaslon na Raspberry Pi
Priključite zaslon na Raspberry Pi
Priključite zaslon na Raspberry Pi
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

Nastavite zaslon za delo z Raspberry Pi
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

Nastavite stroje za prikaz informacij GPS na zaslonu
Nastavite stroje za prikaz informacij GPS na zaslonu
Nastavite stroje za prikaz informacij GPS na zaslonu
Nastavite stroje za prikaz informacij GPS na zaslonu
Nastavite stroje za prikaz informacij GPS na zaslonu
Nastavite stroje 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.

Priporočena: