Talaan ng mga Nilalaman:
- Hakbang 1: Pagsisimula
- Hakbang 2: Ikonekta ang Modyul ng GPS sa Raspberry Pi
- Hakbang 3: Tanggapin ang Data Mula sa Modyul ng Tagatanggap ng GPS
- Hakbang 4: Ikonekta ang Display sa Raspberry Pi
- Hakbang 5: Pag-setup ng Display upang Magtrabaho Sa Raspberry Pi
- Hakbang 6: I-set up ang Mga Makina ng Estado upang Maipakita ang Impormasyon ng GPS sa Ipakita
- Hakbang 7: Hinahayaan Magpatupad ng aming Sistema ng GPS
Video: Sistema ng GPS: 7 Mga Hakbang
2025 May -akda: John Day | [email protected]. Huling binago: 2025-01-10 13:49
Tagalikha ng Proyekto: Carlos Gomez
Ang pagkakaroon ng isang maaasahang sistema ng nabigasyon ay pinakamahalaga para sa sinumang sumusubok na maglakbay at galugarin ang mundo.
Ang pinakamahalagang aspeto na nagpapahintulot sa sistema ng nabigasyon na gumana ay ang kakayahan ng GPS na naka-embed sa loob ng system. Pinapayagan ng sistema ng GPS ang sinuman na subaybayan ang kanilang lokasyon at bilis upang maipakita ang tumpak na impormasyon tungkol sa gumagamit at bigyan ang gumagamit ng isang tumpak na representasyon kung nasaan sila at kung gaano kalayo sila mula sa kanilang lokasyon.
Ang Global Positioning System (GPS) ay isang network ng mga satellite na umiikot sa Earth sa taas na mga 20, 000 km. Ang sinumang may isang aparatong GPS ay maaaring makatanggap ng mga signal ng radyo na nai-broadcast ng mga satellite at magagamit ang mga ito sa alinmang paraan na kinakailangan. Kung saan man ang iyong lokasyon sa planeta ng hindi bababa sa apat na GPS ay dapat na magagamit sa iyo sa anumang oras. Gamit ang isang pamamaraan na tinatawag na 3-D trilateration, ang isang aparato ng GPS ay makakagamit ng tatlong mga satellite upang matukoy ang lokasyon ng aparato sa Earth. Ang bawat isa sa tatlong mga satellite ay nagpapadala ng isang senyas sa aparato at natutukoy ng aparato na ang distansya nito mula sa satellite. Gamit ang bawat isa sa tatlong mga kalkulasyon ng distansya ang aparato ay nagawang matukoy ang lokasyon nito sa Earth at ibabalik iyon sa gumagamit.
Ang GPS system na lilikha namin ay magagawang subaybayan ang mga lokasyon ng gumagamit sa pamamagitan ng pagkuha ng mga coordinate ng gumagamit sa Earth at paggawa ng ilang mga kalkulasyon upang maibalik ang bilis ng lokasyon, lokasyon, at sakop ang distansya.
Hakbang 1: Pagsisimula
Upang masimulan ang proyektong ito, kakailanganin muna naming tipunin ang lahat ng mga tamang materyales
1: Raspberry Pi Zero W
2: Tagatanggap ng GPS
3: 1.8 TFT 128 x 160 LCD SPI Screen
4: ~ 11 mga wire
5: 2 mga pindutan
6: 2x 1k at 2x 10k resistors para sa mga pull down button
7: Bread board
Gagamitin ng proyektong ito ang mga pin ng GPIO ng Raspberry Pi at dahil dito kailangan naming ikonekta ang lahat sa isang board ng tinapay upang mapaunlad ang aming proyekto. Ipinapalagay din na ang paghihinang sa lahat ng mga pin ay tapos na at natapos bago magpatuloy at ikonekta ang lahat ng aming mga bahagi.
Hakbang 2: Ikonekta ang Modyul ng GPS sa Raspberry Pi
Para sa paggamit ng aming system ng GPS kakailanganin mong ikonekta ang mga Tx at Rx pin mula sa module ng GPS sa GPIO pin 14 at 15 sa Raspberry Pi. Ang Tx pin ng GPS receiver ay pupunta sa Rx pin ng Pi at ang Rx pin ng GPS receiver ay pupunta sa Tx pin ng Raspberry pi.
Ang tagatanggap ng GPS na ipinapakita sa mga imahe ay nangangailangan ng 3.3V upang magamit at maaari mong ikonekta ang mga 3.3V na pin sa tamang boltahe, habang kumokonekta sa Ground pin sa lupa.
Hakbang 3: Tanggapin ang Data Mula sa Modyul ng Tagatanggap ng GPS
Upang makatanggap ng data mula sa tagatanggap ng GPS sa Raspberry Pi kailangan naming payagan ang tamang mga socket na basahin mula sa mga port ng UART. Ang pagbabasa ng hilaw na data ay mangangailangan sa amin upang lumikha ng aming sariling library ng pag-parse, ngunit sa senaryong ito maaari naming samantalahin ang isang GPS daemon na tumatakbo sa background upang matulungan ang paggamit ng pag-parse ng data at ipadala ito sa Raspberry Pi
Upang magawa ito maaari naming buksan ang isang terminal sa Raspberry Pi at ipatupad ang code:
sudo apt-get update
sudo apt-get install gpsd gpsd-client python-gps
Dapat nitong alagaan ang pag-download para sa amin.
Kapag nakumpleto na ito, kailangan naming huwag paganahin ang serbisyo ng system ng gpsd sa pamamagitan ng pagpapatakbo ng mga sumusunod na utos:
sudo systemctl ihinto ang gpsd.socket
sudo systemctl huwag paganahin ang gpsd.socket
Kung nais mong paganahin ang default na serbisyo ng system ng gpsd, maaari mong patakbuhin ang mga sumusunod na utos upang maibalik ito:
sudo systemctl paganahin ang gpsd.socket
sudo systemctl simulan ang gpsd.socket
Ngayon kailangan naming simulan ang gpsd daemon at ituro ito sa mga port ng UART sa pamamagitan ng pagpasok
sudo gpsd / dev / ttyAMA0 -F /var/run/gpsd.sock
Maaari na naming patakbuhin ang utos sa ibaba at makita ang lahat ng data na lumulutang!
cgps -s
Hakbang 4: Ikonekta ang Display sa Raspberry Pi
Kapag mayroon nang up ang aming GPS receiver at nagtatrabaho sa Raspberry Pi, maaari naming ikonekta ang display sa Raspberry Pi. Gumagamit kami ng 5 wires upang ikonekta ang aming LCD display sa Raspberry Pi at isa pang 4 na pin upang ikonekta ang pangunahing lakas at LED sa screen.
Nagsama ako ng larawan ng TFT na screen na ginagamit ko, ngunit dapat itong gumana sa mga screen na may katulad na laki at build.
Ikonekta ang LED- at GND sa lupa at ikonekta ang LED + at VCC sa 3.3V.
Ikonekta ang RESET pin sa screen upang i-pin ang 25 sa Pi board.
Ikonekta ang A0 upang i-pin ang 24 sa Pi board.
Ikonekta ang SDA pin sa MOSI pin sa Pi board.
Ikonekta ang SCK pin sa LCD screen sa Pi board.
Ikonekta ang CS pin sa pin 8 sa Pi board.
Hakbang 5: Pag-setup ng Display upang Magtrabaho Sa Raspberry Pi
Upang ma-setup ang display kailangan namin upang magamit ang ST7735 library na matatagpuan sa repo na ito:
Python ST7735 Screen Library
Kapag na-install na ang display library na ito sa aming system ng Raspberry Pi, maaari na kaming magpatuloy sa pagse-set up ng isang halimbawa ng file upang kumpirmahing gumagana nang tama ang aming dating mga kable.
Lumikha ng isang file na may pamagat na example.py at ipasok ang sumusunod na teksto doon kasama ang isang sample na imahe na iyong pinili sa parehong folder
i-import ang ST7735 bilang TFTimport Adafruit_GPIO bilang GPIO import Adafruit_GPIO. SPI bilang SPI
LUPA = 128
TAAS = 160 SPEED_HZ = 4000000
# Pagsasaayos ng Raspberry Pi.
# Ito ang mga kinakailangang pin upang ikonekta ang LCD sa Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Lumikha ng klase ng display na TFT LCD.
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Ipasimula ang pagpapakita.
disp.begin () disp.reset ()
# Mag-load ng isang imahe.
newData = 0x42 disp.command (newData) print ('Naglo-load ng imahe…') imahe = Image.open ('cat.jpg')
# Baguhin ang laki ng imahe at paikutin ito upang tumugma sa display.
imahe = imahe.rotate (270). baguhin ang laki ((LAKAS, Taas))
# I-print sa terminal na iginuhit ng aming programa ang aming Imahe sa screen
i-print ('Larawan ng guhit')
# Ang pagpapaandar na ito ay ipapakita ang aming imahe sa screen
disp.display (imahe)
Itatakda ng file na ito ang pagsasaayos ng Raspberry Pi para sa LCD screen at i-convert ng library ang aming imahe sa folder at ipapakita ito sa screen.
Hakbang 6: I-set up ang Mga Makina ng Estado upang Maipakita ang Impormasyon ng GPS sa Ipakita
Gumagamit kami ng 5 magkakaibang mga makina ng estado, habang ipinapatupad ang aming diagram ng gawain upang mai-set up ang aming gps system.
Makina ng estado ng Pagbabago ng Display:
Ang makina ng estado na ito ay makokontrol kung alin ang ipapakita depende sa aming pag-input ng pindutan. Ginagawa ito sa pamamagitan ng pagbabago ng isang variable na nagpapahintulot sa python na samantalahin ang pag-type ng pato at pagtawag sa wastong pagpapaandar upang maipakita depende sa tinawag na pagpapaandar
Makina ng estado ng bilis:
Ang makina ng estado na ito ay isasagawa ang kasalukuyang bilis depende sa lokasyon ng mga indibidwal. Isasagawa nito ang bawat ikot ng orasan para sa GPS system
Makina ng estado ng output:
Tutukuyin ng makina ng estado ang output batay sa variable na tinutukoy ng makina ng estado ng pagbabago ng display na maging kasalukuyang display.
Distansya machine machine
Ang makina ng estado na ito ay nagpapatupad ng bawat pag-ikot ng orasan at tumutukoy sa kabuuang distansya na nilakbay ng gumagamit at sa sandaling maitulak ang pindutan ng pag-reset, mai-reset ang kasalukuyang nilakbay na distansya.
Makina ng estado ng lokasyon:
Ibinabalik ng machine ng estado ang kasalukuyang lokasyon ng gumagamit, gamit ang mga coordinate na ibabalik ng module ng GPS tungkol sa gumagamit. Ang machine ng estado na ito ay nakasalalay sa koneksyon sa internet ng mga gumagamit.
Hakbang 7: Hinahayaan Magpatupad ng aming Sistema ng GPS
Sa sandaling mayroon kaming aming module ng GPS na nagpapadala ng impormasyon sa aming Raspberry Pi at ang aming LCD screen na nagpapakita ng impormasyon dito maaari naming simulan ang programa ng aming sistema ng GPS. Gagamitin ko ang mga nakaraang makina ng estado ng nakaraang hakbang upang ma-code ang aming system ng GPS
## Pangunahing file para sa Navigation system # # # #
# Mga aklatan para sa pagguhit ng mga imahe
mula sa PIL import Image mula sa PIL import ImageDraw mula sa PIL import ImageFont
# Library para sa ST7737 controller
i-import ang ST7735 bilang TFT
# Library para sa GPIO para sa Raspberry Pi
i-import ang Adafruit_GPIO bilang GPIO i-import ang Adafruit_GPIO. SPI bilang SPI
# Library para sa GPS
#import gpsd mula sa gps3 import gps3
# Library para sa oras
oras ng pag-import
# Library para sa paghahanap ng distansya sa pagitan ng dalawang puntos
mula sa math import sin, cos, sqrt, atan2, radians
# I-import ang Rpi library upang magamit ang mga pindutan upang lumipat ng mga menu at i-reset
# i-import ang RPi. GPIO bilang bGPIO
# Mga setup ng pin para sa mga pindutan
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 geopy library para sa Geocoding
# # Ang pag-access sa Internet ay kinakailangan upang gumana ito
mula sa geopy.geocoders import Nominatim
geolocator = Nominatim ()
# Patuloy para sa system
#################################
LUPA = 128
TAAS = 160 SPEED_HZ = 4000000
# Mga pin ng pagsasaayos ng Raspberry Pi
DC = 24 # A0 sa TFT screen RST = 25 # I-reset ang pin sa TFT screen SPI_PORT = 0 # SPI port sa raspberry pi, SPI0 SPI_DEVICE = 0 # Slave select on rapsberry pi, CE0
# Lumikha ng bagay na display ng TFT LCD
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Ipasimula ang pagpapakita
disp.begin ()
Itatakda sa berde ang # background
# disp.clear ((0, 255, 0))
# I-clear ang screen sa puti at ipakita
# disp.clear ((255, 255, 255)) draw = disp.draw () # draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (0, 0, 255)) # disp.display ()
# Bilis, Latitude, Mga variable ng pagkakalagay ng Longitude
#currentS = "Kasalukuyang Bilis:" # Speed string #totalDis = "Total Distance:" # Distance string #currentLoc = "Kasalukuyang Lokasyon:" # Lokasyon ng string
# Distansya x at y mga coordinate
distX = 10 distY = 20
pointsList =
# Ang bilis ng x at y mga coordinate
bilisX = 10 bilisY = 20
# Lokasyon x at y mga coordiantes
locX = 10 locY = 20
# Mga convert mula sa m / s hanggang mph
conversionVal = 2.24
# Pag-andar ng bilis ng pag-update, ibabalik ang string
SpeedVar = 0
def speedFunc (): pandaigdigan SpeedVar SpeedText = data_stream. TPV ['bilis'] kung (SpeedText! = "n / a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = bilog (SpeedText, 1) # return (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
lokasyon = geolocator.reverse (reverseString)
bumalik (lokasyon.address)
# Pag-andar ng pag-update ng Latitude, ibabalik ang halaga ng float
def latFunc (): Latitude = data_stream. TPV ['lat'] kung (Latitude == "n / a"): return 0 else: return float (bilog (Latitude, 4))
Ang pagpapaandar sa pag-update ng # Longitude, nagbabalik ng string
def lonFunc (): Longitude = data_stream. TPV ['lon'] kung (Longitude == "n / a"): return 0 else: return float (bilog (Longitude, 4))
# Nagbabalik ang pagpapaandar ng distansya TOTAL na nilakbay ng distansya
totalDistansya = 0
def distFunc ():
pandaigdigan totalDistance newLat = latFunc () newLon = lonFunc () kung (newLat == 0 o newLon == 0): totalDistance = totalDistance # return (totalDistance) iba pa: pointsList.append ((newLat, newLon)) huling = len (pointsList) -1 kung (huling == 0): bumalik pa: totalDistance + = coorDistance (pointsList [huling-1], pointsList [huling]) # return totalDistance
# I-reset ang kabuuang distansya
def resDistance ():
pandaigdigang kabuuanDistansya totalDistansya = 0
# Function na ginamit upang makahanap ng distansya sa pagitan ng dalawang mga coordinate
# Gumagamit ng formula ng Haversine upang makahanap. # Input point ay isang tuple
def coorDistansya (point1, point2):
# Tinatayang radius ng Earth sa mga kilometro na EarthRadius = 6373.0
lat1 = point1 [0]
lon1 = point1 [1]
lat2 = point2 [0]
lon2 = point2 [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 (sqrt (a), sqrt (1-a))
# I-convert ang km sa Miles
distansya = (earthRadius * c) * 0.62137
kung (distansya <= 0.01): bumalik 0.00 pa: pagbalik ng pag-ikot (distansya, 3)
# Pag-andar upang ipakita ang bilis sa screen
def dispSpeed ():
pandaigdigang SpeedVar # Distansya ng lugar sa variable sa screen draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Pag-andar upang ipakita ang distansya sa screen
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Ang pagpapaandar sa lokasyon ng pagpapakita sa screen, nangangailangan ng internet upang gumana
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Paggamit ng diksyunaryo upang gayahin ang mga pahayag ng paglipat
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Pag-andar ng output ng screen
output ng def ():
# Paggamit ng pandaigdigang variable para sa displayIndex global displayIndex # Pag-clear ng screen at paglalapat ng background disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), punan = (255, 0, 0))
Ang paggana ng # Mga tawag depende sa halaga ng displayIndex
dispOptions [displayIndex] ()
# Burahin kung gumagana ang ibang pamamaraan
# variable ng distansya ng lugar sa screen
# draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) # variable ng bilis ng lugar sa screen # draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Ipakita ang mga update sa screen disp.display ()
display Button = 18 # BCM Pin sa raspberry pi
reset Button = 23 # BCM Pin sa raspberry pi
buttonPress = Mali
def checkDisplay ():
global buttonPress global displayIndex if (bGPIO.input (display Button) at hindi buttonPress): displayIndex + = 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (display Button) at buttonPress): print (" Pinindot pa rin ") pa: buttonPress = Mali
# Mga setup ng gps
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
timerPeriod =.5
# Halaga ng index para sa display displayIndex = 0 try: para sa new_data sa gps_socket: kung new_data: data_stream.unpack (new_data) kung data_stream. TPV ['lat']! = 'N / a': print (data_stream. TPV ['bilis'], data_stream. TPV ['lat'], data_stream. TPV ['lon']) distFunc () speedFunc () output () checkDisplay () kung (bGPIO.input (reset Button)): resDistance () iba pa: output () checkDisplay () kung (bGPIO.input (reset Button)): resDistance () print ('hindi pa konektado ang GPS') time.s Sleep (.1) time.s Sleep (.8) maliban sa KeyboardInterrupt: gps_socket.close () print (' / n Natukoy ng gumagamit ctrl + c ')
Ang code sa itaas ay isang halimbawa lamang sa kung paano i-code ang aming system at nag-embed ako ng isang video sa kung paano gumagana ang sistemang ito.