Sisällysluettelo:

GPS -järjestelmä: 7 vaihetta
GPS -järjestelmä: 7 vaihetta

Video: GPS -järjestelmä: 7 vaihetta

Video: GPS -järjestelmä: 7 vaihetta
Video: Самолет с турбиной - добавил GPS и начал делать шасси 2024, Lokakuu
Anonim
GPS -järjestelmä
GPS -järjestelmä
GPS -järjestelmä
GPS -järjestelmä
GPS -järjestelmä
GPS -järjestelmä

Projektin luoja: Carlos Gomez

Luotettavan navigointijärjestelmän käyttö on ensiarvoisen tärkeää kaikille, jotka yrittävät matkustaa ja tutkia maailmaa.

Tärkein näkökohta, joka mahdollistaa navigointijärjestelmän toiminnan, on järjestelmän sisään upotettu GPS -ominaisuus. GPS -järjestelmän avulla kuka tahansa voi seurata sijaintiaan ja nopeuttaan näyttääkseen tarkat tiedot käyttäjästä ja antaakseen käyttäjälle tarkan kuvan siitä, missä he ovat ja kuinka kaukana he ovat sijainnistaan.

Global Positioning System (GPS) on satelliittiverkosto, joka kiertää maapalloa noin 20 000 km: n korkeudessa. Jokainen, jolla on GPS -laite, voi vastaanottaa satelliittien lähettämät radiosignaalit ja pystyy hyödyntämään niitä tarpeen mukaan. Minne tahansa sijaintisi planeetalla, vähintään neljän GPS: n pitäisi olla käytettävissäsi milloin tahansa. Käyttämällä 3-D trilateration -menetelmää GPS-laite pystyy käyttämään kolmea satelliittia määrittääkseen laitteen sijainnin maan päällä. Jokainen kolmesta satelliitista lähettää signaalin laitteelle ja laite määrittää sen etäisyyden satelliitista. Käyttämällä kutakin kolmesta etäisyyslaskelmasta laite pystyy nyt määrittämään sijaintinsa maapallolla ja palauttaa sen käyttäjälle.

Luomamme GPS -järjestelmä pystyy seuraamaan käyttäjän sijainteja hankkimalla käyttäjän koordinaatit maapallolta ja tekemällä joitain laskelmia palauttaakseen käyttäjän nopeuden, sijainnin ja ajetun matkan.

Vaihe 1: Aloittaminen

Päästä alkuun
Päästä alkuun
Päästä alkuun
Päästä alkuun
Päästä alkuun
Päästä alkuun
Päästä alkuun
Päästä alkuun

Jotta voimme aloittaa tämän projektin, meidän on ensin kerättävä kaikki oikeat materiaalit

1: Raspberry Pi Zero W

2: GPS -vastaanotin

3: 1,8 TFT 128 x 160 LCD SPI -näyttö

4: ~ 11 johtoa

5: 2 painikkeet

6: 2x 1k ja 2x 10k vastukset alaspainikkeille

7: Leipälauta

Tämä projekti käyttää Raspberry Pi: n GPIO -nastoja, ja siksi meidän on yhdistettävä kaikki leipälautaan, jotta voimme kehittää projektiamme. Oletetaan myös, että kaikkien nastojen juottaminen on tehty ja valmis ennen kuin siirrytään ja liitetään kaikki osat.

Vaihe 2: Yhdistä GPS -moduuli Raspberry Pi -laitteeseen

Liitä GPS -moduuli Raspberry Pi -laitteeseen
Liitä GPS -moduuli Raspberry Pi -laitteeseen
Liitä GPS -moduuli Raspberry Pi -laitteeseen
Liitä GPS -moduuli Raspberry Pi -laitteeseen

Jotta voit käyttää GPS -järjestelmäämme, sinun on kytkettävä Tx- ja Rx -nastat GPS -moduulista Raspberry Pi -laitteen GPIO -nastoihin 14 ja 15. GPS -vastaanottimen Tx -nasta menee Pi: n Rx -nastaan ja GPS -vastaanottimen Rx -nasta Raspberry pi: n Tx -nastaan.

Kuvissa näkyvä GPS -vastaanotin vaatii 3,3 V: n käyttöä, ja voit liittää 3,3 V: n nastat oikeaan jännitteeseen samalla kun liität maadoitusnavan maahan.

Vaihe 3: Vastaanota tietoja GPS -vastaanotinmoduulista

