# Читање GPS података - Raspberry Pi У овом делу лекције, додаћете GPS сензор на ваш Raspberry Pi и читати вредности са њега. ## Хардвер Raspberry Pi захтева GPS сензор. Сензор који ћете користити је [Grove GPS Air530 сензор](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Овај сензор може да се повезује са више GPS система ради брзог и прецизног позиционирања. Сензор се састоји из два дела - основне електронике сензора и спољашње антене која је повезана танким каблом за пријем радио таласа са сателита. Ово је UART сензор, што значи да шаље GPS податке преко UART-а. ## Повезивање GPS сензора Grove GPS сензор може да се повезује са Raspberry Pi. ### Задатак - повежите GPS сензор Повежите GPS сензор. ![Grove GPS сензор](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.sr.png) 1. Уметните један крај Grove кабла у утичницу на GPS сензору. Кабл ће ући само у једном смеру. 1. Са искљученим Raspberry Pi-јем, повежите други крај Grove кабла у UART утичницу означену **UART** на Grove Base хату који је прикључен на Pi. Ова утичница се налази у средњем реду, на страни ближе слоту за SD картицу, супротно од USB портова и Ethernet утичнице. ![Grove GPS сензор повезан на UART утичницу](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.sr.png) 1. Поставите GPS сензор тако да прикључена антена има видљивост ка небу - идеално поред отвореног прозора или напољу. Лакше је добити јаснији сигнал када ништа не блокира антену. ## Програмирање GPS сензора Raspberry Pi сада може бити програмиран за коришћење прикљученог GPS сензора. ### Задатак - програмирајте GPS сензор Програмирајте уређај. 1. Укључите Pi и сачекајте да се покрене. 1. GPS сензор има 2 LED диоде - плаву LED диоду која трепери када се подаци преносе, и зелену LED диоду која трепери сваке секунде када прима податке са сателита. Уверите се да плава LED диода трепери када укључите Pi. Након неколико минута зелена LED диода ће почети да трепери - ако не, можда ћете морати да преместите антену. 1. Покрените VS Code, било директно на Pi-ју, или се повежите преко Remote SSH екстензије. > ⚠️ Можете се позвати на [упутства за подешавање и покретање VS Code-а у лекцији 1 ако је потребно](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). 1. Са новијим верзијама Raspberry Pi-ја које подржавају Bluetooth, постоји конфликт између серијског порта који се користи за Bluetooth и оног који користи Grove UART порт. Да бисте то решили, урадите следеће: 1. Из VS Code терминала, уредите датотеку `/boot/config.txt` користећи `nano`, уграђени терминалски текст едитор, са следећом командом: ```sh sudo nano /boot/config.txt ``` > Ова датотека не може бити уређивана преко VS Code-а јер је потребно уређивање са `sudo` дозволама, односно повишеним дозволама. VS Code не ради са овим дозволама. 1. Користите стрелице на тастатури да се померите до краја датотеке, затим копирајте код испод и налепите га на крај датотеке: ```ini dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1 ``` Можете налепити користећи уобичајене пречице на тастатури за ваш уређај (`Ctrl+v` на Windows, Linux или Raspberry Pi OS, `Cmd+v` на macOS). 1. Сачувајте ову датотеку и изађите из nano-а притиском на `Ctrl+x`. Притисните `y` када вас пита да ли желите да сачувате модификовани бафер, затим притисните `enter` да потврдите да желите да препишете `/boot/config.txt`. > Ако направите грешку, можете изаћи без чувања, а затим поновити ове кораке. 1. Уредите датотеку `/boot/cmdline.txt` у nano-у са следећом командом: ```sh sudo nano /boot/cmdline.txt ``` 1. Ова датотека има бројне парове кључ/вредност одвојене размаком. Уклоните било који пар кључ/вредност за кључ `console`. Они ће вероватно изгледати овако: ```output console=serial0,115200 console=tty1 ``` Можете се померити до ових уноса користећи стрелице на тастатури, затим брисати користећи уобичајене тастере `del` или `backspace`. На пример, ако ваша оригинална датотека изгледа овако: ```output console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` Нова верзија ће бити: ```output root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` 1. Пратите горе наведене кораке да сачувате ову датотеку и изађете из nano-а. 1. Поново покрените ваш Pi, затим се поново повежите у VS Code када се Pi поново покрене. 1. Из терминала, направите нови фолдер у home директоријуму корисника `pi` назван `gps-sensor`. Направите датотеку у овом фолдеру названу `app.py`. 1. Отворите овај фолдер у VS Code-у. 1. GPS модул шаље UART податке преко серијског порта. Инсталирајте `pyserial` Pip пакет за комуникацију са серијским портом из вашег Python кода: ```sh pip3 install pyserial ``` 1. Додајте следећи код у вашу `app.py` датотеку: ```python import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1) ``` Овај код увози `serial` модул из `pyserial` Pip пакета. Затим се повезује на серијски порт `/dev/ttyAMA0` - ово је адреса серијског порта који Grove Pi Base Hat користи за свој UART порт. Затим чисти било које постојеће податке са ове серијске везе. Затим се дефинише функција `print_gps_data` која штампа линију прослеђену њој на конзолу. Након тога, код се врти у бесконачној петљи, читајући што више линија текста може са серијског порта у свакој итерацији. Позива функцију `print_gps_data` за сваку линију. Након што су сви подаци прочитани, петља спава 1 секунду, затим покушава поново. 1. Покрените овај код. Видећете сирови излаз са GPS сензора, нешто попут следећег: ```output $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68 ``` > Ако добијете једну од следећих грешака када зауставите и поново покренете ваш код, додајте `try - except` блок у вашу while петљу. ```output UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte ``` ```python while True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1) ``` > 💁 Овај код можете пронаћи у [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi) фолдеру. 😀 Ваш програм за GPS сензор је успешно завршен! --- **Одрицање од одговорности**: Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.