Sisällysluettelo:
- Vaihe 1: Aloittaminen
- Vaihe 2: Yhdistä GPS -moduuli Raspberry Pi -laitteeseen
- Vaihe 3: Vastaanota tietoja GPS -vastaanotinmoduulista
- Vaihe 4: Liitä näyttö Raspberry Pi: hen
- Vaihe 5: Aseta näyttö toimimaan Raspberry Pi: n kanssa
- Vaihe 6: Määritä tilakoneet näyttämään GPS -tiedot näytöllä
- Vaihe 7: Ota GPS -järjestelmä käyttöön
Video: GPS -järjestelmä: 7 vaihetta
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-10 13:46
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
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
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
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
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
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ä
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.