USB 接口 GPS 在树莓派上的正确使用姿势~

产品说明:

Gps4.jpg
  • 支持Raspberry Pi型号A,B,A +,B +,Zero,2,3,内置L80-39 GPS芯片。
  • 使用UART或USB通信, 默认波特率 9600bps。
  • USB 接口采用CP2102作为USB转UART桥接芯片,稳定且速度更快。
  • L80-39具有66个搜索通道和22个同步跟踪通道,它可以在室外的最短时间内采集和跟踪卫星。我这里要强烈强调一下, 室内你搜不到星的哦, 一定要在室外,人家手册上这么写,你就去室外操作好吗? 别问为啥, 用脑子想想啊,卫星在天上,你要搜星,你喵在家里搜哪门子的星?

注意 我再次强调该模块适合户外操作。请把Antana(就是传说中的天线)放在露天。


兼容性列表(基本上只要支持串口通信的设备基本上都能支持,例如 各种 MCU, 51 单片机,arduino, 树莓派,香蕉派, Tinker board 等…

  • 兼容性
平台USB端口GPS模块
Raspberry Pi 3型号B Plus
树莓派零
Raspberry Pi零W
Raspberry Pi 3型号B.
Raspberry Pi 2模型B.
Raspberry Pi Model B +

功能

  • -165 dBm灵敏度,1Hz(默认),最高5Hz,66个通道
  • 启动时至少消耗100mA电流。
  • PPS输出可用于与卫星协调时间。
  • 定时精度: 1PPS输出 15ns
  • 内部贴片天线在室外使用时工作良好
  • 金属的SMA连接器用于外部有源天线,可以在室内使用,但是天线必须放置在室外.
  • fix状态LED闪烁,让您知道GPS何时确定当前坐标
  • EASY™,先进的AGPS技术,无需外部存储器
  • 支持时间服务应用程序,可通过PPS同步NMEA功能实现
  • 内置LNA可提高灵敏度
  • RTC电池兼容
  • 1×8公头,USB micro接口
  • 包括CP2102模块串行转换器USB 2.0到TTL UART

参数

类型
卫星66个接受通道,22个跟踪通道
工作电压4.5-5.5V
重量4.35克
最大电流最大100mA
工作温度-40〜+ 85℃
规模16.6x26x18.6(毫米)
全球定位系统L80-M39
贴片天线尺寸15.0 x 15.0 x 4.0mm
位置准确性<2.5M CEP
速度准确度<1.0米/ s的
没有ESEY的暖/冷启动<35S
ESEY热/冷启动<15秒
获取灵敏度-148dBm
跟踪灵敏度-165dBm
更新率1Hz(默认)高达5Hz
波特率4800~115200 bps默认为9600bps
协议NMEA 0183
安装电缆1 * 8堆叠标头USB微数据线
GPS的schama.png

如何连线

第一种方法:


这是使用 usb-to-ttl 的线缆接入 GPS的 Uart 引脚.

Uart风格接法:

由于Raspberry Pi 3,Model B的串口问题,它可能会导致意外问题,我们建议您不要将带有Raspberry Pi的GPS模块直接连接到GPIO引脚。当然,如果你要坚持用,也是可以的,只是需要将树莓派3B 和3B+的蓝牙功能关闭, 然后再将/dev/ttyAMA0设备释放出来,即可用树莓派的 GPIO 引脚和设备通信而不用占用 USB口了,操作步骤我大致讲解一下:

  1. 在树莓派上通过 sudo raspi-config 找到接口设置然后打开串口设备,机器上会出现一个/dev/ttyS0设备.
  2. 在树莓派上编辑/boot/config.txt 配置文件,检查 enable_uart=1 是否存在.
  3. 在树莓派上编辑/boot/cmdline.txt 配置文件,将整行复制后注释掉一行, 并将未注释行的 console=/dev/ttyAMA0, 115200 信息删除.
  4. 重启树莓派并在启动后安装适合自己的串口软件例如 minicom 或者别的.
  • 1.如果是使用一根USB-to-TTL线连接GPS模块和Raspberry Pi,你可以像这张图表一样连线:
GPS模块电线颜色
VCC红线
GND黑丝
TXD绿线
RXD白线
  • 2.重启 Raspberry Pi并登录,如果在桌面环境中使用raspberry Pi,请打开终端并按照后面步骤操作。

USB风格接法:

  • 只需使用microUSB电缆连接Raspberry Pi USB端口和GPS模块,并在Raspberry Pi上供电。
Gps1.jpg

如何使用

1.上电后登录系统。您可以打开终端并输入以下命令来安装GPS模块的包。
sudo apt-get update && sudo apt-get -y install gpsd gpsd-clients python-gps 
2.启动gpsd服务并对其进行控制。
启用它: sudo systemctl enable gpsd.socket 
启动它: sudo systemctl start gpsd.socket 
重新启动它: sudo systemctl restart gpsd.socket 
检查状态: sudo systemctl status gpsd.socket 

4.配置文件是在/ etc / default / gpsd中
修改gpsd的配置文件根据/ dev文件夹中串口的名称修改“DEVICE”参数。
如果通过USB电缆将其连接到Raspberry Pi,通常将其命名为“/ dev / ttyUSB0”。
您可以使用“nano”或“vim.tiny”编辑器来完成它。

我下面是写好的一个例子,我只是用 grep -v “#” /etc/default/gpsd | grep -v “^$” 过滤掉了配置文件中的注释和空行, 你们的配置如果是用 USB 接 micro USB口,然后直接插树莓派的 USB 口的,和我的配置基本是差不多的,除非你树莓派上还接了好多 USB设备,否则默认第一个设备就是/dev/ttyUSB0 , 参数 GPSD_OPTIONS= ” -F /var/run/gpsd.sock” 你这里定义啥名字就用啥名字行么?别乱改..否则找不到文件又是一顿刺挠, 你又要到群里喊叫代码不行,用不了.看仔细了哦~

Gpsconfig4.jpg

重启服务:
sudo systemctl restart gpsd.socket 
最后,使用此命令从GPS模块获取信息。
sudo cgps -s

一般情况下,如果不出幺蛾子,那么你会看到如下的信息,但是如果搜不到卫星的时候也很正常,你以为卫星时时刻刻都在你头顶上呢? 也许它跑开了一会儿,耐心等待, 基本上我们搜星也都是 30 多秒-5 分钟左右很正常, 这是 GPS 不是北斗, 自从美国出了个川普,GPS 就没有好用过….
5. GPS状态如下:

Gpsresult.png

客户端C中的示例代码

#include <gps.h> 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int main()
{
int rc;
struct timeval tv;
struct gps_data_t gps_data;
if ((rc = gps_open("localhost", "2947", &gps_data)) == -1)
{
printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
return EXIT_FAILURE;
}
gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);

while (1)
{
/* wait for 2 seconds to receive data */
if (gps_waiting (&gps_data, 2000000))
{
/* read data */
if ((rc = gps_read(&gps_data)) == -1)
{
printf("error occured reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc));
}
else
{
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_FIX) && (gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) && !isnan(gps_data.fix.latitude) && !isnan(gps_data.fix.longitude))
{
/* gettimeofday(&tv, NULL); EDIT: tv.tv_sec isn't actually the timestamp! */

printf("latitude: %f, longitude: %f, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time);
//EDIT: Replaced tv.tv_sec with gps_data.fix.time
}
else
{
printf("no GPS data available\n");
}
}
}
sleep(3);
}
/* When you are done... */
gps_stream(&gps_data, WATCH_DISABLE, NULL);
gps_close (&gps_data);
return EXIT_SUCCESS;
}
  • 编译并运行它。
gcc -o gps gps.c -lm -lgps 
sudo ./gps

GPS客户端的Python解决方案

  • 在Raspberry Pi上用 python 来接受 GPS 数据是最简单的,但是需要你安装一个 pyserial 的模块.

以下是三个如何使用python从连接到Raspberry Pi的GPS接收器获取GPS数据的示例。

思路: 使用GPSD客户端库, 然后手动解析NMEA句子或者使用pynmea2解析NMEA句子,也可以使用GPSD客户端库 

gpsd客户端库基于JSON。JSON对象具有“类”属性(例如TPV,SKY,DEVICE.etc …),可用于过滤不同的信息。
请参阅:[ http://www.catb.org/gpsd/gpsd_json.html | gpsd_json]

  • 本指南介绍了如何在Raspberry Pi上运行gpsd。
  • 下面的示例python脚本在TPV类上过滤,即时间位置速度报告,然后打印出相关信息。
由于 python 代码是需要考虑缩进的.所以我这里就截图给你看了.
下面是另一种方式,需要安装 gps 的库
这个就需要 pyserial 的库, 需要你 pip install pyserial 安装一下.
  • 使用pynmea2解析NMEA句子

下面的python脚本显示了如何通过直接连接到串行接口来访问GPS数据。
它过滤$ GPGGA NMEA句子,然后使用pynmea2来解析数据。
Pynmea2可以安装:

pi@raspberrypi ~ $ pip install pynmea2

这个方法比较简单, 另外还有一种方法就是直接自己解析数据结构,只用一个库,就是 pyserial.
尝试看看,对于其刷新速度,已经在产品特性里面介绍到了很多都是直接来自官方文档的内容,例如串口更新速率从 4800~115200bps ,默认是 9600bps, 更新率 1HZ 默认, 最高到 5Hz, 支持的协议 NMEA 0183 , 你们拿到数据后,如果是要用在一些网站的 api 上,需要转化一下格式的.
这个看 tater.li 之前帖子.

到这里就先告一段落. 下一篇帖子我做一个和高德地图 API 结合的例子.

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据