Мазмуну:

GPS системасы: 7 кадам
GPS системасы: 7 кадам

Video: GPS системасы: 7 кадам

Video: GPS системасы: 7 кадам
Video: ТОП 6 видеорегистраторов с радар-детектором в 2023 году. Какой выбрать? 2024, Октябрь
Anonim
GPS системасы
GPS системасы
GPS системасы
GPS системасы
GPS системасы
GPS системасы

Долбоордун автору: Карлос Гомес

Ишенимдүү навигациялык системага ээ болуу, саякаттап, дүйнөнү изилдөөгө аракет кылган ар бир адам үчүн эң башкы нерсе.

Навигация системасынын иштешине мүмкүндүк берген эң маанилүү аспект системанын ичине камтылган GPS жөндөмдүүлүгү. GPS тутуму кимге болбосун колдонуучу жөнүндө так маалыматты көрсөтүү үчүн жана алардын жайгашкан жерин жана ылдамдыгын көзөмөлдөөгө мүмкүндүк берет жана колдонуучуга алардын кайда жана алардын жайгашкан жеринен канчалык алыс экенин так чагылдырат.

Global Positioning System (GPS) - болжол менен 20 000 км бийиктикте Жерди айланып жүргөн спутниктердин тармагы. GPS түзмөгү бар ар бир адам спутниктер тараткан радио сигналдарды кабыл ала алат жана аларды каалаган жол менен колдоно алат. Планетанын кайсы жеринде болбосун, жок дегенде төрт GPS каалаган убакта сизге жеткиликтүү болушу керек. 3-D трилатерация деп аталган ыкманы колдонуп, GPS түзмөгү Жердеги түзмөктүн ордун аныктоо үчүн үч спутникти колдоно алат. Үч спутниктин ар бири аппаратка сигнал жөнөтөт жана аппарат спутниктен алыстыгын аныктайт. Уч аралыкты эсептөөнүн ар бирин колдонуп, түзмөк эми Жердеги ордун аныктай алат жана аны колдонуучуга кайтарат.

Биз түзө турган GPS системасы колдонуучунун ылдамдыгын, жайгашкан жерин жана басып өткөн аралыкты кайтаруу үчүн колдонуучунун Жердеги координаттарын алуу жана кээ бир эсептөөлөрдү жүргүзүү аркылуу колдонуучунун жайгашкан жерин көзөмөлдөй алат.

1 -кадам: Баштоо

Баштоо
Баштоо
Баштоо
Баштоо
Баштоо
Баштоо
Баштоо
Баштоо

Бул долбоорду баштоо үчүн, адегенде бардык туура материалдарды чогултуубуз керек

1: Raspberry Pi Zero W

2: GPS кабылдагыч

3: 1.8 TFT 128 x 160 LCD SPI экраны

4: ~ 11 зым

5: 2 баскычтары

6: 2x 1k жана 2x 10k каршылыгы баскычтарды түшүрүү үчүн

7: Нан тактасы

Бул долбоор Raspberry Piнин GPIO төөнөгүчтөрүн колдонот жана биз долбоорубузду иштеп чыгуу үчүн бардыгын нан тактасы менен байланыштырышыбыз керек. Ошондой эле, бардык казыктарды ширетүү бүт бөлүктөрүбүздү жылдыруудан жана туташтыруудан мурун жасалып бүткөн деп эсептелет.

2 -кадам: GPS модулун Raspberry Pi менен туташтырыңыз

GPS модулун Raspberry Pi менен туташтырыңыз
GPS модулун Raspberry Pi менен туташтырыңыз
GPS модулун Raspberry Pi менен туташтырыңыз
GPS модулун Raspberry Pi менен туташтырыңыз

Биздин GPS тутумубузду колдонуу үчүн GPS модулунан Tx жана Rx төөнөгүчтөрүн Raspberry Piдеги GPIO pin 14 жана 15ке туташтыруу керек болот. GPS кабылдагычтын Tx пини Piдин Rx пинине жана GPS кабылдагычынын Rx пини Raspberry piнин Tx пинине барат.

