樹莓派鏈接GPS模塊

一月份的時候以爲好玩買了樹莓派,可是太懶沒怎麼研究,但最近當初買樹莓派時的那個夢想又縈繞心頭,決定抽空完成一下當年的計劃~ GPS模塊是其中很重要的一環,因而在某寶上搜索,找了一家相對便宜也很輕巧的GPS模塊,並且這個模塊和天線是合體的,很是省空間。html

幾天後快遞來啦,今天有空來鼓搗一下 o(^▽^)o 先來看看這個模塊,這是天線的一面python

這是組裝好以後的效果編程

我給樹莓派安裝的是 Raspbian,基於Debian;像 Pidora 的話應該大同小異吧,如下操做均爲 Raspbian。工具

下面來簡述一下吧。樹莓派串口通訊網上有不少教程了,我也是搜索着一步步摸索出來的。要想鏈接上這個GPS模塊,先得知道模塊和樹莓派的針腳定義,而後要對樹莓派進行一些設置。學習

1、樹莓派配置修改測試

樹莓派的串口據瞭解,默認是用於SSH調試的,若是須要使用串口鏈接其餘設備須要進行兩步修改:google

1. 修改 /etc/inittabspa

sudo vi /etc/inittab

(若是用不慣vi,又是用圖形界面,能夠選擇用leafpad).net

註釋掉文件中的這一行,以關閉串口登陸命令行

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

 

2、串口鏈接

如今要對GPS模塊和樹莓派進行鏈接,根據GPS模塊的文檔和樹莓派的針腳定義一共須要鏈接4根線:VCC 5V、GND 接地、TXD和RXD。樹莓派上所謂的TOP和BOTTOM,指的是GPIO針腳的兩排,BOTTOM是靠近SD卡的一側。

對硬件我也是小白哈,連錯了,你們千萬要注意模塊上的TXD鏈接樹莓派的RXD,模塊的RXD鏈接樹莓派的TXD!個人鏈接方式以下圖:

 

3、經過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模塊的指示燈工做狀況怎麼樣。

 

4、編程獲取串口數據

經過 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 腳本便可。

5、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(* ̄▽ ̄*)ブ

 

參考文獻

相關文章
相關標籤/搜索