Taula de continguts:

Sistema GPS: 7 passos
Sistema GPS: 7 passos

Vídeo: Sistema GPS: 7 passos

Vídeo: Sistema GPS: 7 passos
Vídeo: Обзор ГНСС-приёмника PrinCe i50 2024, Octubre
Anonim
Sistema GPS
Sistema GPS
Sistema GPS
Sistema GPS
Sistema GPS
Sistema GPS

Creador del projecte: Carlos Gómez

Disposar d’un sistema de navegació fiable és primordial per a qualsevol persona que intenti viatjar i explorar el món.

L'aspecte més important que permet que el sistema de navegació funcioni és la capacitat GPS incrustada dins del sistema. El sistema GPS permet a qualsevol persona fer un seguiment de la seva ubicació i velocitat per mostrar informació precisa sobre l’usuari i proporcionar-li una representació precisa d’on es troba i a quina distància es troba de la seva ubicació.

El Sistema de Posicionament Global (GPS) és una xarxa de satèl·lits que orbiten al voltant de la Terra a una altitud d’uns 20.000 km. Tothom que tingui un dispositiu GPS pot rebre els senyals de ràdio que emeten els satèl·lits i els pot utilitzar de la manera que sigui necessària. Sempre que sigui on sigui que tingueu la ubicació al planeta, haureu d’estar disponibles com a mínim quatre GPS en qualsevol moment. Mitjançant un mètode anomenat trilateració 3D, un dispositiu GPS pot utilitzar tres satèl·lits per determinar la ubicació del dispositiu a la Terra. Cadascun dels tres satèl·lits envia un senyal al dispositiu i aquest determina la distància del satèl·lit. Mitjançant cadascun dels tres càlculs de distància, el dispositiu ara és capaç d’identificar la seva ubicació a la Terra i la retorna a l’usuari.

El sistema GPS que crearem podrà fer un seguiment de les ubicacions de l’usuari obtenint les coordenades de l’usuari a la Terra i fent alguns càlculs per tal de retornar la velocitat, la ubicació i la distància recorreguda de l’usuari.

Pas 1: Introducció

Començant
Començant
Començant
Començant
Començant
Començant
Començant
Començant

Per començar aquest projecte, primer haurem de reunir tots els materials correctes

1: Raspberry Pi Zero W

2: Receptor GPS

Pantalla LCD SPI 3: 1,8 TFT 128 x 160

4: ~ 11 cables

5: 2 botons

Resistències 6: 2x 1k i 2x 10k per a botons desplegables

7: Tauler de pa

Aquest projecte utilitzarà els pins GPIO de Raspberry Pi i, com a tal, haurem de connectar-ho tot amb una placa de pa per desenvolupar el nostre projecte. També se suposa que la soldadura de tots els passadors està feta i acabada abans de passar i connectar totes les nostres peces.

Pas 2: connecteu el mòdul GPS a Raspberry Pi

Connecteu el mòdul GPS a Raspberry Pi
Connecteu el mòdul GPS a Raspberry Pi
Connecteu el mòdul GPS a Raspberry Pi
Connecteu el mòdul GPS a Raspberry Pi

Per utilitzar el nostre sistema GPS, haureu de connectar els pins Tx i Rx del mòdul GPS als pins GPIO 14 i 15 del Raspberry Pi. El pin Tx del receptor GPS va al pin Rx del Pi i el pin Rx del receptor GPS va al pin Tx del Raspberry pi.

El receptor GPS que es mostra a les imatges requereix un ús de 3,3 V i podeu connectar els pins de 3,3 V al voltatge correcte, mentre connecteu el pin de terra a terra.

Pas 3: rebeu dades del mòdul del receptor GPS

Rep dades del mòdul del receptor GPS
Rep dades del mòdul del receptor GPS

Per rebre dades del receptor GPS al Raspberry Pi, hem de permetre la lectura dels endolls correctes des dels ports UART. La lectura de les dades brutes requeriria que creéssim la nostra pròpia biblioteca d’anàlisi, però en aquest escenari podem aprofitar un dimoni GPS que s’executa en segon pla per ajudar a analitzar les dades i transmetre-les al Raspberry Pi

Per aconseguir-ho, podem obrir un terminal al Raspberry Pi i executar el codi:

sudo apt-get update

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

Això ens hauria de fer càrrec de la descàrrega.

Un cop completat, hem de desactivar el servei del sistema gpsd executant les ordres següents:

sudo systemctl stop gpsd.socket

sudo systemctl desactiva gpsd.socket

Si voleu habilitar el servei de sistema gpsd per defecte, podeu executar les ordres següents per restaurar-lo:

sudo systemctl habilita gpsd.socket

sudo systemctl arrenca gpsd.socket

Ara hem d'iniciar el dimoni gpsd i dirigir-lo als ports UART entrant

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

Ara podem executar l'ordre següent i veure totes les dades que suren.

cgps -s

Pas 4: connecteu la pantalla a Raspberry Pi

Connecteu la pantalla a Raspberry Pi
Connecteu la pantalla a Raspberry Pi
Connecteu la pantalla a Raspberry Pi
Connecteu la pantalla a Raspberry Pi

Un cop tinguem el receptor GPS activat i treballem amb el Raspberry Pi, podrem connectar la pantalla al Raspberry Pi. Utilitzarem 5 cables per connectar la nostra pantalla LCD al Raspberry Pi i altres 4 pins per connectar l’alimentació principal i el LED. a la pantalla.

He inclòs una foto de la pantalla TFT que estic fent servir, però hauria de funcionar amb pantalles de mida i construcció similars.

Connecteu LED i GND a terra i connecteu LED + i VCC a 3,3 V.

Connecteu el pin RESET de la pantalla al pin 25 del tauler Pi.

Connecteu A0 al pin 24 del tauler Pi.

Connecteu el pin SDA al pin MOSI de la placa Pi.

Connecteu el pin SCK de la pantalla LCD a la placa Pi.

Connecteu el pin CS al pin 8 del tauler Pi.

Pas 5: configureu la pantalla perquè funcioni amb Raspberry Pi

Configuració de la pantalla perquè funcioni amb Raspberry Pi
Configuració de la pantalla perquè funcioni amb Raspberry Pi

Per configurar la pantalla, hem d’utilitzar la biblioteca ST7735 que es troba en aquesta reposició:

Biblioteca de pantalles Python ST7735

Un cop tinguem aquesta biblioteca de pantalla instal·lada al nostre sistema Raspberry Pi, ara podem procedir a configurar un fitxer d’exemple per confirmar que el cablejat anterior funciona correctament.

Creeu un fitxer titulat example.py i inseriu-hi el text següent juntament amb una imatge de mostra que trieu a la mateixa carpeta

importar ST7735 com a TFT importar Adafruit_GPIO com a GPIO importar Adafruit_GPIO. SPI com a SPI

AMPLADA = 128

ALÇADA = 160 SPEED_HZ = 4000000

# Configuració de Raspberry Pi.

# Aquests són els pins necessaris per connectar la pantalla LCD al Raspberry Pi

CC = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0

# Crea una classe de pantalla TFT LCD.

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

# Inicialitza la visualització.

disp.begin () disp.reset ()

# Carregueu una imatge.

newData = 0x42 disp.command (newData) print ('S'està carregant la imatge …') image = Image.open ('cat.jpg')

# Canvieu la mida de la imatge i gireu-la perquè coincideixi amb la pantalla.

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

# Imprimirà al terminal que el nostre programa està dibuixant la nostra imatge a la pantalla

print ('Imatge de dibuix')

# Aquesta funció mostrarà la nostra imatge a la pantalla

desp.display (imatge)

Aquest fitxer configurarà la configuració de Raspberry Pi per a la pantalla LCD i la biblioteca convertirà la nostra imatge a la carpeta i la mostrarà a la pantalla.

Pas 6: configureu les màquines d'estat per mostrar la informació del GPS a la pantalla

Configureu les màquines d'estat per mostrar informació GPS a la pantalla
Configureu les màquines d'estat per mostrar informació GPS a la pantalla
Configureu les màquines d'estat per mostrar informació GPS a la pantalla
Configureu les màquines d'estat per mostrar informació GPS a la pantalla
Configureu les màquines d'estat per mostrar informació GPS a la pantalla
Configureu les màquines d'estat per mostrar informació GPS a la pantalla

Utilitzarem 5 màquines d’estats diferents, mentre implementem el nostre diagrama de tasques per configurar el nostre sistema GPS.

Màquina d'estat de canvi de pantalla:

Aquesta màquina d'estats controlarà quina visualització dependrà de la nostra entrada de botó. Ho fa canviant una variable que permet a Python aprofitar l’escriptura d’ànecs i cridant la funció correcta per mostrar segons la funció cridada

Màquina d'estat de velocitat:

Aquesta màquina d'estats executarà la velocitat actual en funció de la ubicació de les persones. S’executarà cada cicle de rellotge del sistema GPS

Màquina d'estat de sortida:

Aquesta màquina d'estats determinarà la sortida en funció de la variable que la màquina d'estat de canvi de pantalla determina que és la visualització actual.

Màquina d'estat de distància

Aquesta màquina d'estats s'executa cada cicle de rellotge i determina la distància total recorreguda per l'usuari i, un cop premut el botó de reinicialització, restablirà la distància recorreguda actual.

Màquina d'estat d'ubicació:

Aquesta màquina d'estats retorna la ubicació actual de l'usuari, mitjançant les coordenades que el mòdul GPS retorna sobre l'usuari. Aquesta màquina d'estat depèn de la connexió a Internet dels usuaris.

Pas 7: implementem el nostre sistema GPS

Un cop tinguem el mòdul GPS que envia informació al nostre Raspberry Pi i la pantalla LCD que hi mostra informació, podem començar a programar el nostre sistema GPS. Utilitzaré les màquines d'estat finit del pas anterior per tal de codificar el nostre sistema GPS

## Fitxer principal del sistema de navegació # # # #

# Biblioteques per dibuixar imatges

d'importació PIL Imatge d'importació PIL ImageDraw d'importació PIL ImageFont

# Biblioteca per al controlador ST7737

importeu ST7735 com a TFT

# Biblioteca per a GPIO per a Raspberry Pi

importar Adafruit_GPIO com a GPIO importar Adafruit_GPIO. SPI com a SPI

# Biblioteca per GPS

#import gpsd de gps3 import gps3

# Biblioteca per temps

temps d'importació

# Biblioteca per trobar la distància entre dos punts

a partir de matemàtiques, sin, cos, sqrt, atan2, radians

# Importeu la biblioteca Rpi per utilitzar botons per canviar de menú i restablir

# import RPi. GPIO com a bGPIO

# Pin de configuració per als botons

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)

# importació de la biblioteca de geopies per a la geocodificació

# # L'accés a Internet és necessari perquè això funcioni

de geopy.geocoders importen Nominatim

geolocalitzador = Nominatim ()

# Constants per al sistema

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

AMPLADA = 128

ALÇADA = 160 SPEED_HZ = 4000000

# Pins de configuració de Raspberry Pi

DC = 24 # A0 a la pantalla TFT RST = 25 # Restableix el pin a la pantalla TFT SPI_PORT = 0 # Port SPI a raspberry pi, SPI0 SPI_DEVICE = 0 # Selecció esclau a rapsberry pi, CE0

# Crea un objecte de pantalla TFT LCD

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

# Inicialitza la visualització

disp.begin ()

# El fons es posarà en verd

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

# Esborreu la pantalla al blanc i mostreu-la

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

# Variables de posició de velocitat, latitud i longitud

#currentS = "Velocitat actual:" # Speed string #totalDis = "Distància total:" # Distance string #currentLoc = "Ubicació actual:" # Cadena d'ubicació

# Distància coordenades x i

distX = 10 distY = 20

pointsList =

# Velocitat de les coordenades x i y

velocitatX = 10 velocitatY = 20

# Ubicació x i y coordinants

locX = 10 locY = 20

# Converteix de m / s a mph

conversionVal = 2,24

# Funció d'actualització de velocitat, retorna la cadena

SpeedVar = 0

def speedFunc (): SpeedVar global 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

location = geolocator.reverse (reverseString)

retorn (ubicació.adreça)

# Funció d'actualització de latitud, retorna el valor flotant

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

# Funció d'actualització de longitud, retorna la cadena

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

# La funció Distància retorna la distància recorreguda TOTAL

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

# Restableix la distància total

def resDistance ():

global totalDistance totalDistance = 0

# Funció que s'utilitza per trobar la distància entre dues coordenades

# utilitza la fórmula de Haversine per trobar. # Els punts d'entrada són una tupla

def coorDistance (punt 1, punt 2):

# Radi aproximat de la Terra en quilòmetres de radi terrestre = 6373,0

lat1 = punt1 [0]

lon1 = punt1 [1]

lat2 = punt2 [0]

lon2 = punt2 [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))

# Converteix km a milles

distància = (earthRadius * c) * 0,62137

if (distància <= 0,01): retorna 0,00 else: volta de tornada (distància, 3)

# Funció per mostrar la velocitat a la pantalla

def dispSpeed ():

global SpeedVar # Col·loca la distància a la variable draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Funció per mostrar la distància a la pantalla

def dispDistance ():

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

# La funció de visualització de la ubicació a la pantalla requereix que Internet funcioni

def dispLocation ():

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

# Ús del diccionari per imitar les afirmacions de commutació

dispOptions = {

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

# Funció de sortida de pantalla

sortida def ():

# Ús de variable global per displayIndex global displayIndex # Esborra la pantalla i aplica el fons disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), contorn = (255, 0, 0), omplir = (255, 0, 0))

# Funció de trucades en funció del valor displayIndex

dispOptions [displayIndex] ()

# Esborrarà si funciona un altre mètode

variable de distància de # lloc a la pantalla

# draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) # lloc variable de velocitat a la pantalla # draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Mostra les actualitzacions de la pantalla disp.display ()

displayButton = 18 # BCM Pin a raspberry pi

resetButton = 23 # Pin BCM al raspberry pi

botó Premeu = Fals

def checkDisplay ():

botó global Premeu displayIndex global if (bGPIO.input (displayButton) i no buttonPress): displayIndex + = 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) and buttonPress): print (" Encara premut ") else: buttonPress = False

# Configura gps

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

timerPeriod =.5

# Valor de l'índex per a la visualització displayIndex = 0 prova: per a dades noves a gps_socket: si dades noves: dades_stream.unpack (dades noves) si dades_ flux. TPV ['lat']! = 'N / a': imprimir (dades_ flux. TPV ['velocitat')], 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 encara no està connectat') time.sleep (.1) time.sleep (.8) excepte KeyboardInterrupt: gps_socket.close () print (' / nTerminat per l'usuari ctrl + c ')

El codi anterior és només un exemple de com codificar el nostre sistema i he incrustat un vídeo sobre com funciona aquest sistema.

Recomanat: