Mundarija:

GPS tizimi: 7 qadam
GPS tizimi: 7 qadam

Video: GPS tizimi: 7 qadam

Video: GPS tizimi: 7 qadam
Video: "GPS" трекер (прослушка, GPS, диктофон) билан ҳаммасини назорат қилинг. Хар дақиқа қаерда эканлиги 2024, Oktyabr
Anonim
GPS tizimi
GPS tizimi
GPS tizimi
GPS tizimi
GPS tizimi
GPS tizimi

Loyiha muallifi: Karlos Gomes

Sayohat qilish va dunyoni kashf qilmoqchi bo'lganlar uchun ishonchli navigatsiya tizimiga ega bo'lish birinchi o'rinda turadi.

Navigatsiya tizimining ishlashiga imkon beradigan eng muhim jihat - bu tizimning ichiga o'rnatilgan GPS qobiliyati. GPS tizimi har kimga foydalanuvchi haqidagi aniq ma'lumotlarni ko'rsatish va foydalanuvchiga qaerda va ular joylashgan joydan qanchalik uzoqda ekanligi to'g'risida aniq tasavvur berish uchun ularning joylashuvi va tezligini kuzatib borishga imkon beradi.

Global joylashishni aniqlash tizimi (GPS) - taxminan 20 000 km balandlikda Yer atrofida aylanadigan yo'ldoshlar tarmog'i. GPS qurilmasiga ega bo'lgan har bir kishi sun'iy yo'ldoshlar uzatadigan radio signallarini qabul qilishi mumkin va ulardan istalgan tarzda foydalana oladi. Sayyoramiz qayerda bo'lishidan qat'i nazar, istalgan vaqtda kamida to'rtta GPS mavjud bo'lishi kerak. Uch o'lchovli trilateratsiya usuli yordamida GPS qurilmasi qurilmaning Yerda joylashishini aniqlash uchun uchta yo'ldoshdan foydalanishi mumkin. Uch yo'ldoshning har biri qurilmaga signal yuboradi va qurilma uning sun'iy yo'ldoshdan masofasini aniqlaydi. Uch masofali hisob -kitoblarning har biridan foydalanib, qurilma endi Yerdagi o'rnini aniqlay oladi va uni foydalanuvchiga qaytaradi.

Biz yaratadigan GPS tizimi foydalanuvchining tezligini, joylashuvini va bosib o'tgan masofasini qaytarish uchun Yerdagi koordinatalarini olish va ba'zi hisob -kitoblarni bajarish orqali foydalanuvchining joylashuvini kuzatishi mumkin bo'ladi.

1 -qadam: Ishga kirishish

Ishni boshlash
Ishni boshlash
Ishni boshlash
Ishni boshlash
Ishni boshlash
Ishni boshlash
Ishni boshlash
Ishni boshlash

Loyihani boshlash uchun, avvalo, barcha kerakli materiallarni to'plashimiz kerak bo'ladi

1: Raspberry Pi Zero Vt

2: GPS qabul qiluvchisi

3: 1,8 TFT 128 x 160 LCD displey

4: ~ 11 ta sim

5: 2 tugmachalari

6: 2x 1k va 2x 10k qarshilik tugmachalarini pastga tushirish uchun

7: non paneli

Bu loyiha Raspberry Pi ning GPIO pinlaridan foydalanadi va shuning uchun biz o'z loyihamizni ishlab chiqish uchun hamma narsani non paneli bilan ulashimiz kerak bo'ladi. Bundan tashqari, barcha pimlarni lehimlash, biz harakat qilishdan va barcha qismlarimizni ulashdan oldin bajarilgan va tugagan deb taxmin qilinadi.

2 -qadam: GPS modulini Raspberry Pi -ga ulang

GPS modulini Raspberry Pi -ga ulang
GPS modulini Raspberry Pi -ga ulang
GPS modulini Raspberry Pi -ga ulang
GPS modulini Raspberry Pi -ga ulang

Bizning GPS tizimimizdan foydalanish uchun GPS modulidan Tx va Rx pinlarini Raspberry Pi -dagi GPIO pin 14 va 15 ga ulashingiz kerak bo'ladi. GPS -qabul qilgichning Tx -pinasi Pi -ning Rx -piniga, GPS -qabul qilgichning -Rx -pinasi esa Raspberry pi -ning Tx -piniga o'tadi.

Rasmlarda ko'rsatilgan GPS -qabul qilgich 3.3V kuchlanishdan foydalanishni talab qiladi va siz topraklama pimini erga ulashda siz 3,3V pinlarni to'g'ri voltajga ulashingiz mumkin.

3 -qadam: GPS qabul qilish modulidan ma'lumotlarni olish

GPS qabul qilish modulidan ma'lumotlarni olish
GPS qabul qilish modulidan ma'lumotlarni olish

GPS -qabul qilgichdan Raspberry Pi -ga ma'lumotlarni qabul qilish uchun biz UART portlaridan to'g'ri rozetkalarni o'qishga ruxsat berishimiz kerak. Xom ma'lumotni o'qish bizdan o'z tahlil qilish kutubxonasini yaratishni talab qiladi, lekin bu holatda biz ma'lumotlarni tahlil qilish va uni Raspberry Pi -ga yuborish uchun orqa fonda ishlaydigan GPS demonidan foydalanishimiz mumkin.

Buni amalga oshirish uchun biz Raspberry Pi -da terminal ochib, kodni bajarishimiz mumkin:

sudo apt-get yangilanishi

sudo apt-get gpsd gpsd-client python-gps ni o'rnating

Bu biz uchun yuklab olish haqida g'amxo'rlik qilishi kerak.

Tugallangach, biz gpsd tizimi xizmatini quyidagi buyruqlar yordamida o'chirib qo'yishimiz kerak:

sudo systemctl stop gpsd.socket

sudo systemctl gpsd.socket -ni o'chirib qo'ying

Agar siz standart gpsd tizim xizmatini yoqmoqchi bo'lsangiz, uni qayta tiklash uchun quyidagi buyruqlarni bajarishingiz mumkin:

sudo systemctl gpsd.socket -ni yoqadi

sudo systemctl gpsd.socket -ni ishga tushiring

Endi biz gpsd dasturini ishga tushirishimiz va uni kiritish orqali UART portlariga yo'naltirishimiz kerak

sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock

Endi biz quyidagi buyruqni ishga tushirishimiz va undagi barcha ma'lumotlarni ko'rishimiz mumkin!

cgps -lar

4 -qadam: Displeyni Raspberry Pi -ga ulang

Displeyni Raspberry Pi -ga ulang
Displeyni Raspberry Pi -ga ulang
Displeyni Raspberry Pi -ga ulang
Displeyni Raspberry Pi -ga ulang

GPS qabul qilgichimiz Raspberry Pi bilan ishlagandan so'ng, biz displeyni Raspberry Pi -ga ulashimiz mumkin, biz LCD displeyimizni Raspberry Pi -ga ulash uchun 5 ta simdan va asosiy quvvat va LEDni ulash uchun yana 4 ta pindan foydalanamiz. ekranda.

Men foydalanadigan TFT ekranining fotosuratini qo'shdim, lekin bu xuddi shunday o'lchamdagi va tuzilishdagi ekranlar bilan ishlashi kerak.

LED- va GND-ni erga ulang va LED+ va VCC-ni 3.3V ga ulang.

Ekrandagi RESET pinini Pi taxtasidagi 25 -pinga ulang.

A0 -ni Pi kartasidagi 24 -pinga ulang.

SDA pinini Pi platasidagi MOSI piniga ulang.

LCD displeyidagi SCK pinini Pi taxtasiga ulang.

CS pinini Pi taxtasidagi 8 -pinga ulang.

