วันจันทร์ที่ 29 มิถุนายน พ.ศ. 2558

Raspberrypi+GPS+MySQL


 

 
GPS Logger 

สืบเนื่องจากบทความนำเสนอวิธีการใช้งาน USB GPS ผ่านทางภาษา Python บน Raspberry Pi
จาก http://learninginventions.org/?page_id=1026 ซึ่งเป็นบทความที่เยี่ยมยอดมาก อ่านแล้วเข้าใจง่าย เลยอยากพัฒนาต่อยอด จากของที่บอร์ด Raspberry Pi ทำได้ ค้นหาไปเจอ USB GPS ราคาถูกที่   www.spelecshop.com ( ถ้ามีถูกกว่ารบกวนช่วยบอกด้วย ) แต่ของหมด เลยได้ Serial GPS+ตัวแปลงPL2303HX USB to UART TTL เพื่อเป็นระบบ GPS ราคาต่ำ

  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
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()
 
  • ทดสอบโปรแกรม โดยใช้คำสั่ง
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
  • ทำการติดตั้ง 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
ทดสอบเปิดเว็บดูได้ครับ
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()

 
 

  • เขียนโปรแกรม PHP นำข้อมูลที่ได้มาแสดง
nano /var/www/gpslog.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>
 




  • เขียนโปรแกรม 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 ให้ลองศึกษาดู