Obsah:

Systém GPS: 7 kroků
Systém GPS: 7 kroků

Video: Systém GPS: 7 kroků

Video: Systém GPS: 7 kroků
Video: ANDROID MÁ JEDNO SKRYTÉ NASTAVENÍ 🤖 2024, Říjen
Anonim
GPS systém
GPS systém
GPS systém
GPS systém
GPS systém
GPS systém

Tvůrce projektu: Carlos Gomez

Spolehlivý navigační systém je prvořadý pro každého, kdo se snaží cestovat a poznávat svět.

Nejdůležitějším aspektem, který umožňuje navigačnímu systému fungovat, je schopnost GPS zabudovaná uvnitř systému. Systém GPS umožňuje komukoli sledovat jeho polohu a rychlost, aby mohl zobrazovat přesné informace o uživateli a poskytovat uživateli přesnou reprezentaci toho, kde se nacházejí a jak daleko jsou od svého umístění.

Global Positioning System (GPS) je síť satelitů obíhajících kolem Země ve výšce asi 20 000 km. Každý, kdo má zařízení GPS, může přijímat rádiové signály, které satelity vysílají, a je schopen je využívat jakýmkoli způsobem. Ať už jste kdekoli na planetě, měli byste mít kdykoli k dispozici alespoň čtyři GPS. Pomocí metody zvané 3-D trilaterace je zařízení GPS schopno použít tři satelity k určení polohy zařízení na Zemi. Každý ze tří satelitů odešle signál do zařízení a zařízení určí jeho vzdálenost od satelitu. Pomocí každého ze tří výpočtů vzdálenosti je zařízení nyní schopno určit svou polohu na Zemi a vrátí ji uživateli.

Systém GPS, který vytvoříme, bude schopen sledovat polohu uživatele získáním jeho souřadnic na Zemi a provedením několika výpočtů, aby se uživateli vrátila rychlost, poloha a ujetá vzdálenost.

Krok 1: Začínáme

Začínáme
Začínáme
Začínáme
Začínáme
Začínáme
Začínáme
Začínáme
Začínáme

Abychom mohli tento projekt zahájit, budeme nejprve muset shromáždit všechny správné materiály

1: Raspberry Pi Zero W

2: GPS přijímač

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

4: ~ 11 vodičů

Tlačítka 5: 2

6: 2x 1k a 2x 10k odpory pro stahovací tlačítka

7: Chlebová deska

Tento projekt bude využívat GPIO piny Raspberry Pi a jako takový budeme pro vývoj našeho projektu muset vše propojit s chlebovou deskou. Předpokládá se také, že pájení na všech pinech je hotové a dokončené, než se přesuneme a spojíme všechny naše části.

Krok 2: Připojte modul GPS k Raspberry Pi

Připojte modul GPS k Raspberry Pi
Připojte modul GPS k Raspberry Pi
Připojte modul GPS k Raspberry Pi
Připojte modul GPS k Raspberry Pi

Abyste mohli používat náš systém GPS, budete muset připojit piny Tx a Rx z modulu GPS ke kolíku GPIO 14 a 15 na Raspberry Pi. Tx pin přijímače GPS jde na Rx pin Pi a Rx pin přijímače GPS jde na Tx pin Raspberry pi.

Přijímač GPS zobrazený na obrázcích vyžaduje použití 3,3 V a piny 3,3 V můžete připojit ke správnému napětí při připojení zemnicího kolíku k zemi.

Krok 3: Získejte data z modulu přijímače GPS

Získejte data z modulu přijímače GPS
Získejte data z modulu přijímače GPS

Abychom mohli přijímat data z přijímače GPS na Raspberry Pi, musíme povolit čtení správných zásuvek z portů UART. Čtení surových dat by vyžadovalo, abychom vytvořili vlastní knihovnu pro analýzu, ale v tomto scénáři můžeme využít démona GPS, který běží na pozadí, aby pomohl při analýze dat a jejich přenosu na Raspberry Pi

Abychom toho dosáhli, můžeme otevřít terminál na Raspberry Pi a spustit kód:

sudo apt-get update

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

To by se mělo postarat o stažení za nás.

Jakmile je dokončen, musíme zakázat systémovou službu gpsd spuštěním následujících příkazů:

sudo systemctl stop gpsd.socket

sudo systemctl zakáže gpsd.socket

Pokud byste někdy chtěli povolit výchozí systémovou službu gpsd, můžete ji spustit následujícími příkazy:

sudo systemctl povolit gpsd.socket

sudo systemctl start gpsd.socket

Nyní musíme spustit démona gpsd a nasměrovat jej na porty UART zadáním

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

Nyní můžeme spustit níže uvedený příkaz a zobrazit všechna data plovoucí v!

cgps -s

Krok 4: Připojte displej k Raspberry Pi

Připojte displej k Raspberry Pi
Připojte displej k Raspberry Pi
Připojte displej k Raspberry Pi
Připojte displej k Raspberry Pi

Jakmile máme GPS přijímač v provozu a pracujeme s Raspberry Pi, můžeme připojit displej k Raspberry Pi. Pro připojení LCD displeje k Raspberry Pi použijeme 5 vodičů a další 4 piny pro připojení hlavního napájení a LED na obrazovce.

Zahrnul jsem fotografii obrazovky TFT, kterou používám, ale to by mělo fungovat s obrazovkami podobné velikosti a sestavení.

Připojte LED a GND k zemi a připojte LED+ a VCC na 3,3 V.

Připojte pin RESET na obrazovce ke kolíku 25 na desce Pi.

Připojte A0 ke kolíku 24 na desce Pi.

Připojte pin SDA ke kolíku MOSI na desce Pi.

Připojte pin SCK na obrazovce LCD k desce Pi.

Připojte pin CS k pinu 8 na desce Pi.

Krok 5: Nastavení zobrazení pro práci s Raspberry Pi

Nastavte displej tak, aby fungoval s Raspberry Pi
Nastavte displej tak, aby fungoval s Raspberry Pi

K nastavení displeje musíme použít knihovnu ST7735, kterou najdete v tomto repo:

Knihovna obrazovky Python ST7735

Jakmile budeme mít tuto knihovnu displeje nainstalovanou v našem systému Raspberry Pi, můžeme nyní přistoupit k nastavení ukázkového souboru, který potvrdí, že naše předchozí zapojení funguje správně.

Vytvořte soubor s názvem example.py a vložte tam následující text spolu s ukázkovým obrázkem, který si vyberete, do stejné složky

import ST7735 jako TFTimport Adafruit_GPIO jako GPIO import Adafruit_GPIO. SPI jako SPI

ŠÍŘKA = 128

VÝŠKA = 160 SPEED_HZ = 4000000

# Konfigurace Raspberry Pi.

# Toto jsou kolíky potřebné k připojení LCD k Raspberry Pi

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

# Vytvořte třídu TFT LCD displeje.

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

# Inicializujte zobrazení.

disp.begin () disp.reset ()

# Načtěte obrázek.

newData = 0x42 disp.command (newData) print ('Loading image…') image = Image.open ('cat.jpg')

# Změňte velikost obrázku a otočte jej tak, aby odpovídal zobrazení.

image = image.rotate (270). resize ((ŠÍŘKA, VÝŠKA))

# Vytiskne na terminál, že náš program kreslí náš Obraz na obrazovku

tisk ('Kreslící obrázek')

# Tato funkce zobrazí náš obrázek na obrazovce

disp.display (obrázek)

Tento soubor nastaví konfiguraci Raspberry Pi pro LCD obrazovku a knihovna převede náš obrázek do složky a zobrazí jej na obrazovce.

Krok 6: Nastavení stavových strojů pro zobrazení informací GPS na displeji

Nastavte stavové stroje tak, aby zobrazovaly informace GPS na displeji
Nastavte stavové stroje tak, aby zobrazovaly informace GPS na displeji
Nastavte stavové stroje tak, aby zobrazovaly informace GPS na displeji
Nastavte stavové stroje tak, aby zobrazovaly informace GPS na displeji
Nastavte stavové stroje tak, aby zobrazovaly informace GPS na displeji
Nastavte stavové stroje tak, aby zobrazovaly informace GPS na displeji

Při nastavování našeho systému GPS použijeme 5 různých stavových strojů.

Zobrazit stroj pro změnu stavu:

Tento stavový stroj bude řídit, který se má zobrazit, v závislosti na našem zadání tlačítka. Dělá to změnou proměnné, která umožňuje pythonu využívat výhody psaní kachen a volání správné funkce pro zobrazení v závislosti na volané funkci

Rychlostní stavový stroj:

Tento stavový stroj provede aktuální rychlost v závislosti na umístění jednotlivců. Tím se spustí každý hodinový cyklus systému GPS

Stavový stavový stroj:

Tento stavový stroj určí výstup na základě proměnné, kterou stroj pro změnu stavu zobrazení určí jako aktuální zobrazení.

Stavový stroj vzdálenosti

Tento stavový stroj provede každý hodinový cyklus a určí celkovou vzdálenost, kterou uživatel ujel, a po stisknutí tlačítka reset vynuluje aktuální ujetou vzdálenost.

Stavový stroj polohy:

Tento stavový stroj vrací aktuální polohu uživatele pomocí souřadnic, které modul GPS vrací o uživateli. Tento stavový stroj je závislý na internetovém připojení uživatelů.

Krok 7: Pojďme implementovat náš systém GPS

Poté, co náš modul GPS odesílá informace na náš Raspberry Pi a náš LCD displej zobrazuje informace, můžeme začít programovat náš systém GPS. Ke kódování našeho systému GPS použiji stroje s konečným stavem předchozího kroku

## Hlavní soubor pro navigační systém # # # #

# Knihovny pro kreslení obrázků

z PIL import Image z PIL import ImageDraw z PIL import ImageFont

# Knihovna pro ovladač ST7737

importujte ST7735 jako TFT

# Knihovna pro GPIO pro Raspberry Pi

import Adafruit_GPIO jako GPIO import Adafruit_GPIO. SPI jako SPI

# Knihovna pro GPS

#import gpsd z gps3 import gps3

# Knihovna na čas

čas importu

# Knihovna pro hledání vzdálenosti mezi dvěma body

z matematiky import sin, cos, sqrt, atan2, radiány

# Importujte knihovnu Rpi a pomocí tlačítek přepínejte nabídky a resetujte

# importujte RPi. GPIO jako bGPIO

# Nastavovací kolíky pro tlačítka

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 geopy knihovny pro geokódování

# # Aby to fungovalo, je nutný přístup k internetu

z geopy.geocoders import Nominatim

geolokátor = Nominatim ()

# Konstanty pro systém

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

ŠÍŘKA = 128

VÝŠKA = 160 SPEED_HZ = 4000000

# Konfigurační piny Raspberry Pi

DC = 24 # A0 na obrazovce TFT RST = 25 # Resetovací pin na obrazovce TFT SPI_PORT = 0 # SPI port na malinovém pi, SPI0 SPI_DEVICE = 0 # Volba slave na rapsberry pi, CE0

# Vytvořte objekt TFT LCD displeje

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

# Inicializujte zobrazení

disp.begin ()

# Pozadí bude nastaveno na zelenou

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

# Vymazat obrazovku na bílou a zobrazit

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

# Proměnné umístění rychlosti, zeměpisné šířky a délky

#currentS = "Aktuální rychlost:" # Řetězec rychlosti #totalDis = "Celková vzdálenost:" # Řetězec vzdálenosti #currentLoc = "Aktuální poloha:" # Řetězec polohy

