Turinys:

GPS sistema: 7 žingsniai
GPS sistema: 7 žingsniai

Video: GPS sistema: 7 žingsniai

Video: GPS sistema: 7 žingsniai
Video: GPS, How does it work? | ICT #12 2024, Spalio mėn
Anonim
GPS sistema
GPS sistema
GPS sistema
GPS sistema
GPS sistema
GPS sistema

Projekto kūrėjas: Carlosas Gomezas

Turėti patikimą navigacijos sistemą yra svarbiausia visiems, kurie bando keliauti ir tyrinėti pasaulį.

Svarbiausias aspektas, leidžiantis veikti navigacijos sistemai, yra sistemos galimybė, įdėta į sistemą. GPS sistema leidžia bet kam sekti savo buvimo vietą ir greitį, kad būtų rodoma tiksli informacija apie naudotoją ir vartotojas galėtų tiksliai parodyti, kur jie yra ir kiek toli nuo savo buvimo vietos.

Pasaulinė padėties nustatymo sistema (GPS) yra palydovų tinklas, skriejantis aplink Žemę maždaug 20 000 km aukštyje. Kiekvienas, turintis GPS įrenginį, gali priimti palydovų transliuojamus radijo signalus ir gali juos panaudoti bet kokiu būdu. Visur, kur esate jūsų planetoje, bet kuriuo metu turėtų būti prieinama bent keturi GPS. Naudodamas metodą, vadinamą 3-D trilateration, GPS įrenginys gali naudoti tris palydovus, kad nustatytų įrenginio vietą Žemėje. Kiekvienas iš trijų palydovų siunčia signalą į įrenginį ir prietaisas nustato jo atstumą nuo palydovo. Naudodamas kiekvieną iš trijų atstumų skaičiavimų, įrenginys dabar gali tiksliai nustatyti savo vietą Žemėje ir grąžina ją vartotojui.

Mūsų sukurta GPS sistema galės stebėti vartotojo buvimo vietą, gavusi vartotojo koordinates Žemėje ir atlikusi tam tikrus skaičiavimus, kad grąžintų vartotojo greitį, vietą ir įveiktą atstumą.

1 žingsnis: Darbo pradžia

Darbo pradžia
Darbo pradžia
Darbo pradžia
Darbo pradžia
Darbo pradžia
Darbo pradžia
Darbo pradžia
Darbo pradžia

Norėdami pradėti šį projektą, pirmiausia turime surinkti visas tinkamas medžiagas

1: Raspberry Pi Zero W

2: GPS imtuvas

3: 1.8 TFT 128 x 160 LCD SPI ekranas

4: ~ 11 laidų

5: 2 mygtukai

6: 2x 1k ir 2x 10k rezistoriai nuspaudžiamiems mygtukams

7: duonos lenta

Šiame projekte bus naudojami „Raspberry Pi“GPIO kaiščiai, todėl, norėdami plėtoti savo projektą, turėsime viską sujungti su duonos lenta. Taip pat daroma prielaida, kad visų kaiščių litavimas yra atliktas ir baigtas prieš judant ir sujungiant visas mūsų dalis.

2 veiksmas: prijunkite GPS modulį prie „Raspberry Pi“

Prijunkite GPS modulį prie Raspberry Pi
Prijunkite GPS modulį prie Raspberry Pi
Prijunkite GPS modulį prie „Raspberry Pi“
Prijunkite GPS modulį prie „Raspberry Pi“

Norėdami naudotis mūsų GPS sistema, turėsite prijungti „Tx“ir „Rx“kaiščius iš GPS modulio prie „Raspberry Pi“14 ir 15 GPIO kaiščių. GPS imtuvo Tx kaištis eina į Pi Rx kaištį, o GPS imtuvo Rx kaištis - prie Raspberry pi Tx kaiščio.

Nuotraukose parodytas GPS imtuvas reikalauja naudoti 3,3 V įtampą, o 3,3 V kaiščius galite prijungti prie tinkamos įtampos, o įžeminimo kaištį - prie žemės.

3 veiksmas: gaukite duomenis iš GPS imtuvo modulio

Gaukite duomenis iš GPS imtuvo modulio
Gaukite duomenis iš GPS imtuvo modulio

