GPS Logger
สืบเนื่องจากบทความนำเสนอวิธีการใช้งาน USB GPS ผ่านทางภาษา Python บน Raspberry Pi
1.การทดสอบการทำงานของ GPS ร่วมกับ RaspberryPi ด้วยคำสั่ง
- lsusb ก็จะพบ PL2303
- ติดตั้ง gpsd พร้อมทั้งโปรแกรมทดสอบ และ api ใช้งานผ่าน Python
apt-get install gpsd gpsd-clients python-gps
- ให้เรียกใช้โปรแกรม gpsd ซึ่งจะทำงานในพื้นหลัง
gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
- ทดลองเรียกใช้โปรแกรม cgps เพื่อดูว่า GPS สามารถระบุพิกัดได้หรือไม่
cgps -s
หมายเหตุ หากเรียกใช้โปรแกรม cgps แล้วแสดงหน้าจอข้างต้นเพียงไม่กี่วินาทีแล้วจบการทำงาน
อาจต้องเรียกใช้ gpsd อีกครั้งหนึ่งโดยใช้คำสั่ง
killall gpsd
gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
cgps -s
- ทดสอบเขียนโปรแกรมอ่านค่าจาก GPS
nano gpstest.py
import gps
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
while True:
try:
report = session.next()
# Wait for a 'TPV' report and display the current time To see all report data, uncomment the line below print report
if report['class'] == 'TPV':
if hasattr(report, 'lat'):
lat = report.lat
if hasattr(report, 'lon'):
lon = report.lon
if hasattr(report, 'speed'):
speed = report.speed
print report.time
print lat
print lon
print speed
except KeyError:
pass
except KeyboardInterrupt:
quit()
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
while True:
try:
report = session.next()
# Wait for a 'TPV' report and display the current time To see all report data, uncomment the line below print report
if report['class'] == 'TPV':
if hasattr(report, 'lat'):
lat = report.lat
if hasattr(report, 'lon'):
lon = report.lon
if hasattr(report, 'speed'):
speed = report.speed
print report.time
print lat
print lon
print speed
except KeyError:
pass
except KeyboardInterrupt:
quit()
- ทดสอบโปรแกรม โดยใช้คำสั่ง
python gpstest.py
2. ติดตั้ง โปรแกรม เวบเซอร์เวอร์ และฐานข้อมูล
Raspberry Pi เองเป็นคอมพิวเตอร์ขนาดเล็กที่รัน Linux อยู่ภายใน และตัว Raspbian ซึ่งเป็น OS ที่เราได้ทำการ Write Images File ลง SD-Card ไปเมื่อคราวที่แล้วก็ถูกดัดแปลงมาจาก Debian ฉะนั้นคำสั่งต่างๆสำหรับลงโปรแกรมก็จะเป็นคำสั่งเดียวกับของ Debian นั้นก็คือ apt-get โครงงานต้องใช้ PHP กับ MySQL เป็นร่วมด้วย ดังนั้นต้องทำการติดตั้ง Apache, PHP, MySQL บน Raspberry Pi ด้วย จะสามารถทำงานเป็นเว็บเซิร์ฟเวอร์โดยสมบูรณ์ เริ่มจาการต่อสายแลนและแหล่งจ่ายไฟให้ Raspberry Pi ทำการ Login เข้า Raspberry Pi และติดตั้งแพคเกจต่างๆ เริ่มด้วยการอัพเดทแพคเกจ
apt-get update
apt-get upgrade
apt-get upgrade
- ทำการติดตั้ง Apache, MySQL , PHP , phpMyAdmin
apt-get install apache2 apache2-utils
apt-get install libapache2-mod-php5 php5 php-pear php5-xcache
apt-get install mysql-server mysql-client
ขั้นตอนการติดตั้ง MySQL ระบบจะขึ้นหน้าจอมาให้ใส่รหัสผ่านของ MySQL เป็น 112233ก็แล้วกัน
- ติดตั้ง php5 mod MySQL เพื่อใช้เรียกข้อมูแสดงผล
apt-get install php5-mysql
- ทำการติดตั้ง phpmyadmin
apt-get install phpmyadmin
ในขั้นตอนการติดตั้ง phpmyadmin ระบบจะขึ้นหน้าจอมาให้เลือกว่าจะใช้กับเว็บเซิร์ฟเวอร์ตัวไหน ให้ใช้ปุ่มลูกศรในการเลื่อนไปยังตัวเลือกที่ต้องการ และใช้ space bar ในการเลือกตัวเลือก และกด tab เพื่อเลื่อนให้เคอร์เซอร์มาอยู่ที่ปุ่ม OK แล้วกด Enter ถ้าถามรหัส ให้เป็น 112233 เหมือนกันเปลี่ยนทีหลังได้
- แก้ไข ข้อมูลใน /etc/apache2/apache2.conf ด้วย
nano /etc/apache2/apache2.conf
เพิ่มบรรทัด
Include /etc/phpmyadmin/apache.conf
สั่ง Reart Astpache และ MySQL
service apache2 restart
service mysql restart
service mysql restart
ทดสอบเปิดเว็บดูได้ครับ
http://raspberry pi ip/phpmyadmin
- ติดตั้ง MySQL module python
apt-get install python-mysqldb
login ด้วย root รหัส 112233 สร้าง ฐานข้อมูล gpslog ใน MySQL ด้วย phpmyadmin
สร้างฐานข้อมูลชื่อ gpslog และสร้าง teble ชื่อ gpsdata และ gpsday ให้มีรายละเอียด ด้งรูป
- ทดสอบเขียนโปรแกรมภาษา python ค่า GPS นำข้อมูล เข้า ฐานข้อมูล MySQL
nano gpslog.py
import gps
import MySQLdb
import time
import os
os.system('gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock')
db = MySQLdb.connect("localhost", "root", "112233", "gpslog")
curs=db.cursor()
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
while True:
try:
report = session.next()
# Wait for a 'TPV' report and display the current time To see all report data, uncomment the line below print report
if report['class'] == 'TPV':
if hasattr(report, 'lat'):
lat=report.lat
if hasattr(report, 'lon'):
lon=report.lon
if hasattr(report, 'speed'):
speed=report.speed
print lat
print lon
print speed
curs.execute("DELETE FROM gpsdata")
curs.execute("INSERT INTO gpsdata values (CURRENT_DATE(), NOW(), '%s', '%s', '%s')"%(lat, lon, speed))
curs.execute("INSERT INTO gpsday SELECT ttdate, ttime, lat, lon, speed FROM gpsdata")
curs.execute("DELETE FROM gpsday WHERE ttdate < (CURRENT_DATE() - INTERVAL 1 DAY)")
db.commit()
time.sleep(5)
except KeyError:
pass
except KeyboardInterrupt:
quit()
import MySQLdb
import time
import os
os.system('gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock')
db = MySQLdb.connect("localhost", "root", "112233", "gpslog")
curs=db.cursor()
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
while True:
try:
report = session.next()
# Wait for a 'TPV' report and display the current time To see all report data, uncomment the line below print report
if report['class'] == 'TPV':
if hasattr(report, 'lat'):
lat=report.lat
if hasattr(report, 'lon'):
lon=report.lon
if hasattr(report, 'speed'):
speed=report.speed
print lat
print lon
print speed
curs.execute("DELETE FROM gpsdata")
curs.execute("INSERT INTO gpsdata values (CURRENT_DATE(), NOW(), '%s', '%s', '%s')"%(lat, lon, speed))
curs.execute("INSERT INTO gpsday SELECT ttdate, ttime, lat, lon, speed FROM gpsdata")
curs.execute("DELETE FROM gpsday WHERE ttdate < (CURRENT_DATE() - INTERVAL 1 DAY)")
db.commit()
time.sleep(5)
except KeyError:
pass
except KeyboardInterrupt:
quit()
- เขียนโปรแกรม PHP นำข้อมูลที่ได้มาแสดง
<html>
<head>
<title>Simple show GPS Log</title>
<META HTTP-EQUIV='Refresh' CONTENT='10;'>
</head>
<body>
<?
$obj_con = mysql_connect(localhost,root,112233);
mysql_select_db(gpslog,$obj_con);
mysql_query("SET NAMES UTF8");
$sql = "select * from gpsday order by ttime desc limit 20 ";
$sql_query=mysql_query($sql);
?>
<table border=1 width=35% >
<tr align="center" bgcolor="#CCCCFF">
<td width="30%">เวลา</td><td>Latitude</td><td>Longitude</td><td>ความเร็ว</td></tr>
<?
while($array =mysql_fetch_array($sql_query))
{
//echo "<td>$array[ttdate]</td>";
echo "<td>$array[ttime]</td>";
echo "<td>$array[lat]</td>";
echo "<td>$array[lon]</td>";
echo "<td>$array[speed]</td>";
echo "</tr>";
}
mysql_close();
?>
</table>
</body>
</html>
- เปิด เวบ http://(raspberrypi ip)/gpslog.php
- เขียนโปรแกรม PHP นำพิกัดลงแผนที่ googlemap
nano /var/www/gpsmap.php
<html>
<head>
<title>Simple GPS position on Googlemap</title>
</head>
<body>
<? $obj_con = mysql_connect(localhost,root,112233);
mysql_select_db(gpslog,$obj_con);
mysql_query("SET NAMES UTF8");
$str_sql = "select * from gpsdata ";
$sql_gps = mysql_query($str_sql,$obj_con);
?>
<? while($in_gps = mysql_fetch_array($sql_gps))
{ ?>
<td><? $lat1= $in_gps['lat'] ?></td>
<td><? $lon1= $in_gps['lon'] ?></tr>
<?}
?>
<? echo '<script type="text/javascript">';
echo "var lat1 = '$lat1';";
echo "var lon1 = '$lon1';";
echo '</script>';
?>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script>
function loadmap()
{
var mapSet = {center:new google.maps.LatLng(lat1,lon1),zoom:14,
mapTypeId:google.maps.MapTypeId.ROADMAP};
var map=new google.maps.Map(document.getElementById("googleMap"),mapSet);
var marker=new google.maps.Marker({
position:new google.maps.LatLng(lat1,lon1),
icon:'http://www.kr.ac.th/webresource/arrow/aro123.gif',
animation:google.maps.Animation.BOUNCE});
marker.setMap(map);
}
google.maps.event.addDomListener(window, 'load', loadmap);autoUpdate();
</script>
<div id="googleMap" style="width:100%;height:100%;"></div>
</body>
</html>
ถ้าเกิดมีใครสนใจหรือปัญหาสอบถาม ให้ Mail มาที่ rittichai.a@hotmail.com อาจจะลง Image ของ RaspberryPi ให้ลองศึกษาดู