Բովանդակություն:
- Քայլ 1: Սկսելու համար
- Քայլ 2. GPS մոդուլը միացրեք Raspberry Pi- ին
- Քայլ 3: Տվյալներ ստացեք GPS ստացողի մոդուլից
- Քայլ 4. Միացրեք ցուցադրումը Raspberry Pi- ին
- Քայլ 5: Կարգավորեք ցուցադրումը `Raspberry Pi- ի հետ աշխատելու համար
- Քայլ 6. Ստեղծեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
- Քայլ 7: Եկեք ներդնենք մեր GPS համակարգը:
Video: GPS համակարգ `7 քայլ
2025 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2025-01-10 13:47
Նախագծի հեղինակ ՝ Կառլոս Գոմես
Հուսալի նավիգացիոն համակարգ ունենալը ամենակարևորն է նրանց համար, ովքեր փորձում են ճանապարհորդել և ուսումնասիրել աշխարհը:
Նավիգացիոն համակարգին աշխատելու ամենակարևոր ասպեկտը համակարգի ներսում ներդրված GPS հնարավորությունն է: GPS համակարգը թույլ է տալիս որևէ մեկին հետևել իրենց գտնվելու վայրին և արագությանը ՝ օգտագործողի մասին ճշգրիտ տեղեկատվություն ցուցադրելու և օգտագործողին ճշգրիտ պատկերացում տալու համար, թե որտեղ են նրանք և որքան հեռու են իրենց գտնվելու վայրից:
Գլոբալ դիրքավորման համակարգը (GPS) արբանյակների ցանց է, որոնք պտտվում են Երկրի շուրջը մոտ 20,000 կմ բարձրության վրա: Յուրաքանչյուր ոք, ով ունի GPS սարք, կարող է ստանալ ռադիոազդանշաններ, որոնք ուղարկում են արբանյակները և կարող է դրանք օգտագործել անհրաժեշտության դեպքում: Որտեղ էլ որ լինի ձեր գտնվելու վայրը մոլորակի վրա, առնվազն չորս GPS պետք է հասանելի լինի ձեզ ցանկացած պահի: Օգտագործելով 3-D եռակողմ կոչվող մեթոդը, GPS սարքը կարող է օգտագործել երեք արբանյակ `սարքի գտնվելու վայրը Երկրում որոշելու համար: Երեք արբանյակներից յուրաքանչյուրը ազդանշան է ուղարկում սարքին, և սարքը որոշում է դրա հեռավորությունը արբանյակից: Օգտագործելով հեռավորության երեք հաշվարկներից յուրաքանչյուրը, սարքն այժմ կարող է ճշգրիտ որոշել իր գտնվելու վայրը Երկրի վրա և այն վերադարձնում է օգտագործողին:
GPS- ի համակարգը, որը մենք կստեղծենք, կկարողանա հետևել օգտատիրոջ գտնվելու վայրին ՝ ստանալով օգտատիրոջ կոորդինատները Երկրի վրա և որոշ հաշվարկներ կատարելով ՝ վերադարձնելու օգտվողի արագությունը, գտնվելու վայրը և անցած տարածությունը:
Քայլ 1: Սկսելու համար
Այս նախագիծը սկսելու համար մենք նախ պետք է հավաքենք բոլոր ճիշտ նյութերը
1: Ազնվամորի Pi Zero W
2: GPS ընդունիչ
3: 1.8 TFT 128 x 160 LCD SPI էկրան
4: ~ 11 լարեր
5: 2 կոճակ
6: 2x 1k և 2x 10k դիմադրիչներ `ներքև քաշվող կոճակները
7: Հացի տախտակ
Այս նախագիծը կօգտագործի Raspberry Pi- ի GPIO կապում, և որպես այդպիսին մենք պետք է ամեն ինչ միացնենք հացի տախտակի հետ `մեր նախագիծը զարգացնելու համար: Ենթադրվում է նաև, որ բոլոր կապում զոդումն արված և ավարտված է, նախքան մեր բոլոր մասերը շարժվելը և միացնելը:
Քայլ 2. GPS մոդուլը միացրեք Raspberry Pi- ին
Մեր GPS համակարգի օգտագործման համար ձեզ հարկավոր է միացնել Tx և Rx կապումներն GPS մոդուլից GPIO կապին 14 և 15 Raspberry Pi- ի վրա: GPS ստացողի Tx քորոցը գնում է Pi- ի Rx, իսկ GPS ընդունիչի Rx կապը ՝ Raspberry pi- ի Tx քորոցին:
Պատկերներում ցուցադրվող GPS ընդունիչին անհրաժեշտ է օգտագործել 3.3 Վ, իսկ դուք կարող եք միացնել 3.3 Վ կապոցները ճիշտ լարման հետ ՝ միացնելով Գրունտի քորոցը գետնին:
Քայլ 3: Տվյալներ ստացեք GPS ստացողի մոդուլից
GPS ընդունիչից Raspberry Pi- ին տվյալներ ստանալու համար մենք պետք է թույլ տանք UART նավահանգիստներից կարդալ ճիշտ վարդակները: Հում տվյալների կարդալը մեզանից կպահանջի ստեղծել մեր սեփական վերլուծման գրադարանը, սակայն այս սցենարում մենք կարող ենք օգտվել GPS դեյմոնից, որն աշխատում է հետին պլանում `օգնելու տվյալների վերլուծությանը և փոխանցմանը Raspberry Pi- ին:
Դա իրականացնելու համար մենք կարող ենք բացել տերմինալ Raspberry Pi- ի վրա և կատարել ծածկագիրը.
sudo apt-get թարմացում
sudo apt-get տեղադրել gpsd gpsd-clients python-gps
Սա պետք է հոգ տանի մեզ համար ներբեռնման մասին:
Այն ավարտվելուց հետո մենք պետք է անջատենք gpsd համակարգի ծառայությունը ՝ գործարկելով հետևյալ հրամանները.
sudo systemctl stop gpsd.socket
sudo systemctl անջատել gpsd.socket- ը
Եթե երբևէ ցանկանում եք միացնել կանխադրված gpsd համակարգի ծառայությունը, այն վերականգնելու համար կարող եք գործարկել հետևյալ հրամանները.
sudo systemctl միացնել gpsd.socket- ը
sudo systemctl սկսել gpsd.socket
Այժմ մենք պետք է սկսենք gpsd դեյմոնը և նշենք այն UART նավահանգիստներին ՝ մուտքագրելով
sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock
Այժմ մենք կարող ենք գործարկել ստորև բերված հրամանը և տեսնել բոլոր տվյալները, որոնք լողում են:
cgps -s
Քայլ 4. Միացրեք ցուցադրումը Raspberry Pi- ին
Երբ մենք ունենք GPS ընդունիչ և աշխատում ենք Raspberry Pi- ի հետ, այնուհետև կարող ենք էկրանը միացնել Raspberry Pi- ին: Մենք կօգտագործենք 5 լար ՝ LCD էկրանը Raspberry Pi- ին միացնելու համար և ևս 4 կապ ՝ հիմնական սնուցման և LED- ի միացման համար: էկրանին:
Ես ներառել եմ իմ օգտագործած TFT էկրանի լուսանկարը, բայց այն պետք է աշխատի նման չափի և կառուցվածքի էկրանների հետ:
Միացրեք LED- ը և GND- ը գետնին և միացրեք LED+ և VCC- ն 3.3 Վ-ին:
Էկրանի RESET կապը միացրեք Pi տախտակի 25 -րդ կապին:
Միացրեք A0- ն Pi տախտակի 24 -րդ կապին:
Միացրեք SDA կապը Pi տախտակի MOSI կապին:
LCD էկրանին SCK կապը միացրեք Pi տախտակին:
Միացրեք CS կապը Pi տախտակի 8 -րդ կապին:
Քայլ 5: Կարգավորեք ցուցադրումը `Raspberry Pi- ի հետ աշխատելու համար
Էկրանը կարգավորելու համար մենք պետք է օգտագործենք այս ռեպոում հայտնաբերված ST7735 գրադարանը.
Python ST7735 Էկրանի գրադարան
Երբ մենք տեղադրենք այս ցուցադրման գրադարանը մեր Raspberry Pi համակարգին, այժմ կարող ենք անցնել օրինակելի ֆայլի ստեղծմանը `հաստատելու համար, որ մեր նախկին էլեկտրագծերը ճիշտ են աշխատում:
Ստեղծեք օրինակ `օրինակ.
ներմուծել ST7735 որպես TFTimport Adafruit_GPIO որպես GPIO ներմուծել Adafruit_GPIO. SPI որպես SPI
Լայնություն = 128
Բարձրություն = 160 SPEED_HZ = 4000000
# Raspberry Pi կոնֆիգուրացիա:
# Սրանք այն կապումներն են, որոնք անհրաժեշտ են LCD- ը Raspberry Pi- ին միացնելու համար
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Ստեղծեք TFT LCD ցուցադրման դաս:
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Նախնականացնել ցուցադրումը:
disp.begin () disp.reset ()
# Բեռնել պատկերը:
newData = 0x42 disp.com պատվիրել (newData) տպել ('Պատկերի բեռնում …') image = Image.open ('cat.jpg')
# Չափափոխեք պատկերը և պտտեք այն այնպես, որ համապատասխանի ցուցադրմանը:
image = image.rotate (270).resize ((WIDTH, HEIGHT))
# Տպելու է տերմինալին, որ մեր ծրագիրը նկարում է մեր Պատկերը էկրանին
տպել («Պատկեր նկարել»)
# Այս գործառույթը էկրանին կցուցադրի մեր պատկերը
disp.display (պատկեր)
Այս ֆայլը կկարգավորի Raspberry Pi- ի կոնֆիգուրացիան LCD էկրանին, և գրադարանը կփոխի մեր պատկերը թղթապանակում և կցուցադրի այն էկրանին:
Քայլ 6. Ստեղծեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
Մենք կօգտագործենք 5 տարբեր պետական մեքենաներ ՝ միաժամանակ իրականացնելով մեր առաջադրանքի սխեման ՝ մեր GPS համակարգը կարգավորելու համար:
Displayուցասարքի փոփոխման վիճակի մեքենա.
Այս պետական մեքենան կվերահսկի, թե որը ցուցադրվի ՝ կախված մեր կոճակի մուտքագրումից: Դա անում է ՝ փոփոխելով մի փոփոխական, որը թույլ է տալիս պիթոնին օգտվել բադի մուտքագրումից և ցուցադրել ճիշտ գործառույթը ՝ կախված կանչված գործառույթից
Արագության վիճակի մեքենա.
Այս պետական մեքենան կկատարի ընթացիկ արագությունը ՝ կախված անհատների գտնվելու վայրից: Սա կկատարի GPS համակարգի համար ժամացույցի յուրաքանչյուր ցիկլ
Ելքային վիճակի մեքենա.
Այս պետական մեքենան որոշելու է ելքը ՝ հիմնվելով այն փոփոխականի վրա, որը ցուցադրման փոփոխման վիճակի մեքենան որոշում է որպես ընթացիկ էկրան:
Հեռավորության պետական մեքենա
Այս պետական մեքենան կատարում է ժամացույցի յուրաքանչյուր ցիկլ և որոշում է օգտագործողի անցած ընդհանուր հեռավորությունը, և երբ նորից սեղմված կոճակը սեղմվի, կվերականգնի ընթացիկ անցած տարածությունը:
Տեղադրության պետական մեքենա.
Այս պետական մեքենան վերադարձնում է օգտագործողի ընթացիկ գտնվելու վայրը ՝ օգտագործելով կոորդինատները, որոնք GPS մոդուլը վերադարձնում է օգտագործողի մասին: Այս պետական մեքենան կախված է օգտագործողների ինտերնետ կապից:
Քայլ 7: Եկեք ներդնենք մեր GPS համակարգը:
Երբ մենք ունենք մեր GPS մոդուլը, որը տեղեկատվություն է ուղարկում մեր Raspberry Pi- ին և մեր LCD էկրանին, որտեղ ցուցադրվում են դրա մասին տեղեկությունները, ապա կարող ենք սկսել ծրագրավորել մեր GPS համակարգը: Ես կօգտագործեմ նախորդ քայլի սահմանափակ վիճակի մեքենաները `մեր GPS համակարգը կոդավորելու համար
## Նավիգացիոն համակարգի հիմնական ֆայլ # # # #
# Պատկերներ նկարելու գրադարաններ
PIL ներմուծումից Image PIL ներմուծումից ImageDraw from PIL import ImageFont
# Գրադարան ST7737 վերահսկիչի համար
ներմուծեք ST7735- ը որպես TFT
# Գրադարան GPIO- ի համար Raspberry Pi- ի համար
ներմուծեք Adafruit_GPIO- ն որպես GPIO ներմուծեք Adafruit_GPIO. SPI- ն որպես SPI
# Գրադարան GPS- ի համար
#ներմուծել gpsd gps3- ից ներմուծել gps3
# Գրադարան ժամանակի համար
ներմուծման ժամանակը
# Գրադարան երկու կետերի միջև հեռավորություն գտնելու համար
մաթեմատիկայից ներմուծում sin, cos, sqrt, atan2, radians
# Ներմուծեք Rpi գրադարանը `ընտրացանկերը փոխելու և վերակայելու համար կոճակներ օգտագործելու համար
# ներմուծեք RPi. GPIO- ն որպես bGPIO
# Կարգավորեք կապում կոճակների համար
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)
# ներմուծեք աշխարհագրության գրադարան `աշխարհագրման համար
# # Ինտերնետ հասանելիությունն անհրաժեշտ է դրա համար
geopy.geocoders- ից ներմուծում են Nominatim
geolocator = Nominatim ()
# Համակարգ համակարգի համար
#################################
Լայնություն = 128
Բարձրություն = 160 SPEED_HZ = 4000000
# Raspberry Pi կազմաձևման կապում
DC = 24 # A0 TFT էկրանին RST = 25 # Վերակայել PIN- ը TFT էկրանին SPI_PORT = 0 # SPI նավահանգիստ ազնվամորու pi- ի վրա, SPI0 SPI_DEVICE = 0 # Ստրուկ ընտրել ազնվամորի պիի վրա, CE0
# Ստեղծեք TFT LCD ցուցադրման օբյեկտ
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Նախնականացնել ցուցադրումը
disp.begin ()
# Նախապատմությունը կդառնա կանաչ
#disp. հստակ ((0, 255, 0))
# Մաքրել էկրանը սպիտակի վրա և ցուցադրել
#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), ուրվագիծ = (255, 0, 0), fill = (0, 0, 255)) #disp.display ()
# Արագություն, լայնություն, երկայնություն տեղադրման փոփոխականներ
#currentS = "Ընթացիկ արագություն." # Speed string #totalDis = "Ընդհանուր հեռավորություն." # Distance string #currentLoc = "Ընթացիկ գտնվելու վայրը." # Տեղադրության տող
# Հեռավորության x և y կոորդինատները
distX = 10 distY = 20
միավորների ցուցակ =
# Արագության և y կոորդինատները
արագություն x = 10 արագություն Y = 20
# Տեղադրության x և y կոորդինատները
locX = 10 locY = 20
# Փոխակերպում է m/s- ից mph
convertVal = 2.24
# Արագության թարմացման գործառույթ, վերադարձնում է տողը
SpeedVar = 0
def speedFunc (). գլոբալ SpeedVar SpeedText = data_stream. TPV ['արագություն] եթե (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = կլոր (SpeedText, 1) # վերադարձ (SpeedText)
def locationFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
գտնվելու վայրը = geolocator.reverse (reverseString)
վերադարձ (գտնվելու վայրը. հասցե)
# Latitude թարմացման գործառույթը, վերադարձնում է բոցավառվող արժեքը
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): return 0 else: return float (round (Latitude, 4))
# Երկայնության թարմացման գործառույթ, վերադարձնում է տողը
def lonFunc (): Երկայնություն = data_stream. TPV ['lon'] եթե (Երկայնություն == "n/a"): վերադարձ 0 այլ. վերադարձ բոց (կլոր (Երկայնություն, 4))
# Հեռավորության գործառույթը վերադարձնում է TOTAL անցած ճանապարհը
ընդհանուր հեռավորություն = 0
def distFunc ():
գլոբալ totalDistance newLat = latFunc () newLon = lonFunc () եթե (newLat == 0 կամ newLon == 0): totalDistance = totalDistance # վերադարձ (totalDistance) այլ ՝ pointsList.append ((newLat, newLon)) last = len (pointsList) -1 եթե (վերջին == 0). Վերադարձ ուրիշ ՝ totalDistance += coorDistance (միավորների ցուցակ [վերջին-1], միավորների ցուցակ [վերջին]) # վերադարձ ընդհանուր հեռավորություն
# Վերականգնում է ընդհանուր հեռավորությունը
def resDistance ():
գլոբալ totalDistance totalDistance = 0
# Ֆունկցիա, որն օգտագործվում է երկու կոորդինատների միջև հեռավորություն գտնելու համար
# -ը օգտագործում է Հավերսինի բանաձևը գտնելու համար: # Մուտքային կետերը բազմապատիկ են
def coor Հեռավորություն (կետ 1, կետ 2):
# Երկրի մոտավոր շառավիղը կիլոմետրերով երկիր Ռադիուս = 6373.0
lat1 = միավոր 1 [0]
lon1 = միավոր 1 [1]
lat2 = միավոր 2 [0]
lon2 = point2 [1]
distanceLon = lon2 - lon1
distanceLat = lat2 - lat1
# Հավերսինե ա
a = sin (distanceLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (distanceLon/2) ** 2
# Հավերսինե գ
c = 2 * atan2 (sqrt (a), sqrt (1-a))
# Փոխակերպեք կմ -ը մղոնների
հեռավորություն = (earthRadius * c) * 0.62137
եթե (հեռավորություն <= 0.01). վերադարձ 0.00 ուրիշ. վերադարձի շրջան (հեռավորություն, 3)
# Ֆունկցիա ՝ էկրանին արագությունը ցուցադրելու համար
def dispSpeed ():
գլոբալ SpeedVar # Տեղադրեք հեռավորությունը փոփոխականի վրա էկրանին draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Ֆունկցիա ՝ էկրանին հեռավորությունը ցուցադրելու համար
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Գործառույթը, որը ցուցադրում է էկրանին գտնվելու վայրը, աշխատելու համար պահանջում է ինտերնետ
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Բառարանի օգտագործումը ՝ անջատիչ հայտարարությունները ընդօրինակելու համար
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Էկրանի ելքային գործառույթ
def ելք ():
# Օգտագործելով գլոբալ փոփոխականը ցուցադրման համար լրացնել = (255, 0, 0))
# Sանգերի գործառույթ ՝ կախված ցուցադրման ինդեքսի արժեքից
dispOptions [displayIndex] ()
# Կջնջվի, եթե այլ մեթոդ աշխատի
# տեղ հեռավորության փոփոխական էկրանին
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #տեղադրել արագության փոփոխական էկրանին #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # updatesուցադրել թարմացումներ էկրանին disp.display ()
displayButton = 18 # BCM կապում ազնվամորու pi- ի վրա
resetButton = 23 # BCM կապում ազնվամորու pi- ի վրա
buttonPress = Կեղծ
def checkDisplay ():
գլոբալ կոճակ գլոբալ ցուցադրման ցուցիչ if (bGPIO.input (displayButton) և ոչ buttonPress). Դեռ սեղմված է ) այլ: buttonPress = Կեղծ
# Կարգավորեք GPS- ը
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
ժամանակաչափ eriամանակաշրջան =.5
# Exուցադրման արժեք ցուցադրման համար Index = 0 փորձ. Gps_socket- ում new_data- ի համար. Եթե new_data: data_stream.unpack (new_data), եթե 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)). / n Վերջացրած օգտվողի կողմից ctrl+c ')
Վերոնշյալ ծածկագիրը ընդամենը մեկ օրինակ է, թե ինչպես կոդավորել մեր համակարգը, և ես տեղադրել եմ տեսանյութ, թե ինչպես է աշխատում այս համակարգը: