Raspberry Pi подключение GPS USB приемника

  • Автор
Недавно нашел у себя USB-GPS приемник, если не ошибаюсь модель от GlobalSat BU 353. Вот и решил его подключить к Raspberry Pi. После подключения он обнаружился хорошо , проблем вообще не было никаких:

#lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial PortBus 001 Device 005: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)


Вот наш девайс: Prolific Technology, Inc. PL2303 Serial Port
В /dev/ появилось новое устройство ttyUSB0, к нему и будем подключаться, насколько я помню, у большинства подобных девайсов скорость 4800. Ниже скрипт на PHP с использованием свободной библиотеки php_serial.class.php, с ней довольно просто работать.

#!/usr/bin/php5
// подключаем библиотеку
require("php_serial.class.php");
$serial=new phpSerial();
// выбираем порт
$serial->deviceSet("/dev/ttyUSB0");
// скорость
$serial->confBaudRate(4800);
// ниже параметры как правило стандартные
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
// открываем порт
$serial->deviceOpen();
$loop=1;
while($loop==1){
$get=$serial->readPort();
// если включить print , то будут все строки NMEA протокола
// print $get;

if(substr($get,1,5) == "GPGGA")
{
// если включить print , то будет только $GPGGA
//print $get;
// парсим строку
list($gga,$time,$lat,$NS,$lng,$EW,$state)=explode(",",$get);
/* расшифровка строки $GPGGA,155004.000,4253.9372,N,04108.1511,E,1,08,1.2,18.4,M,27.4,M,,0000*68$GPGGA -- название пакета 155004.000 -- время гринвич 4253.9372,N,-- широта 04108.1511,E,-- доолгота 1-- если 1 то данные достоверны , если 0 то данные сомнительные в данном случае это переменная $state остальное можно прочитать в справочниках по NMEA протоколу,08,1.2,18.4,M,27.4,M,,0000*68*/

if($state == "1")
{
/* сохраняем в текстовый файл , но не обязательно, можно закомментировать и использовать перенаправление через print, типа
#./gps.php > куда то, или
#./gps.php | proga.sh */
// путь куда положить файл
$fp=fopen('/h/pi/robot/gps/gga.txt','wt');
if($fp)
{
fputs($fp,$get);
// print $get;
}
fclose($fp); //ставим задержку 10 секунд , но реально лучше ставить минуты 3-5 , зависит от задачи

sleep(10);
} }}
$serial->deviceClose();?>


Это был простой пример , как получить данные из GPS приемника, обработку полученных данных можно реализовать разными способами, равно как и запуск скрипта. Я поставил периодичность запросов 10 секунд чисто для примера, хотя можно убрать sleep(10) и запускаться через cron.

Ниже рабочий пример скрипта для отображения координат на картах Google.

// получим данные из текстового файла
$gga=shell_exec("cat /home/pi/robot/gps/gga.txt");
// пропарсим строку
list($gga,$time,$lat,$NS,$lng,$EW,$state)=explode(",",$gga);
// показываем полученные данные
print "Time: ".$time." Lat: ".$lat." Lang: ".$lng." State: ".$state;
// преобразуем широту и долготу к формату Google
$Lat=round(floor($lat/100)+(($lat/100)-floor($lat/100))/0.6,6);
$Lng=round(floor($lng/100)+(($lng/100)-floor($lng/100))/0.6,6);
// диаметр круга
$Acc="20";
// дальше обработка данных средствами Google API 3
print " Google Maps JavaScript API v3(Street View)
function initialize() { var moscow = new google.maps.LatLng(".$Lat.",".$Lng.");
var mapOptions = {center: moscow,zoom: 18,mapTypeId: google.maps.MapTypeId.SATELLITE,panControl: false,zoomControl: true,mapTypeControl: false,scaleControl: false};
var map = new google.maps.Map(document.getElementById(\"map_canvas\"), mapOptions);
var circle = new google.maps.Circle({radius: ".$Acc.",map: map, center: moscow,fillOpacity: 0.2,strokeOpacity: 0.5,strokeColor: '#00CCCC', fillColor: '#33CCFF', strokeWeight: 1 });
var marker = new google.maps.Marker({position: moscow,map: map,title:\"Lat:".$Lat." Long:".$Lng." Acc:".$Acc." \" }); } "; ?>

Комментарии:

RePost4
Если не сложно, то можешь установить Navit и оценить скорость работы?
Он уже есть готовый в одном из репозиториев Raspbian'a
Откровенно говоря , я иксами не пользуюсь совсем, поскольку некуда подключаться. А через ssh или vnc довольно медленно все работает.
О navit довольно много в интернете написано, с хорошими примерами.
Это понятно, просто интересует производительность именно RPi

Для написания комментариев необходимо зарегистрироваться