İçindekiler:

GPS Sistemi: 7 Adım
GPS Sistemi: 7 Adım

Video: GPS Sistemi: 7 Adım

Video: GPS Sistemi: 7 Adım
Video: Eşinizin siz olmadan gittiği yerleri nasıl görürsünüz ? 2024, Ekim
Anonim
GPS Sistemi
GPS Sistemi
GPS Sistemi
GPS Sistemi
GPS Sistemi
GPS Sistemi

Proje Yaratıcısı: Carlos Gomez

Seyahat etmeye ve dünyayı keşfetmeye çalışan herkes için güvenilir bir navigasyon sistemine sahip olmak çok önemlidir.

Navigasyon sisteminin çalışmasını sağlayan en önemli unsur, sistemin içine yerleştirilmiş GPS özelliğidir. GPS sistemi, kullanıcı hakkında doğru bilgileri görüntülemek ve kullanıcıya nerede olduklarını ve bulundukları yerden ne kadar uzakta olduklarını doğru bir şekilde göstermek için herkesin konumunu ve hızını takip etmesine olanak tanır.

Küresel Konumlandırma Sistemi (GPS), Dünya yörüngesinde yaklaşık 20.000 km yükseklikte dönen bir uydu ağıdır. GPS cihazı olan herkes, uyduların yayınladığı radyo sinyallerini alabilir ve ihtiyaç duyduğu şekilde kullanabilir. Gezegenin neresinde olursanız olun, istediğiniz zaman en az dört GPS mevcut olmalıdır. 3-D trilaterasyon adı verilen bir yöntem kullanarak, bir GPS cihazı, cihazın Dünya'daki yerini belirlemek için üç uydu kullanabilir. Üç uydunun her biri cihaza bir sinyal gönderir ve cihaz uyduya olan mesafesini belirler. Cihaz, üç uzaklık hesaplamasının her birini kullanarak artık Dünya üzerindeki yerini tam olarak belirleyebiliyor ve bunu kullanıcıya geri veriyor.

Oluşturacağımız GPS sistemi, kullanıcının Dünya üzerindeki koordinatlarını alarak ve kullanıcının hızını, konumunu ve kat ettiği mesafeyi geri döndürmek için bazı hesaplamalar yaparak kullanıcının konumlarını takip edebilecektir.

1. Adım: Başlarken

Başlarken
Başlarken
Başlarken
Başlarken
Başlarken
Başlarken
Başlarken
Başlarken

Bu projeyi başlatmak için önce tüm doğru malzemeleri toplamamız gerekecek.

1: Ahududu Pi Sıfır W

2: GPS Alıcısı

3: 1.8 TFT 128 x 160 LCD SPI Ekran

4: ~11 tel

5: 2 düğme

6: aşağı çekme butonları için 2x 1k ve 2x 10k dirençler

7: Ekmek tahtası

Bu proje Raspberry Pi'nin GPIO pinlerini kullanacak ve bu nedenle projemizi geliştirmek için her şeyi bir breadboard ile bağlamamız gerekecek. Ayrıca, tüm parçalarımızı bağlamadan ve bağlamadan önce tüm pimlerdeki lehimlemenin yapıldığı ve tamamlandığı varsayılmaktadır.

Adım 2: GPS Modülünü Raspberry Pi'ye Bağlayın

GPS Modülünü Raspberry Pi'ye Bağlayın
GPS Modülünü Raspberry Pi'ye Bağlayın
GPS Modülünü Raspberry Pi'ye Bağlayın
GPS Modülünü Raspberry Pi'ye Bağlayın

GPS sistemimizi kullanmak için GPS modülündeki Tx ve Rx pinlerini Raspberry Pi üzerindeki GPIO pin 14 ve 15'e bağlamanız gerekecektir. GPS alıcısının Tx pini Pi'nin Rx pinine, GPS alıcısının Rx pini Raspberry pi'nin Tx pinine gider.

Resimlerde gösterilen GPS alıcısının kullanılması için 3.3V gerekmektedir ve Ground pinini toprağa bağlarken 3.3V pinlerini doğru voltaja bağlayabilirsiniz.

Adım 3: GPS Alıcı Modülünden Veri Alın

GPS Alıcı Modülünden Veri Alma
GPS Alıcı Modülünden Veri Alma

GPS alıcısından Raspberry Pi'ye veri alabilmek için UART portlarından doğru soketlerin okumasına izin vermemiz gerekiyor. Ham verileri okumak, kendi ayrıştırma kitaplığımızı oluşturmamızı gerektirir, ancak bu senaryoda, verileri ayrıştırmaya ve Raspberry Pi'ye iletmeye yardımcı olmak için arka planda çalışan bir GPS arka plan programından yararlanabiliriz.

Bunu başarmak için Raspberry Pi üzerinde bir terminal açıp şu kodu çalıştırabiliriz:

sudo apt-get güncellemesi

sudo apt-get install gpsd gpsd-clients python-gps

Bu bizim için indirmeye dikkat etmelidir.

Tamamlandığında, aşağıdaki komutları çalıştırarak gpsd sistem hizmetini devre dışı bırakmamız gerekiyor:

sudo systemctl gpsd.socket'i durdur

sudo systemctl gpsd.socket'i devre dışı bırak

Varsayılan gpsd sistem hizmetini etkinleştirmek isterseniz, geri yüklemek için aşağıdaki komutları çalıştırabilirsiniz:

sudo systemctl gpsd.socket'i etkinleştir

sudo systemctl gpsd.socket'i başlat

Şimdi gpsd arka planını başlatmamız ve girerek UART portlarına yönlendirmemiz gerekiyor.

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

Artık aşağıdaki komutu çalıştırabilir ve içinde yüzen tüm verileri görebiliriz!

cgps -s

Adım 4: Ekranı Raspberry Pi'ye Bağlayın

Ekranı Raspberry Pi'ye Bağlayın
Ekranı Raspberry Pi'ye Bağlayın
Ekranı Raspberry Pi'ye Bağlayın
Ekranı Raspberry Pi'ye Bağlayın

GPS alıcımızı kurduktan ve Raspberry Pi ile çalıştıktan sonra, ekranı Raspberry Pi'ye bağlayabiliriz. LCD ekranımızı Raspberry Pi'ye bağlamak için 5 kablo ve ana gücü ve LED'i bağlamak için 4 pin daha kullanacağız. ekranda.

Kullandığım TFT ekranın bir fotoğrafını ekledim, ancak bu, benzer boyut ve yapıdaki ekranlarla çalışmalıdır.

LED- ve GND'yi toprağa bağlayın ve LED+ ve VCC'yi 3.3V'a bağlayın.

Ekrandaki RESET pinini Pi kartındaki pin 25'e bağlayın.

A0'ı Pi kartındaki pim 24'e bağlayın.

SDA pinini Pi kartındaki MOSI pinine bağlayın.

LCD ekrandaki SCK pinini Pi kartına bağlayın.

CS pinini Pi kartındaki pin 8'e bağlayın.

Adım 5: Raspberry Pi ile Çalışmak için Ekranı Ayarlayın

Raspberry Pi ile Çalışacak Kurulum Ekranı
Raspberry Pi ile Çalışacak Kurulum Ekranı

Ekranı kurmak için bu depoda bulunan ST7735 kitaplığını kullanmamız gerekiyor:

Python ST7735 Ekran Kitaplığı

Bu ekran kitaplığını Raspberry Pi sistemimize yükledikten sonra, önceki kablolamamızın doğru çalıştığını doğrulamak için örnek bir dosya oluşturmaya başlayabiliriz.

example.py başlıklı bir dosya oluşturun ve aşağıdaki metni, seçtiğiniz örnek bir resimle birlikte aynı klasöre ekleyin.

ST7735'i TFTimport Adafruit_GPIO olarak GPIO olarak içe aktar Adafruit_GPIO. SPI'yi SPI olarak içe aktar

GENİŞLİK = 128

YÜKSEKLİK = 160 HIZ_HZ = 4000000

# Raspberry Pi yapılandırması.

# LCD'yi Raspberry Pi'ye bağlamak için gereken pinler bunlardır.

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

# TFT LCD ekran sınıfı oluşturun.

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

# Ekranı başlat.

disp.begin() disp.reset()

# Bir resim yükleyin.

newData = 0x42 disp.command(newData) print('Resim yükleniyor…') image = Image.open('cat.jpg')

# Resmi yeniden boyutlandırın ve ekrana uyacak şekilde döndürün.

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

# Programımızın ekrandaki resmimizi çizdiği terminale yazdıracak

print('Çizim resmi')

# Bu fonksiyon resmimizi ekranda gösterecek

disp.display(resim)

Bu dosya, LCD ekran için Raspberry Pi konfigürasyonunu kuracak ve kütüphane, klasördeki imajımızı dönüştürecek ve ekranda gösterecektir.

Adım 6: GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın

GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın
GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın
GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın
GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın
GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın
GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın

GPS sistemimizi kurmak için görev diyagramımızı uygularken 5 farklı durum makinesi kullanacağız.

Durum değiştirme makinesini görüntüleyin:

Bu durum makinesi, düğme girişimize bağlı olarak hangisinin görüntüleneceğini kontrol edecektir. Bunu, python'un ördek yazımından yararlanmasına izin veren bir değişkeni değiştirerek ve çağrılan işleve bağlı olarak görüntülemek için doğru işlevi çağırarak yapar.

Hız durumu makinesi:

Bu durum makinesi, bireylerin konumuna bağlı olarak mevcut hızı yürütecektir. Bu, GPS sistemi için her saat döngüsünü yürütecektir.

Çıkış durumu makinesi:

Bu durum makinesi, çıktıyı, görüntü değiştirme durumu makinesinin geçerli görüntü olarak belirlediği değişkene göre belirleyecektir.

Mesafe durum makinesi

Bu durum makinesi, her saat döngüsünü yürütür ve kullanıcı tarafından kat edilen toplam mesafeyi belirler ve sıfırlama düğmesine basıldığında, kat edilen mevcut mesafeyi sıfırlar.

Konum durumu makinesi:

Bu durum makinesi, GPS modülünün kullanıcı hakkında döndürdüğü koordinatları kullanarak kullanıcının mevcut konumunu döndürür. Bu durum makinesi, kullanıcıların internet bağlantısına bağlıdır.

7. Adım: GPS Sistemimizi Uygulayalım

Raspberry Pi'mize bilgi gönderen GPS modülümüz ve üzerindeki bilgileri gösteren LCD ekranımız aldıktan sonra GPS sistemimizi programlamaya başlayabiliriz. GPS sistemimizi kodlamak için önceki adımın sonlu durum makinelerini kullanacağım

## Navigasyon sistemi için ana dosya # # # #

# Resim çizmek için kütüphaneler

PIL'den içe aktar PIL'den görüntü içe aktar PIL'den ImageDraw içe aktar ImageFont

# ST7737 denetleyicisi için kitaplık

ST7735'i TFT olarak içe aktar

# Raspberry Pi için GPIO Kütüphanesi

Adafruit_GPIO'yu GPIO olarak içe aktar Adafruit_GPIO. SPI'yi SPI olarak içe aktar

# GPS için kitaplık

# gpsd'yi gps3'ten içe aktar, gps3'ü içe aktar

# Zaman için kitaplık

ithalat zamanı

# İki nokta arasındaki mesafeyi bulmak için kitaplık

matematikten içe aktar sin, cos, sqrt, atan2, radyan

# Menüleri değiştirmek ve sıfırlamak için düğmeleri kullanmak için Rpi kitaplığını içe aktarın

# RPi. GPIO'yu bGPIO olarak içe aktar

# Düğmeler için kurulum pimleri

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 için geopy kitaplığını içe aktar

# # Bunun çalışması için İnternet erişimi gereklidir

geopy.geocoders'dan Nominatim'i içe aktarın

konum belirleyici = Nominatim()

# Sistem için sabitler

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

GENİŞLİK = 128

YÜKSEKLİK = 160 HIZ_HZ = 4000000

# Raspberry Pi yapılandırma pinleri

DC = TFT ekranında 24 # A0 RST = 25 # TFT ekranında Reset pini SPI_PORT = 0 # Raspberry pi üzerinde SPI portu, SPI0 SPI_DEVICE = 0 # Rapsberry pi üzerinde Slave seçimi, CE0

# TFT LCD ekran nesnesi oluşturun

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

# Ekranı başlat

disp.başla()

# Arka plan yeşil olarak ayarlanacak

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

# Ekranı beyaza çevir ve göster

#disp.clear((255, 255, 255)) çiz = disp.draw() #draw.rectangle((0, 10, 127, 150), anahat=(255, 0, 0), dolgu=(0, 0, 255)) #disp.display()

# Hız, Enlem, Boylam yerleşim değişkenleri

#currentS = "Mevcut Hız: " # Hız dizesi #totalDis = "Toplam Mesafe: " # Uzaklık dizesi #currentLoc = "Mevcut Konum: " # Konum dizesi

# Uzaklık x ve y koordinatları

distX = 10 distY = 20

puanListesi =

# Hız x ve y koordinatları

hızX = 10 hızY = 20

# Konum x ve y koordinatları

locX = 10 locY = 20

# m/s'den mph'ye çevirir

dönüşümDeğeri = 2.24

# Hız güncelleme işlevi, dize döndürür

HızVar = 0

def speedFunc(): global SpeedVar SpeedText = data_stream. TPV['speed'] if (SpeedText != "n/a"): SpeedText = float(SpeedText) * convertVal SpeedVar = round(SpeedText, 1) # return (SpeedText)

def locationFunc():

latLoc = str(latFunc()) lonLoc = str(lonFunc())

tersString = latLoc + ", " + lonLoc

konum = geolocator.reverse(reverseString)

dönüş (konum.adres)

# Latitude güncelleme işlevi, kayan nokta değerini döndürür

def latFunc(): Latitude = data_stream. TPV['lat'] if(Latitude == "n/a"): return 0 else: return float(round(Latitude, 4))

# Boylam güncelleme işlevi, dize döndürür

def lonFunc(): Boylam = data_stream. TPV['lon'] if (Boylam == "n/a"): dönüş 0 else: dönüş float(yuvarlak(Boylam, 4))

# Mesafe işlevi, kat edilen TOPLAM mesafeyi döndürür

toplamMesafe = 0

def distFunc():

global totalDistance newLat = latFunc() newLon = lonFunc() if(newLat == 0 veya newLon == 0): totalDistance = totalDistance # return (totalDistance) else: pointList.append((newLat, newLon)) last = len(pointsList))-1 if(last == 0): return else: totalDistance += coorDistance(pointsList[last-1], pointsList[last]) # return totalDistance

# Toplam mesafeyi sıfırlar

def resDistance():

global toplamMesafe toplamıMesafe = 0

# İki koordinat arasındaki mesafeyi bulmak için kullanılan fonksiyon

# bulmak için Haversine'nin formülünü kullanır. # Giriş noktaları bir demetdir

def coorDistance(nokta1, nokta2):

# Dünya'nın kilometre cinsinden yaklaşık yarıçapı earthRadius = 6373.0

lat1 = nokta1[0]

lon1 = nokta1[1]

lat2 = nokta2[0]

lon2 = nokta2[1]

mesafeLon = lon2 - lon1

mesafeLat = lat2 - lat1

#Haversine bir

a = günah(mesafeEnlem/2)**2 + cos(lat1) * cos(lat2) * günah(mesafeBoy/2)**2

# Haversine c

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

# Km'yi Mil'e Dönüştür

mesafe = (yerYarıçap * c) * 0,62137

if(mesafe <= 0.01): dönüş 0.00 başka: dönüş turu(mesafe, 3)

# Ekranda hızı gösterme işlevi

def dispSpeed():

global SpeedVar # Mesafeyi ekranda değişkene yerleştirin draw.text((speedX, speedY), str(SpeedVar), font=ImageFont.truetype("Lato-Medium.ttf", 72))

# Mesafeyi ekranda gösterme işlevi

def dispDistance():

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

# İşlev ti ekranda konumu gösterir, çalışması için internet gerekir

def dispLocation():

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

# Switch ifadelerini taklit etmek için sözlük kullanma

dispOptions = {

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

# Ekran çıktı işlevi

tanım çıktı():

# displayIndex global displayIndex için global değişkeni kullanma # Ekranı temizleme ve arka planı uygulama disp.clear((255, 255, 255)) draw.rectangle((0, 10, 127, 150), anahat=(255, 0, 0), doldur=(255, 0, 0))

# displayIndex değerine bağlı olarak arama işlevi

dispOptions[displayIndex]()

# Diğer yöntem işe yararsa silinecek

# mesafe değişkenini ekrana yerleştir

#draw.text((distX, distY), str(distFunc()), font=ImageFont.load_default()) # hız değişkenini ekrana yerleştirin #draw.text((speedX, speedY), speedFunc(), font=ImageFont.load_default()) # Ekran güncellemelerini görüntüle disp.display()

ahududu pi üzerinde displayButton = 18 # BCM Pin

resetButton = ahududu pi üzerinde 23 # BCM Pin

buttonPress = Yanlış

def checkDisplay():

global butona basın global displayIndex if(bGPIO.input(displayButton) ve buttonPress değil): displayIndex += 1 buttonPress = True if(displayIndex == 2): displayIndex = 0 elif(bGPIO.input(displayButton) ve buttonPress): print (" Hala basılı") başka: buttonPress = False

# gps kurulumu

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

timerPeriod =.5

# Ekran displayIndex için dizin değeri = 0 deneyin: gps_socket'teki new_data için: if new_data: data_stream.unpack(new_data) if 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)): resDistance() print('GPS henüz bağlanmadı') time.sleep(.1) time.sleep(.8) KeyboardInterrupt hariç: gps_socket.close() print(' \nKullanıcı ctrl+c tarafından sonlandırıldı')

Yukarıdaki kod, sistemimizin nasıl kodlanacağına dair sadece bir örnektir ve bu sistemin nasıl çalıştığına dair bir video yerleştirdim.

Önerilen: