一月份的時候覺得好玩買了樹莓派,但是太懶沒怎么研究,但最近當初買樹莓派時的那個夢想又縈繞心頭,決定抽空完成一下當年的計划~ 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<CR><LF>
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
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(* ̄▽ ̄*)ブ
參考文獻