5 -qadam: Displeyni Raspberry Pi bilan ishlashga sozlash

Raspberry Pi bilan ishlash uchun displeyni o'rnating
Raspberry Pi bilan ishlash uchun displeyni o'rnating

Displeyni sozlash uchun biz ushbu omborda joylashgan ST7735 kutubxonasidan foydalanishimiz kerak:

Python ST7735 ekran kutubxonasi

Bu displey kutubxonasini Raspberry Pi tizimimizga o'rnatganimizdan so'ng, biz avvalgi simlarimiz to'g'ri ishlayotganini tasdiqlash uchun namuna faylini o'rnatishga o'tamiz.

Example.py nomli fayl yarating va quyidagi matnni shu papkaga o'zingiz tanlagan rasm namunasi bilan kiriting.

ST7735 ni TFTimport Adafruit_GPIO sifatida GPIO sifatida import qilish Adafruit_GPIO. SPIni SPI sifatida import qilish

Kenglik = 128

Balandlik = 160 SPEED_HZ = 4000000

# Raspberry Pi konfiguratsiyasi.

# Bu LCD -ni Raspberry Pi -ga ulash uchun zarur bo'lgan pinlar

DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0

# TFT LCD displey sinfini yarating.

disp = TFT. ST7735 (shahar, birinchi = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))

# Displeyni ishga tushiring.

disp.begin () disp.reset ()

# Rasm yuklash.

newData = 0x42 disp.command (newData) chop etish ('Rasm yuklanmoqda…') image = Image.open ('cat.jpg')

# Tasvirning o'lchamini o'zgartiring va ekranga mos keladigan tarzda aylantiring.

image = image.rotate (270).resize ((WIDTH, HEIGHT))

# Bizning dasturimiz bizning tasvirimizni ekranda chizayotgan terminalga chop etadi

chop etish ("Rasm chizish")

# Bu funksiya bizning rasmimizni ekranda aks ettiradi

disp. displey (rasm)

Bu fayl LCD displey uchun Raspberry Pi konfiguratsiyasini o'rnatadi va kutubxona bizning rasmimizni papkaga o'zgartiradi va uni ekranda ko'rsatadi.

6 -qadam: GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating

GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating
GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating
GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating
GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating
GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating
GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating

Biz gps tizimini sozlash uchun vazifa diagrammasini amalga oshirishda 5 xil davlat mashinasidan foydalanamiz.

Displey holatini o'zgartirish mashinasi:

Bu holat mashinasi tugma kiritishimizga qarab, qaysi ekran ko'rsatilishini nazorat qiladi. Bu, pythonga o'rdak yozish imkoniyatidan foydalanishga va chaqirilgan funktsiyaga qarab, to'g'ri funktsiyani ko'rsatishga imkon beradigan o'zgaruvchini o'zgartirish orqali amalga oshiriladi.

Tezlik holati mashinasi:

Bu davlat mashinasi odamlarning joylashuviga qarab joriy tezlikni bajaradi. Bu GPS tizimi uchun har bir soat tsiklini bajaradi

Chiqish holati mashinasi:

Bu holat mashinasi chiqishni displeyning holatini o'zgartirish mashinasi joriy displey deb belgilaydigan o'zgaruvchiga qarab aniqlaydi.

Masofadagi davlat mashinasi

Bu shtat mashinasi har bir soat tsiklini bajaradi va foydalanuvchi bosib o'tgan umumiy masofani aniqlaydi va reset tugmasi bosilgandan so'ng, o'tgan masofani tiklaydi.

Joylashuv holati mashinasi:

Bu shtat mashinasi GPS moduli foydalanuvchi haqida qaytaradigan koordinatalar yordamida foydalanuvchining joriy manzilini qaytaradi. Ushbu davlat mashinasi foydalanuvchilarning Internetga ulanishiga bog'liq.

7 -qadam: GPS tizimimizni joriy etamiz

GPS moduli Raspberry Pi -ga ma'lumot yuborganida va bizda ma'lumotlarni aks ettiruvchi LCD displeyga ega bo'lgach, biz GPS tizimini dasturlashni boshlashimiz mumkin. GPS tizimini kodlash uchun men oldingi bosqichning cheklangan holatli mashinalarini ishlataman

## Navigatsiya tizimi uchun asosiy fayl # # # #

# Rasm chizish uchun kutubxonalar

PIL importidan PIL importidan ImageDraw PIL import ImageFont -dan

ST7737 tekshiruvi uchun # kutubxona

ST7735ni TFT sifatida import qilish

Raspberry Pi uchun GPIO uchun # kutubxona

Adafruit_GPIO ni GPIO sifatida import qilish Adafruit_GPIO. SPI ni SPI sifatida import qilish

GPS uchun # kutubxona

#import gpsd gps3 dan gps3 import gps3

# Vaqt kutubxonasi

import vaqti

# Ikki nuqta orasidagi masofani topish uchun kutubxona

matematikadan import sin, cos, sqrt, atan2, radian

# Rpi kutubxonasini import qilish, menyularni almashtirish va qayta o'rnatish tugmalaridan foydalanish

# import RPi. GPIO bGPIO sifatida

# Tugmalar uchun pinlarni o'rnating

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)

Geocoding uchun # import geopy kutubxonasi

Buning uchun # # Internetga kirish kerak

dan geopy.geocoders import Nominatim

geolokator = Nominatim ()

# Tizim uchun doimiylar

#################################

Kenglik = 128

Balandlik = 160 SPEED_HZ = 4000000

# Raspberry Pi konfiguratsion pinlari

TFT ekranida DC = 24 # A0 RST = 25 # TFT ekranidagi pinni tiklash SPI_PORT = 0 # malina pi ustidagi SPI porti, SPI0 SPI_DEVICE = 0 # Rapsberry pi -da qul tanlash, CE0

# LCD displeyli TFT ob'ektini yarating

disp = TFT. ST7735 (shahar, birinchi = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))

# Displeyni ishga tushiring

disp.begin ()

# Fon yashil rangga o'rnatiladi

#disp.clear ((0, 255, 0))

# Ekranni oq va ekranga tozalang

#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), kontur = (255, 0, 0), to'ldirish = (0, 0, 255)) #disp.display ()

# Tezlik, kenglik, uzunlik joylashuvi o'zgaruvchilari

#currentS = "Hozirgi tezlik:" # Tezlik qatori #totalDis = "Umumiy masofa:" # Masofa qatori #currentLoc = "Hozirgi manzil:" # Joylashuv qatori

# X va y masofalari koordinatalari

distX = 10 distY = 20

pointsList =

# Tezlik x va y koordinatalari

tezlikX = 10 tezlikY = 20

# X va y coordiantes joylashuvi

locX = 10 locY = 20

# M/s dan mil/soatga o'zgartiradi

convertVal = 2.24

# Tezlikni yangilash funktsiyasi, qatorni qaytaradi

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

manzil = geolocator.reverse (reverseString)

qaytish (manzil. manzil)

# Latitude yangilash funktsiyasi float qiymatini qaytaradi

def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): 0 qaytish boshqa: qaymoq float (dumaloq (Latitude, 4))

# Uzunlikni yangilash funktsiyasi, qatorni qaytaradi

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): 0 qaytish boshqa: qaymoq float (dumaloq (Uzunlik, 4))

# Masofa funktsiyasi TOTAL bosib o'tgan masofani qaytaradi

totalDistance = 0

def distFunc ():

global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 yoki newLon == 0): totalDistance = totalDistance # return (totalDistance) else: pointsList.append ((newLat, newLon)) last = len (pointsList) -1 agar (oxirgi == 0): qaytish boshqa: totalDistance += coorDistance (ballList [oxirgi-1], ballList [oxirgi]) # qaytish umumiyDistance

# Umumiy masofani tiklaydi

def resDistance ():

global totalDistance totalDistance = 0

# Ikki koordinata orasidagi masofani topish uchun ishlatiladigan funktsiya

# topish uchun Haversine formulasidan foydalanadi. # Kirish nuqtalari - bu birlashma

def coorDistance (nuqta1, nuqta2):

# Erning taxminiy radiusi kilometrlarda er radiusi = 6373.0

lat1 = nuqta1 [0]

lon1 = nuqta1 [1]

lat2 = nuqta2 [0]

lon2 = nuqta2 [1]

masofaLon = lon2 - lon1

masofaLat = lat2 - lat1

# Haversine a

a = sin (masofaLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (masofaLon/2) ** 2

# Haversine c

c = 2 * atan2 (sqrt (a), sqrt (1-a))

# Kmni Milga aylantiring

masofa = (earthRadius * c) * 0.62137

if (masofa <= 0,01): qaytish 0,00 boshqa: qaytish davri (masofa, 3)

# Tezlikni ekranda ko'rsatish funktsiyasi

def dispSpeed ():

global SpeedVar # Masofani ekranning o'zgarmaydigan joyiga qo'ying draw.text ((speedX, speedY), str (SpeedVar), shrift = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Ekranda masofani ko'rsatish funktsiyasi

def dispDistance ():

draw.text ((distX, distY), str (totalDistance), shrift = ImageFont.truetype ("Lato-Medium.ttf", 60))

# Ekrandagi joylashuvni ko'rsatish funktsiyasi Internetning ishlashini talab qiladi

def dispLocation ():

draw.text ((locX, locY), locationFunc (), shrift = ImageFont.truetype ("Lato-Medium.ttf", 8))

# Kalit so'zlarini taqlid qilish uchun lug'atdan foydalanish

dispOptions = {

0: dispSpeed, 1: dispDistance, 2: dispLocation}

# Ekranni chiqarish funktsiyasi

def chiqishi ():

# DisplayIndex global displayIndex uchun global o'zgaruvchidan foydalanish to'ldirish = (255, 0, 0))

# DisplayIndex qiymatiga qarab qo'ng'iroqlar funktsiyasi

dispOptions [displayIndex] ()

# Boshqa usul ishlasa o'chiriladi

# masofadagi o'zgaruvchini ekranda joylashtiring

#draw.text ((distX, distY), str (distFunc ()), shrift = ImageFont.load_default ()) #tezlik o'zgaruvchisini ekranda joylashtirish #draw.text ((speedX, speedY), speedFunc (), shrift = ImageFont.load_default ()) # Ekran disp.display () yangilanishlarini ko'rsatish

displayButton = 18 # BCM malina pi -ga pin

resetButton = 23 # BCM malina pi -ga pin

tugmasini bosing = noto'g'ri

def checkDisplay ():

global tugmachasini bosing global displayIndex if (bGPIO.input (displayButton) va tugmani bosmang): displayIndex += 1 tugmasini bosing = True bo'lsa (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) va tugmasini bosing): chop etish (" Hali ham bosilgan ") boshqa: tugmani bosing = False

# GPS -ni sozlash

gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()

taymerPeriod =.5

DisplayIndex = 0 ko'rsatish uchun indeks qiymati: gps_socket -dagi yangi ma'lumotlar uchun: agar new_data: data_stream.unpack (new_data) if data_stream. TPV ['lat']! = 'N/a': chop etish (data_stream. TPV ['tezlik' ')], 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 () bosib chiqarish ('GPS hali ulanmagan') vaqt. uyqu (.1) vaqt. / nCtrl+c 'foydalanuvchisi tomonidan tasdiqlangan)

Yuqoridagi kod - bu bizning tizimimizni qanday kodlash mumkinligi haqidagi birgina misol va men bu tizim qanday ishlashi haqida videoni joylashtirdim.

Tavsiya: