Indholdsfortegnelse:
- Trin 1: Kom godt i gang
- Trin 2: Tilslut GPS -modul til Raspberry Pi
- Trin 3: Modtag data fra GPS -modtagermodul
- Trin 4: Tilslut skærmen til Raspberry Pi
- Trin 5: Konfigurer skærmen til at fungere med Raspberry Pi
- Trin 6: Konfigurer tilstandsmaskiner til visning af GPS -oplysninger på displayet
- Trin 7: Lad os implementere vores GPS -system
Video: GPS -system: 7 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:29
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
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
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
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
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
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
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:
Arduino bil omvendt parkering alarmsystem - Trin for trin: 4 trin
Arduino bil omvendt parkering alarmsystem. Trin for trin: I dette projekt vil jeg designe en simpel Arduino bil omvendt parkeringssensorkreds ved hjælp af Arduino UNO og HC-SR04 ultralydssensor. Dette Arduino -baserede bilomvendt alarmsystem kan bruges til en autonom navigation, robotafstand og andre rækkevidde
Trin for trin pc -bygning: 9 trin
Trin for trin PC Building: Supplies: Hardware: MotherboardCPU & CPU -køler PSU (strømforsyningsenhed) Opbevaring (HDD/SSD) RAMGPU (ikke påkrævet) CaseTools: Skruetrækker ESD -armbånd/mathermal pasta m/applikator
Tre højttalerkredsløb -- Trin-for-trin vejledning: 3 trin
Tre højttalerkredsløb || Trin-for-trin vejledning: Højttalerkredsløb styrker lydsignalerne, der modtages fra miljøet til MIC og sender det til højttaleren, hvorfra forstærket lyd produceres. Her vil jeg vise dig tre forskellige måder at lave dette højttalerkredsløb på:
Akustisk levitation med Arduino Uno trin for trin (8 trin): 8 trin
Akustisk levitation med Arduino Uno Step-by Step (8-trin): ultralyds lydtransducere L298N Dc kvindelig adapter strømforsyning med en han-DC-pin Arduino UNOBreadboard Sådan fungerer det: Først uploader du kode til Arduino Uno (det er en mikrokontroller udstyret med digital og analoge porte til konvertering af kode (C ++)
Sådan tilsluttes DeLorme Earthmate GPS LT-20 til din Google Earth for et fantastisk GPS-sporingskort .: 5 trin
Sådan tilsluttes DeLorme Earthmate GPS LT-20 til din Google Earth for et fantastisk GPS-sporingskort .: Jeg viser dig, hvordan du tilslutter en GPS-enhed til det populære Google Earth-program uden at bruge Google Earth Plus. Jeg har ikke et stort budget, så jeg kan garantere, at dette bliver så billigt som muligt