一月份的時候覺得好玩買了樹莓派,但是太懶沒怎麼研究,但最近當初買樹莓派時的那個夢想又萦繞心頭,決定抽空完成一下當年的計劃~ GPS子產品是其中很重要的一環,于是在某寶上搜尋,找了一家相對便宜也很輕巧的GPS子產品,而且這個子產品和天線是合體的,非常省空間。
幾天後快遞來啦,今天有空來鼓搗一下 o(^▽^)o 先來看看這個子產品,這是天線的一面
這是組裝好之後的效果
我給樹莓派安裝的是 Raspbian,基于Debian;像 Pidora 的話應該大同小異吧,以下操作均為 Raspbian。
下面來簡述一下吧。樹莓派序列槽通信網上有很多教程了,我也是搜尋着一步步摸索出來的。要想連接配接上這個GPS子產品,先得知道子產品和樹莓派的針腳定義,然後要對樹莓派進行一些設定。
一、樹莓派配置修改
樹莓派的序列槽據了解,預設是用于SSH調試的,如果需要使用序列槽連接配接其他裝置需要進行兩步修改:
1. 修改 /etc/inittab
sudo vi /etc/inittab
(如果用不慣vi,又是用圖形界面,可以選擇用leafpad)
注釋掉檔案中的這一行,以關閉序列槽登入
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
這一行一般位于檔案最後一行,注釋的方式是在前面加一個“#”
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
2. 修改 /boot/cmdline.txt
sudo vi /boot/cmdline.txt
将下面高亮的部分删除
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
最後變成了:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
修改好這兩部分之後,需要重新開機樹莓派
sudo reboot
二、序列槽連接配接
現在要對GPS子產品和樹莓派進行連接配接,根據GPS子產品的文檔和樹莓派的針腳定義一共需要連接配接4根線:VCC 5V、GND 接地、TXD和RXD。樹莓派上所謂的TOP和BOTTOM,指的是GPIO針腳的兩排,BOTTOM是靠近SD卡的一側。
對硬體我也是小白哈,連錯了,大家千萬要注意子產品上的TXD連接配接樹莓派的RXD,子產品的RXD連接配接樹莓派的TXD!我的連接配接方式如下圖:
三、通過minicom擷取序列槽資料
經過上面兩步的操作樹莓派就和GPS子產品連接配接好了~ 那如何擷取GPS子產品發出的内容呢,就要通過 minicom 這個工具,來擷取序列槽的資料。
sudo apt-get install minicom
安裝好之後通過minicom指令擷取序列槽上的資料:
minicom -b 9600 -o -D /dev/ttyAMA0
-b 設定的是波特率,是子產品參數而定;-o 是不初始化Modem且不鎖定檔案;-D 設定的是接口
如果一切順利的話,應該能看到這樣的畫面(Press CTRL-A Z for help on special keys 下面嘩嘩的出現内容):
這就說明一切 ok 啦,根據GPS子產品的文檔,知道了這是一種叫NMEA-0183的協定,包括 GSA 目前衛星資訊、GSV 可見衛星資訊、GGA GPS定位資訊、RMC 推薦定位資訊和 VTG 地面速度資訊等内容。
在 minicom 界面裡,可以按Ctrl+A,然後按Z擷取幫助;Ctrl+A、然後按Q來退出(據說如果minicom裡沒有顯示,可以試試按一下Ctrl+A、然後按E,啟用或關閉回顯,沒有試過)。如果沒有出現上面的内容,除了剛剛說的Ctrl+A、E外,還應該好好檢查一下針腳有沒有插錯、看一下GPS子產品的訓示燈工作情況怎麼樣。
四、程式設計擷取序列槽資料
通過 minicom 測試後,說明序列槽和GPS子產品工作正常,我們就應該用程式設計的方式來擷取序列槽資料了,以Python為例,要擷取序列槽的資料需要安裝Python serial子產品
sudo apt-get install python-serial
安裝好後先通過python指令,進入python指令行進行測試
python
首先,導入serial子產品
import serial
然後打開序列槽,存放到 ser 中,方法接收一個端口名,和一個波特率
ser = serial.Serial("/dev/ttyAMA0", 9600)
通過ser的read()方法隻能擷取一個字元,但read()方法有一個接收字元長度的重載,首先通過ser.inWaiting()方法擷取總長度,再通過ser.read()讀取
ser.read(ser.inWaiting())
這樣就能擷取資料了!我們隻需要對read到的資料進行分析、處理即可,寫成 .py 腳本即可。
五、NMEA-0183 一些資料的計算方式
需要說兩個關于NMEA-0183協定傳回内容的計算方式,一個是時間,另一個是經緯度。
1. GGA和RMC的時間
來看一下GGA和RMC傳回的格式:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
GGA和RMC都會傳回時間,他們的第一個參數<1>就是UTC時間,即協調世界時,格式為hhmmss,要換算成中原標準時間隻需要加上8小時即可;RMC的<9>為UTC日期,格式為ddmmyy(日月年)。下面列一條RMC傳回的資料:
$GPRMC,125315.00,A,3853.70120,N,12133.61898,E,1.710,,081114,,,A*7E
好,我們可以數一下,<1>對應的是 125315.00 也就是UTC時間 12:53:15,換算成中原標準時間就是 20:53:15;參數<9>為 081114,根據 dd/mm/yy 來算就是14年11月08日~
看,如果我們要做一個根據GPS授時的功能,是不是so easy!
2. 經緯度計算
同樣的,GGA和RMC都會傳回經緯度;GGA的<2>~<5>和RMC的<3>~<6>含義及格式相同,下面還是以RMC來做示範(看看上一點的RMC資料)。找到RMC參數<3>~<6>,分别是
<3>
3853.70120
緯度(ddmm.mmmm)
<4>
N
緯度半球(N 北半球、S 南半球)
<5>
12133.61898
經度(dddmm.mmmm)
<6>
E
經度半球(E 東經、W 西經)
注意看經緯度的格式啊,這都是個啥,GPS壞了麼,3853度?當然不是,緯度和經度都是“度分”格式,dd代表度,m代表分,那麼顯而易見:
緯度資訊:3853.70120,就是38度和53.70120分。
分換算成度隻需要除以60,也就是 53.70120 / 60 = 0.89502,那麼3853.70120的含義就是38.89502° (OMG 把自己住處位置暴露了,歡迎來串門)。
算好經緯度之後可以用 ditu.google.cn 輸入 緯度N 經度E 來看看你所在位置哈。
好啦,總結了一些網上已經有的東西,分享給大家~ 大家請輕噴哈 o(* ̄▽ ̄*)ブ
參考文獻