今天终于有空把这篇文章整理出来了,GPS模块我买了很久了,一直没有时间研究。我这款GPS模块是串口的,使用方法很简单,只要把GPS模块接好线,直接接树莓派的串口针脚,或者买个USB转串口(TTL)的模块,然后插在树莓派上即可,然后不停的读取数据,从读取到的数据里面即可解析出经纬度,卫星数等信息。
下面先来看一些模块图片,接线图片
1、GPS模块(具体型号:ATGM336H-5N-31),包含一条天线
2、接上天线后的GPS模块
3、接上USB转串口(TTL)模块后的GPS。这里要特别注意:GPS的两个针脚TX和RX,必须要和USB串口模块的TX和RX对调,也就是TX接RX,RX接TX
4、接了树莓派后的GPS
模块全部接好后,测试GPS是否正常。因为我这里用了USB转串口(TTL)模块,所以测试起来也非常的简单。串口设备是/dev/ttyUSB0,所以直接用cat /dev/ttyUSB0就可以读取到数据,或者用minicom -b 9600 -o -D /dev/ttyUSB0也可以。如果读不到数据的话,请记得把GPS模块拿到窗口外面或者露天的地方去测试。室内一般是定位不了的。
读取数据的效果如下图:
GPS模块测试成功后,我们发现返回的数据一大堆,那么到底哪些才是我们要的呢?这个时候就要分析协议了。
协议下载:ATGM336H-5N模块使用手册
我们主要看里面的GNGGA数据,同时要注意经纬度转换成谷歌、百度地图的方法。
协议了解了,下面我们就要写代码实现经纬度的读取解析和转换了。下面是python源码:
# -*- coding: utf-8 -* import serial import time ser = serial.Serial("/dev/ttyUSB0", 9600) try: while True: temp = ser.readline() if temp.startswith('$GNGGA'): temp = temp.split(',') latitude = temp[2] longitude = temp[4] flag = temp[6] satellite = temp[7] if latitude != '' and longitude != '': # 对经纬度进行转换 latitude = int(latitude[0:2]) + (float(latitude[2:8]) / 60) longitude = int(longitude[0:3]) + (float(longitude[3:9]) / 60) if flag == '1': # 数据有效 print('当前坐标:%s,%s' % (latitude, longitude)) print('卫星数量:%s' % int(satellite)) print('定位时间:%s\n' % time.strftime('%Y-%m-%d %H:%M:%S')) else: print('定位数据无效(%s)' % time.strftime('%Y-%m-%d %H:%M:%S')) else: print('定位失败(%s)' % time.strftime('%Y-%m-%d %H:%M:%S')) except KeyboardInterrupt as e: print("程序结束")
源代码下载:GPS.zip
效果图:
ok
mjj通道