# Зчитування даних GPS - Raspberry Pi У цій частині уроку ви додасте GPS сенсор до вашого Raspberry Pi і зчитуватимете дані з нього. ## Обладнання Raspberry Pi потребує GPS сенсора. Сенсор, який ви будете використовувати, — це [Grove GPS Air530 sensor](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.uk.png) 1. Вставте один кінець кабелю Grove у роз'єм на GPS сенсорі. Він вставляється лише в одному напрямку. 1. З вимкненим Raspberry Pi підключіть інший кінець кабелю Grove до роз'єму UART, позначеного **UART**, на Grove Base Hat, який прикріплений до Pi. Цей роз'єм знаходиться в середньому ряду, на стороні ближче до слота для SD-карти, протилежній USB портам і роз'єму Ethernet. ![Сенсор Grove GPS підключений до роз'єму UART](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.uk.png) 1. Розмістіть GPS сенсор так, щоб підключена антена мала видимість неба — найкраще біля відкритого вікна або на вулиці. Легше отримати чіткий сигнал, якщо нічого не заважає антені. ## Програмування GPS сенсора Тепер Raspberry Pi можна запрограмувати для використання підключеного GPS сенсора. ### Завдання - програмування GPS сенсора Програмуйте пристрій. 1. Увімкніть Pi і зачекайте, поки він завантажиться. 1. GPS сенсор має 2 світлодіоди: синій світлодіод, який блимає під час передачі даних, і зелений світлодіод, який блимає щосекунди при отриманні даних від супутників. Переконайтеся, що синій світлодіод блимає, коли ви вмикаєте 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 сенсора було успішним! --- **Відмова від відповідальності**: Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.