Vastaanota tietoja GPS -vastaanotinmoduulista
Vastaanota tietoja GPS -vastaanotinmoduulista

Jotta voimme vastaanottaa tietoja GPS -vastaanottimesta Raspberry Pi -laitteeseen, meidän on sallittava oikeiden pistorasioiden lukeminen UART -porteista. Raakatietojen lukeminen edellyttäisi, että luomme oman jäsennyskirjasto, mutta tässä tilanteessa voimme hyödyntää taustalla olevaa GPS -demonia, joka auttaa jäsentämään tiedot ja lähettämään ne Raspberry Pi: lle

Tämän saavuttamiseksi voimme avata päätelaitteen Raspberry Pi -laitteella ja suorittaa koodin:

sudo apt-get päivitys

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

Tämän pitäisi huolehtia lataamisesta meille.

Kun se on valmis, meidän on poistettava gpsd -järjestelmäpalvelu käytöstä suorittamalla seuraavat komennot:

sudo systemctl stop gpsd.socket

sudo systemctl poista gpsd.socket käytöstä

Jos haluat ottaa gpsd -oletuspalvelun käyttöön, voit palauttaa sen suorittamalla seuraavat komennot:

sudo systemctl mahdollistaa gpsd.socket

sudo systemctl käynnistä gpsd.socket

Nyt meidän on käynnistettävä gpsd -demoni ja osoitettava se UART -portteihin syöttämällä

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

Voimme nyt suorittaa alla olevan komennon ja nähdä kaikki tiedot kelluvan!

cgps -s

Vaihe 4: Liitä näyttö Raspberry Pi: hen

Liitä näyttö Raspberry Pi: hen
Liitä näyttö Raspberry Pi: hen
Liitä näyttö Raspberry Pi: hen
Liitä näyttö Raspberry Pi: hen

Kun olemme vastaanottaneet GPS -vastaanottimen ja työskentelemässä Raspberry Pi: n kanssa, voimme yhdistää näytön Raspberry Pi -laitteeseen. Käytämme 5 johtoa LCD -näytön yhdistämiseen Raspberry Pi -laitteeseen ja vielä 4 nastaa päävirtalähteen ja LED -valon kytkemiseen näytöllä.

Olen lisännyt kuvan käyttämästäni TFT -näytöstä, mutta tämän pitäisi toimia samankokoisten ja -rakenteisten näyttöjen kanssa.

Kytke LED- ja GND-liittimet maahan ja kytke LED+ ja VCC 3,3 V: n jännitteeseen.

Liitä näytön RESET -nasta Pi -levyn nastaan 25.

Liitä A0 Pi -levyn nastaan 24.

Liitä SDA -nasta Pi -levyn MOSI -nastaan.

Liitä LCD -näytön SCK -nasta Pi -korttiin.

Liitä CS -nasta Pi -levyn nastaan 8.

Vaihe 5: Aseta näyttö toimimaan Raspberry Pi: n kanssa

Asenna näyttö toimimaan Raspberry Pi: n kanssa
Asenna näyttö toimimaan Raspberry Pi: n kanssa

Näytön asetusten määrittämiseen on käytettävä tässä repossa olevaa ST7735 -kirjastoa:

Python ST7735 -näyttökirjasto

Kun tämä näyttökirjasto on asennettu Raspberry Pi -järjestelmäämme, voimme nyt perustaa esimerkkitiedoston varmistaaksemme, että edellinen johdotus toimii oikein.

Luo tiedosto nimeltä example.py ja lisää siihen seuraava teksti yhdessä valitsemasi esimerkkikuvan kanssa samaan kansioon

Tuo ST7735 TFT: nä Tuo Adafruit_GPIO GPIO: na Tuo Adafruit_GPIO. SPI SPI: nä

LEVEYS = 128

KORKEUS = 160 SPEED_HZ = 4000000

# Raspberry Pi -kokoonpano.

# Nämä ovat nastat, joita tarvitaan nestekidenäytön liittämiseen Raspberry Pi -laitteeseen

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

# Luo TFT LCD -näyttöluokka.

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

# Alusta näyttö.

disp.begin () disp.reset ()

# Lataa kuva.

newData = 0x42 disp.command (newData) print ('Ladataan kuvaa …') image = Image.open ('cat.jpg')

# Muuta kuvan kokoa ja kierrä sitä niin, että se vastaa näyttöä.

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

# Tulostaa päätelaitteelle, että ohjelmamme piirtää kuvan ruudulle

tulosta ('Piirrä kuva')

# Tämä toiminto näyttää kuvan näytöllä

näyttö (kuva)

Tämä tiedosto määrittää Raspberry Pi -määrityksen nestekidenäyttöä varten ja kirjasto muuntaa kuvan kansioon ja näyttää sen näytöllä.

Vaihe 6: Määritä tilakoneet näyttämään GPS -tiedot näytöllä

Määritä tilakoneet näyttämään GPS -tiedot näytöllä
Määritä tilakoneet näyttämään GPS -tiedot näytöllä
Määritä tilakoneet näyttämään GPS -tiedot näytöllä
Määritä tilakoneet näyttämään GPS -tiedot näytöllä
Määritä tilakoneet näyttämään GPS -tiedot näytöllä
Määritä tilakoneet näyttämään GPS -tiedot näytöllä

Käytämme 5 eri tilakonetta, kun toteutamme tehtäväkaaviamme GPS -järjestelmän asentamiseen.

Näyttö Vaihda tilan kone:

Tämä tilakone ohjaa näytettävää näppäimistöstä riippuen. Se tekee tämän muuttamalla muuttujaa, jonka avulla python voi hyödyntää ankan kirjoittamista ja kutsumalla näytettäväksi oikean funktion kutsutusta funktiosta riippuen

Nopeustilan kone:

Tämä tilakone suorittaa nykyisen nopeuden yksilöiden sijainnin mukaan. Tämä suorittaa kaikki GPS -järjestelmän kellojaksot

Lähtötilakone:

Tämä tilakone määrittää lähdön muuttujan perusteella, jonka näytön vaihtotilan kone määrittää nykyiseksi näytöksi.

Etäisyyden tilakone

Tämä tilakone suorittaa jokaisen kellosyklin ja määrittää käyttäjän kokonaismatkan, ja kun nollauspainiketta painetaan, nollataan nykyinen ajettu matka.

Sijaintikone:

Tämä tilakone palauttaa käyttäjän nykyisen sijainnin käyttämällä koordinaatteja, jotka GPS -moduuli palauttaa käyttäjästä. Tämä tilakone on riippuvainen käyttäjien Internet -yhteydestä.

Vaihe 7: Ota GPS -järjestelmä käyttöön

Kun GPS -moduulimme lähettää tietoja Raspberry Pi -laitteeseemme ja LCD -näyttö näyttää tietoja, voimme aloittaa GPS -järjestelmän ohjelmoinnin. Käytän edellisen vaiheen äärellisiä tilakoneita GPS -järjestelmämme koodaamiseen

## Navigointijärjestelmän päätiedosto # # # #

# Kirjastot kuvien piirtämiseen

PIL -tuonnista Kuva PIL -tuonnista ImageDraw PIL -tuonnista ImageFont

# Kirjasto ST7737 -ohjaimelle

Tuo ST7735 TFT -muodossa

# GPP -kirjasto Raspberry Pi: lle

Tuo Adafruit_GPIO GPIO: na Tuo Adafruit_GPIO. SPI SPI: nä

# GPS -kirjasto

#tuoda gpsd gps3: sta tuoda gps3

# Kirjastossa aikaa

tuonnin aika

# Kirjasto etäisyyden löytämiseksi kahden pisteen välillä

matematiikan tuonnista sin, cos, sqrt, atan2, radiaanit

# Tuo RPI -kirjasto painikkeilla valikkojen vaihtamiseen ja nollaamiseen

# tuo RPi. GPIO nimellä bGPIO

# Asenna nastat painikkeille

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)

# Tuo geokoodikirjasto geokoodausta varten

# # Internet -yhteys on tarpeen, jotta tämä toimisi

geopy.geocoders tuo Nominatimin

geolocator = Nominatim ()

# Vakiot järjestelmälle

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

LEVEYS = 128

KORKEUS = 160 SPEED_HZ = 4000000

# Raspberry Pi -määritystapit

DC = 24 # A0 TFT -näytöllä RST = 25 # Reset pin in the TFT screen SPI_PORT = 0 # SPI -portti vadelmalla pi, SPI0 SPI_DEVICE = 0 # Slave select on rapsberry pi, CE0

# Luo TFT LCD -näyttöobjekti

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

# Alusta näyttö

disp.begin ()

# Tausta on vihreä

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

# Tyhjennä näyttö valkoiseksi ja näyttö

#disp.clear ((255, 255, 255)) draw = disp.draw () #draw. suorakulmio ((0, 10, 127, 150), ääriviivat = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()

# Nopeus, leveysaste ja pituusaste sijoittelumuuttujat

#currentS = "Nykyinen nopeus:" # Nopeusmerkkijono #totalDis = "Kokonaismatka:" # Etäisyysmerkkijono #currentLoc = "Nykyinen sijainti:" # Sijaintijono

# Etäisyys x ja y -koordinaatit

distX = 10 distY = 20

pointsList =

# Nopeus x- ja y -koordinaatit

nopeusX = 10 nopeuttaY = 20

# Sijainti x ja y -koordinaatit

locX = 10 locY = 20

# Muuntaa m/s mph

conversionVal = 2.24

# Nopeuspäivitystoiminto, palauttaa merkkijonon

SpeedVar = 0

def speedFunc (): yleinen SpeedVar SpeedText = data_stream. TPV ['nopeus'], jos (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = pyöreä (SpeedText, 1) # return (SpeedText)

def locationFunc ():

latLoc = str (latFunc ()) lonLoc = str (lonFunc ())

reverseString = latLoc + "," + lonLoc

location = geolocator.reverse (reverseString)

paluu (location.address)

# Latitude -päivitystoiminto palauttaa kelluvan arvon

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

# Pituusasteen päivitystoiminto, palauttaa merkkijonon

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

# Etäisyystoiminto palauttaa YHTEENSÄ ajetun matkan

totalDistance = 0

def distFunc ():

global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 or 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

# Nollaa kokonaismatkan

def resDistance ():

global totalDistance totalDistance = 0

# Toiminto, jolla etsitään etäisyyttä kahden koordinaatin välillä

# käyttää Haversinen kaavaa löytääkseen. # Syöttöpisteet ovat tuple

def coorDistance (kohta1, kohta2):

# Maan likimääräinen säde kilometreinä earthRadius = 6373,0

lat1 = piste1 [0]

lon1 = piste1 [1]

lat2 = piste2 [0]

lon2 = piste2 [1]

distanceLon = lon2 - lon1

distanceLat = lat2 - lat1

# Haversine a

a = sin (etäisyysLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (distanceLon/2) ** 2

# Haversine c

c = 2 * atan2 (neliö (a), neliö (1-a))

# Muunna km mailiksi

etäisyys = (earthRadius * c) * 0,62137

jos (etäisyys <= 0,01): paluu 0,00 muuta: paluu kierros (etäisyys, 3)

# Toiminto näyttää nopeuden näytöllä

def dispSpeed ():

globaali SpeedVar # Aseta etäisyys muuttujalle ruudulla draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Toiminto etäisyyden näyttämiseksi näytöllä

def dispDistance ():

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

# Toiminto ti näyttää sijainnin näytöllä, vaatii Internetin toimiakseen

def dispLocation ():

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

# Sanakirjan käyttäminen kytkinlausekkeiden jäljittelemiseen

dispOptions = {

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

# Näytön tulostustoiminto

def lähtö ():

# Globaalin muuttujan käyttäminen displayIndex global displayIndex # Näytön tyhjentäminen ja taustan disp.clear ((255, 255, 255)) piirtäminen.suorakulmio ((0, 10, 127, 150), ääriviivat = (255, 0, 0), täyttö = (255, 0, 0))

# Puhelut -toiminto näytönIndex -arvon mukaan

dispOptions [displayIndex] ()

# Poistuu, jos toinen menetelmä toimii

# paikka etäisyyden muuttuja näytöllä

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #paikan nopeuden muuttuja näytöllä #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Näytön päivitykset näytön näyttöön ()

displayButton = 18 # BCM Pin on vadelma pi

resetButton = 23 # BCM Pin on vadelma pi

buttonPress = False

def checkDisplay ():

globaali painike Paina globaalia näyttöIndex jos (bGPIO.input (displayButton) eikä painike): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) ja buttonPress): print (" Edelleen painettuna ") else: buttonPress = False

# Asenna GPS

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

timerPeriod =.5

# Indeksiarvo näytön näytölleIndex = 0 try: for new_data in 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 () if (bGPIO.input (resetButton)): resDistance () print ('GPS not connected yet') time.sleep (.1) time.sleep (.8) paitsi KeyboardInterrupt: gps_socket.close () print (' / nKäyttäjä ctrl+c ')

Yllä oleva koodi on vain yksi esimerkki järjestelmämme koodaamisesta, ja olen upottanut videon tämän järjestelmän toiminnasta.

Suositeltava: