gps on raspberry pi

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." \" });  }  "; ?> 
Тэги:

 

Автор:

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

  • RePost4
    03.04.2013 в 11:43 ответ

    Если не сложно, то можешь установить Navit и оценить скорость работы? Он уже есть готовый в одном из репозиториев Raspbian'a

    • JackM10
      03.04.2013 в 15:18 ответ

      Откровенно говоря , я иксами не пользуюсь совсем, поскольку некуда подключаться. А через ssh или vnc довольно медленно все работает. О navit довольно много в интернете написано, с хорошими примерами.

      • RePost4
        03.04.2013 в 18:50 ответ

        Это понятно, просто интересует производительность именно RPi

  • kukabu1
    05.04.2013 в 10:01 ответ

    gpsd используй

Ваш комментарий

Авторизуйтесь для отправки комментария

© Сообщество пользователей RaspberryPi 2021