Turinys:
- 1 žingsnis: Darbo pradžia
- 2 veiksmas: prijunkite GPS modulį prie „Raspberry Pi“
- 3 veiksmas: gaukite duomenis iš GPS imtuvo modulio
- 4 veiksmas: prijunkite ekraną prie „Raspberry Pi“
- 5 veiksmas: nustatykite ekraną, kad jis veiktų su „Raspberry Pi“
- 6 veiksmas: nustatykite būsenos mašinas, kad ekrane būtų rodoma GPS informacija
- 7 žingsnis: Įdiekite mūsų GPS sistemą
Video: GPS sistema: 7 žingsniai
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
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
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“
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
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“
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“
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
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.