İçindekiler:
- 1. Adım: Başlarken
- Adım 2: GPS Modülünü Raspberry Pi'ye Bağlayın
- Adım 3: GPS Alıcı Modülünden Veri Alın
- Adım 4: Ekranı Raspberry Pi'ye Bağlayın
- Adım 5: Raspberry Pi ile Çalışmak için Ekranı Ayarlayın
- Adım 6: GPS Bilgilerini Ekranda Görüntülemek için Durum Makinelerini Ayarlayın
- 7. Adım: GPS Sistemimizi Uygulayalım
Video: GPS Sistemi: 7 Adım
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-10 13:49
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
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 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ı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
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
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 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.