Satura rādītājs:
- 1. darbība. Darba sākšana
- 2. darbība: pievienojiet GPS moduli Raspberry Pi
- 3. darbība: iegūstiet datus no GPS uztvērēja moduļa
- 4. darbība: pievienojiet displeju Raspberry Pi
- 5. darbība: iestatiet displeju darbam ar Raspberry Pi
- 6. darbība: iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
- 7. solis: ļauj ieviest mūsu GPS sistēmu
Video: GPS sistēma: 7 soļi
2025 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2025-01-10 13:47
Projekta veidotājs: Carlos Gomez
Uzticamas navigācijas sistēmas izmantošana ir ārkārtīgi svarīga ikvienam, kurš cenšas ceļot un izpētīt pasauli.
Vissvarīgākais aspekts, kas ļauj darboties navigācijas sistēmai, ir sistēmas iekšpusē iebūvētā GPS iespēja. GPS sistēma ļauj ikvienam izsekot savai atrašanās vietai un ātrumam, lai parādītu precīzu informāciju par lietotāju un sniegtu lietotājam precīzu priekšstatu par to, kur viņi atrodas un cik tālu atrodas no savas atrašanās vietas.
Globālā pozicionēšanas sistēma (GPS) ir satelītu tīkls, kas riņķo ap Zemi aptuveni 20 000 km augstumā. Ikviens, kam ir GPS ierīce, var uztvert satelītu pārraidītos radiosignālus un var tos izmantot jebkurā vajadzīgā veidā. Lai kur būtu jūsu atrašanās vieta uz planētas, jums jebkurā laikā jābūt pieejamai vismaz četrām GPS ierīcēm. Izmantojot metodi, ko sauc par trīsdimensiju trilatrāciju, GPS ierīce var izmantot trīs satelītus, lai noteiktu ierīces atrašanās vietu uz Zemes. Katrs no trim satelītiem nosūta signālu uz ierīci, un ierīce nosaka tā attālumu no satelīta. Izmantojot katru no trim attāluma aprēķiniem, ierīce tagad var precīzi noteikt savu atrašanās vietu uz Zemes un atgriež to lietotājam.
Mūsu izveidotā GPS sistēma varēs izsekot lietotāja atrašanās vietām, iegūstot lietotāja koordinātas uz Zemes un veicot dažus aprēķinus, lai atgrieztu lietotāja ātrumu, atrašanās vietu un veikto attālumu.
1. darbība. Darba sākšana
Lai sāktu šo projektu, mums vispirms būs jāsavāc visi pareizie materiāli
1: Raspberry Pi Zero W
2: GPS uztvērējs
3: 1.8 TFT 128 x 160 LCD SPI ekrāns
4: ~ 11 vadi
5: 2 pogas
6: 2x 1k un 2x 10k rezistori nolaižamajām pogām
7: maizes dēlis
Šajā projektā tiks izmantotas Raspberry Pi GPIO tapas, un tāpēc mums, lai attīstītu savu projektu, viss būs jāsavieno ar maizes dēli. Tiek pieņemts arī, ka visu tapu lodēšana ir veikta un pabeigta, pirms pāriet un savienot visas mūsu detaļas.
2. darbība: pievienojiet GPS moduli Raspberry Pi
Lai izmantotu mūsu GPS sistēmu, jums būs jāpievieno Tx un Rx tapas no GPS moduļa ar GPIO 14. un 15. tapu Raspberry Pi. GPS uztvērēja Tx tapa iet uz Pi Rx tapu un GPS uztvērēja Rx tapa uz Raspberry pi Tx tapu.
Attēlos redzamajam GPS uztvērējam ir jāizmanto 3.3V, un jūs varat savienot 3.3V tapas ar pareizo spriegumu, vienlaikus savienojot zemējuma tapu ar zemi.
3. darbība: iegūstiet datus no GPS uztvērēja moduļa
Lai saņemtu datus no GPS uztvērēja uz Raspberry Pi, mums jāļauj no UART portiem lasīt pareizās ligzdas. Lai lasītu neapstrādātus datus, mums ir jāizveido sava parsēšanas bibliotēka, taču šajā gadījumā mēs varam izmantot GPS dēmonu, kas darbojas fonā, lai palīdzētu izmantot datu parsēšanu un pārsūtīšanu uz Raspberry Pi
Lai to paveiktu, mēs varam atvērt Raspberry Pi termināli un izpildīt kodu:
sudo apt-get update
sudo apt-get instalēt gpsd gpsd-klienti python-gps
Tam vajadzētu rūpēties par lejupielādi mūsu vietā.
Kad tas ir pabeigts, mums ir jāatspējo gpsd sistēmas pakalpojums, palaižot šādas komandas:
sudo systemctl stop gpsd.socket
sudo systemctl atspējot gpsd.socket
Ja kādreiz vēlaties iespējot noklusējuma GPS pakalpojumu, varat palaist šādas komandas, lai to atjaunotu:
sudo systemctl iespējot gpsd.socket
sudo systemctl sākt gpsd.socket
Tagad mums jāuzsāk gpsd dēmons un jānorāda uz UART portiem, ievadot
sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock
Tagad mēs varam palaist komandu zemāk un redzēt visus datus, kas peld!
cgps -s
4. darbība: pievienojiet displeju Raspberry Pi
Kad GPS uztvērējs ir izveidots un strādājam ar Raspberry Pi, mēs varam savienot displeju ar Raspberry Pi. Mēs izmantosim 5 vadus, lai savienotu mūsu LCD displeju ar Raspberry Pi, un vēl 4 tapas, lai savienotu galveno barošanu un LED uz ekrāna.
Esmu iekļāvis izmantotā TFT ekrāna fotoattēlu, taču tam vajadzētu darboties ar līdzīga izmēra un uzbūves ekrāniem.
Pievienojiet LED un GND zemei un pievienojiet LED+ un VCC pie 3.3V.
Savienojiet ekrānā esošo RESET tapu ar Pi plāksnes 25. tapu.
Savienojiet A0 ar Pi plāksnes 24. tapu.
Pievienojiet SDA tapu MOSI tapai uz Pi plates.
Pievienojiet SCK tapu LCD ekrānā pie Pi plates.
Savienojiet CS tapu ar Pi tapas 8. tapu.
5. darbība: iestatiet displeju darbam ar Raspberry Pi
Lai iestatītu displeju, mums jāizmanto šajā repo atrodamā ST7735 bibliotēka:
Python ST7735 ekrāna bibliotēka
Kad šī displeja bibliotēka ir instalēta mūsu Raspberry Pi sistēmā, tagad mēs varam turpināt izveidot parauga failu, lai apstiprinātu, ka mūsu iepriekšējā elektroinstalācija darbojas pareizi.
Izveidojiet failu ar nosaukumu example.py un ievietojiet tur šādu tekstu kopā ar jūsu izvēlētā attēla paraugu tajā pašā mapē
importēt ST7735 kā TFTimportēt Adafruit_GPIO kā GPIO importēt Adafruit_GPIO. SPI kā SPI
PLATUMS = 128
AUGSTUMS = 160 SPEED_HZ = 4000000
# Raspberry Pi konfigurācija.
# Šīs ir tapas, kas nepieciešamas, lai LCD savienotu ar Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Izveidojiet TFT LCD displeju klasi.
disp = TFT. ST7735 (DC, pirmais = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Inicializēt displeju.
disp.begin () disp.reset ()
# Ielādējiet attēlu.
newData = 0x42 disp.command (newData) print ('Notiek attēla ielāde …') image = Image.open ('cat.jpg')
# Mainiet attēla izmēru un pagrieziet to atbilstoši displejam.
image = image.rotate (270). resize ((WIDTH, HEIGHT))
# Drukās uz termināli, ka mūsu programma uz ekrāna zīmē mūsu attēlu
drukāt ('Zīmēt attēlu')
# Šī funkcija parādīs mūsu attēlu ekrānā
displejs (attēls)
Šis fails iestatīs Raspberry Pi konfigurāciju LCD ekrānam, un bibliotēka pārveidos mūsu attēlu mapē un parādīs to ekrānā.
6. darbība: iestatiet valsts iekārtas, lai displejā parādītu GPS informāciju
Mēs izmantosim 5 dažādas valsts iekārtas, vienlaikus ieviešot mūsu uzdevumu diagrammu, lai iestatītu mūsu GPS sistēmu.
Displeja mainīšanas stāvokļa mašīna:
Šī stāvokļa mašīna kontrolēs to, ko rādīt, atkarībā no mūsu pogas ievades. Tas tiek darīts, mainot mainīgo, kas ļauj python izmantot pīles rakstīšanas priekšrocības un izsauc pareizo funkciju parādīšanai atkarībā no izsauktās funkcijas
Ātruma stāvokļa mašīna:
Šī stāvokļa mašīna veiks pašreizējo ātrumu atkarībā no indivīdu atrašanās vietas. Tas izpildīs katru GPS sistēmas pulksteņa ciklu
Izejas stāvokļa mašīna:
Šī stāvokļa mašīna noteiks izvadi, pamatojoties uz mainīgo, ko displeja maiņas stāvokļa mašīna nosaka kā pašreizējo displeju.
Attāluma stāvokļa mašīna
Šī stāvokļa mašīna izpilda katru pulksteņa ciklu un nosaka kopējo lietotāja nobraukto attālumu, un, tiklīdz tiek nospiesta atiestatīšanas poga, tiks atiestatīts pašreizējais nobrauktais attālums.
Atrašanās vietas stāvokļa mašīna:
Šī stāvokļa mašīna atgriež pašreizējo lietotāja atrašanās vietu, izmantojot koordinātas, kuras GPS modulis atgriež par lietotāju. Šī stāvokļa mašīna ir atkarīga no lietotāju interneta savienojuma.
7. solis: ļauj ieviest mūsu GPS sistēmu
Kad mūsu GPS modulis sūta informāciju uz mūsu Raspberry Pi un LCD ekrāns parāda informāciju, mēs varam sākt programmēt savu GPS sistēmu. Es izmantošu iepriekšējā soļa galīgās iekārtas, lai kodētu mūsu GPS sistēmu
## Navigācijas sistēmas galvenais fails # # # #
# Bibliotēkas attēlu zīmēšanai
no PIL importa attēla no PIL importa ImageDraw no PIL importēšanas ImageFont
# Bibliotēka kontrolierim ST7737
importēt ST7735 kā TFT
# Bibliotēka GPIO Raspberry Pi
importēt Adafruit_GPIO kā GPIO importēt Adafruit_GPIO. SPI kā SPI
# GPS bibliotēka
#import gpsd no gps3 importēt gps3
# Bibliotēka laikam
importa laiks
# Bibliotēka attāluma noteikšanai starp diviem punktiem
no matemātikas importa sin, cos, sqrt, atan2, radiāni
# Importējiet Rpi bibliotēku, lai izmantotu pogas izvēlņu pārslēgšanai un atiestatīšanai
# importējiet RPi. GPIO kā bGPIO
# Iestatīšanas tapas pogām
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ēt ģeogrāfisko bibliotēku ģeokodēšanai
# # Lai tas darbotos, ir nepieciešama piekļuve internetam
no geopy.geocoders importē Nominatim
ģeolokators = Nominatim ()
# Sistēmas konstantes
#################################
PLATUMS = 128
AUGSTUMS = 160 SPEED_HZ = 4000000
# Raspberry Pi konfigurācijas tapas
DC = 24 # A0 TFT ekrānā RST = 25 # Reset pin in TFT screen SPI_PORT = 0 # SPI ports on aveņu pi, SPI0 SPI_DEVICE = 0 # Slave select on rapsberry pi, CE0
# Izveidojiet TFT LCD displeja objektu
disp = TFT. ST7735 (DC, pirmais = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Inicializēt displeju
disp.begin ()
# Fons tiks iestatīts uz zaļu
#displejs skaidrs ((0, 255, 0))
# Notīriet ekrānu līdz baltam un parādiet
#disp.clear ((255, 255, 255)) draw = disp.draw () #draw. taisnstūris ((0, 10, 127, 150), kontūra = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()
# Ātruma, platuma, garuma izvietojuma mainīgie
#currentS = "Pašreizējais ātrums:" # Ātruma virkne #totalDis = "Kopējais attālums:" # Attāluma virkne #currentLoc = "Pašreizējā atrašanās vieta:" # Atrašanās vietas virkne
# Attālums x un y koordinātas
distX = 10 distY = 20
pointsList =
# Ātruma x un y koordinātas
ātrumsX = 10 ātrumsY = 20
# Atrašanās vietas x un y koordinātas
locX = 10 locY = 20
# Pārvērš no m/s uz mph
conversionVal = 2,24
# Ātruma atjaunināšanas funkcija, atgriež virkni
SpeedVar = 0
def speedFunc (): globālais SpeedVar SpeedText = data_stream. TPV ['ātrums'], ja (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = apaļš (SpeedText, 1) # return (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
location = geolocator.reverse (reverseString)
atgriešanās (location.address)
# Latitude atjaunināšanas funkcija, atgriež peldošo vērtību
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (round (Latitude, 4))
# Garuma atjaunināšanas funkcija, atgriež virkni
def lonFunc (): garums = data_stream. TPV ['lon'], ja (garums == "n/a"): atgriežas 0 cits: atgriežas pludiņš (apaļš (garums, 4))
# Attāluma funkcija atgriež KOPĀ nobraukto attālumu
totalDistance = 0
def distFunc ():
global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 or newLon == 0): totalDistance = totalDistance # return (totalDistance) cits: pointsList.append ((newLat, newLon)) last = len (pointsList) -1, ja (pēdējais == 0): atgriežas cits: totalDistance += coorDistance (pointsList [last-1], pointsList [last]) # return totalDistance
# Atiestata kopējo attālumu
def resDistance ():
global totalDistance totalDistance = 0
# Funkcija, ko izmanto, lai atrastu attālumu starp divām koordinātām
# izmanto Haversine formulu, lai atrastu. # Ievades punkti ir karte
def coorDistance (1. punkts, 2. punkts):
# Aptuvenais Zemes rādiuss kilometros earthRadius = 6373,0
lat1 = 1. punkts [0]
lon1 = 1. punkts [1]
lat2 = 2. punkts [0]
lon2 = 2. punkts [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 (kvadrātveida (a), kvadrātveida (1-a))
# Pārvērst km uz jūdzēm
attālums = (earthRadius * c) * 0.62137
ja (attālums <= 0,01): atgriešanās 0,00 cits: atgriešanās kārta (attālums, 3)
# Funkcija ātruma parādīšanai ekrānā
def dispSpeed ():
globālais SpeedVar # Novietojiet attālumu uz mainīgā ekrānā draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Funkcija, lai ekrānā parādītu attālumu
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Funkcija ti parāda atrašanās vietu ekrānā, lai darbotos internets
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Vārdnīcas izmantošana slēdzienu paziņojumu atdarināšanai
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Ekrāna izvades funkcija
def izeja ():
# Globālā mainīgā izmantošana displejamIndex globālais displejsIndekss # Ekrāna notīrīšana un fona displeja pielietošana. ([255, 255, 255]) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), aizpildīt = (255, 0, 0))
# Zvanu funkcija atkarībā no displayIndex vērtības
dispOptions [displayIndex] ()
# Izdzēs, ja cita metode darbojas
# vietas attāluma mainīgais ekrānā
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #ātruma mainīgais uz ekrāna #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Displeja displeja atjauninājumu displejs ()
displayButton = 18 # BCM Pin uz aveņu pi
resetButton = 23 # BCM Pin uz aveņu pi
buttonPress = False
def checkDisplay ():
globālā poga Nospiediet globālo displejaIndeksu, ja (bGPIO.input (displayButton), nevis pogas spiediens): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) un buttonPress): print (" Joprojām tiek nospiests ") else: buttonPress = False
# GPS iestatīšana
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
taimerisPeriods =.5
# Indeksa vērtība displeja displejamIndex = 0 try: new_data in gps_socket: if new_data: data_stream.unpack (new_data) if data_stream. TPV ['lat']! = 'N/a': print (data_stream. TPV ['ātrums')], 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 vēl nav savienots') time.sleep (.1) time.sleep (.8), izņemot KeyboardInterrupt: gps_socket.close () print (' / nPārtrauc lietotājs ctrl+c ')
Iepriekš minētais kods ir tikai viens piemērs, kā kodēt mūsu sistēmu, un es esmu ievietojis video par šīs sistēmas darbību.