Indholdsfortegnelse:

GPS -system: 7 trin
GPS -system: 7 trin

Video: GPS -system: 7 trin

Video: GPS -system: 7 trin
Video: ШИПЫ НЕ ТОРМОЗЯТ НА ЛЬДУ! ТЕСТ 2024, Oktober
Anonim
GPS -system
GPS -system
GPS -system
GPS -system
GPS -system
GPS -system

Projektskaber: Carlos Gomez

At have et pålideligt navigationssystem er altafgørende for alle, der forsøger at rejse og udforske verden.

Det vigtigste aspekt, der tillader navigationssystemet at fungere, er GPS -funktionen, der er integreret inde i systemet. GPS -systemet giver alle mulighed for at holde styr på deres placering og hastighed for at vise nøjagtige oplysninger om brugeren og give brugeren en præcis repræsentation af, hvor de er, og hvor langt de er fra deres placering.

Global Positioning System (GPS) er et netværk af satellitter, der kredser om jorden i en højde af omkring 20.000 km. Alle med en GPS -enhed kan modtage de radiosignaler, som satellitterne sender og er i stand til at udnytte dem på hvilken som helst måde, det er nødvendigt. Uanset hvor din placering på planeten skal mindst fire GPS være tilgængelige for dig når som helst. Ved hjælp af en metode kaldet 3D-trilateration kan en GPS-enhed bruge tre satellitter for at bestemme enhedens placering på jorden. Hver af de tre satellitter sender et signal til enheden, og enheden bestemmer dens afstand til satellitten. Ved hjælp af hver af de tre afstandsberegninger er enheden nu i stand til at lokalisere sin placering på Jorden, og den returnerer den til brugeren.

Det GPS -system, vi vil oprette, vil kunne spore brugerens placeringer ved at hente brugerens koordinater på Jorden og foretage nogle beregninger for at returnere brugerens hastighed, placering og tilbagelagte afstand.

Trin 1: Kom godt i gang

Kom godt i gang
Kom godt i gang
Kom godt i gang
Kom godt i gang
Kom godt i gang
Kom godt i gang
Kom godt i gang
Kom godt i gang

For at komme i gang med dette projekt skal vi først samle alle de korrekte materialer

1: Raspberry Pi Zero W

2: GPS -modtager

3: 1,8 TFT 128 x 160 LCD SPI -skærm

4: ~ 11 ledninger

5: 2 knapper

6: 2x 1k og 2x 10k modstande til nedtrapningsknapper

7: Brødbræt

Dette projekt vil bruge Raspberry Pi's GPIO -ben, og som sådan skal vi forbinde alt med et brødbræt for at udvikle vores projekt. Det antages også, at lodningen på alle stifterne er udført og færdig, før vi går videre og forbinder alle vores dele.

Trin 2: Tilslut GPS -modul til Raspberry Pi

Tilslut GPS -modul til Raspberry Pi
Tilslut GPS -modul til Raspberry Pi
Tilslut GPS -modul til Raspberry Pi
Tilslut GPS -modul til Raspberry Pi

Til brug af vores GPS -system skal du forbinde Tx- og Rx -benene fra GPS -modulet til GPIO pin 14 og 15 på Raspberry Pi. GPS -modtagerens Tx -pin går til Rx -stiften på Pi og Rx -stiften på GPS -modtageren går til Tx -stiften på Raspberry pi.

GPS -modtageren vist på billederne kræver, at der bruges 3,3V, og du kan slutte 3,3V -benene til den korrekte spænding, mens du tilslutter jordstiften til jorden.

Trin 3: Modtag data fra GPS -modtagermodul

Modtag data fra GPS -modtagermodul
Modtag data fra GPS -modtagermodul

For at modtage data fra GPS -modtageren til Raspberry Pi skal vi give de korrekte stik til at læse fra UART -portene. Læsning af rådata ville kræve, at vi opretter vores eget parsingsbibliotek, men i dette scenario kan vi drage fordel af en GPS -dæmon, der kører i baggrunden, for at hjælpe med at analysere dataene og overføre dem til Raspberry Pi

For at opnå dette kan vi åbne en terminal på Raspberry Pi og udføre koden:

sudo apt-get opdatering

sudo apt-get install gpsd gpsd-clients python-gps

Dette burde tage sig af download for os.

Når det er fuldført, skal vi deaktivere gpsd -systemtjenesten ved at køre følgende kommandoer:

sudo systemctl stop gpsd.socket

sudo systemctl deaktiver gpsd.socket

Hvis du nogensinde vil aktivere standard gpsd -systemtjeneste, kan du køre følgende kommandoer for at gendanne den:

sudo systemctl aktiver gpsd.socket

sudo systemctl start gpsd.socket

Nu skal vi starte gpsd -dæmonen og pege den på UART -portene ved at indtaste

sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock

Vi kan nu køre kommandoen herunder og se alle data flyde ind!

cgps -s

Trin 4: Tilslut skærmen til Raspberry Pi

Tilslut skærmen til Raspberry Pi
Tilslut skærmen til Raspberry Pi
Tilslut skærmen til Raspberry Pi
Tilslut skærmen til Raspberry Pi

Når vi har vores GPS -modtager op og arbejder med Raspberry Pi, kan vi derefter tilslutte skærmen til Raspberry Pi. Vi vil bruge 5 ledninger til at forbinde vores LCD -skærm til Raspberry Pi og yderligere 4 ben til at forbinde hovedstrøm og LED på skærmen.

Jeg har inkluderet et foto af den TFT -skærm, jeg bruger, men dette burde fungere med skærme af lignende størrelse og build.

Tilslut LED- og GND til jord, og tilslut LED+ og VCC til 3,3V.

Tilslut RESET -pin på skærmen til pin 25 på Pi -kortet.

Tilslut A0 til pin 24 på Pi -kortet.

Tilslut SDA -stiften til MOSI -stiften på Pi -kortet.

Tilslut SCK -stiften på LCD -skærmen til Pi -kortet.

Tilslut CS -stiften til pin 8 på Pi -kortet.

Trin 5: Konfigurer skærmen til at fungere med Raspberry Pi

Opsæt skærm til at fungere med Raspberry Pi
Opsæt skærm til at fungere med Raspberry Pi

For at konfigurere skærmen skal vi bruge ST7735 -biblioteket, der findes i denne repo:

Python ST7735 skærmbibliotek

Når vi har dette displaybibliotek installeret på vores Raspberry Pi -system, kan vi nu fortsætte med at oprette en eksempelfil for at bekræfte, at vores tidligere ledninger fungerer korrekt.

Opret en fil med titlen example.py og indsæt følgende tekst derinde sammen med et eksempelbillede efter eget valg i den samme mappe

import ST7735 som TFTimport Adafruit_GPIO som GPIO import Adafruit_GPIO. SPI som SPI

BREDDE = 128

HØJDE = 160 SPEED_HZ = 4000000

# Raspberry Pi -konfiguration.

# Dette er de ben, der er nødvendige for at forbinde LCD'en til Raspberry Pi

DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0

# Opret TFT LCD -skærmklasse.

disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))

# Initialiser visning.

disp.begin () disp.reset ()

# Indlæs et billede.

newData = 0x42 disp.command (newData) print ('Indlæser billede …') image = Image.open ('cat.jpg')

# Ændre størrelsen på billedet, og drej det, så det matcher displayet.

image = image.rotate (270). resize ((WIDTH, HEIGHT))

# Vil udskrive til terminalen, at vores program tegner vores billede på skærmen

print ('Tegning af billede')

# Denne funktion viser vores billede på skærmen

disp. display (billede)

Denne fil opsætter Raspberry Pi -konfigurationen til LCD -skærmen, og biblioteket konverterer vores billede i mappen og viser det på skærmen.

Trin 6: Konfigurer tilstandsmaskiner til visning af GPS -oplysninger på displayet

Opsæt tilstandsmaskiner til visning af GPS -oplysninger på displayet
Opsæt tilstandsmaskiner til visning af GPS -oplysninger på displayet
Opsæt tilstandsmaskiner til visning af GPS -oplysninger på displayet
Opsæt tilstandsmaskiner til visning af GPS -oplysninger på displayet
Opsæt tilstandsmaskiner til visning af GPS -oplysninger på displayet
Opsæt tilstandsmaskiner til visning af GPS -oplysninger på displayet

Vi vil bruge 5 forskellige statsmaskiner, mens vi implementerer vores opgavediagram til opsætning af vores gps -system.

Display Skift tilstandsmaskine:

Denne tilstandsmaskine styrer, hvilken der skal vises afhængigt af vores knapindgang. Det gør det ved at ændre en variabel, der gør det muligt for python at drage fordel af andetypning og kalde den korrekte funktion til visning afhængigt af den kaldte funktion

Hastighedstilstandsmaskine:

Denne tilstandsmaskine vil udføre den aktuelle hastighed afhængigt af individets placering. Dette vil udføre hver urcyklus for GPS -systemet

Output tilstand maskine:

Denne tilstandsmaskine bestemmer output baseret på den variabel, som displayet ændrer tilstandsmaskine bestemmer for at være det aktuelle display.

Afstandstilstandsmaskine

Denne tilstandsmaskine udfører hver urcyklus og bestemmer den samlede distance, som brugeren har tilbagelagt, og når nulstillingsknappen trykkes, nulstilles den aktuelle tilbagelagte afstand.

Placering tilstandsmaskine:

Denne tilstandsmaskine returnerer brugerens aktuelle placering ved hjælp af koordinater, som GPS -modulet returnerer om brugeren. Denne tilstandsmaskine er afhængig af brugernes internetforbindelse.

Trin 7: Lad os implementere vores GPS -system

Når vi har vores GPS -modul, der sender oplysninger til vores Raspberry Pi og vores LCD -skærm, der viser oplysninger om det, kan vi derefter begynde at programmere vores GPS -system. Jeg vil bruge det foregående trin's endelige tilstandsmaskiner til at kode vores GPS -system

## Hovedfil til navigationssystem # # # #

# Biblioteker til tegning af billeder

fra PIL import Billede fra PIL import ImageDraw fra PIL import ImageFont

# Bibliotek til ST7737 controller

import ST7735 som TFT

# Bibliotek til GPIO til Raspberry Pi

import Adafruit_GPIO som GPIO import Adafruit_GPIO. SPI som SPI

# Bibliotek til GPS

#importer gpsd fra gps3 import gps3

# Bibliotek for tiden

importtid

# Bibliotek til at finde afstand mellem to punkter

fra matematik import synd, cos, sqrt, atan2, radianer

# Importer Rpi -bibliotek for at bruge knapper til at skifte menuer og nulstille

# importer RPi. GPIO som bGPIO

# Opsætningsnåle til knapper

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 geopi bibliotek til geokodning

# # Internetadgang er nødvendig for at dette kan fungere

fra geopy.geocoders importerer Nominatim

geolocator = Nominatim ()

# Konstanter for system

#################################

BREDDE = 128

HØJDE = 160 SPEED_HZ = 4000000

# Raspberry Pi konfigurationsnåle

DC = 24 # A0 på TFT -skærmen RST = 25 # Nulstil pin på TFT -skærm SPI_PORT = 0 # SPI -port på hindbær pi, SPI0 SPI_DEVICE = 0 # Slave select på rapsberry pi, CE0

# Opret TFT LCD -displayobjekt

disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))

# Initialiser visning

disp.begin ()

# Baggrund indstilles til grøn

#disp.clear ((0, 255, 0))

# Ryd skærmen til hvid og vis den

#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (0, 0, 255)) #disp. Display ()

# Placeringsvariabler for hastighed, breddegrad, længdegrad

#currentS = "Current Speed:" # Speed string #totalDis = "Total Distance:" # Distance string #currentLoc = "Current Location:" # Location string

# Afstand x og y koordinater

distX = 10 distY = 20

pointList =

# Hastighed x og y koordinater

speedX = 10 speedY = 20

# Placering x og y coordiantes

locX = 10 locY = 20

# Konverterer fra m/s til mph

conversionVal = 2,24

# Hastighedsopdateringsfunktion, returnerer streng

SpeedVar = 0

def speedFunc (): global 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)

# Latitude opdateringsfunktion, returnerer floatværdi

def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (round (Latitude, 4))

# Opdateringsfunktion i længdegrad, returnerer streng

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): return 0 else: return float (round (Longitude, 4))

# Distance funktion returnerer TOTAL tilbagelagt distance

totalDistance = 0

def distFunc ():

global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 eller 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]) # return totalDistance

# Nulstiller total afstand

def resDistance ():

global totalDistance totalDistance = 0

# Funktion bruges til at finde afstand mellem to koordinater

# bruger Haversines formel til at finde. # Inputpunkter er en tuple

def coorDistance (punkt1, punkt2):

# Jordens omtrentlige radius i kilometer earthRadius = 6373,0

lat1 = punkt1 [0]

lon1 = punkt1 [1]

lat2 = punkt2 [0]

lon2 = punkt2 [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))

# Konverter km til Miles

afstand = (earthRadius * c) * 0,62137

hvis (afstand <= 0,01): returner 0,00 andet: returrunde (afstand, 3)

# Funktion til visning af hastighed på skærmen

def dispSpeed ():

global SpeedVar # Placer afstanden på variablen på skærmen draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Funktion til visning af afstand på skærmen

def dispDistance ():

draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))

# Funktion ti visningsplacering på skærmen, kræver internet for at fungere

def dispLocation ():

draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))

# Brug af ordbog til at efterligne switch -udsagn

dispOptions = {

0: dispSpeed, 1: dispDistance, 2: dispLocation}

# Skærmoutputfunktion

def output ():

# Brug af global variabel til displayIndex global displayIndex # Rydning af skærm og anvendelse af baggrund disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), omrids = (255, 0, 0), fill = (255, 0, 0))

# Opkald fungerer afhængigt af displayIndex -værdi

dispOptions [displayIndex] ()

# Vil slette, hvis en anden metode virker

# placere afstandsvariabel på skærmen

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #placer hastighedsvariabel på skærmen #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Vis opdateringer til skærmdisplay ()

displayButton = 18 # BCM Pin på hindbær pi

resetButton = 23 # BCM Pin på hindbær pi

buttonPress = Falsk

def checkDisplay ():

global knap Tryk på global displayIndex hvis (bGPIO.input (displayButton) og ikke buttonPress): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) og buttonPress): print (" Stadig trykket ") else: buttonPress = Falsk

# Opsætning gps

gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()

timerPeriod =.5

# Indeksværdi for display displayIndex = 0 prøv: for new_data i gps_socket: if new_data: data_stream.unpack (new_data) if 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 () hvis (bGPIO.input (resetButton)): resDistance () print ('GPS endnu ikke tilsluttet') time.sleep (.1) time.sleep (.8) undtagen KeyboardInterrupt: gps_socket.close () print (' / nAfsluttet af brugeren ctrl+c ')

Koden ovenfor er kun et eksempel på, hvordan vi koder vores system, og jeg har integreret en video om, hvordan dette system fungerer.

Anbefalede: