# Четене на 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.bg.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.bg.png) 1. Поставете GPS сензора така, че прикрепената антена да има видимост към небето - идеално до отворен прозорец или навън. По-лесно е да получите ясен сигнал, когато няма препятствия пред антената. ## Програмиране на GPS сензора Сега Raspberry Pi може да бъде програмиран да използва свързания GPS сензор. ### Задача - програмирайте GPS сензора Програмирайте устройството. 1. Включете Pi и изчакайте да се зареди. 1. GPS сензорът има два светодиода - син светодиод, който мига, когато се предават данни, и зелен светодиод, който мига всяка секунда, когато получава данни от сателити. Уверете се, че синият светодиод мига, когато включите Pi. След няколко минути зеленият светодиод ще започне да мига - ако не, може да се наложи да преместите антената. 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. От терминала създайте нова папка в домашната директория на потребителя `pi`, наречена `gps-sensor`. Създайте файл в тази папка, наречен `app.py`. 1. Отворете тази папка в VS Code. 1. GPS модулът изпраща UART данни през сериен порт. Инсталирайте Pip пакета `pyserial`, за да комуникирате със серийния порт от вашия 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` от Pip пакета `pyserial`. След това се свързва към серийния порт `/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 сензора беше успешна! --- **Отказ от отговорност**: Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.