Բովանդակություն:

GPS համակարգ `7 քայլ
GPS համակարգ `7 քայլ

Video: GPS համակարգ `7 քայլ

Video: GPS համակարգ `7 քայլ
Video: GPS treker GF- 07 Не покупайте 2024, Հոկտեմբեր
Anonim
GPS համակարգ
GPS համակարգ
GPS համակարգ
GPS համակարգ
GPS համակարգ
GPS համակարգ

Նախագծի հեղինակ ՝ Կառլոս Գոմես

Հուսալի նավիգացիոն համակարգ ունենալը ամենակարևորն է նրանց համար, ովքեր փորձում են ճանապարհորդել և ուսումնասիրել աշխարհը:

Նավիգացիոն համակարգին աշխատելու ամենակարևոր ասպեկտը համակարգի ներսում ներդրված 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 մոդուլը Raspberry Pi- ին
Միացրեք GPS մոդուլը Raspberry Pi- ին
Միացրեք GPS մոդուլը Raspberry Pi- ին
Միացրեք 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 ընդունիչի մոդուլից
Տվյալներ ստացեք 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- ին

Միացրեք ցուցադրումը Raspberry Pi- ին
Միացրեք ցուցադրումը Raspberry Pi- ին
Միացրեք ցուցադրումը Raspberry Pi- ին
Միացրեք ցուցադրումը 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- ի հետ աշխատելու համար

Կարգավորեք ցուցադրումը `Raspberry Pi- ի հետ աշխատելու համար
Կարգավորեք ցուցադրումը `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 տեղեկատվությունը ցուցադրելու համար

Կարգավորեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
Կարգավորեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
Կարգավորեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
Կարգավորեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
Ստեղծեք պետական մեքենաներ `ցուցադրվող GPS տեղեկատվությունը ցուցադրելու համար
Ստեղծեք պետական մեքենաներ `ցուցադրվող 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 ')

Վերոնշյալ ծածկագիրը ընդամենը մեկ օրինակ է, թե ինչպես կոդավորել մեր համակարգը, և ես տեղադրել եմ տեսանյութ, թե ինչպես է աշխատում այս համակարգը:

Խորհուրդ ենք տալիս: