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." \" }); } "; ?>