Отслеживание местоположения каких либо людей или объектов в настоящее время стало достаточно обыденной задачей благодаря таким системам как GPS и Глонасс. Современные GPS модули сравнительно дешево стоят и умещаются на ладони человека, благодаря чему любой радиолюбитель может их без особого труда применить в своих проектах.
В данной статье мы рассмотрим подключение GPS модуля к плате Raspberry Pi. Мы будем принимать данные широты и долготы от GPS модуля по последовательному каналу связи и отображать их на экране ЖК дисплея 16x2.
Также на нашем сайте вы можете посмотреть другие проекты, в которых был использован GPS модуль:
- подключение GPS модуля к микроконтроллеру AVR ATmega16/32;
- отслеживание местоположения автомобиля с использованием GPS, GSM и Arduino;
- GPS часы на Arduino Uno;
- GPS трекер на основе Arduino и технологии Lora;
- GPS спидометр на Arduino и OLED дисплее.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- GPS модуль Neo 6m v2 (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Потенциометр 10 кОм для регулировки контрастности ЖК дисплея (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Принципы работы GPS модуля
GPS (Global Positioning System) представляет собой систему глобального позиционирования, с помощью которой можно определить широту и долготу любой точки на Земле, а также точное время в этой точке (UTC time - Universal Time Coordinated). GPS модуль будет основным устройством в нашем проекте. Данный модуль принимает координаты от спутников каждую секунду. Вместе с координатами осуществляется прием времени и даты.
GPS передает данные, идентифицирующие местоположение, в реальном времени. Но вместе с этими данными он передает и очень много других данных в формате NMEA – смотрите приведенный ниже рисунок. NMEA содержит несколько строк (предложений) – нам из всей этой совокупности данных будет нужна всего лишь одна строка. Эта строка начинается с $GPGGA и содержит координаты, время и другую полезную информацию. Эти данные относятся к фиксированным данным глобального позиционирования (Global Positioning System Fix Data).
Мы можем извлечь нужные нам данные из строки $GPGGA при помощи подсчета запятых в строке. К примеру, если вы нашли строку $GPGGA и сохранили ее в массиве, то широта может быть найдена в нем после двух запятых, а долгота – после четырех запятых. После извлечения значения широты и долготы можно поместить в другие массивы.
Приведем пример $GPGGA строки с расшифровкой:
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
В следующей таблице представлен перевод (описание) этих данных GPS.
Идентификатор | Описание |
$GPGGA | Фиксированные данные системы глобального позиционирования |
HHMMSS.SSS | Время в формате: час минута секунда и миллисекунда |
Latitude | Широта (координата) |
N | Направление: N=North (север), S=South (юг) |
Longitude | Долгота (координата) |
E | Направление: E= East (восток), W=West (запад) |
FQ | Данные фиксированного качества (Fix Quality Data) |
NOS | Номер использованного спутника |
HPD | Фактор снижения точности при определении положения в горизонтальной плоскости (Horizontal Dilution of Precision) |
Altitude | Высота над уровнем моря |
M | Meter (метр) |
Height | Height (высота) |
Checksum | Данные контрольной суммы |
Теперь перейдем к подготовке платы к подключению GPS модуля.
Подготовка Raspberry Pi к подключению GPS модуля
Будем надеяться, что перед прочтением данной статьи вы уже знаете основы работы с Raspberry Pi, у вас установлена операционная система на нее, вы знаете IP адрес платы и она у вас подключена к интернету.
Мы будем подключать GPS модуль к плате Raspberry Pi по последовательному порту связи (UART). Плата Raspberry Pi имеет два встроенных порта UART - PL011 и мини UART. Способы использования этих двух портов немного отличаются друг от друга. К примеру, в Raspberry Pi 3 (именно эту модель мы использовали в проекте, хотя можно применить и другие модели), модуль Bluetooth подключен к PLO11 UART, в то время как mini UART используется в качестве выхода консоли linux. В этом проекте мы будем использовать порт PLO11, поэтому мы должны деактивировать Bluetooth модуль на этом порту используя overlay (оверлей), доступный в Raspberry Pi OS.
Для подготовки Raspberry Pi к подключению GPS модуля выполните следующую последовательность шагов.
Шаг 1. Установка обновлений для Raspberry Pi.
Установите последние обновления для Raspberry Pi с помощью следующих команд:
1 2 |
sudo apt-get update sudo apt-get upgrade |
После этого перезагрузите систему:
1 |
sudo reboot |
Шаг 2. Установка UART в Raspberry Pi.
Здесь нам первое, что необходимо сделать, это отредактировать файл /boot/config.txt. Для этого выполните следующую команду:
1 |
sudo nano /boot/config.txt |
В самый конец этого файла добавьте следующие строки:
1 2 3 4 5 |
dtparam=spi=on dtoverlay=pi3-disable-bt core_freq=250 enable_uart=1 force_turbo=1 |
Нажмите ctrl+x чтобы выйти из режима редактирования файла и затем y и enter чтобы сохранить изменения в файле.
Приведенная команда force_turbo позволяет UART использовать максимальную частоту ядра, в нашем случае мы ее установили равной 250. Это необходимо для обеспечения целостности и полноты данных, получаемых по последовательному порту. Необходимо отметить, что команда force_turbo=1 снимает гарантию с вашей платы Raspberry Pi, однако, тем не менее, это безопасная команда.
Команда dtoverlay=pi3-disable-bt отсоединяет Bluetooth от порта ttyAMA0, что позволяет задействовать полную мощность UART доступную через ttyAMAO вместо использования mini UART ttyS0.
Убедитесь в том, что в работе вашей платы Raspberry Pi отсутствуют ошибки, которые могут приводить к ее перезагрузке.
Далее на этом шаге для настройки UART необходимо отредактировать файл boot/cmdline.txt. Перед его редактированием сделайте его копию и сохраните ее в надежном месте чтобы иметь возможность "откатить" сделанные изменения если что то пойдет не так. Отредактировать этот файл можно с помощью следующей команды:
1 2 |
sudo cp boot/cmdline.txt boot/cmdline_backup.txt sudo nano /boot.cmdline.txt |
Замените его содержимое на следующее:
1 |
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles |
Сохраните после этого файл. После этого необходимо перезагрузить систему чтобы изменения вступили в силу.
Шаг 3. Отключение службы последовательной передачи данных Getty
На этом шаге необходимо отключить службу getty, следующая команда предотвратит ее запуск после перезагрузки системы:
1 2 |
sudo systemctl stop serial-getty@ttyS0.service sudo systemctl disable serial-getty@ttyS0.service |
Следующая команда задействует эту службу снова если у вас в этом будет необходимость:
1 2 |
sudo systemctl enable serial-getty@ttyS0.service sudo systemctl start serial-getty@ttyS0.service |
Перезагрузите систему.
Шаг 4. Активация ttyAMAO.
Ранее мы деактивировали ttyS0, теперь необходимо активировать ttyAMAO.
1 |
sudo systemctl enable serial-getty@ttyAMA0.service |
Шаг 5. Установка Minicom и pynmea2.
Нам необходима будет служба Minicom чтобы подключаться к GPS модулю и принимать от него данные. Также с помощью данного инструмента можно проверить хорошо ли работает GPS модуль или нет. Альтернативой minicom является программное обеспечение GPSD (daemon).
1 |
sudo apt-get install minicom |
Чтобы максимально упростить прием данных от GPS модуля мы будем использовать библиотеку pynmea2. Его можно установить с помощью следующей команды:
1 |
sudo pip install pynmea2 |
Документацию к данной библиотеке можно найти по следующей ссылке – https://github.com/Knio/pynmea2.
Шаг 6. Установка библиотеки для работы с ЖК дисплеем.
В данном проекте мы будем использовать библиотеку AdaFruit, которая изначально была разработана для дисплеев производства компании AdaFruit, но также работает и с дисплеями на драйвере HD44780. Если ваш дисплей работает на данном драйвере, то у вас не должно возникнуть проблем с этой библиотекой.
Мы будем клонировать эту библиотеку и затем непосредственно ее устанавливать. Чтобы клонировать эту библиотеку введите следующую команду:
1 |
git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git |
Смените каталог на тот, в который вы клонировали библиотеку, и затем установите ее:
1 2 |
cd ./Adafruit_Python_CharLCD sudo python setup.py install |
После установки библиотеки перезагрузите систему.
Схема проекта
Схема подключения GPS модуля к плате Raspberry Pi представлена на следующем рисунке.
Тестирование GPS модуля
Перед тем как запускать на выполнение основную программу нашего проекта (приведена в конце статьи) желательно протестировать соединение с GPS модулем. Мы будем использовать для этой цели minicom. Выполните следующую команду:
1 |
sudo minicom -D/dev/ttyAMA0 -b9600 |
9600 в данной команде обозначает бодовую скорость, с которой мы будем взаимодействовать с GPS модулем.
Также тестирование работы GPS модуля можно выполнить с помощью следующей команды:
1 |
sudo cat /dev/ttyAMA0 |
После выполнения этой команды вы можете увидеть в окне предложения NMEA, которые были описаны ранее.
Если тест соединения с GPS модулем прошел успешно, можно приступать к тестированию работы всего проекта. GPS модулю обычно необходимо чтобы в его поле зрения было от 3 до 4 спутников чтобы он работал уверенно.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import time import serial import string import pynmea2 import RPi GPIO as gpio #to add the LCD library import Adafruit_CharLCD as LCD gpio.setmode(gpio.BCM) # контакты к которым подключен ЖК дисплей lcd_rs = 17 lcd_en = 18 lcd_d4 = 27 lcd_d5 = 22 lcd_d6 = 23 lcd_d7 = 10 lcd_backlight = 2 lcd_columns = 16 # число столбцов ЖК дисплея lcd_rows = 2 # число строк ЖК дисплея lcd = LCD.Adafruit_CharLCD(lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) port = "/dev/ttyAMA0" # последовательный порт, к которому подключена плата Raspberry Pi # создаем объект для работы с последовательным портом ser = serial.Serial(port, baudrate = 9600, timeout = 0.5) while 1: try: data = ser.readline() except: print("loading") # ждем пока последовательный порт примет поток данных if data[0:6] == '$GPGGA': # мы будем извлекать широту и долготу из строки GPGGA в данных NMEA msg = pynmea2.parse(data) # считываем широту и выводим ее значение на экран latval = msg.lat concatlat = "lat:" + str(latval) print concatlat lcd.set_cursor(0,0) lcd.message(concatlat) # считываем долготу и выводим ее значение на экран longval = msg.lon concatlong = "long:"+ str(longval) print concatlong lcd.set_cursor(0,1) lcd.message(concatlong) time.sleep(0.5) # небольшая задержка перед приемом следующей порции данных |