Isi kandungan:
- Langkah 1: Bermula
- Langkah 2: Sambungkan Modul GPS ke Raspberry Pi
- Langkah 3: Terima Data Dari Modul Penerima GPS
- Langkah 4: Sambungkan Paparan ke Raspberry Pi
- Langkah 5: Sediakan Paparan untuk Bekerja Dengan Raspberry Pi
- Langkah 6: Siapkan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
- Langkah 7: Mari Melaksanakan Sistem GPS Kami
Video: Sistem GPS: 7 Langkah
2025 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2025-01-10 13:48
Pencipta Projek: Carlos Gomez
Mempunyai sistem navigasi yang boleh dipercayai adalah yang terpenting bagi sesiapa sahaja yang berusaha melancong dan menjelajah dunia.
Aspek terpenting yang membolehkan sistem navigasi berfungsi adalah keupayaan GPS yang tertanam di dalam sistem. Sistem GPS membolehkan sesiapa sahaja melacak lokasi dan kelajuannya untuk memaparkan maklumat yang tepat mengenai pengguna dan memberikan gambaran yang tepat kepada pengguna tentang lokasi mereka dan sejauh mana mereka berada dari lokasi mereka.
Sistem Penentududukan Global (GPS) adalah rangkaian satelit yang mengorbit Bumi pada ketinggian kira-kira 20, 000 km. Sesiapa yang mempunyai peranti GPS dapat menerima isyarat radio yang disiarkan oleh satelit dan dapat menggunakannya dengan cara yang diperlukan. Di mana sahaja lokasi anda di planet ini sekurang-kurangnya empat GPS tersedia untuk anda pada bila-bila masa. Dengan menggunakan kaedah yang disebut trilaterasi 3-D, peranti GPS dapat menggunakan tiga satelit untuk menentukan lokasi perangkat di Bumi. Masing-masing dari tiga satelit menghantar isyarat ke peranti dan peranti menentukan jaraknya dari satelit. Dengan menggunakan masing-masing dari tiga perhitungan jarak, peranti kini dapat menentukan lokasinya di Bumi dan mengembalikannya kepada pengguna.
Sistem GPS yang akan kita buat dapat mengesan lokasi pengguna dengan mendapatkan koordinat pengguna di Bumi dan melakukan beberapa pengiraan untuk mengembalikan kepantasan, lokasi, dan jarak yang dilalui pengguna.
Langkah 1: Bermula
Untuk memulakan projek ini, pertama-tama kita perlu mengumpulkan semua bahan yang betul
1: Raspberry Pi Zero W
2: Penerima GPS
3: 1.8 Skrin LCD TFT 128 x 160 LCD
4: ~ 11 wayar
Butang 5: 2
6: 2x 1k dan 2x 10k perintang untuk butang tarik ke bawah
7: Papan roti
Projek ini akan menggunakan pin GPIO Raspberry Pi dan dengan itu kita perlu menghubungkan semuanya dengan papan roti untuk membangunkan projek kita. Ia juga dianggap bahawa pematerian pada semua pin telah selesai dan selesai sebelum bergerak dan menghubungkan semua bahagian kami.
Langkah 2: Sambungkan Modul GPS ke Raspberry Pi
Untuk penggunaan sistem GPS kami, anda perlu menyambungkan pin Tx dan Rx dari modul GPS ke GPIO pin 14 dan 15 pada Raspberry Pi. Pin Tx penerima GPS menuju ke pin Rx dari Pi dan pin Rx penerima GPS menuju ke pin Tx dari Raspberry pi.
Penerima GPS yang ditunjukkan dalam gambar memerlukan 3.3V digunakan dan anda boleh menyambungkan pin 3.3V ke voltan yang betul, sambil menyambungkan pin Ground ke tanah.
Langkah 3: Terima Data Dari Modul Penerima GPS
Untuk menerima data dari penerima GPS ke Raspberry Pi, kita perlu membiarkan soket yang betul dibaca dari port UART. Membaca data mentah memerlukan kita membuat perpustakaan penghuraian sendiri, tetapi dalam senario ini kita dapat memanfaatkan daemon GPS yang berjalan di latar belakang untuk membantu menggunakan mengurai data dan mengirimkannya ke Raspberry Pi
Untuk mencapai ini, kita dapat membuka terminal di Raspberry Pi dan melaksanakan kodnya:
sudo apt-get kemas kini
sudo apt-get install gpsd gpsd-klien python-gps
Ini mesti menjaga muat turun untuk kita.
Setelah selesai, kita perlu mematikan perkhidmatan sistem gpsd dengan menjalankan perintah berikut:
sudo systemctl stop gpsd.socket
sudo systemctl lumpuhkan gpsd.socket
Sekiranya anda ingin mengaktifkan perkhidmatan sistem gpsd lalai, anda boleh menjalankan perintah berikut untuk memulihkannya:
sudo systemctl mengaktifkan gpsd.socket
sudo systemctl mulakan gpsd.socket
Sekarang kita perlu memulakan daemon gpsd dan mengarahkannya ke port UART dengan memasukkan
sudo gpsd / dev / ttyAMA0 -F /var/run/gpsd.sock
Kita sekarang boleh menjalankan perintah di bawah ini dan melihat semua data terapung!
cgps -s
Langkah 4: Sambungkan Paparan ke Raspberry Pi
Sebaik sahaja kami memasang penerima GPS dan bekerja dengan Raspberry Pi, kami kemudian dapat menyambungkan paparan ke Raspberry Pi. Kami akan menggunakan 5 wayar untuk menyambungkan paparan LCD kami ke Raspberry Pi dan 4 pin lain untuk menyambungkan kuasa utama dan LED di skrin.
Saya telah memasukkan foto skrin TFT yang saya gunakan, tetapi ini harus berfungsi dengan skrin dengan saiz dan binaan yang serupa.
Sambungkan LED- dan GND ke arde dan sambungkan LED + dan VCC ke 3.3V.
Sambungkan pin RESET di skrin ke pin 25 pada papan Pi.
Sambungkan A0 ke pin 24 pada papan Pi.
Sambungkan pin SDA ke pin MOSI pada papan Pi.
Sambungkan pin SCK pada skrin LCD ke papan Pi.
Sambungkan pin CS ke pin 8 pada papan Pi.
Langkah 5: Sediakan Paparan untuk Bekerja Dengan Raspberry Pi
Untuk menyiapkan paparan, kita perlu menggunakan perpustakaan ST7735 yang terdapat di repo ini:
Pustaka Skrin Python ST7735
Sebaik sahaja kami memasang pustaka paparan ini ke sistem Raspberry Pi kami, kami sekarang dapat meneruskan penyediaan fail contoh untuk mengesahkan pendawaian kami sebelumnya berfungsi dengan betul.
Buat fail bertajuk example.py dan masukkan teks berikut di sana bersama dengan contoh gambar pilihan anda dalam folder yang sama
import ST7735 sebagai TFTimport Adafruit_GPIO sebagai GPIO import Adafruit_GPIO. SPI sebagai SPI
Luas = 128
TINGGI = 160 SPEED_HZ = 4000000
# Konfigurasi Raspberry Pi.
# Ini adalah pin yang diperlukan untuk menyambungkan LCD ke Raspberry Pi
DC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0
# Buat kelas paparan LCD TFT.
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Permulaan paparan.
disp.begin () disp.reset ()
# Muatkan gambar.
newData = 0x42 disp.command (newData) print ('Loading image …') image = Image.open ('cat.jpg')
# Ubah saiz gambar dan putar sehingga sesuai dengan paparan.
image = image.rotate (270). ubah saiz ((WIDTH, HEIGHT))
# Akan mencetak ke terminal bahawa program kami melukis Gambar kami di skrin
cetak ('Gambar gambar')
# Fungsi ini akan memaparkan gambar kita di layar
paparan paparan (gambar)
Fail ini akan menetapkan konfigurasi Raspberry Pi untuk layar LCD dan perpustakaan akan menukar gambar kita dalam folder dan memaparkannya di layar.
Langkah 6: Siapkan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
Kami akan menggunakan 5 mesin keadaan yang berbeza, sambil melaksanakan rajah tugas kami untuk menyiapkan sistem gps kami.
Mesin keadaan Tukar Paparan:
Mesin keadaan ini akan mengawal mana yang akan dipaparkan bergantung pada input butang kami. Ia melakukannya dengan mengubah pemboleh ubah yang membolehkan python memanfaatkan menaip bebek dan memanggil fungsi yang betul untuk ditampilkan bergantung pada fungsi yang disebut
Mesin keadaan laju:
Mesin keadaan ini akan melaksanakan kelajuan semasa bergantung pada lokasi individu. Ini akan melaksanakan setiap pusingan jam untuk sistem GPS
Mesin keadaan output:
Mesin keadaan ini akan menentukan output berdasarkan pemboleh ubah yang ditentukan oleh mesin keadaan perubahan paparan menjadi paparan semasa.
Mesin keadaan jarak
Mesin keadaan ini melaksanakan setiap pusingan jam dan menentukan jumlah jarak perjalanan oleh pengguna dan setelah butang set semula ditekan, akan menetapkan semula jarak semasa yang dilalui.
Mesin keadaan lokasi:
Mesin keadaan ini mengembalikan lokasi pengguna semasa, menggunakan koordinat yang dikembalikan oleh modul GPS mengenai pengguna. Mesin keadaan ini bergantung pada sambungan internet pengguna.
Langkah 7: Mari Melaksanakan Sistem GPS Kami
Setelah modul GPS kami menghantar maklumat ke Raspberry Pi kami dan skrin LCD kami memaparkan maklumat di atasnya, kami kemudian dapat mulai memprogram sistem GPS kami. Saya akan menggunakan mesin keadaan terhingga langkah sebelumnya untuk membuat kod sistem GPS kami
## Fail utama untuk sistem Navigasi # # # #
# Perpustakaan untuk melukis gambar
dari PIL import Imej dari PIL import ImageDraw dari PIL import ImageFont
# Perpustakaan untuk pengawal ST7737
import ST7735 sebagai TFT
# Perpustakaan untuk GPIO untuk Raspberry Pi
import Adafruit_GPIO sebagai GPIO import Adafruit_GPIO. SPI sebagai SPI
# Perpustakaan untuk GPS
#import gpsd dari gps3 import gps3
# Perpustakaan untuk masa
masa import
# Perpustakaan untuk mencari jarak antara dua titik
dari math import sin, cos, sqrt, atan2, radian
# Import perpustakaan Rpi untuk menggunakan butang untuk menukar menu dan menetapkan semula
# import RPi. GPIO sebagai bGPIO
# Pin persediaan untuk butang
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)
# import perpustakaan geopy untuk Geocoding
# # Akses internet diperlukan untuk berfungsi
dari geopy.geocoders import Nominatim
geolocator = Nominatim ()
# Pemalar untuk sistem
#################################
Luas = 128
TINGGI = 160 SPEED_HZ = 4000000
# Pin konfigurasi Raspberry Pi
DC = 24 # A0 pada layar TFT RST = 25 # Tetapkan semula pin pada layar TFT SPI_PORT = 0 # Port SPI pada raspberry pi, SPI0 SPI_DEVICE = 0 # Slave select pada rapsberry pi, CE0
# Buat objek paparan LCD TFT
disp = TFT. ST7735 (DC, rst = RST, spi = SPI. SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = SPEED_HZ))
# Permulaan paparan
permulaan ()
# Latar belakang akan diatur ke hijau
# disp.clear ((0, 255, 0))
# Kosongkan skrin ke putih dan paparkan
# disp.clear ((255, 255, 255)) draw = disp.draw () # draw.rectangle ((0, 10, 127, 150), garis besar = (255, 0, 0), isi = (0, 0, 255)) # paparan. ()
# Pemboleh ubah penempatan kelajuan, garis lintang, garis bujur
#currentS = "Speed Semasa:" # Speed string #totalDis = "Total Jarak:" # Jarak rentetan #currentLoc = "Lokasi Semasa:" # String lokasi
# Jarak koordinat x dan y
distX = 10 distY = 20
poinList =
# Koordinat kelajuan x dan y
speedX = 10 speedY = 20
# Lokasi koordinat x dan y
locX = 10 locY = 20
# Menukar dari m / s ke mph
penukaranVal = 2.24
# Fungsi kemas kini kelajuan, mengembalikan rentetan
SpeedVar = 0
def speedFunc (): SpeedVar SpeedText global = data_stream. TPV ['speed'] if (SpeedText! = "n / a"): SpeedText = float (SpeedText) * penukaranVal SpeedVar = bulat (SpeedText, 1) # return (SpeedText)
lokasi defFunc ():
latLoc = str (latFunc ()) lonLoc = str (lonFunc ())
reverseString = latLoc + "," + lonLoc
lokasi = geolocator.reverse (reverseString)
kembali (location.address)
# Fungsi kemas kini lintang, mengembalikan nilai apungan
def latFunc (): Latitud = data_stream. TPV ['lat'] if (Latitud == "n / a"): return 0 else: return float (bulat (Latitud, 4))
# Fungsi kemas kini bujur, mengembalikan rentetan
def lonFunc (): Longitud = data_stream. TPV ['lon'] if (Longitud == "n / a"): return 0 else: return float (bulat (Longitud, 4))
# Fungsi jarak mengembalikan JUMLAH jarak perjalanan
jumlah Jarak = 0
def distFunc ():
global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 atau newLon == 0): totalDistance = totalDistance # return (totalDistance) yang lain: pointsList.append ((newLat, newLon)) terakhir = len (pointsList) -1 if (last == 0): return other: totalDistance + = coorDistance (pointsList [last-1], pointsList [terakhir]) # pulangan totalDistance
# Menetapkan semula jarak keseluruhan
def resDistance ():
total globalDistance totalDistance = 0
# Fungsi yang digunakan untuk mencari jarak antara dua koordinat
# menggunakan formula Haversine untuk mencari. # Titik input adalah tuple
def coorDistance (titik1, titik2):
# Jejari Bumi kira-kira dalam kilometer bumiRadius = 6373.0
lat1 = titik1 [0]
lon1 = titik1 [1]
lat2 = titik2 [0]
lon2 = titik2 [1]
jarakLon = lon2 - lon1
jarakLat = lat2 - lat1
# Haversine a
a = sin (jarakLat / 2) ** 2 + cos (lat1) * cos (lat2) * sin (jarakLon / 2) ** 2
# Haversine c
c = 2 * atan2 (sqrt (a), sqrt (1-a))
# Tukar km ke Batu
jarak = (bumiRadius * c) * 0.62137
jika (jarak <= 0.01): kembali 0,00 yang lain: pusingan kembali (jarak, 3)
# Fungsi untuk menampilkan kelajuan di skrin
def dispSpeed ():
SpeedVar global # Letakkan jarak pada pemboleh ubah pada draw draw screen. ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))
# Fungsi untuk menunjukkan jarak di skrin
def dispDistance ():
draw.text ((distX, distY), str (totalDistance), font = ImageFont.truetype ("Lato-Medium.ttf", 60))
# Fungsi ti lokasi paparan di skrin, memerlukan internet untuk berfungsi
def dispLocation ():
draw.text ((locX, locY), locationFunc (), font = ImageFont.truetype ("Lato-Medium.ttf", 8))
# Menggunakan kamus untuk meniru pertukaran pernyataan
dispOptions = {
0: dispSpeed, 1: dispDistance, 2: dispLocation}
# Fungsi output skrin
output def ():
# Menggunakan pemboleh ubah global untuk displayIndex global displayIndex # Membersihkan skrin dan menerapkan latar belakang. Dispar ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), garis besar = (255, 0, 0), isi = (255, 0, 0))
# Panggilan berfungsi bergantung pada nilai displayIndex
dispOptions [displayIndex] ()
# Akan terhapus jika kaedah lain berfungsi
# pemboleh ubah jarak tempat di skrin
# draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) # pemboleh ubah kelajuan tempat di layar # draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Paparkan kemas kini ke layar disp.display ()
displayButton = 18 # Pin BCM pada pi raspberry
resetButton = 23 # Pin BCM pada pi raspberry
butang Tekan = Salah
def checkDisplay ():
butang globalTekan global displayIndex if (bGPIO.input (displayButton) and not buttonPress): displayIndex + = 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) dan buttonPress): cetak (" Masih ditekan ") lain: butang Tekan = Salah
# Sediakan gps
gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()
timerPeriod =.5
# Nilai indeks untuk paparan paparanIndex = 0 cuba: untuk new_data di gps_socket: 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 belum disambungkan') time.sleep (.1) time.sleep (.8) kecuali KeyboardInterrupt: gps_socket.close () print (' / nTerminat oleh pengguna ctrl + c ')
Kod di atas adalah salah satu contoh bagaimana membuat kod sistem kami dan saya telah memasukkan video mengenai bagaimana sistem ini berfungsi.