Mục lục:

Hệ thống GPS: 7 bước
Hệ thống GPS: 7 bước

Video: Hệ thống GPS: 7 bước

Video: Hệ thống GPS: 7 bước
Video: GPS : Hệ thống định vị toàn cầu - Phần 1 2024, Tháng Mười
Anonim
Hệ thống GPS
Hệ thống GPS
Hệ thống GPS
Hệ thống GPS
Hệ thống GPS
Hệ thống GPS

Người tạo dự án: Carlos Gomez

Có một hệ thống định vị đáng tin cậy là điều tối quan trọng đối với bất kỳ ai đang cố gắng đi du lịch và khám phá thế giới.

Khía cạnh quan trọng nhất cho phép hệ thống định vị hoạt động là khả năng GPS được nhúng bên trong hệ thống. Hệ thống GPS cho phép mọi người theo dõi vị trí và tốc độ của họ để hiển thị thông tin chính xác về người dùng và cung cấp cho người dùng thông tin chính xác về vị trí của họ và khoảng cách từ vị trí của họ.

Hệ thống Định vị Toàn cầu (GPS) là một mạng lưới các vệ tinh quay quanh Trái đất ở độ cao khoảng 20.000 km. Bất kỳ ai có thiết bị GPS đều có thể nhận được tín hiệu vô tuyến mà vệ tinh phát đi và có thể sử dụng chúng theo bất kỳ cách nào cần thiết. Bất cứ nơi nào vị trí của bạn trên hành tinh, ít nhất bốn GPS sẽ có sẵn cho bạn bất cứ lúc nào. Sử dụng phương pháp gọi là trilateration 3-D, một thiết bị GPS có thể sử dụng ba vệ tinh để xác định vị trí của thiết bị tại Trái đất. Mỗi trong số ba vệ tinh gửi một tín hiệu đến thiết bị và thiết bị xác định khoảng cách của nó với vệ tinh. Sử dụng từng phép tính trong số ba phép tính khoảng cách, thiết bị hiện có thể xác định chính xác vị trí của nó trên Trái đất và trả về cho người dùng.

Hệ thống GPS mà chúng tôi sẽ tạo sẽ có thể theo dõi vị trí của người dùng bằng cách lấy tọa độ của người dùng trên Trái đất và thực hiện một số tính toán để trả về tốc độ, vị trí và khoảng cách của người dùng.

Bước 1: Bắt đầu

Bắt đầu
Bắt đầu
Bắt đầu
Bắt đầu
Bắt đầu
Bắt đầu
Bắt đầu
Bắt đầu

Để bắt đầu dự án này, trước tiên chúng tôi cần thu thập tất cả các tài liệu chính xác

1: Raspberry Pi Zero W

2: Bộ thu GPS

Màn hình SPI 3: 1.8 TFT 128 x 160 LCD SPI

4: ~ 11 dây

5: 2 nút

Điện trở 6: 2x 1k và 2x 10k cho các nút kéo xuống

7: Bảng bánh mì

Dự án này sẽ sử dụng các chân GPIO của Raspberry Pi và như vậy, chúng tôi sẽ cần kết nối mọi thứ với bảng mạch bánh mì để phát triển dự án của mình. Nó cũng được giả định rằng quá trình hàn trên tất cả các chân đã được thực hiện và hoàn thành trước khi tiếp tục và kết nối tất cả các bộ phận của chúng tôi.

Bước 2: Kết nối Mô-đun GPS với Raspberry Pi

Kết nối Mô-đun GPS với Raspberry Pi
Kết nối Mô-đun GPS với Raspberry Pi
Kết nối Mô-đun GPS với Raspberry Pi
Kết nối Mô-đun GPS với Raspberry Pi

Để sử dụng hệ thống GPS của chúng tôi, bạn sẽ cần kết nối các chân Tx và Rx từ mô-đun GPS với chân GPIO 14 và 15 trên Raspberry Pi. Chân Tx của bộ thu GPS chuyển đến chân Rx của Pi và chân Rx của bộ thu GPS đi tới chân Tx của Raspberry pi.

Bộ thu GPS hiển thị trong hình ảnh yêu cầu sử dụng 3,3V và bạn có thể kết nối các chân 3,3V với điện áp chính xác, trong khi kết nối chân Đất với mặt đất.

Bước 3: Nhận dữ liệu từ mô-đun bộ thu GPS

Nhận dữ liệu từ mô-đun máy thu GPS
Nhận dữ liệu từ mô-đun máy thu GPS

Để nhận dữ liệu từ bộ thu GPS đến Raspberry Pi, chúng ta cần cho phép đọc đúng các ổ cắm từ các cổng UART. Việc đọc dữ liệu thô sẽ yêu cầu chúng tôi tạo thư viện phân tích cú pháp của riêng mình, nhưng trong trường hợp này, chúng tôi có thể tận dụng daemon GPS chạy trong nền để giúp sử dụng phân tích cú pháp dữ liệu và truyền nó đến Raspberry Pi

Để thực hiện điều này, chúng ta có thể mở một thiết bị đầu cuối trên Raspberry Pi và thực thi mã:

sudo apt-get cập nhật

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

Điều này sẽ chăm sóc tải xuống cho chúng tôi.

Sau khi hoàn tất, chúng ta cần tắt dịch vụ hệ thống gpsd bằng cách chạy các lệnh sau:

sudo systemctl dừng gpsd.socket

sudo systemctl vô hiệu hóa gpsd.socket

Nếu bạn muốn bật dịch vụ hệ thống gpsd mặc định, bạn có thể chạy các lệnh sau để khôi phục nó:

sudo systemctl cho phép gpsd.socket

sudo systemctl start gpsd.socket

Bây giờ chúng ta cần khởi động trình nền gpsd và trỏ nó đến các cổng UART bằng cách nhập

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

Bây giờ chúng ta có thể chạy lệnh bên dưới và xem tất cả dữ liệu được đưa vào!

cgps -s

Bước 4: Kết nối Hiển thị với Raspberry Pi

Kết nối màn hình với Raspberry Pi
Kết nối màn hình với Raspberry Pi
Kết nối màn hình với Raspberry Pi
Kết nối màn hình với Raspberry Pi

Khi chúng tôi đã thiết lập bộ thu GPS và hoạt động với Raspberry Pi, sau đó chúng tôi có thể kết nối màn hình với Raspberry Pi. Chúng tôi sẽ sử dụng 5 dây để kết nối màn hình LCD của chúng tôi với Raspberry Pi và 4 chân khác để kết nối nguồn chính và đèn LED trên màn hình.

Tôi đã gửi kèm ảnh chụp màn hình TFT mà tôi đang sử dụng, nhưng ảnh này sẽ hoạt động với các màn hình có kích thước và cấu trúc tương tự.

Kết nối LED- và GND với mặt đất và kết nối LED + và VCC với 3.3V.

Kết nối chân RESET trên màn hình với chân 25 trên bảng Pi.

Kết nối A0 với chân 24 trên bảng Pi.

Kết nối chân SDA với chân MOSI trên bảng Pi.

Kết nối chân SCK trên màn hình LCD với bảng Pi.

Kết nối chân CS với chân 8 trên bảng Pi.

Bước 5: Thiết lập hiển thị để hoạt động với Raspberry Pi

Thiết lập hiển thị để hoạt động với Raspberry Pi
Thiết lập hiển thị để hoạt động với Raspberry Pi

Để thiết lập màn hình, chúng ta cần sử dụng thư viện ST7735 có trong repo này:

Thư viện màn hình Python ST7735

Khi chúng tôi đã cài đặt thư viện hiển thị này vào hệ thống Raspberry Pi của mình, bây giờ chúng tôi có thể tiến hành thiết lập tệp ví dụ để xác nhận hệ thống dây trước đó của chúng tôi đang hoạt động chính xác.

Tạo một tệp có tiêu đề example.py và chèn văn bản sau vào đó cùng với hình ảnh mẫu bạn chọn trong cùng một thư mục

nhập ST7735 dưới dạng TFTimport Adafruit_GPIO dưới dạng GPIO nhập Adafruit_GPIO. SPI dưới dạng SPI

WIDTH = 128

HEIGHT = 160 SPEED_HZ = 4000000

# Cấu hình Raspberry Pi.

# Đây là các chân cần thiết để kết nối màn hình LCD với Raspberry Pi

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

# Tạo lớp hiển thị TFT LCD.

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

# Khởi tạo hiển thị.

disp.begin () disp.reset ()

# Tải hình ảnh.

newData = 0x42 disp.command (newData) print ('Đang tải hình ảnh…') image = Image.open ('cat.jpg')

# Thay đổi kích thước hình ảnh và xoay nó sao cho khớp với màn hình.

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

# Sẽ in ra thiết bị đầu cuối rằng chương trình của chúng tôi đang vẽ Hình ảnh của chúng tôi trên màn hình

print ('Hình vẽ')

# Chức năng này sẽ hiển thị hình ảnh của chúng ta trên màn hình

disp.display (hình ảnh)

Tệp này sẽ thiết lập cấu hình Raspberry Pi cho màn hình LCD và thư viện sẽ chuyển đổi hình ảnh của chúng ta trong thư mục và hiển thị trên màn hình.

Bước 6: Thiết lập Máy trạng thái để Hiển thị Thông tin GPS trên Màn hình

Thiết lập máy trạng thái để hiển thị thông tin GPS trên màn hình
Thiết lập máy trạng thái để hiển thị thông tin GPS trên màn hình
Thiết lập máy trạng thái để hiển thị thông tin GPS trên màn hình
Thiết lập máy trạng thái để hiển thị thông tin GPS trên màn hình
Thiết lập máy trạng thái để hiển thị thông tin GPS trên màn hình
Thiết lập máy trạng thái để hiển thị thông tin GPS trên màn hình

Chúng tôi sẽ sử dụng 5 máy trạng thái khác nhau, trong khi triển khai sơ đồ nhiệm vụ để thiết lập hệ thống gps của chúng tôi.

Màn hình Thay đổi trạng thái máy:

Máy trạng thái này sẽ kiểm soát hiển thị cái nào tùy thuộc vào đầu vào nút của chúng ta. Nó thực hiện điều này bằng cách thay đổi một biến cho phép python tận dụng lợi thế của việc gõ vịt và gọi hàm chính xác để hiển thị tùy thuộc vào hàm được gọi

Máy trạng thái tốc độ:

Máy trạng thái này sẽ thực thi tốc độ hiện tại tùy thuộc vào vị trí của từng cá nhân. Điều này sẽ thực hiện mọi chu kỳ đồng hồ cho hệ thống GPS

Máy trạng thái đầu ra:

Máy trạng thái này sẽ xác định đầu ra dựa trên biến mà máy trạng thái thay đổi hiển thị xác định là màn hình hiện tại.

Máy trạng thái khoảng cách

Máy trạng thái này thực hiện mọi chu kỳ đồng hồ và xác định tổng quãng đường mà người dùng đã đi và một khi nút đặt lại được nhấn, sẽ đặt lại khoảng cách hiện tại đã đi.

Vị trí máy trạng thái:

Máy trạng thái này trả về vị trí hiện tại của người dùng, sử dụng tọa độ mà mô-đun GPS trả về về người dùng. Máy trạng thái này phụ thuộc vào kết nối internet của người dùng.

Bước 7: Cho phép triển khai hệ thống GPS của chúng tôi

Sau khi mô-đun GPS của chúng tôi gửi thông tin đến Raspberry Pi và màn hình LCD của chúng tôi hiển thị thông tin trên đó, chúng tôi có thể bắt đầu lập trình hệ thống GPS của mình. Tôi sẽ sử dụng các máy trạng thái hữu hạn của bước trước để mã hóa hệ thống GPS của chúng tôi

## Tệp chính cho hệ thống Điều hướng # # # #

# Thư viện để vẽ hình ảnh

from PIL import Image from PIL import ImageDraw from PIL import ImageFont

# Thư viện cho bộ điều khiển ST7737

nhập ST7735 dưới dạng TFT

# Thư viện cho GPIO dành cho Raspberry Pi

nhập Adafruit_GPIO dưới dạng GPIO nhập Adafruit_GPIO. SPI dưới dạng SPI

# Thư viện cho GPS

#import gpsd from gps3 import gps3

# Thư viện cho thời gian

thời gian nhập khẩu

# Thư viện tìm khoảng cách giữa hai điểm

từ toán học nhập sin, cos, sqrt, atan2, radian

# Nhập thư viện Rpi để sử dụng các nút để chuyển đổi menu và đặt lại

# nhập RPi. GPIO dưới dạng bGPIO

# Chân thiết lập cho các nút

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)

# nhập thư viện geopy để Mã hóa địa lý

# # Cần có truy cập Internet để điều này hoạt động

từ geopy.geocoders nhập Nominatim

geolocator = Nominatim ()

# Hằng số cho hệ thống

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

WIDTH = 128

HEIGHT = 160 SPEED_HZ = 4000000

# Chân cấu hình Raspberry Pi

DC = 24 # A0 trên màn hình TFT RST = 25 # Đặt lại chân trên màn hình TFT SPI_PORT = 0 # Cổng SPI trên mâm xôi pi, SPI0 SPI_DEVICE = 0 # Slave chọn trên mâm xôi pi, CE0

# Tạo đối tượng hiển thị TFT LCD

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

# Khởi tạo màn hình

disp.begin ()

# Nền sẽ được đặt thành màu xanh lục

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

# Xóa màn hình sang màu trắng và hiển thị

# disp.clear ((255, 255, 255)) draw = disp.draw () # draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (0, 0, 255)) # disp.display ()

# Biến vị trí Tốc độ, Vĩ độ, Kinh độ

#currentS = "Tốc độ Hiện tại:" # Chuỗi tốc độ #totalDis = "Tổng khoảng cách:" # Chuỗi khoảng cách #currentLoc = "Vị trí hiện tại:" # Chuỗi vị trí

# Khoảng cách tọa độ x và y

distX = 10 distY = 20

pointsList =

# Tốc độ x và tọa độ y

speedX = 10 speedY = 20

# Vị trí x và y coordiantes

locX = 10 locY = 20

# Chuyển đổi từ m / s sang mph

convertVal = 2,24

# Chức năng cập nhật tốc độ, trả về chuỗi

SpeedVar = 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 ())

reverseString = latLoc + "," + lonLoc

location = geolocator.reverse (reverseString)

return (location.address)

# Chức năng cập nhật Latitude, trả về giá trị float

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

# Hàm cập nhật kinh độ, trả về chuỗi

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n / a"): return 0 else: return float (round (Longitude, 4))

# Hàm khoảng cách trả về TOTAL quãng đường đã đi

totalDistance = 0

def distFunc ():

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

# Đặt lại tổng khoảng cách

def resDistance ():

global totalDistance totalDistance = 0

# Hàm dùng để tìm khoảng cách giữa hai tọa độ

# sử dụng công thức của Haversine để tìm. # Điểm đầu vào là một bộ

def coorDistance (point1, point2):

# Bán kính gần đúng của Trái đất tính bằng km earthRadius = 6373,0

lat1 = point1 [0]

lon1 = point1 [1]

lat2 = point2 [0]

lon2 = point2 [1]

distanceLon = lon2 - lon1

distanceLat = lat2 - lat1

# Haversine a

a = sin (distanceLat / 2) ** 2 + cos (lat1) * cos (lat2) * sin (distanceLon / 2) ** 2

# Haversine c

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

# Chuyển đổi km sang Dặm

khoảng cách = (earthRadius * c) * 0,62137

if (khoảng cách <= 0,01): trả về 0,00 khác: vòng quay trở lại (khoảng cách, 3)

# Chức năng hiển thị tốc độ trên màn hình

def dispSpeed ():

global SpeedVar # Đặt khoảng cách trên biến trên màn hình draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Chức năng hiển thị khoảng cách trên màn hình

def dispDistance ():

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

# Chức năng hiển thị vị trí ti trên màn hình, cần có internet để hoạt động

def dispLocation ():

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

# Sử dụng từ điển để bắt chước các câu lệnh switch

dispOptions = {

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

# Chức năng xuất màn hình

đầu ra def ():

# Sử dụng biến toàn cục cho displayIndex global displayIndex # Xóa màn hình và áp dụng background disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), điền = (255, 0, 0))

# Chức năng cuộc gọi tùy thuộc vào giá trị displayIndex

dispOptions [displayIndex] ()

# Sẽ xóa nếu phương pháp khác hoạt động

# đặt biến khoảng cách trên màn hình

# draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) # đặt biến tốc độ trên màn hình # draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Hiển thị cập nhật cho màn hình disp.display ()

displayButton = 18 # BCM Ghim trên raspberry pi

resetButton = 23 # BCM Ghim trên raspberry pi

buttonPress = Sai

def checkDisplay ():

nút toàn cầu Nhấn hiển thị toàn cục Vẫn được nhấn ) else: buttonPress = False

# Thiết lập gps

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

timerPeriod =.5

# Giá trị chỉ mục cho hiển thị displayIndex = 0 try: for new_data in 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 chưa được kết nối') time.sleep (.1) time.sleep (.8) ngoại trừ KeyboardInterrupt: gps_socket.close () print (' / nĐược kết thúc bởi người dùng ctrl + c ')

Đoạn mã trên chỉ là một ví dụ về cách viết mã hệ thống của chúng tôi và tôi đã nhúng một video về cách hệ thống này hoạt động.

Đề xuất: