Obsah:
- Krok 1: Začínáme
- Krok 2: Připojte modul GPS k Raspberry Pi
- Krok 3: Získejte data z modulu přijímače GPS
- Krok 4: Připojte displej k Raspberry Pi
- Krok 5: Nastavení zobrazení pro práci s Raspberry Pi
- Krok 6: Nastavení stavových strojů pro zobrazení informací GPS na displeji
- Krok 7: Pojďme implementovat náš systém GPS
Video: Systém GPS: 7 kroků
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-10 13:46
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
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
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
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
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
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
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.