# Vzdálenost souřadnic x a y

distX = 10 distY = 20

pointsList =

# Rychlost souřadnic x a y

speedX = 10 speedY = 20

# Umístění x a y coordiantes

locX = 10 locY = 20

# Převádí z m/s na mph

conversionVal = 2,24

# Funkce aktualizace rychlosti, vrací řetězec

SpeedVar = 0

def speedFunc (): global SpeedVar SpeedText = data_stream. TPV ['speed'] if (SpeedText! = "n/a"): SpeedText = float (SpeedText) * conversionVal SpeedVar = kulatý (SpeedText, 1) # návrat (SpeedText)

def locationFunc ():

latLoc = str (latFunc ()) lonLoc = str (lonFunc ())

reverseString = latLoc + "," + lonLoc

umístění = geolocator.reverse (reverseString)

návrat (umístění.adresa)

# Funkce aktualizace Latitude, vrací plovoucí hodnotu

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

# Funkce aktualizace zeměpisné délky, vrací řetězec

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

# Funkce vzdálenosti vrací TOTAL ujetou vzdálenost

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

# Resetuje celkovou vzdálenost

def resDistance ():

global totalDistance totalDistance = 0

# Funkce sloužící k nalezení vzdálenosti mezi dvěma souřadnicemi

# používá k nalezení Haversinův vzorec. # Vstupní body jsou n -tice

def coorDistance (point1, point2):

# Přibližný poloměr Země v kilometrech Země Radius = 6373,0

lat1 = bod1 [0]

lon1 = bod1 [1]

lat2 = bod2 [0]

lon2 = bod2 [1]

distanceLon = lon2 - lon1

distanceLat = lat2 - lat1

# Haversine a

a = sin (vzdálenostLat/2) ** 2 + cos (lat1)*cos (lat2)*sin (vzdálenostLon/2) ** 2

# Haversine c

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

# Převést km na míle

vzdálenost = (earthRadius * c) * 0,62137

if (vzdálenost <= 0,01): návrat 0,00 jinak: návrat kolo (vzdálenost, 3)

# Funkce pro zobrazení rychlosti na obrazovce

def dispSpeed ():

globální SpeedVar # Umístit vzdálenost na proměnnou na obrazovce draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Funkce pro zobrazení vzdálenosti na obrazovce

def dispDistance ():

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

# Funkce, která zobrazuje umístění na obrazovce, vyžaduje internet

def dispLocation ():

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

# Použití slovníku k napodobení příkazů přepínače

dispOptions = {

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

# Funkce výstupu obrazovky

def výstup ():

# Použití globální proměnné pro displayIndex globální displayIndex # Vymazání obrazovky a použití pozadí disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), outline = (255, 0, 0), fill = (255, 0, 0))

# Funkce volání v závislosti na hodnotě displayIndex

dispOptions [displayIndex] ()

# Pokud jiná metoda funguje, vymaže se

# proměnná vzdálenosti místa na obrazovce

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #proměnná rychlosti umístění na obrazovku #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Zobrazí aktualizace obrazovky. displej ()

displayButton = 18 # BCM Pin na malinovém pi

resetButton = 23 # BCM Pin na malinovém pi

buttonPress = False

def checkDisplay ():

global buttonPress global displayIndex if (bGPIO.input (displayButton) and not buttonPress): displayIndex += 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) and buttonPress): print (" Stále stisknuto ") else: buttonPress = False

# Nastavení GPS

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

timerPeriod =.5

# Hodnota indexu pro displayIndex = 0 zkus: pro new_data v 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 dosud není připojeno') time.sleep (.1) time.sleep (.8) kromě KeyboardInterrupt: gps_socket.close () print (' / nUkončeno uživatelem ctrl+c ')

Výše uvedený kód je jen jedním příkladem, jak kódovat náš systém, a vložil jsem video o tom, jak tento systém funguje.

Doporučuje: