Isi kandungan:

Sistem GPS: 7 Langkah
Sistem GPS: 7 Langkah

Video: Sistem GPS: 7 Langkah

Video: Sistem GPS: 7 Langkah
Video: Tutorial Lengkap dan Review GPS Mini GF-07 GPS Mini Multifungsi untuk Lacak Lokasi dan Sadap Suara 2024, Oktober
Anonim
Sistem GPS
Sistem GPS
Sistem GPS
Sistem GPS
Sistem GPS
Sistem GPS

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

Bermula
Bermula
Bermula
Bermula
Bermula
Bermula
Bermula
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

Sambungkan Modul GPS ke Raspberry Pi
Sambungkan Modul GPS ke Raspberry Pi
Sambungkan Modul GPS ke Raspberry Pi
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

Terima Data Dari Modul Penerima GPS
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

Sambungkan Paparan ke Raspberry Pi
Sambungkan Paparan ke Raspberry Pi
Sambungkan Paparan ke Raspberry Pi
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

Tetapkan Paparan untuk Bekerja Dengan Raspberry Pi
Tetapkan 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

Sediakan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
Sediakan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
Sediakan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
Sediakan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
Sediakan Mesin Keadaan untuk Memaparkan Maklumat GPS pada Paparan
Sediakan 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.

Disyorkan: