Mundarija:
- 1 -qadam: Ishga kirishish
- 2 -qadam: GPS modulini Raspberry Pi -ga ulang
- 3 -qadam: GPS qabul qilish modulidan ma'lumotlarni olish
- 4 -qadam: Displeyni Raspberry Pi -ga ulang
- 5 -qadam: Displeyni Raspberry Pi bilan ishlashga sozlash
- 6 -qadam: GPS ma'lumotlarini displeyda ko'rsatish uchun davlat mashinalarini o'rnating
- 7 -qadam: GPS tizimimizni joriy etamiz
Video: GPS tizimi: 7 qadam
2025 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2025-01-10 13:49
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
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
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 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
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
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
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.