Norėdami gauti duomenis iš GPS imtuvo į „Raspberry Pi“, turime leisti iš UART prievadų nuskaityti teisingus lizdus. Skaitydami neapdorotus duomenis, turėtume sukurti savo analizavimo biblioteką, tačiau tokiu atveju galime pasinaudoti fone veikiančiu GPS demonu, kuris padės panaudoti duomenų analizavimą ir perduoti juos į „Raspberry Pi“

Norėdami tai padaryti, mes galime atidaryti terminalą „Raspberry Pi“ir įvykdyti kodą:

sudo apt-get atnaujinimas

sudo apt-get įdiegti gpsd gpsd-klientai python-gps

Tai turėtų pasirūpinti mūsų atsisiuntimu.

Kai jis bus baigtas, turime išjungti „gpsd“sistemos paslaugą vykdydami šias komandas:

sudo systemctl sustabdyti gpsd.socket

sudo systemctl išjungti gpsd.socket

Jei kada nors norite įjungti numatytąją gpsd sistemos paslaugą, galite paleisti šias komandas, kad ją atkurtumėte:

sudo systemctl įgalinti gpsd.socket

sudo systemctl paleiskite gpsd.socket

Dabar turime paleisti „gpsd“demoną ir nukreipti jį į UART prievadus įvesdami

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

Dabar galime paleisti žemiau esančią komandą ir pamatyti visus plūduriuojančius duomenis!

cgps -s

4 veiksmas: prijunkite ekraną prie „Raspberry Pi“

Prijunkite ekraną prie „Raspberry Pi“
Prijunkite ekraną prie „Raspberry Pi“
Prijunkite ekraną prie „Raspberry Pi“
Prijunkite ekraną prie „Raspberry Pi“

Kai tik imsimės GPS imtuvo ir dirbame su „Raspberry Pi“, galime prijungti ekraną prie „Raspberry Pi“. Mes naudosime 5 laidus, kad prijungtume savo LCD ekraną prie „Raspberry Pi“, ir dar 4 kaiščius, kad prijungtume pagrindinį maitinimą ir šviesos diodą. ekrane.

Įtraukiau naudojamo TFT ekrano nuotrauką, tačiau tai turėtų veikti su panašaus dydžio ir konstrukcijos ekranais.

Prijunkite LED ir GND prie žemės ir prijunkite LED+ ir VCC prie 3.3V.

Prijunkite RESET kaištį ekrane prie 25 kaiščio Pi plokštėje.

Prijunkite A0 prie „Pi“plokštės 24 kaiščio.

Prijunkite SDA kaištį prie MOSI kaiščio Pi plokštėje.

Prijunkite SCK kaištį LCD ekrane prie „Pi“plokštės.

Prijunkite CS kaištį prie Pi plokštės 8 kaiščio.

5 veiksmas: nustatykite ekraną, kad jis veiktų su „Raspberry Pi“

Nustatykite ekraną, kad jis veiktų su „Raspberry Pi“
Nustatykite ekraną, kad jis veiktų su „Raspberry Pi“

Norėdami sukonfigūruoti ekraną, turime naudoti šioje repo rastą biblioteką ST7735:

„Python ST7735“ekrano biblioteka

Įdiegę šią ekrano biblioteką į mūsų „Raspberry Pi“sistemą, dabar galime pereiti prie failo pavyzdžio nustatymo, kad patvirtintume, jog mūsų ankstesnė instaliacija veikia tinkamai.

Sukurkite failą pavadinimu example.py ir tame pačiame aplanke įterpkite šį tekstą kartu su pasirinktu atvaizdo pavyzdžiu

importuoti ST7735 kaip TFT importuoti „Adafruit_GPIO“kaip GPIO, importuoti „Adafruit_GPIO. SPI“kaip SPI

PLOTIS = 128

AUKŠTIS = 160 SPEED_HZ = 4000000

# „Raspberry Pi“konfigūracija.

# Tai yra kaiščiai, reikalingi LCD prijungimui prie „Raspberry Pi“

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

# Sukurkite TFT LCD ekranų klasę.

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

# Inicijuoti ekraną.

disp.begin () disp.reset ()

# Įkelkite vaizdą.

newData = 0x42 disp.command (newData) print ('Įkeliamas vaizdas …') image = Image.open ('cat.jpg')

# Pakeiskite vaizdo dydį ir pasukite jį taip, kad jis atitiktų ekraną.

image = image.rotate (270). keisti dydį ((WIDTH, HEIGHT))

# Bus spausdinama į terminalą, kuriame mūsų programa piešia mūsų vaizdą ekrane

spausdinti („Piešimo vaizdas“)

# Ši funkcija ekrane parodys mūsų vaizdą

displ. (vaizdas)

Šis failas sukonfigūruos „Raspberry Pi“konfigūraciją LCD ekranui, o biblioteka konvertuos mūsų vaizdą į aplanką ir parodys jį ekrane.

6 veiksmas: nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija

Nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija
Nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija
Nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija
Nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija
Nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija
Nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija

Vykdydami savo užduočių diagramą, naudosime 5 skirtingas būsenos mašinas, kad nustatytume GPS sistemą.

Ekrano keitimo būsenos mašina:

Ši būsenos mašina valdys, kurią rodyti, priklausomai nuo mūsų mygtuko įvesties. Tai daroma keičiant kintamąjį, leidžiantį „python“pasinaudoti ančių rašymo pranašumais ir iškviečiant teisingą funkciją rodyti, priklausomai nuo iškviestos funkcijos

Greičio būsenos mašina:

Ši būsenos mašina vykdys esamą greitį, priklausomai nuo asmens vietos. Tai atliks kiekvieną GPS sistemos laikrodžio ciklą

Išėjimo būsenos mašina:

Ši būsenos mašina nustatys išvestį pagal kintamąjį, kurį ekrano keitimo būsenos mašina nustato kaip dabartinį ekraną.

Atstumo būsenos mašina

Ši būsenos mašina vykdo kiekvieną laikrodžio ciklą ir nustato bendrą vartotojo nuvažiuotą atstumą, o paspaudus atstatymo mygtuką, bus iš naujo nustatytas esamas nuvažiuotas atstumas.

Vietos būsenos mašina:

Ši būsenos mašina grąžina dabartinę vartotojo vietą, naudodama koordinates, kurias GPS modulis grąžina apie vartotoją. Ši būsenos mašina priklauso nuo vartotojų interneto ryšio.

7 žingsnis: Įdiekite mūsų GPS sistemą

Kai mūsų GPS modulis siunčia informaciją į mūsų „Raspberry Pi“ir LCD ekranas, kuriame rodoma informacija, galime pradėti programuoti savo GPS sistemą. Naudosiu ankstesnio žingsnio baigtinės būsenos mašinas, kad galėčiau koduoti mūsų GPS sistemą

## Pagrindinis navigacijos sistemos failas # # # #

# Bibliotekos vaizdams piešti

iš PIL importo vaizdo iš PIL importo ImageDraw iš PIL importo ImageFont

# ST7737 valdiklio biblioteka

importuoti ST7735 kaip TFT

# „Raspberry Pi“GPIO biblioteka

importuoti Adafruit_GPIO kaip GPIO importuoti Adafruit_GPIO. SPI kaip SPI

# GPS biblioteka

#import gpsd iš gps3 importuoti gps3

# Biblioteka laiko

importo laikas

# Biblioteka, skirta atstumui tarp dviejų taškų rasti

iš matematikos importo sin, cos, sqrt, atan2, radianai

# Importuokite Rpi biblioteką, kad galėtumėte naudoti mygtukus meniu perjungimui ir atstatymui

# importuokite RPi. GPIO kaip bGPIO

# Mygtukų sąrankos kaiščiai

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)

# importuokite geografinio kodavimo biblioteką

# # Kad tai veiktų, būtina interneto prieiga

iš geopy.geocoders importuoja Nominatim

geolocator = Nominatim ()

# Sistemos konstantos

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

PLOTIS = 128

AUKŠTIS = 160 SPEED_HZ = 4000000

# „Raspberry Pi“konfigūracijos kaiščiai

DC = 24 # A0 TFT ekrane RST = 25 # Atstatyti kaištį TFT ekrane SPI_PORT = 0 # SPI prievadas aviečių pi, SPI0 SPI_DEVICE = 0 # Slave select on rapsberry pi, CE0

# Sukurkite TFT LCD ekrano objektą

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

# Inicijuoti ekraną

disp.begin ()

# Fonas bus nustatytas žaliai

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

# Išvalyti ekraną į baltą ir rodyti

#disp.clear ((255, 255, 255)) draw = disp.draw () #draw. stačiakampis ((0, 10, 127, 150), kontūras = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()

# Greičio, platumos, ilgumos paskirties kintamieji

#currentS = "Dabartinis greitis:" # Speed string #totalDis = "Bendras atstumas:" # Distance string #currentLoc = "Dabartinė vieta:" # Vietos eilutė

# Atstumas x ir y koordinatės

distX = 10 distY = 20

taškų sąrašas =

# Greičio x ir y koordinatės

greitisX = 10 greičiųY = 20

# Vietos x ir y koordinatės

locX = 10 lokY = 20

# Konvertuoja iš m/s į mph

conversionVal = 2.24

# Greito atnaujinimo funkcija, grąžina eilutę

„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

vieta = geolocator.reverse (reverseString)

grįžti (location.address)

# Platumos atnaujinimo funkcija, grąžina plūdės vertę

def latFunc (): Platuma = data_stream. TPV ['lat'] if (Platuma == "n/a"): grąžinti 0 else: grąžinti plūdę (apvalus (platuma, 4))

# Ilgumos atnaujinimo funkcija, grąžina eilutę

def lonFunc (): ilguma = data_stream. TPV ['lon'], jei (ilguma == "n/a"): grįžti 0 else: grąžinti plūdę (apvalus (ilguma, 4))

# Atstumo funkcija grąžina IŠ VISO nuvažiuoto atstumo

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, jei (paskutinis == 0): grąžinkite kitą: totalDistance += coorDistance (taškaiList [paskutinis-1], taškaiList [paskutinis]) # grąžinti iš visoDistance

# Iš naujo nustato bendrą atstumą

def resDistance ():

global totalDistance totalDistance = 0

# Funkcija naudojama atstumui tarp dviejų koordinačių rasti

# naudoja Haversine formulę. # Įvesties taškai yra rinkinys

def coorDistance (1, 2 taškai):

# Apytikslis Žemės spindulys kilometrais earthRadius = 6373,0

lat1 = 1 taškas [0]

lon1 = 1 taškas [1]

lat2 = 2 taškas [0]

lon2 = 2 taškas [1]

distanceLon = lon2 - lon1

distanceLat = lat2 - lat1

# Haversine a

a = sin (atstumasLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (atstumasLon/2) ** 2

# Haversine c

c = 2 * atan2 (kv. (a), kv. (1-a))

# Konvertuokite km į Miles

atstumas = (earthRadius * c) * 0.62137

jei (atstumas <= 0,01): grįžimas 0,00 kitas: grįžimas atgal (atstumas, 3)

# Funkcija, rodanti greitį ekrane

def dispSpeed ():

global SpeedVar # Padėkite atstumą ant kintamojo ekrane draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Funkcija atstumui ekrane rodyti

def dispDistance ():

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

# Funkcija ti rodyti vietą ekrane, kad veiktų internetas

def dispLocation ():

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

# Žodžio naudojimas jungiklių teiginiams imituoti

dispOptions = {

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

# Ekrano išvesties funkcija

def išvestis ():

# Visuotinio kintamojo naudojimas rodymuiIndex visuotinis ekranas užpildyti = (255, 0, 0))

# Skambučių funkcija priklauso nuo „DisplayIndex“vertės

dispOptions [displayIndex] ()

# Bus ištrinta, jei kitas metodas veiks

# vietos atstumo kintamasis ekrane

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #vietos greičio kintamasis ekrane #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Ekrano atnaujinimų rodymas displ. display ()

displayButton = 18 # BCM smeigtukas ant aviečių pi

resetButton = 23 # BCM smeigtukas ant aviečių pi

buttonPress = Netiesa

def checkDisplay ():

global buttonPress global displayIndex if (bGPIO.input (displayButton), o ne buttonPress): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) ir buttonPress): print (" Vis dar paspaustas ") else: buttonPress = False

# GPS nustatymas

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

timerPeriod =.5

# Rodyklės ekrano rodinio reikšmėIndex = 0 bandykite: naujiems duomenims gps_socket: jei nauji_datai: data_stream.unpack (nauji_datai), jei 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 dar neprijungtas') time.sleep (.1) time.sleep (.8), išskyrus KeyboardInterrupt: gps_socket.close () print (' / nPabaiga naudotojas ctrl+c ')

Aukščiau pateiktas kodas yra tik vienas pavyzdys, kaip koduoti mūsų sistemą, ir aš įdėjau vaizdo įrašą apie tai, kaip ši sistema veikia.

Rekomenduojamas: