Mündəricat:
- Addım 1: Başlayın
- Addım 2: GPS Modulunu Raspberry Pi -yə qoşun
- Addım 3: GPS Alıcı Modulundan Məlumat Alın
- Addım 4: Ekranı Raspberry Pi -yə qoşun
- Addım 5: Raspberry Pi ilə işləmək üçün Ekranı qurun
- Addım 6: Ekranda GPS məlumatlarını göstərmək üçün Dövlət Maşını qurun
- Addım 7: GPS sistemimizi tətbiq edək
Video: GPS sistemi: 7 addım
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-10 13:46
Layihənin yaradıcısı: Carlos Gomez
Gəzmək və dünyanı kəşf etmək istəyən hər kəs üçün etibarlı bir naviqasiya sisteminə sahib olmaq hər şeydən önəmlidir.
Naviqasiya sisteminin işləməsinə imkan verən ən vacib cəhət sistemin içərisinə yerləşdirilmiş GPS qabiliyyətidir. GPS sistemi hər kəsə istifadəçi haqqında dəqiq məlumatları göstərmək və istifadəçiyə harada olduqlarını və yerləşdikləri yerdən nə qədər uzaq olduqlarını dəqiq bir şəkildə göstərmək üçün yerlərini və sürətlərini izləməyə imkan verir.
Qlobal Konumlandırma Sistemi (GPS), təxminən 20.000 km yüksəklikdə Yer ətrafında fırlanan bir peyklər şəbəkəsidir. GPS cihazı olan hər kəs, peyklərin yayımladığı radio siqnallarını qəbul edə bilər və lazım olduğu şəkildə istifadə edə bilir. Planetinizdə harada olmağınızdan asılı olmayaraq ən azı dörd GPS istənilən vaxt əlinizdə olmalıdır. Üçölçülü trilaterasiya adlanan bir metoddan istifadə edərək, GPS cihazı cihazın Yerdəki yerini təyin etmək üçün üç peykdən istifadə edə bilir. Üç peykin hər biri cihaza bir siqnal göndərir və cihaz onun peykdən uzaqlığını təyin edir. Üç məsafə hesablamasının hər birini istifadə edərək, cihaz Yerdəki yerini dəqiq müəyyən edə bilir və istifadəçiyə qaytarır.
Yaratacağımız GPS sistemi, istifadəçinin Yerdəki koordinatlarını əldə edərək və istifadəçinin sürətini, yerini və keçdiyi məsafəni geri qaytarmaq üçün bəzi hesablamalar apararaq istifadəçinin yerlərini izləyə biləcək.
Addım 1: Başlayın
Bu layihəyə başlamaq üçün əvvəlcə bütün lazımi materialları toplamalıyıq
1: Raspberry Pi Zero W
2: GPS qəbuledicisi
3: 1.8 TFT 128 x 160 LCD SPI Ekranı
4: ~ 11 tel
5: 2 düymələri
Düymələri aşağı çəkmək üçün 6: 2x 1k və 2x 10k rezistorlar
7: Çörək lövhəsi
Bu layihə Raspberry Pi -nin GPIO pinlərindən istifadə edəcək və buna görə də layihəmizi inkişaf etdirmək üçün hər şeyi bir çörək taxtası ilə birləşdirməliyik. Bütün hissələr üzərində hərəkət etmədən və birləşdirmədən əvvəl bütün sancaqlar üzərində lehimləmə işlərinin aparıldığı və bitdiyi güman edilir.
Addım 2: GPS Modulunu Raspberry Pi -yə qoşun
GPS sistemimizdən istifadə etmək üçün GPS modulundan Tx və Rx pinlərini Raspberry Pi üzərindəki GPIO pin 14 və 15 -ə bağlamalısınız. GPS qəbuledicisinin Tx pimi Pi -nin Rx pininə və GPS qəbuledicisinin Rx pimi Raspberry pi -nin Tx pininə gedir.
Şəkillərdə göstərilən GPS qəbuledicisi 3.3V istifadə edilməsini tələb edir və 3.3V sancaqlarını düzgün bir gərginliyə bağlaya bilərsiniz.
Addım 3: GPS Alıcı Modulundan Məlumat Alın
GPS qəbuledicisindən Raspberry Pi -yə məlumat almaq üçün düzgün yuvaların UART limanlarından oxumasına icazə verməliyik. Xam məlumatları oxumaq üçün öz təhlil kitabxanamızı yaratmalıyıq, ancaq bu ssenaridə, məlumatların təhlil edilməsinə və Raspberry Pi -yə ötürülməsinə kömək etmək üçün arxa planda çalışan bir GPS daemonundan istifadə edə bilərik.
Bunu etmək üçün Raspberry Pi -də bir terminal aça və kodu icra edə bilərik:
sudo apt-get yeniləməsi
sudo apt-get gpsd gpsd-client python-gps qurun
Bu, bizim üçün yükləmənin qayğısına qalmalıdır.
Tamamlandıqdan sonra, aşağıdakı əmrləri yerinə yetirərək gpsd sistem xidmətini deaktiv etməliyik:
sudo systemctl gpsd.socket dayandırın
sudo systemctl gpsd.socket -i deaktiv edin
Varsayılan gpsd sistem xidmətini aktivləşdirmək istəyirsinizsə, onu bərpa etmək üçün aşağıdakı əmrləri işlədə bilərsiniz:
sudo systemctl gpsd.socket imkan verir
sudo systemctl gpsd.socket işə salın
İndi gpsd demonunu işə salmalı və daxil olaraq UART portlarına yönəltməliyik
sudo gpsd/dev/ttyAMA0 -F /var/run/gpsd.sock
İndi aşağıdakı əmri işlədə bilərik və daxil olan bütün məlumatları görə bilərik!
cgps -s
Addım 4: Ekranı Raspberry Pi -yə qoşun
GPS qəbuledicimizi hazırladıqdan və Raspberry Pi ilə işlədikdən sonra ekranı Raspberry Pi -yə bağlaya bilərik. LCD displeyimizi Raspberry Pi -yə bağlamaq üçün 5 teldən istifadə edəcəyik və əsas gücü və LED -i bağlamaq üçün başqa 4 pindən istifadə edəcəyik. ekranda.
İstifadə etdiyim TFT ekranının bir fotoşəkilini daxil etdim, amma bu oxşar ölçüdə və quruluşlu ekranlarla işləməlidir.
LED və GND-ni yerə bağlayın və LED+ və VCC-ni 3.3V-ə qoşun.
Pi lövhəsindəki 25 pin üçün ekrandakı RESET pinini bağlayın.
A0 -nu Pi lövhəsindəki 24 pininə bağlayın.
SDA pinini Pi lövhəsindəki MOSI pininə qoşun.
LCD ekrandakı SCK pinini Pi lövhəsinə qoşun.
CS pinini Pi lövhəsindəki 8 pininə qoşun.
Addım 5: Raspberry Pi ilə işləmək üçün Ekranı qurun
Ekranı qurmaq üçün bu depoda olan ST7735 kitabxanasından istifadə etməliyik:
Python ST7735 Ekran Kitabxanası
Bu ekran kitabxanasını Raspberry Pi sistemimizə quraşdırdıqdan sonra, əvvəlki kabellərimizin düzgün işlədiyini təsdiqləmək üçün nümunə fayl qurmağa davam edə bilərik.
Example.py adlı bir fayl yaradın və eyni mətnə seçdiyiniz nümunə şəkli ilə birlikdə aşağıdakı mətni daxil edin
ST7735, TFTimport Adafruit_GPIO olaraq GPIO olaraq idxal Adafruit_GPIO. SPI olaraq SPI olaraq
Eni = 128
Hündürlük = 160 SPEED_HZ = 4000000
# Raspberry Pi konfiqurasiyası.
# Bunlar LCD -ni Raspberry Pi -yə bağlamaq üçün lazım olan sancaqlardır
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# TFT LCD ekran sinfi yaradın.
disp = TFT. ST7735 (DC, ilk = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Ekranı işə salın.
disp.begin () disp.reset ()
# Şəkil yükləyin.
newData = 0x42 disp.command (newData) çap ('Şəkil yüklənir…') image = Image.open ('cat.jpg')
# Görüntünün ölçüsünü dəyişdirin və ekrana uyğun olaraq döndərin.
image = image.rotate (270).resize ((WIDTH, HEIGHT))
# Proqramımızın Şəklimizi ekranda çəkdiyi terminala çap edəcək
çap et ('Şəkil çəkmək')
# Bu funksiya görüntümüzü ekranda göstərəcək
disp.display (şəkil)
Bu fayl, LCD ekran üçün Raspberry Pi konfiqurasiyasını quracaq və kitabxana imicimizi qovluqda çevirərək ekranda göstərəcək.
Addım 6: Ekranda GPS məlumatlarını göstərmək üçün Dövlət Maşını qurun
GPS sistemimizi qurmaq üçün tapşırıq diaqramımızı həyata keçirərkən 5 fərqli dövlət maşınından istifadə edəcəyik.
Vəziyyəti dəyişdirmə maşını göstərin:
Bu dövlət maşını, düymə girişimizdən asılı olaraq nəyin göstəriləcəyini idarə edəcək. Bunu, pythonun ördək yazmasından istifadə etməsinə və çağırılan funksiyadan asılı olaraq düzgün funksiyanı göstərməsinə imkan verən bir dəyişəni dəyişdirərək edir.
Sürət vəziyyəti maşını:
Bu dövlət maşını, fərdlərin yerindən asılı olaraq cari sürəti icra edəcək. Bu, GPS sistemi üçün hər saat dövrünü yerinə yetirəcəkdir
Çıxış vəziyyəti maşını:
Bu vəziyyət maşını, çıxış dəyişikliyi vəziyyəti maşınının cari ekran olaraq təyin etdiyi dəyişənə əsaslanaraq çıxışı təyin edəcək.
Məsafə vəziyyəti maşını
Bu dövlət maşını hər bir saat dövrünü yerinə yetirir və istifadəçinin getdiyi ümumi məsafəni təyin edir və sıfırlama düyməsinə basıldıqda, gedilən cari məsafəni sıfırlayacaq.
Yer dövlət maşını:
Bu dövlət maşını, GPS modulunun istifadəçi haqqında qaytardığı koordinatları istifadə edərək istifadəçinin cari yerini qaytarır. Bu dövlət maşını istifadəçilərin internet bağlantısından asılıdır.
Addım 7: GPS sistemimizi tətbiq edək
GPS modulumuz Raspberry Pi -yə məlumat göndərdikdən və bu barədə məlumat göstərən LCD ekrandan sonra GPS sistemimizi proqramlaşdırmağa başlaya bilərik. GPS sistemimizi kodlaşdırmaq üçün əvvəlki addımın sonlu vəziyyət maşınlarından istifadə edəcəyəm
## Naviqasiya sistemi üçün əsas fayl # # # #
# Şəkillər çəkmək üçün kitabxanalar
PIL idxalından PIL idxalından ImageDraw PIL idxal ImageFontdan
# ST7737 nəzarətçi üçün kitabxana
ST7735 -i TFT olaraq idxal edin
Raspberry Pi üçün GPIO üçün # Kitabxana
Adafruit_GPIO -nu GPIO olaraq idxal edin Adafruit_GPIO. SPI -ni SPI olaraq idxal edin
GPS üçün # Kitabxana
gps3 -dən gpsd -i idxal edin
Vaxt üçün # kitabxana
idxal vaxtı
# İki nöqtə arasındakı məsafəni tapmaq üçün kitabxana
riyaziyyatdan idxal günah, cos, sqrt, atan2, radian
Menyuları dəyişdirmək və sıfırlamaq üçün düymələrdən istifadə etmək üçün # Rpi kitabxanasını idxal edin
# RPi. GPIO -nu bGPIO olaraq idxal edin
# Düymələr üçün sancaqlar qurun
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 üçün idxal geopy kitabxanası
Bunun işləməsi üçün # # İnternet bağlantısı lazımdır
geopy.geocoders idxal Nominatim
geolokator = Nominatim ()
# Sistem üçün sabitlər
#################################
Eni = 128
Hündürlük = 160 SPEED_HZ = 4000000
# Raspberry Pi konfiqurasiya sancaqları
TFT ekranında DC = 24 # A0 RST = 25 # TFT ekranında pin sıfırlayın SPI_PORT = 0 # moruq pi üzərində SPI portu, SPI0 SPI_DEVICE = 0 # Rapsberry pi -də qul seçimi, CE0
# TFT LCD ekran obyekti yaradın
disp = TFT. ST7735 (DC, ilk = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Ekranı işə salın
disp.begin ()
# Arxa plan yaşıl olaraq təyin ediləcək
#disp.clear ((0, 255, 0))
# Ekranı ağdan təmizləyin və göstərin
#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.dörtgen ((0, 10, 127, 150), kontur = (255, 0, 0), doldur = (0, 0, 255)) #disp.display ()
# Sürət, Enlem, Boylam yerləşdirmə dəyişənləri
#currentS = "Mövcud Sürət:" # Sürət xətti #totalDis = "Ümumi Məsafə:" # Məsafə xətti #currentLoc = "Cari Yer:" # Yer sətri
# X və y məsafələrinin koordinatları
distX = 10 distY = 20
pointsList =
# Sürət x və y koordinatları
sürətX = 10 sürətY = 20
# Yer x və y coordiantes
locX = 10 locY = 20
# M/s -dən mil/saata çevirir
dönüşümVal = 2.24
# Sürət yeniləmə funksiyası, simli qaytarır
SpeedVar = 0
def speedFunc (): qlobal 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
yer = geolocator.reverse (reverseString)
geri qayıt (ünvan. ünvan)
# Latitude yeniləmə funksiyası, float dəyərini qaytarır
def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): 0 başqa qayıt: qayıt float (dəyirmi (Enlem, 4))
# Boylam yeniləmə funksiyası simli qaytarır
def lonFunc (): Boylam = data_stream. TPV ['lon'] if (Boylam == "n/a"): 0 başqa qayıt: qayıt float (yuvarlaq (Boylam, 4))
# Məsafə funksiyası TOTAL gediş məsafəsini qaytarır
totalDistance = 0
def distFunc ():
qlobal totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 və ya newLon == 0): totalDistance = totalDistance # return (totalDistance) başqa: pointsList.append ((newLat, newLon)) last = len (pointsList) -1 əgər (son == 0): başqa qayıdın: totalDistance += coorDistance (balList [son-1], xalList [son]) # qaytarılma ümumiDistance
# Ümumi məsafəni sıfırlayır
def resDistance ():
qlobal totalDistance totalDistance = 0
# İki koordinat arasındakı məsafəni tapmaq üçün istifadə olunan funksiya
# tapmaq üçün Haversine düsturundan istifadə edir. # Giriş nöqtələri bir tuple
def coorDistance (nöqtə1, nöqtə2):
# Yerin kilometrlərdəki təxmini radiusuRadius = 6373.0
lat1 = nöqtə1 [0]
lon1 = nöqtə1 [1]
lat2 = nöqtə2 [0]
lon2 = nöqtə2 [1]
məsafəLon = lon2 - lon1
məsafəLat = lat2 - lat1
# Haversine a
a = sin (məsafəLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (məsafəLon/2) ** 2
# Haversine c
c = 2 * atan2 (sqrt (a), sqrt (1-a))
# Km -i Milə çevirin
məsafə = (earthRadius * c) * 0.62137
əgər (məsafə <= 0.01): 0.00 qayıtmaq başqa: geri dönmə (məsafə, 3)
# Sürəti ekranda göstərmək funksiyası
def dispSpeed ():
qlobal SpeedVar # Məsafəni ekrandakı dəyişənə qoyun draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Ekranda məsafəni göstərmək funksiyası
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Ekrandakı ti ekran funksiyası, işləməsi üçün internet tələb edir
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Keçid ifadələrini təqlid etmək üçün lüğətdən istifadə
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Ekran çıxışı funksiyası
def çıxışı ():
# DisplayIndex qlobal displayIndex üçün qlobal dəyişəndən istifadə # Ekran silinməsi və background disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), kontur = (255, 0, 0), doldur = (255, 0, 0))
# DisplayIndex dəyərindən asılı olaraq zənglər funksiyası
dispOptions [displayIndex] ()
# Başqa bir üsul işləyərsə silinəcək
# məsafə dəyişənini ekranda yerləşdirin
#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #ekranda sürət dəyişənini yerləşdir #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Ekran disp.display () yeniləmələrini göstərin
displayButton = 18 # BCM Moruq pi üzərində pin
resetButton = 23 # BCM Moruq pi üzərində pin
düyməsini basın = Yanlış
def checkDisplay ():
qlobal düyməni basın qlobal displayIndex əgər (bGPIO.input (displayButton) və düyməni basmayın): displayIndex += 1 düyməsini basın = True (əgər displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) və buttonPress): print (" Hələ də basıldı ") başqa: buttonPress = False
# GPS qurun
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
timerPeriod =.5
DisplayIndex = 0 göstərmə indeksi dəyəri: gps_socket -də yeni_datalar üçün: əgər yeni_data: data_stream.unpack (yeni_data) əgər data_stream. TPV ['lat']! = 'Yox/': çap edin (data_stream. TPV ['sürət' ')], data_stream. TPV ['lat'], data_stream. TPV ['lon']) distFunc () speedFunc () output () checkDisplay () if (bGPIO.input (resetButton)) if: resDistance () else: output () checkDisplay () if (bGPIO.input (resetButton)): resDistance () çap ('GPS hələ bağlı deyil') vaxt.yuxu (.1) vaxt.yuxu (.8) KeyboardInterrupt istisna olmaqla: gps_socket.close () print (') nCtrl+c 'istifadəçisi tərəfindən müəyyən edilmişdir)
Yuxarıdakı kod sistemimizi necə kodlaşdıracağımıza dair yalnız bir nümunədir və bu sistemin necə işlədiyinə dair bir video yerləşdirmişəm.