Сүрөттөрдө көрсөтүлгөн GPS кабыл алгыч 3.3V колдонулушун талап кылат жана 3.3V казыктарын туура чыңалууга туташтыра аласыз, ал эми Ground пинди жерге туташтырыңыз.

3 -кадам: GPS алуучу модулунан маалыматтарды алуу

GPS кабыл алуучу модулунан маалыматтарды алуу
GPS кабыл алуучу модулунан маалыматтарды алуу

GPS кабылдагычтан Raspberry Piге маалымат алуу үчүн, UART портторунан туура розеткаларды окууга уруксат беришибиз керек. Чийки маалыматтарды окуу бизден өзүбүздүн талдоочу китепканабызды түзүүнү талап кылат, бирок бул сценарийде биз маалыматтарды талдоого жана аны Raspberry Piге берүүгө жардам берүү үчүн фондо иштеген GPS демонун колдоно алабыз.

Бул үчүн биз Raspberry Pi терминалын ачып, кодду иштете алабыз:

sudo apt-get update

Sudo apt-get gpsd gpsd-client python-gps орнотуу

Бул биз үчүн жүктөө кам көрүшү керек.

Ал бүткөндөн кийин, биз төмөнкү буйруктарды иштетүү менен gpsd системасынын кызматын өчүрүшүбүз керек:

sudo systemctl stop gpsd.socket

sudo systemctl gpsd.socketти өчүрүү

Эгерде сиз качандыр бир убакта демейки gpsd тутум кызматын иштеткиңиз келсе, аны калыбына келтирүү үчүн төмөнкү буйруктарды иштетсеңиз болот:

sudo systemctl gpsd.socket иштетүү

sudo systemctl gpsd.socket баштайт

Эми биз gpsd демонду иштетип, UART портторуна киришибиз керек

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

Биз азыр төмөнкү буйрукту иштете алабыз жана бардык маалыматтарды калкып көрө алабыз!

cgps -s

4 -кадам: Дисплейди Raspberry Pi менен туташтырыңыз

Raspberry Pi менен дисплейди туташтырыңыз
Raspberry Pi менен дисплейди туташтырыңыз
Raspberry Pi менен дисплейди туташтырыңыз
Raspberry Pi менен дисплейди туташтырыңыз

Биз GPS кабыл алгычты орнотуп, Raspberry Pi менен иштей баштагандан кийин, дисплейди Raspberry Pi менен байланыштыра алабыз. Биз LCD дисплейибизди Raspberry Pi менен туташтыруу үчүн 5 зымды жана негизги кубаттуулукту жана LEDди туташтыруу үчүн дагы 4 казыкты колдонобуз. экранда.

Мен колдонгон TFT экрандын сүрөтүн коштум, бирок бул окшош өлчөмдөгү экрандар менен иштеши керек.

LEDди жана GNDди жерге туташтырыңыз жана LED+ менен VCCди 3.3Vга туташтырыңыз.

Пи тактасындагы 25 -пинге экрандагы RESET пин туташтырыңыз.

Pi доскасында A0ду 24 -пинге туташтырыңыз.

SDA пинин Пи тактасындагы MOSI пинине туташтырыңыз.

ЖК экрандагы SCK пинин Пи тактасына туташтырыңыз.

CS тактасын Pi тактасындагы 8 -пинге туташтырыңыз.

5 -кадам: Raspberry Pi менен иштөө үчүн дисплейди орнотуңуз

Raspberry Pi менен иштөө үчүн дисплейди орнотуңуз
Raspberry Pi менен иштөө үчүн дисплейди орнотуңуз

Дисплейди орнотуу үчүн, биз бул репода табылган ST7735 китепканасын колдонушубуз керек:

Python ST7735 экран китепканасы

