天天看點

python gps子產品_樹莓派連接配接GPS子產品

一月份的時候覺得好玩買了樹莓派,但是太懶沒怎麼研究,但最近當初買樹莓派時的那個夢想又萦繞心頭,決定抽空完成一下當年的計劃~ GPS子產品是其中很重要的一環,于是在某寶上搜尋,找了一家相對便宜也很輕巧的GPS子產品,而且這個子產品和天線是合體的,非常省空間。

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

python gps子產品_樹莓派連接配接GPS子產品

這是組裝好之後的效果

python gps子產品_樹莓派連接配接GPS子產品

我給樹莓派安裝的是 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!我的連接配接方式如下圖:

python gps子產品_樹莓派連接配接GPS子產品

三、通過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 下面嘩嘩的出現内容):

python gps子產品_樹莓派連接配接GPS子產品

這就說明一切 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(* ̄▽ ̄*)ブ

參考文獻

python gps子產品_樹莓派連接配接GPS子產品