Бул дисплей китепканасы Raspberry Pi тутумубузга орнотулгандан кийин, биз мурунку зымдарыбыздын туура иштеп жатканын ырастоо үчүн мисал файлын орнотууга кирише алабыз.

Example.py аттуу файлды түзүңүз жана ошол эле папкага тандап алган сүрөтүңүз менен бирге төмөнкү текстти киргизиңиз

ST7735 импорттоо TFTimport Adafruit_GPIO катары GPIO импорттоо Adafruit_GPIO. SPI катары SPI катары

WIDTH = 128

БИЙИКТИК = 160 SPEED_HZ = 4000000

# Raspberry Pi конфигурациясы.

# Бул LCDди Raspberry Pi менен туташтыруу үчүн керектүү төөнөгүчтөр

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

# TFT LCD дисплей классын түзүү.

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

# Дисплейди баштоо.

disp.begin () disp.reset ()

# Сүрөт жүктөө.

newData = 0x42 disp.command (newData) басып чыгаруу ('Сүрөт жүктөлүүдө…') image = Image.open ('cat.jpg')

# Сүрөттүн өлчөмүн өзгөртүп, дисплейге дал келгендей буруңуз.

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

# Биздин программа экранда биздин сүрөтүбүздү тартып жаткан терминалга басып чыгарат

басып чыгаруу ('Сүрөт тартуу')

# Бул функция экранда биздин сүрөттү көрсөтөт

disp.display (сүрөт)

Бул файл Raspberry Pi конфигурациясын ЖК экранга орнотот жана китепкана биздин сүрөттү папкага айлантып, экранда көрсөтөт.

6 -кадам: Дисплейде GPS маалыматын көрсөтүү үчүн мамлекеттик машиналарды орнотуңуз

GPS маалыматын дисплейде көрсөтүү үчүн мамлекеттик машиналарды орнотуңуз
GPS маалыматын дисплейде көрсөтүү үчүн мамлекеттик машиналарды орнотуңуз
Мамлекеттик машиналарды GPS маалыматын дисплейде көрсөтүү үчүн орнотуңуз
Мамлекеттик машиналарды GPS маалыматын дисплейде көрсөтүү үчүн орнотуңуз
GPS маалыматын дисплейде көрсөтүү үчүн мамлекеттик машиналарды орнотуңуз
GPS маалыматын дисплейде көрсөтүү үчүн мамлекеттик машиналарды орнотуңуз

Биз gps тутумубузду орнотуу үчүн тапшырма диаграммабызды ишке ашырууда 5 түрдүү мамлекеттик машинаны колдонобуз.

Мамлекеттик машинаны көрсөтүү:

Бул мамлекеттик машина баскычтын киришине жараша эмнени көрсөтүүнү көзөмөлдөйт. Бул муну pythonго өрдөктүн терүү артыкчылыгын пайдаланууга мүмкүндүк берген өзгөрмөнү өзгөртүү аркылуу жана чакырылган функцияга жараша туура функцияны көрсөтүү үчүн кылат.

Ылдам абал машинасы:

Бул мамлекеттик машина адамдардын жайгашкан жерине жараша учурдагы ылдамдыкты аткарат. Бул GPS тутуму үчүн ар бир циклди аткарат

Чыгуу абалынын машинасы:

Бул абал машинасы дисплейдин өзгөрүү абалынын машинасы учурдагы дисплей деп аныктаган өзгөрмөнүн негизинде чыгарууну аныктайт.

Дистанциялык мамлекеттик машина

Бул мамлекеттик машина ар бир циклди аткарат жана колдонуучу басып өткөн жалпы аралыкты аныктайт жана баштапкы абалга келтирүү баскычы басылганда, учурдагы аралыкты баштапкы абалга келтирет.

Жайгашкан жердин мамлекеттик машинасы:

Бул мамлекеттик машина GPS модулу колдонуучу жөнүндө кайтарып берген координаттарды колдонуп, колдонуучунун учурдагы жайгашкан жерин кайтарат. Бул мамлекеттик машина колдонуучулардын интернет байланышына көз каранды.

7 -кадам: GPS системабызды ишке киргизели

GPS модулубуз Raspberry Piге маалымат жөнөткөндөн кийин жана ал жөнүндө маалыматты чагылдырган ЖК экраныбыз бар болсо, анда биз GPS системабызды программалоого кирише алабыз. Мен GPS системабызды коддоо үчүн мурунку кадамдын чектүү мамлекеттик машиналарын колдоном

## Навигация системасынын негизги файлы # # # #

# Сүрөттөрдү тартуу үчүн китепканалар

PIL импорттоо PIL имиджинен ImageDraw PIL импорттоо ImageFont

ST7737 контроллери үчүн # китепкана

ST7735ти TFT катары импорттоо

Raspberry Pi үчүн GPIO үчүн # китепкана

Adafruit_GPIO GPIO катары импорттоо Adafruit_GPIO. SPIди SPI катары импорттоо

# GPS үчүн китепкана

gps3 импорттук gps3 импорттоо

# Китепкана убакыттын өтүшү менен

импорттоо убактысы

# Китепкана эки чекиттин ортосундагы аралыкты табуу үчүн

математикадан импорт син, cos, sqrt, atan2, radians

# Менюларды алмаштыруу жана баштапкы абалга келтирүү үчүн баскычтарды колдонуу үчүн Rpi китепканасын импорттоо

# импорт RPi. GPIO bGPIO катары

# Баскычтар үчүн казыктарды орнотуңуз

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)

# Geocoding үчүн импорттук геопи китепканасы

# # Интернетке кирүү бул иштеши үчүн керек

geopy.geocoders импорт Номинатим

геолокатор = Номинатим ()

# Система үчүн туруктуу

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

WIDTH = 128

БИЙИКТИК = 160 SPEED_HZ = 4000000

# Raspberry Pi конфигурация казыктары

DC = 24 # A0 TFT экранында RST = 25 # TFT экраны боюнча PIN кодду калыбына келтирүү SPI_PORT = 0 # малина пи боюнча SPI порт, SPI0 SPI_DEVICE = 0 # Rapsberry пи боюнча кул тандоо, CE0

# TFT ЖК дисплей объектисин түзүү

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

# Дисплейди баштоо

disp.begin ()

# Фон жашылга коюлат

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

# Экранды ак жана дисплейге тазалаңыз

#disp.clear ((255, 255, 255)) draw = disp.draw () #draw.rectangle ((0, 10, 127, 150), схема = (255, 0, 0), толтуруу = (0, 0, 255)) #disp.display ()

# Ылдамдык, Кеңдик, Узундук жайгаштыруу өзгөрмөлөрү

#currentS = "Учурдагы Ылдамдык:" # Ыкчам сап #totalDis = "Жалпы Аралык:" # Аралык сабы #currentLoc = "Учурдагы Жайгашуу:" # Жайгашкан сап

# Аралык x жана y координаттары

distX = 10 distY = 20

pointsList =

# Ыкчамдык x жана y координаттары

speedX = 10 ылдамдыкY = 20

# Жайгашкан жер x жана y coordiantes

locX = 10 locY = 20

# M/sден mphке айландырат

conversionVal = 2.24

# Ыкчам жаңыртуу функциясы, сапты кайтарат

SpeedVar = 0

def speedFunc (): глобалдык SpeedVar 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

жайгашуу = geolocator.reverse (reverseString)

кайтуу (жайгашкан жери. дареги)

# Latitude жаңыртуу функциясы, калкыма маанини кайтарат

def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n/a"): 0 кайтаруу башка: кайтуу сүзүү (тегерек (Latitude, 4))

# Узунун өзгөртүү функциясы, сапты кайтарат

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n/a"): 0 кайтаруу башка: кайтуу сүзүү (тегерек (Longitude, 4))

# Расстояние функциясы TOTAL басып өткөн аралыкты кайтарат

totalDistance = 0

def distFunc ():

глобалдык totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 же newLon == 0): totalDistance = totalDistance # return (totalDistance) башка: pointsList.append ((newLat, newLon)) last = len (pointsList) -1 эгер (акыркы == 0): башка кайтуу: totalDistance += coorDistance (pointsList [last-1], pointsList [last]) # return totalDistance

# Жалпы аралыкты баштапкы абалга келтирет

def resDistance ():

глобалдык totalDistance totalDistance = 0

# Функция эки координаттын ортосундагы аралыкты табуу үчүн колдонулат

# табуу үчүн Haversine формуласын колдонот. # Киргизүү чекиттери - бул тупле

def coorDistance (пункт 1, пункт 2):

# Жердин болжолдуу радиусу километр менен жерRadius = 6373.0

lat1 = point1 [0]

lon1 = point1 [1]

lat2 = point2 [0]

lon2 = point2 [1]

distanceLon = lon2 - lon1

distanceLat = lat2 - lat1

# Гаверсин а

a = sin (расстояние/2) ** 2 + кос (лат1)*кос (лат2)*күнөө (аралыктагы/2) ** 2

# Haversine c

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

# Кмди Милге айландыруу

аралык = (earthRadius * c) * 0.62137

if (расстояние <= 0.01): кайтуу 0.00 башка: кайтуу тегерек (аралык, 3)

# Экранда ылдамдыкты көрсөтүү функциясы

def dispSpeed ():

глобалдык SpeedVar # Аралыкты экранда draw.text ((speedX, speedY), str (SpeedVar), font = ImageFont.truetype ("Lato-Medium.ttf", 72))

# Экранда аралыкты көрсөтүү функциясы

def dispDistance ():

draw.text ((distX, distY), str (totalDistance), шрифт = ImageFont.truetype ("Lato-Medium.ttf", 60))

# Функция экранда дисплейдин жайгашкан жери, иштеши үчүн интернетти талап кылат

def dispLocation ():

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

# Коммутатордук билдирүүлөрдү тууроо үчүн сөздүктү колдонуу

dispOptions = {

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

# Экран чыгаруу функциясы

def чыгаруу ():

# DisplayIndex глобалдык DisplayIndex үчүн глобалдык өзгөрмөнү колдонуу # Экранды тазалоо жана disp.clear ((255, 255, 255)) draw.rectangle ((0, 10, 127, 150), контур = (255, 0, 0), толтуруу = (255, 0, 0))

# Чалуулар DisplayIndex маанисине жараша иштейт

dispOptions [displayIndex] ()

# Башка ыкма иштесе өчүрүлөт

# аралыктын өзгөрмөсү экранда

#draw.text ((distX, distY), str (distFunc ()), font = ImageFont.load_default ()) #экранда ылдамдыктын өзгөрмөсүн #draw.text ((speedX, speedY), speedFunc (), font = ImageFont.load_default ()) # Screen disp.display () жаңыртууларын көрсөтүү

displayButton = 18 # BCM Малина пи боюнча пин

resetButton = 23 # BCM Малина пи боюнча пин

buttonPress = False

def checkDisplay ():

глобалдык баскычын басыңыз global displayIndex if (bGPIO.input (displayButton) but butPressPress): displayIndex += 1 button Press = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) and buttonPress): print (" Дагы эле басылды ") башка: buttonPress = False

# GPS орнотуу

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

timerPeriod =.5

DisplayIndex үчүн дисплейдин мааниси = 0 аракет: gps_socketтеги жаңы_маалымат үчүн: эгер 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 () басып чыгаруу ('GPS азырынча туташа элек') time.sleep (.1) time.sleep (.8) KeyboardInterruptден башка: gps_socket.close () print (') nКолдонуучу тарабынан аныкталган ctrl+c ')

Жогорудагы код биздин системаны кантип коддоо боюнча бир гана мисал, мен бул системанын кантип иштээри тууралуу видеону кыстардым.

Сунушталууда: